Простой способ понять, как работает блокчейн, - это построить его

Обеспокоены ростом криптовалют? И вы хотите знать, как работает блокчейн - фундаментальная технология, лежащая в его основе. В конце концов, в наши дни они являются модными и любимыми темами СМИ - модными словечками года.

Понять блокчейн непросто - или это было не для меня тоже! Я просматриваю учебные пособия, видео и имею дело с нарастающим разочарованием.

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

Что такое блокчейн?

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

Вы можете рассматривать блокчейн как просто книгу.

Блоки в цепочке = Страницы в книге

Для аналогии книга - это цепочка страниц. Каждая страница в книге содержит:

Текст: например рассказ.

Информация о себе: вверху страницы обычно находится название книги; Внизу обычно находится номер страницы, который говорит вам, где вы находитесь в книге. Эти «данные о данных» называются метаданными.

Аналогично в цепочке блоков каждый блок имеет:

Содержимое блока; например: транзакции

«Индекс», который однозначно определяет блок.

Ссылка на предыдущий блок и, среди прочего, отпечаток (хэш) данных, содержащихся в этом блоке.

Прежде чем начать…

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

Что вам понадобится? Убедитесь, что Node.js установлен. Ах да, еще понадобится HTTP-клиент, например Почтальон.

Окончательный исходный код? Доступно здесь!

ШАГ 1. Построение блокчейна

Мы собираемся создать блокчейн только для узла. Откройте ваш любимый редактор кода или IDE, лично я ❤️ Atom. Создайте новый файл с именем blockchain.js.

Представление блокчейна

Мы создадим функцию Blockchain, которая создает начальный пустой список (для хранения нашей цепочки блоков), а другой - для хранения транзакций. Вот план нашего класса:

Давайте начнем рассказывать о некоторых методах.

Как выглядит блок?

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

Вот пример того, как выглядит отдельный блок:

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

Создать новый блок

Когда наш Blockchain будет инициирован, нам нужно будет засеять его блоком генезис - первым блоком в цепочке. Нам также нужно будет добавить nonce в наш генезис-блок, который является результатом майнинга (или доказательства работы). Подробнее о майнинге поговорим позже.

Помимо создания блока genesis, мы также доработаем методы для createNewBlock(), getLastBlock() и hashBlock():

Создать новую транзакцию

Нам понадобится способ добавления транзакций в блок. За это отвечает наш createNewTransaction() метод, и он довольно прост:

После того, как createNewTransaction() добавляет транзакцию в список, он возвращает индекс блока, в который будет добавлена ​​транзакция - следующего блока, который будет добыт. Это будет полезно позже. на, пользователю, отправившему транзакцию.

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

Понимание доказательства работы

Алгоритм доказательства работы (PoW) подтверждает транзакцию и создает новый блок в цепочке. Мы можем установить несколько индексов хеш-значения блоков. Например, мы можем установить значение хеш-функции, за которым следуют первые четыре «0000», поэтому теперь наше значение хеш-функции становится «0000rjzlvn…». Теперь предположим, что если кто-то пытается изменить данные блоков, эти измененные данные напрямую влияют на значение хеш-функции. Следовательно, хеш-значение измененных данных изменилось и не соответствует нашему условию, как указано выше. Таким образом, модифицированные данные не допускаются цепочкой блоков, и любой блок не должен приниматься до тех пор, пока он не выполнит условие метода ProofofWork.

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

Внедрение базового доказательства работы

Давайте реализуем аналогичный алгоритм для нашей цепочки блоков. Наше правило будет аналогично приведенному выше примеру:

Найдите число "nonce", при хешировании которого с решением предыдущего блока получается хеш с 4 ведущими нулями.

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

Наш класс почти готов, и мы готовы начать с ним взаимодействовать с помощью HTTP-запросов.

ШАГ 2: Доступ к блокчейну через API

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

Установите экспресс, используя следующую команду:

npm install express --save

Мы создадим три метода:

  • /blockchain, чтобы вернуть всю цепочку блоков.
  • /transaction для создания новой транзакции в блоке
  • /mine, чтобы наш сервер майнил новый блок.

Создание основы API:

Наш «сервер» сформирует единый узел в нашей сети блокчейнов. Создайте новый файл с именем networkNode.js. Давайте создадим шаблонный код:

Конечная точка транзакции

Так будет выглядеть запрос на транзакцию. Это то, что пользователь отправляет на сервер:

{
 "amount": 5;
 "sender": "own address";
 "recipient": "someone else's address" 
}

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

Конечная точка майнинга

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

  1. Рассчитать Proof of Work
  2. Наградите майнера (нас), добавив транзакцию, дающую монеты 12,5 долларов США.
  3. Создайте новый блок, добавив его в цепочку

На этом мы закончили и можем начать взаимодействие с нашей цепочкой блоков.

ШАГ 3: Взаимодействие с нашей цепочкой блоков

Вы можете использовать Postman для взаимодействия с нашим API по сети.

Запустите сервер:

$ npm start
Running on http://localhost:3000/ 

Давайте создадим новую транзакцию, отправив POST запрос кhttp://localhost:3000/transaction с телом, содержащим нашу структуру транзакции:

Давайте рассмотрим запрошенную выше транзакцию в блоке, отправляющем запрос GET на http://localhost:3000/mine

Давайте проверим всю цепочку, запросив http://localhost:3000/blockchain в браузере

Удивительный ! У нас есть базовая цепочка блоков, которая принимает транзакции и позволяет нам добывать новые блоки.

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

Если вам понравилось это руководство, или у вас есть предложения или вопросы, дайте мне знать в комментариях. А если вы заметили какие-либо ошибки, не стесняйтесь вносить свой вклад в код здесь!