Понимание и создание собственного крошечного блокчейна на JavaScript

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

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

Откройте для себя и ознакомьтесь с лучшим программным обеспечением Blockchain

Требования: Я построил это в Node.js, но вы можете легко построить его на Repl.it, если хотите. Мы также будем использовать пакет sha256 npm для хеширования блоков.

Если вы новичок в Node.js, сначала вам нужно создать новый каталог, создать index.js файл, а затем запустить npm init -y из вашего нового каталога в терминале. Это создает файл package.json, который позволит нам установить пакет sha256. Запустите npm i sha256, чтобы установить библиотеку sha256. Если вы используете Repl.it, создайте новый ответ Nodejs, установите пакет thejs-sha256 и потребуйте его.

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

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

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

В строке 15 я использую стрелочную функцию для создания нового блока на основе класса, который мы написали ранее. Я передаю ему 0 для индекса, текущее время, строку, указывающую, что это Genesis Block, и предыдущий хэш 0. Теперь у нас есть первый блок, и мы почти закончили! Блок генезиса особенный, но каждый второй блок будет использовать ту же формулу в будущем.

Здесь я пишу nextBlock функцию, которая принимает только последний блок и данные нового блока в качестве параметров. Затем функция создает новый блок и устанавливает индекс нового блока равным тому, каким был индекс предыдущего блока, и добавляет 1, захватывает текущее время, а затем захватывает хэш предыдущего блока и устанавливает его как prevHash в новом блоке. Этот последний шаг, хотя и представляет собой крошечный фрагмент кода, чрезвычайно важен. Это связывает каждый блок с предыдущим блоком через хеш. Допустим, кто-то хотел изменить цепочку блоков биткойнов так, чтобы выглядело так, будто они получили больше биткойнов, чем на самом деле, или чтобы все выглядело так, как будто они потратили меньше своих биткойнов. Если они изменили блок, хэш, который служит снимком данных, содержащихся в блоке при его создании, больше не будет совпадать. Чтобы исправить это, им пришлось бы перефразировать блок. Поскольку все блоки связаны вместе и указывают на хэш предыдущего блока, этому человеку также придется изменить все блоки в цепочке, следующие за своим целевым блоком, чтобы он выглядел законным.

В то время как современные компьютеры могут изменить блок, сгенерировать новый хэш, а затем сгенерировать новые хеши для всех следующих блоков, чтобы измененный блок считался законным, биткойн, в частности, реализует метод под названием `` Доказательство работы '', чтобы замедлить подтверждение. новых блоков, что делает это практически невозможным. Кроме того, из-за распределенной сети реестров, на которую опирается блокчейн, злоумышленник должен будет контролировать более 50% сети, чтобы их поддельный блокчейн был принят. Наш блокчейн не будет распространяться или использовать доказательства работы, но это чрезвычайно умное решение проблемы, и эти темы требуют собственных объяснений.

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

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

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

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

Вот ответ всего кода для простого блокчейна, если вы хотите поэкспериментировать с ним.

Также прочтите

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик