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

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

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

Блокчейн состоит из транзакций, которые связаны друг с другом и объединены в единый блок от начала до конца, как на листе Excel. Каждая строка содержит информацию об одной транзакции, например, какое имущество было передано и когда оно было передано. То же самое касается любой транзакции между блоками или передачи собственности. Если вы думаете о электронной таблице, то каждый блок будет одной «вкладкой» или «оценкой». Блок — это группировка всех транзакций в цепочке блоков (таблица Excel).

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

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

Блокчейн децентрализован. Нет центрального сервера или точки, где хранится информация. Это делает блокчейн высокораспределенным и труднодоступным для атак, поскольку миллионы копий хранятся в нескольких сетях.

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

Следующее, что нам нужно сделать, это создать новый файл, с которым мы можем работать, позже названный «блоками».

Далее нам нужно добавить 5 ключевых переменных для блока. Нам нужно создать новый тип данных под названием «struct», чтобы код можно было легче читать. Структура будет содержать в себе все ключи и значения (свойства)

data BlockType = Block { previousHash :: String, index :: Int, timestamp :: String, transaction :: [[String]] } производное (Show, Eq)
Этот тип данных называется BlockType и содержит различные свойства это мы увидим позже, когда создадим наш первый блок.

Есть много вещей, которые может содержать блок, например:

previousHash содержит хэш предыдущего блока. Это позволяет нам связывать транзакции в будущих блоках вместе.

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

содержит целое число, которое идентифицирует каждый блок, чтобы мы могли найти свое место после чтения нового блока позже без необходимости запоминать или искать. Это особенно полезно при чтении цепочки блоков, когда мы хотим найти свое место. Кроме того, это гарантирует, что у вас всегда будет свой закрытый ключ, чтобы вы могли реконструировать нечитаемый или модифицированный блокчейн и при необходимости иметь возможность его декодировать. Отметка времени содержит отметку времени (в секундах с 1 января 1970 года по Гринвичу) этого блока, поэтому вы знаете точное время, когда произошла транзакция и т. д.

содержит отметку времени (в секундах с 1 января 1970 года по Гринвичу) этого блока, поэтому вы знаете точное время, когда произошла транзакция и т. д. Транзакции представляют собой список всех транзакций, связанных с этим блоком.

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

data TransactionType = Transaction { from :: String, to :: String, amount :: Int, timestamp :: String } производное (Show, Eq)
Тип TransactionType данных подобен BlockType, но вместо предыдущегоHash он содержит ключ от, до и суммы. Это имеет смысл, если подумать, потому что вы переносите что-то из одного места в другое. Временная метка необходима, поскольку время нужно каким-то образом записать, чтобы все знали, когда произошла транзакция и т. д.

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

data Blockchain = Blockchain { firstBlock :: Block, lastBlock :: Block } производное (Show, Eq)

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

newtype TransactionCreator a = TransactionCreator
У нас будет только один тип транзакции в нашей цепочке блоков, но нам все еще нужно создать для нее блок. Мы можем улучшить этот код позже, создав транзакцию для каждого типа, который нам нужен. Следующий код создает первый блок в нашей новой базе данных, но его можно улучшить, чтобы сделать его более читаемым в будущих блоках.

Result {getFirstBlock :: Blockchain -> Block} firstBlock = Result ‹$› runTransactionCreator getBlock 0
Этот фрагмент кода создает пустую базу данных с именем Blockchain. Он должен содержать много блоков (блоки связаны друг с другом хешами) и место, которое содержит первый блок. Причина, по которой нам нужен первый блок, заключается в том, что он содержит начальный индекс, который идентифицирует блоки по порядку.

Нам нужно место для хранения нашего блокчейна по мере его роста, а также нам нужен способ чтения его содержимого. Мы можем сделать это с помощью двух отдельных функций. Первая функция будет называться newBlockchain и возьмет буфер и добавит нашу цепочку блоков в буфер, увеличивая размер его файла с помощью «bloomCount». Он заменит все нулевые байты пробелами (для удобства просмотра позже). Есть и другие способы добиться этого, но мне нравится этот, потому что его легко модифицировать позже и при необходимости сделать читаемым.

Функция генерации хэшей нужна для создания связей между нашими транзакциями. Это может понадобиться для проверки других блоков позже. Единственная причина, по которой этот хеш в данный момент не нужен, заключается в том, что мы строим новую базу данных и все ссылки уже есть.
initialHashes :: Blockchain -> [BlockHash] initialHashes initialBlockchain = emptyBlockHash : [toBlockHash next] где next = getNext initialBlockchain
Осталось только написать «getNext». Я решил не делать ее чистой функцией, потому что она будет использоваться в трех местах, поэтому любой код, написанный в ней, должен быть быстрым.
нельзя встроить, потому что:
нельзя встроить, потому что:
код действительно был не намного длиннее исходной версии. Единственное, что заняло у меня много времени, это понять, как делать транзакции из существующих структур данных и как создавать связи между ними.

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

Как шаг за шагом создать блокчейн с помощью языка программирования?