С момента своего неблагоприятного начала в качестве академической концепции более десяти лет назад до нынешней возросшей популярности в различных сферах бизнеса, криптовалюты и поддерживающая их технология блокчейн пережили невероятный всплеск.
Технология блокчейн привлекает большое внимание, потому что она может обеспечить децентрализацию, повысить безопасность в условиях отсутствия доверия и ускорить процедуры.
Python уже давно является предпочтительным языком программирования для разработки блокчейнов. Но по мере распространения этой невероятной технологии росли и альтернативы программирования, и Node.js не остался позади.
В этой статье я объясню, как создать простой блокчейн Node.js для криптовалюты. Это не будет очень сложно, этого достаточно, чтобы помочь вам понять, как работает блокчейн.
Что такое Node.Js
Node.js — это очень популярная среда выполнения, которую используют такие известные приложения, как Twitter, PayPal и LinkedIn. Разработанный Райаном Далом и впервые выпущенный в 2011 году, Node.js использует V8, движок JavaScript с открытым исходным кодом от Google. Node.js предлагает следующие преимущества:
- js обеспечивает асинхронное программирование, управляемое событиями, что устраняет блокирующие процессы. Это улучшает масштабируемость.
- Это высокопроизводительная среда выполнения.
- Разработчики со знанием JavaScript могут легко изучить Node.js, и это повысит их продуктивность.
- Потоковую передачу данных проще реализовать с помощью Node.js.
- Тысячи совместно используемых модулей и инструментов с открытым исходным кодом обогащают экосистему, которая также может похвастаться активным сообществом разработчиков.
- Базы данных NoSQL с открытым исходным кодом, такие как MongoDB, используют JavaScript, поэтому разработчик JavaScript может легко реализовать их.
Подходы к разработке блокчейна с помощью Node.Js
Как видно из приведенного выше обзора блокчейна и различных платформ, при разработке блокчейна нужно многое запланировать. Вот они:
- Определите, нужен ли вам блокчейн.
- Решите, нужен ли вам крипто-токен.
- Вам нужно выбрать между публичным и частным блокчейном.
- Необходимо выбрать правильную платформу, которая ускорит ваш проект.
- Вам нужно выбрать правильные инструменты для вашего развития.
Этот пост даст вам знания и навыки, необходимые для начала работы, если вы являетесь разработчиком JavaScript и хотите с головой окунуться в расширяющийся мир криптовалют. В качестве альтернативы, если вы хотите узнать больше о том, как работают криптовалюты, этот урок может вам помочь.
ПРЕДПОЛАГАЕМЫЕ ТРЕБОВАНИЯ #
Для правильного выполнения этого руководства вам необходимо следующее:
- На вашем компьютере настроен Node.js.
- редактор кода, такой как Sublime Text, Visual Studio Code или другая программа.
Давайте начнем…
Что такое блокчейн?
Технология, лежащая в основе цифровых валют, таких как Биткойн и Эфириум, называется блокчейн. Это передовая технология распределенной публичной бухгалтерской книги, которая отслеживает растущую коллекцию документов, известных как блоки, которые безопасно связаны с помощью шифрования.
Способ хранения данных транзакций — в блоках, которые связаны друг с другом, образуя цепочку, — дал название термину «блокчейн». Количество совершенных транзакций приводит к увеличению размера блокчейна.
Все законные данные транзакций записываются в сети блокчейн, которая регулируется согласованными стандартами одноранговой сети. Эта информация может включать, например, запись транзакций (например, когда стороны обмениваются товарами и услугами) или привилегии прав (например, когда цепочка записывает информацию о праве собственности). Он также может включать «стоимость» блока, выраженную в цифровой валюте.
В дополнение к данным транзакции каждый блок может также включать в себя хэш предыдущего блока, собственное значение одноразового номера, отметку времени для недавно аутентифицированных транзакций и собственный криптографический хэш, который служит уникальным идентификатором или цифровым отпечатком.
Если блок добавляется в цепочку без правильного хэша предыдущего блока, вся цепочка блоков может стать недействительной, поскольку каждый новый блок должен ссылаться на предыдущий блок. Функция неизменности блокчейнов необходима для их безопасности.
Кроме того, для поддержания легитимности блокчейна часто используются различные протоколы консенсуса. Все участники должны достичь консенсуса, чтобы транзакции, подтвержденные сетью, были приняты.
Доказательство работы — это один из популярных согласованных протоколов, который идентифицирует число, которое решает сложную математическую задачу после приложения определенных вычислительных усилий.
Фундаментальная цель работы с доказательствами состоит в том, чтобы любому, кто использует сеть блокчейнов, было сложно идентифицировать, а просто проверить этот номер. В результате это предотвращает рассылку спама и вмешательство в структуру блокчейна.
Добавление нового блока в блокчейн для большинства криптовалют требует решения сложного математического уравнения, которое со временем усложняется по мере расширения блокчейна. Таким образом, любой, кто продемонстрирует свои усилия, решив эту задачу, вознаграждается виртуальными деньгами, процесс, известный как «майнинг», в качестве оплаты.
Как создать блок
Теперь, когда технология блокчейна была объяснена, давайте посмотрим, как мы можем использовать концепции для создания блока. Как уже было установлено, блокчейн состоит из взаимосвязанных блоков.
Для создания валюты BlockSolCoin
я буду использовать классы JavaScript, представленные в ES6.
Готовый?
Запачкаем руки…
Вот код для класса CryptoBlock
:
const SHA256 = require('crypto-js/sha256'); class CryptoBlock{ constructor(index, timestamp, data, precedingHash=" "){ this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); } computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString(); } }
Как вы можете видеть в приведенном выше коде, я создал класс CryptoBlock
и добавил к нему метод constructor()
— так же, как это делается в любом другом классе JavaScript. Затем для инициализации его свойств я присвоил методу constructor
следующие параметры:
index:
Это уникальный номер, который отслеживает положение каждого блока во всей цепочке блоков.
timestamp:
Он ведет учет времени возникновения каждой завершенной транзакции.
data:
Он предоставляет данные о завершенных транзакциях, такие как данные отправителя, данные получателя и количество транзакций.
precedingHash:
Он указывает на хэш предыдущего блока в блокчейне, что важно для поддержания целостности блокчейна.
Кроме того, я использовал метод computeHash
для вычисления хеша блока на основе его свойств, как указано в данных выше.
Как видите, я импортировал библиотеку JavaScript crypto-js и использовал ее модуль crypto-js/sha256
для вычисления хэша каждого блока. Поскольку модуль возвращает числовой объект, я использовал метод toString()
, чтобы преобразовать его в строку.
Чтобы добавить библиотеку crypto-js в свой проект, перейдите в терминал и выполните следующую команду, чтобы установить ее, используя npm
:
npm install --save crypto-js
После выполнения вышеуказанной команды каталог модуля узла, который содержит библиотеку и другие необходимые файлы, будет добавлен в папку вашего проекта.
Как создать блокчейн
Как объяснялось ранее, технология блокчейна основана на концепции, согласно которой все блоки связаны друг с другом. Итак, давайте создадим класс CryptoBlockchain
, который будет отвечать за обработку операций всей цепочки. Здесь резина встречается с дорогой.
Класс CryptoBlockchain
будет поддерживать операции блокчейна, используя вспомогательные методы, выполняющие различные задачи, такие как создание новых блоков и добавление их в цепочку.
Вот код для класса CryptoBlockchain
:
class CryptoBlockchain{ constructor(){ this.blockchain = [this.startGenesisBlock()]; } startGenesisBlock(){ return new CryptoBlock(0, "01/12/2022", "Initial Block in the Chain", "0"); } obtainLatestBlock(){ return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; newBlock.hash = newBlock.computeHash(); this.blockchain.push(newBlock); } }
Позвольте мне рассказать о роли каждого из вспомогательных методов, составляющих класс CryptoBlockchain
.
1. МЕТОД КОНСТРУКТОРА
Этот метод создает экземпляр блокчейна. Внутри конструктора я создал свойство blockchain
, которое ссылается на массив блоков. Обратите внимание, что я передал ему метод startGenesisBlock()
, который создает начальный блок в цепочке.
2. СОЗДАНИЕ БЛОКА ГЕНЕЗИС
В блокчейне блок генезиса относится к первому блоку, созданному в сети. Всякий раз, когда блок интегрируется с остальной частью цепочки, он должен ссылаться на предыдущий блок.
И наоборот, в случае этого начального блока у него нет предшествующего блока, на который можно было бы указать. Поэтому блок генезиса обычно жестко запрограммирован в блокчейне. Таким образом, последующие блоки могут быть созданы на нем. Обычно имеет индекс 0.
Я использовал этот метод startGenesisBlock()
для создания блока генезиса. Обратите внимание, что я создал его с использованием ранее созданного класса CryptoBlock
и передал параметры index
, timestamp
, data
и precedingHash
.
3. ПОЛУЧЕНИЕ ПОСЛЕДНЕГО БЛОКА
Получение последнего блока в блокчейне помогает гарантировать, что хэш текущего блока указывает на хэш предыдущего блока, тем самым поддерживая целостность цепочки.
Я использовал этот метод obtainLatestBlock()
, чтобы получить его.
4. ДОБАВЛЕНИЕ НОВЫХ БЛОКОВ
Я использовал этот метод addNewBlock()
, чтобы добавить новый блок в цепочку. Для этого я устанавливаю предыдущий хэш нового блока равным хэшу последнего блока в цепочке, тем самым обеспечивая защиту цепочки от несанкционированного доступа.
Поскольку свойства нового блока меняются при каждом новом вычислении, важно снова вычислить его криптографический хэш. После обновления хэша новый блок помещается в массив блокчейна.
На самом деле добавить новый блок в цепочку блоков не так просто из-за нескольких проверок. Тем не менее, для этой простой криптовалюты достаточно продемонстрировать, как работает блокчейн.
Тестирование блокчейна
Теперь давайте протестируем нашу простую цепочку блоков и посмотрим, работает ли она.
Вот код:
let BlockSolCoin = new CryptoBlockchain(); BlockSolCoin.addNewBlock(new CryptoBlock(1, "01/12/2022", {sender: "Aditya", recipient: "Mike", quantity: 50})); BlockSolCoin.addNewBlock(new CryptoBlock(2, "01/12/2022", {sender: "Mike", recipient: "Ricardo", quantity: 100}) ); console.log(JSON.stringify(BlockSolCoin, null, 4));
Как видно из приведенного выше кода, я создал новый экземпляр класса CryptoBlockchain
и назвал его BlockSolCoin. Я добавил два блока в блокчейн, используя произвольные значения. В параметре data
я использовал объект и добавил данные отправителя, данные получателя и количество транзакций.
Когда я запускаю код на терминале, вот что я получаю:
Как проверить целостность блокчейна
Одной из основных особенностей блокчейна, как уже было установлено, является то, что после добавления блока в цепочку его нельзя изменить, не ставя под угрозу целостность остальной части цепочки.
В результате я предоставит классу CryptoBlockchain метод checkChainValidity() для подтверждения целостности блокчейна.
Поскольку каждое изменение содержимого блока генерирует совершенно новый хэш, аннулирующий блокчейн, хэши необходимы для гарантии подлинности и безопасности. блокчейна.
Метод также проверит, указывают ли друг на друга хэши каждых двух последовательных блоков. Если целостность блокчейна не нарушена, возвращается true; в противном случае, в случае каких-либо аномалий, возвращается false.
Вот код:
checkChainValidity(){ for(let i = 1; i < this.blockchain.length; i++){ const currentBlock = this.blockchain[i]; const precedingBlock= this.blockchain[i-1]; if(currentBlock.hash !== currentBlock.computeHash()){ return false; } if(currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; }
Как добавить доказательство работы
Как уже было установлено, доказательство работы — это концепция, используемая для усложнения майнинга или добавления новых блоков в блокчейн.
Для BlockSolCoin я буду использовать простой алгоритм, который не позволит пользователям быстро создавать новые блоки или спамить блокчейн.
Поэтому я добавлю в класс CryptoBlock новый метод ProofOfWork ().
По сути, этот простой подход определяет число, передаваемое как свойство сложности, так что ведущие нули хэша каждого блока соответствуют заданному уровню сложности.
Требуется много вычислительной мощности, чтобы убедиться, что хэш каждого блока начинается с количества нулей, указанного уровнем сложности. Время, необходимое для добычи новых блоков, увеличивается с увеличением сложности.
Ограничения по уровню сложности все еще могут быть соблюдены при перехешировании, потому что я также добавлю случайное значение nonce в каждый хешированный блок.
Вот код:
proofOfWork(difficulty){ while(this.hash.substring(0, difficulty) !==Array(difficulty + 1).join("0")){ this.nonce++; this.hash = this.computeHash(); } }
А вот обновленный метод computeHash()
с включенной переменной nonce
:
computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)+this.nonce).toString(); }
Кроме того, чтобы реализовать механизм доказательства работы при генерации новых блоков, я включу его в метод addNewBlock()
:
addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); }
Подведение итогов
const SHA256 = require("crypto-js/sha256"); class CryptoBlock { constructor(index, timestamp, data, precedingHash = " ") { this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); this.nonce = 0; } computeHash() { return SHA256( this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } proofOfWork(difficulty) { while ( this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0") ) { this.nonce++; this.hash = this.computeHash(); } } } class CryptoBlockchain { constructor() { this.blockchain = [this.startGenesisBlock()]; this.difficulty = 4; } startGenesisBlock() { return new CryptoBlock(0, "01/12/2022", "Initial Block in the Chain", "0"); } obtainLatestBlock() { return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock) { newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); } checkChainValidity() { for (let i = 1; i < this.blockchain.length; i++) { const currentBlock = this.blockchain[i]; const precedingBlock = this.blockchain[i - 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; } } let BlockSolCoin = new CryptoBlockchain(); console.log("BlockSolCoin mining in progress...."); BlockSolCoin.addNewBlock( new CryptoBlock(1, "01/12/2022", { sender: "Aditya", recipient: "Mike", quantity: 50 }) ); BlockSolCoin.addNewBlock( new CryptoBlock(2, "01/12/2022", { sender: "Mike", recipient: "Ricardo", quantity: 100 }) ); console.log(JSON.stringify(BlockSolCoin, null, 4));
Если я запускаю код на терминале, вот что я получаю:
Как вы можете видеть на изображении выше, хэши теперь начинаются с четырех нулей, что соответствует уровню сложности, установленному в механизме проверки работоспособности.
Заключение
Ну вот! Итак, используя Node.js, вы можете создать базовый блокчейн криптовалюты.
Конечно, BlockSolCoin все еще находится в стадии разработки. На самом деле, если вы запустите его без каких-либо дополнительных улучшений, он вряд ли удовлетворит потребительский спрос на безопасные, надежные и удобные цифровые деньги, оставив вас единственным пользователем.
Тем не менее, я надеюсь, что это видео дало вам фундаментальные знания, необходимые для погружения в увлекательный мир криптовалют.
Пожалуйста, поделитесь любыми отзывами или вопросами в комментариях ниже.