Простой способ понять, как работает блокчейн, - это построить его
Обеспокоены ростом криптовалют? И вы хотите знать, как работает блокчейн - фундаментальная технология, лежащая в его основе. В конце концов, в наши дни они являются модными и любимыми темами СМИ - модными словечками года.
Понять блокчейн непросто - или это было не для меня тоже! Я просматриваю учебные пособия, видео и имею дело с нарастающим разочарованием.
Мне нравится приобретать знания на практике. Это заставляет меня заниматься предметом на уровне кода. Если вы сделаете то же самое, в конце этого руководства вы получите работающий блокчейн с твердым пониманием того, как они работают.
Что такое блокчейн?
Проще говоря, блокчейн - это распределенная база данных, которая поддерживает неизменяемую запись всех транзакций в сети блокчейн. Блокчейн - это распределенная структура данных, состоящая из цепочки блоков. Транзакции имеют временные метки и объединяются в блоки, где каждый блок идентифицируется своим криптографическим хешем.
Вы можете рассматривать блокчейн как просто книгу.
Блоки в цепочке = Страницы в книге
Для аналогии книга - это цепочка страниц. Каждая страница в книге содержит:
Текст: например рассказ.
Информация о себе: вверху страницы обычно находится название книги; Внизу обычно находится номер страницы, который говорит вам, где вы находитесь в книге. Эти «данные о данных» называются метаданными.
Аналогично в цепочке блоков каждый блок имеет:
Содержимое блока; например: транзакции
«Индекс», который однозначно определяет блок.
Ссылка на предыдущий блок и, среди прочего, отпечаток (хэш) данных, содержащихся в этом блоке.
Прежде чем начать…
Мы предполагаем, что читатель знаком с 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" }
Поскольку у нас уже есть метод добавления транзакций в блок, остальное несложно. Напишем функцию добавления транзакций:
Конечная точка майнинга
Наша конечная точка майнинга - это то место, где происходит волшебство, и это легко. Он должен делать три вещи:
- Рассчитать Proof of Work
- Наградите майнера (нас), добавив транзакцию, дающую монеты 12,5 долларов США.
- Создайте новый блок, добавив его в цепочку
На этом мы закончили и можем начать взаимодействие с нашей цепочкой блоков.
ШАГ 3: Взаимодействие с нашей цепочкой блоков
Вы можете использовать Postman для взаимодействия с нашим API по сети.
Запустите сервер:
$ npm start Running on http://localhost:3000/
Давайте создадим новую транзакцию, отправив POST
запрос кhttp://localhost:3000/transaction
с телом, содержащим нашу структуру транзакции:
Давайте рассмотрим запрошенную выше транзакцию в блоке, отправляющем запрос GET на http://localhost:3000/mine
Давайте проверим всю цепочку, запросив http://localhost:3000/blockchain
в браузере
Удивительный ! У нас есть базовая цепочка блоков, которая принимает транзакции и позволяет нам добывать новые блоки.
Надеюсь, это вдохновило вас на создание чего-то нового. Я банально отношусь к криптовалютам, потому что считаю, что блокчейн быстро изменит наше представление об экономике, правительстве и ведении учета.
Если вам понравилось это руководство, или у вас есть предложения или вопросы, дайте мне знать в комментариях. А если вы заметили какие-либо ошибки, не стесняйтесь вносить свой вклад в код здесь!