fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Изучите блокчейн, построив единое целое

Изучите блокчейн, построив единое целое

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

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

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

Почему блокчейн?

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

К другим преимуществам относятся:

  • Децентрализованность: Транзакции происходят в сети компьютеров.
  • Неизменность: Если транзакция создана, она не может быть изменена.
  • Открытость: Все транзакции видны всем узлам.
  • Безопасность: Благодаря функции шифрования блокчейн почти всегда безопасен.

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

Предварительные условия

Чтобы следовать и понимать этот учебник, вы должны быть знакомы с этим:

  • Рабочие знания классов и других возможностей ES6 в JavaScript.
  • Установленный на машине NodeJS.

Начало работы с блоком

Ранее мы упоминали о блоках как о коробке, содержащей полезную информацию. Мне нравится думать о блокчейне как о LinkedList (структуры данных), а каждый блок в блокчейне – как узел в LinkedList. Его можно представить как объект в JavaScript, который содержит следующие свойства:

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

Определение класса блоков, обладающих вышеуказанными свойствами.

Вычисление хэша блока

Хэш блока – это идентификатор, сгенерированный с помощью криптографической техники. Мы получим хэш блока путем хэширования хэша предыдущего блока, данных текущего блока, временной метки и PoW с помощью алгоритма SHA256. Для хэширования данных мы будем использовать crypto, встроенную библиотеку NodeJS.

В приведенном выше коде мы сделали следующее:

  • Преобразование данных блока в формат JSON, чтобы мы могли объединить их с другой информацией в виде строки.
  • Конкатенация предыдущего хэша блока, данных, временной метки и доказательства работы (PoW).
  • Сгенерировали хэш для предыдущей конкатенации с помощью алгоритма SHA256.
  • Возвращал результат хэширования в базе 16, со строчными буквами для A-F.

Добыча новых блоков

Майнинг новых блоков подразумевает генерацию хэша блока с определенным количеством ведущих нулей (0). Количество ведущих нулей определяется уровнем сложности текущего блокчейна. Это означает, что если сложность блокчейна равна 3, мы должны сгенерировать блок, начинающийся с трех нулей “000”, например, “000f34abad….”. .

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

Чтобы реализовать это, мы создадим метод mine() для класса Block, который будет постоянно увеличивать значение PoW и вычислять хэш блока до тех пор, пока мы не получим достоверный хэш.

Определите класс Blockchain

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

Мы также объявили статический метод внутри блокчейна, чтобы мы могли инициализировать блокчейн непосредственно с помощью сложности, например const blockchain = Blockchain.create(2) – будет создан экземпляр блокчейна со сложностью 2 вместе с блоком genesis.

Добавление новых блоков в блокчейн

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

Здесь мы добавили метод addBlock в прототип класса Blockchain. Это аналогично определению метода addBlock непосредственно внутри класса.

Объяснение метода addBlock:

  • Собирает детали транзакции (отправитель, получатель и сумма перевода) из параметра.
  • Создает новый блок с деталями транзакции.
  • Добывает новый блок с помощью метода mine класса Block.
  • Помещает вновь созданный блок в свойство chain блокчейна.

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

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

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

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

Поскольку у нас есть полностью функционирующий блокчейн, давайте протестируем все функции, которые мы реализовали до сих пор. Добавьте тестовую функцию в файлы и запустите ее с помощью node из командной строки.

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

Бонус: Регулировка времени и сложности блока

Время блока – это расчетное время, необходимое для добавления нового блока в цепочку после майнинга. Это постоянная величина. Время блока некоторых распространенных платформ составляет 10 минут для Bitcoin и около 13 секунд для Ethereum.

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

новая сложность = старая сложность * (2016 блоков * 10 минут) / время добычи предыдущих 2016 блоков.

Для нашего простого блокчейна мы скорректируем сложность, если новый блок займет больше времени, чем время блока. Если он займет больше времени, мы уменьшим его на 1, в противном случае увеличим на 1.

Мы объявим время блока равным 10 секундам или 10000 миллисекунд. Добавьте свойство blockTime в конструктор Blockchain и задайте ему фиксированное значение, например 10000. Затем отредактируйте метод addBlock, чтобы регулировать сложность после каждой транзакции.

ПРИМЕЧАНИЕ : Не забудьте добавить свойство blockTime в конструктор Blockchain. В противном случае код выдаст ошибку.

Заключение

Сегодня мы узнали, как блокчейн работает под капотом и как создать свой блокчейн с нуля с помощью JavaScript. Исходный код доступен в виде Gist на GitHub, включая корректировки сложности. Более интерактивный код доступен в репозитории GitHub. В нем используется TypeScript. Запустите программу в терминале, чтобы взаимодействовать с блокчейном, который мы сегодня создали.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *