В прошлом месяце я решил попробовать свои силы в программировании блокчейн. Не имея до этого опыта программирования, это было амбициозное начинание. Теперь, сделав это, я подумал, что поделюсь своим опытом в надежде, что он вдохновит кого-то вроде меня совершить прыжок в неизвестный, устрашающий мир программирования на блокчейне.

Ниже приводится 7-минутное видео, в котором я просматриваю эту статью со своим собственным повествованием, предоставляя объяснения наравне с технической глубиной самой отдельной статьи. Если вы считаете, что мы в большей степени слуховые ученики, не стесняйтесь смотреть это видео.

В прошлом месяце я решил попробовать свои силы в программировании блокчейн. Не имея до этого опыта программирования, это было амбициозное начинание. Теперь, сделав это, я подумал, что поделюсь своим опытом в надежде, что он вдохновит кого-то вроде меня совершить прыжок в неизвестный, устрашающий мир программирования на блокчейне.

Во-первых, я хотел бы упомянуть, что этот проект является доказательством концепции, а не функционирующим блокчейном, таким как Биткойн или Эфириум. Цель этой статьи - предоставить вам основу того, как на самом деле выглядит блокчейн в коде, чтобы раскрыть абстракцию шума цепочки блоков.

Что нам нужно?

Для этого блокчейна я решил заставить его функционировать как криптовалюту с именем, лучшим, чем одноименный «Austin Coin». Функциональность разделена на три «класса». Класс похож на единый список инструкций, которые вы можете запускать из любой точки проекта - как будто вы отправляете широковещательную рассылку, чтобы вызвать его к действию. Инструкции (или код) внутри этого класса используются для изменения данных, которые вы сопровождаете своей трансляцией.

Первый класс - это класс транзакции. Он срабатывает, когда пользователь хочет совершить транзакцию. Ниже приведен ряд команд, запускающих транзакцию.

Первая строка создает объект транзакции, который включает адрес отправителя, адрес назначения и сумму криптовалюты. Это можно рассматривать как широковещательную рассылку, поскольку она запускает класс Transaction и отправляет ему только что упомянутые данные. Давайте посмотрим, что происходит после того, как эта транзакция будет инициирована.

Это весь класс Transaction. Первый выделенный фрагмент кода структурирует данные, которые мы ему дадим, путем именования каждого элемента списка. Итак, когда мы даем ему: («Боб», «Джейн», 12), он знает, что он указан в следующем порядке: исходный адрес, до-адрес и сумма. Это позволяет программе изменять эти данные независимо друг от друга.

Первый метод - второе красное поле - вычисляет хэш транзакции, и, как видите, это всего лишь одна строка кода. Причина, по которой мы включаем его как собственный метод, заключается в том, что мы можем легко запустить эту формулу из любого другого места в классе, не набирая ее. Это становится особенно полезным, когда мы начинаем хотеть использовать этот хеш в других переменных и комбинировать / хешировать его с другими данными.

Третье поле с методом под названием «signTransaction» проверяет личность отправителя с помощью его открытого ключа. Сначала он проверяет, совпадает ли открытый ключ пользователя с fromAddress, указанным в транзакции, поскольку, если они отправляют деньги, они должны совпадать; мы бы не хотели, чтобы люди отправляли деньги с чужих счетов. Если адреса не совпадают, транзакция прекращается.

Последний блок кода с методом: «isValid» проверяет именно это, используя пару операторов if. Во-первых, он проверяет, является ли адрес отправителя «нулевым», что означает, что ему не назначена никакая идентификация. Это делается для того, чтобы программа могла запустить цепочку блоков с первого блока, называемого генезисным блоком, и у этого генезисного блока не будет ни отправителя, ни получателя, но он все равно будет действителен. Однако следующий оператор if проверяет, состоит ли открытый ключ пользователя из нуля символов или равен «0», и в этом случае транзакция будет недействительной.

Следующий класс - это класс Block. Как и предыдущий, этот начинается просто с организации и определения данных, которые нам понадобятся, чтобы заставить его работать. Это включает в себя все переменные, необходимые в данном блоке, включая метку времени, транзакции внутри блока и хэш предыдущего блока в цепочке. Он также определяет две новые переменные; хэш этого блока, и это 'nonce'.

Эти две переменные являются неотъемлемой частью работы блокчейна. Как видите, они используются в следующих методах: «calculateHash» и «mineBlock». Эти два метода заключают в себе «механизм консенсуса», который в данном случае является доказательством выполнения работы.

Оба метода повторяются снова и снова, пока хэш блока не начинается с определенного количества нулей, и только после этого его можно добавить в цепочку. Поскольку невозможно предсказать хеш-код, компьютер должен потратить около 10 минут на его повторное хеширование, пока не будет найден правильный ответ. Он делает это, увеличивая одноразовый номер на +1 после каждого цикла, который затем учитывается в процессе хеширования, как и все другие переменные, для создания нового хеша для всего блока.

Третий и последний класс включает шесть полезных методов, но я остановлюсь только на четырех наиболее важных.

«CreateGenesisBlock» всегда используется только при первом создании цепочки блоков и делает это путем запуска класса «Block», который мы рассмотрели ранее.

«MinePendingTransactions» предоставляет майнеру вознаграждение и помещает ожидающие подтверждения транзакции в блок.

«AddTransaction» переводит транзакции в состояние ожидания после того, как убедитесь, что каждая из них включает адрес отправителя, адрес получателя и была предварительно проверена методом isValid.

И, наконец, isChainValid выполняет поиск по всей цепочке блок за блоком. Поскольку каждый блок должен содержать хэш предыдущего блока, код проверяет, не был ли какой-либо блок изменен, хешируя их и сравнивая только что вычисленный хэш с переменной «previousHash» следующего блока. Если эти два числа не совпадают, это означает, что текущий блок был изменен.

Вау, на том последнем уроке было довольно много. Я искренне надеюсь, что не потерял тебя там. Как я уже упоминал ранее, вход в эту статью без предварительных знаний затрудняет извлечение из нее максимальной информации, поэтому, если вы находитесь в таком положении и зашли так далеко, прочтите эту статью, если вы еще не сделали этого. уже нет. »

Но на этом мы подошли к концу. Я прекрасно провел время, взявшись за этот проект и углубив свое понимание блокчейна с помощью чистого, нефильтрованного опыта написания логики самостоятельно. Если эта статья помогла вам сломать какую-то абстракцию или даже не помогла, дайте мне знать, и я обязательно адаптирую ее, чтобы дать вам максимальную ценность.