Если мы посмотрим на тенденции последних нескольких лет, мы все время слышали о блокчейне, но мало о специфике.
Мы все знаем, что криптовалюты, такие как Биткойн, Эфириум, Dogecoin, Matic и другие, основаны на технологии блокчейн. Блокчейн возглавил важные события, которые произвели революцию во многих отраслях в 2021 году и проложили путь к новым достижениям.
Блокчейн — это способ хранения данных, который трудно или невозможно изменить, взломать или обмануть. Это цифровой реестр транзакций, которые дублируются и распространяются по всей сети компьютерных систем блокчейна.
Это новаторская технология баз данных, на которой основаны практически все криптовалюты. Блокчейн невероятно затрудняет взлом или обман системы путем распространения идентичных копий базы данных по всей сети.
Хотя Биткойн в настоящее время является наиболее популярным применением блокчейна, эта технология может использоваться в очень широком спектре приложений.
Криптовалюты и блокчейны в последние годы становятся все более популярными, и ожидается, что эта тенденция сохранится.
В этом уроке мы создадим простую цепочку блоков с помощью JavaScript. Это даст вам базовое понимание того, как работает блокчейн.
Давайте назовем это MelodyCoin и приступим к делу!
Создание блока
Для начала мы создадим новый файл JavaScript, в который мы поместим весь наш код.
Назовем его main.js и начнем с описания того, как должны выглядеть блокчейн и блоки.
Создайте класс Block и назначьте ему функцию Object() { [собственный код] } для начала.
Вы должны указать дату и хэш предыдущего блока при создании нового блока:
Вот определения для каждого свойства:
- Отметка времени указывает, когда был создан блок. Вы можете использовать любой выбранный вами формат (в данном случае метку времени UNIX).
- Любая форма данных, которую вы хотите подключить к этому блоку, может быть включена в параметр данных. Если вы хотите создать криптовалюту, вы можете сохранить данные транзакции, такие как отправитель/получатель и сумма денег, перемещенных здесь.
- previousHash — это строка, содержащая хэш предыдущего блока. Это то, что будет генерировать цепочку блоков, что позже будет иметь решающее значение для обеспечения целостности нашей цепочки блоков.
Создание хэшей
Каждый блок связан с предыдущим блоком (таким образом, свойство previousHash). То есть для каждого блока требуется хэш. Хэш похож на отпечаток пальца. Он индивидуален для каждого блока.
Хэш блока можно вычислить, передав все его содержимое через хеш-функцию.
Итак, начнем с реализации функции, которая вычисляет хэш текущего блока.
Итак, в классе Block мы определяем функцию calculateHash:
Однако хэш SHA256 не поддерживается JavaScript и должен быть получен из внешней библиотеки.
Crypto-js — это фантастический пакет, который включает в себя безопасные реализации нескольких алгоритмов хеширования.
Затем мы можем импортировать его в наш код main.js.
Теперь, когда у нас есть функция calculateHash(), давайте применим ее в функции нашего блока:
Описав, как выглядит блок, мы можем определить, как должен выглядеть блокчейн. Итак, давайте создадим новый класс.
В этом сценарии блокчейн — это очень простой объект, имеющий цепочку свойств. Это массив, содержащий все блоки в цепочке.
Прежде чем мы сможем добавлять блоки, мы должны сначала создать то, что известно как «блок генезиса». Это первый блок в цепочке, и он уникален тем, что не может указывать на предыдущий блок (он первый!).
Итак, чтобы построить блок генезиса, я добавлю в наш класс функцию с именем createGenesisBlock(). Вернемся к функции Object() { [собственный код]} нашего класса Blockchain.
Теперь мы можем включать блок генезиса в любое время, когда мы создаем новый экземпляр Blockchain:
Методы блокчейна
Теперь давайте добавим в наш класс Blockchain методы, которые позволят нам делать такие вещи, как добавление новых блоков и получение самого последнего блока.
Функция getLatestBlock является самой простой. Он просто возвращает последний элемент массива цепочки:
Техника addBlock немного сложнее.
Прежде чем мы сможем добавить новый блок в нашу цепочку, мы должны сначала соответствующим образом установить значение поля previousHash этого блока.
Он должен быть установлен на хэш последнего добавленного блока в нашу цепочку. Нам также нужно вычислить хэш нового блока:
Тестирование
Давайте посмотрим, как вышла наша MelodyCoin.
Для этого создайте экземпляр блокчейна. Добавим еще пару блоков:
Там мы сделали два новых блока. Давайте посмотрим, как сейчас выглядит наш блокчейн.
MelodyCoin будет преобразован в строку и отформатирован с четырьмя пробелами:
Проверьте целостность блокчейна
Блокчейны — это фантастика, потому что после добавления блока его нельзя изменить без аннулирования оставшейся части цепочки.
Однако у меня нет способа проверить целостность нашей цепочки блоков с помощью этой реализации.
Давайте введем функцию isChainValid в нашу цепочку блоков. Если цепочка легитимна, она вернет true; в противном случае он вернет false:
Проверка целостности
Теперь мы можем проверить целостность нашего блокчейна. Если мы выполним его сейчас, это подтвердит, что наша цепочка подлинная.
Давайте теперь попробуем вмешаться в нашу цепочку блоков. Давайте изменим блок 2 и перезапишем его содержимое (допустим, мы перевели 100 монет вместо четырех).
Когда мы выполним это, мы увидим, что программное обеспечение распознает наши попытки вмешательства в цепочку.
Однако вы можете поверить, что у меня есть другой способ вмешаться в это. Я изменил содержимое в блоке, но не пересчитывал хеш. Так что можно попробовать проявить хитрость и пересчитать хэш того же блока.
Это все, что было в нашей крошечной настройке блокчейна! Это позволяет нам добавлять новые блоки и обнаруживать фальсификацию данных в цепочке.
Есть две проблемы с нашим небольшим блокчейном, которые мы должны решить:
- Современные компьютеры чрезвычайно быстры и могут добавить тысячи блоков в нашу цепочку за секунды. Мы, очевидно, не хотим, чтобы кто-то спамил наш блокчейн.
- Наш блокчейн по-прежнему уязвим для взлома. Вы можете обновить содержимое блока, а затем просто пересчитать хэши (и предыдущие хэши) для всех следующих блоков. Даже если вы с этим запутаетесь, вы получите законную цепочку.
Чтобы решить эти проблемы, блокчейны используют технику, известную как «доказательство работы». Вы должны продемонстрировать, что использовали значительный объем вычислительных ресурсов для создания блока с использованием этого подхода. Это также называется добычи полезных ископаемых.
Доказательство работы требует, чтобы хэш блока начинался с определенного количества нулей. Но как узнать, соответствует ли ваш хэш этому правилу?
Содержимое блока определяет его хэш. Таким образом, мы всегда получаем один и тот же хеш, если не изменяем содержимое.
Каждый блок должен иметь значение nonce, добавленное к нему в качестве решения. По сути, это какие-то случайные данные, которые мы можем обновлять до тех пор, пока хэш нашего блока не будет начинаться с достаточного количества нулей. Поскольку вы не можете изменить вывод хеш-функции, вам нужно протестировать множество различных комбинаций и надеяться на лучшее.
Внедрение майнинга в блокчейн
Давайте начнем с включения одноразового номера в наш класс Block. Nonce — это единственное значение в нашем блоке, которое мы можем изменить, чтобы повлиять на хэш блока.
Мы не можем изменить метку времени или данные.
Далее давайте напишем функцию mineBlock(), которая будет выполнять фактическую добычу блока. Этой функции будет отправлена необходимая сложность в качестве параметра, и она будет продолжать выполняться до тех пор, пока хэш нашего блока не будет начинаться с достаточного количества нулей.
Я только что сделал базовый цикл while, который будет работать до тех пор, пока наш хеш не будет начинаться с достаточного количества нулей. Мы используем трудность, чтобы определить, сколько нулей необходимо. При сложности 5 наш хэш должен начинаться с 5 нулей.
Когда наш хэш не содержит достаточного количества нулей, мы увеличиваем одноразовый номер на единицу и пересчитываем хэш. И если мы находим хэш, соответствующий сложности, мы записываем его в консоль.
Нам нужно сделать еще одну вещь. На самом деле мы не учитываем переменную nonce в нашем методе calculateHash, так что вот она:
Класс блокчейна
Давайте проверим этот новый подход в нашем классе блокчейна и посмотрим, как он пойдет.
Для начала я определю сложность нашего блокчейна в функции Object(). Мы определяем его здесь, так как мы можем использовать его где-нибудь позже.
Затем функция addBlock должна быть изменена таким образом, чтобы она извлекала блок перед добавлением его в нашу цепочку.
Используйте блокчейн
Теперь давайте задействуем нашу новую цепочку блоков с алгоритмом проверки работоспособности. Здесь добавьте пару операторов console.log.
Когда мы выполняем этот код, мы можем заметить, что процесс майнинга больше не является особенно быстрым.
Алгоритму требуется некоторое время для генерации блоков с хэшами, начинающимися с трех нулей (в зависимости от сложности).
Так что это был конец нашей базовой настройки блокчейна.
Мы можем регулировать скорость добавления новых блоков в нашу цепочку блоков благодаря механизму проверки работоспособности.
Это самая важная функция безопасности в блокчейнах. И теперь, когда вы понимаете, как это работает, приступайте к созданию своего собственного!
Оставьте комментарий