Как построить простой блокчейн криптовалюты в Node.js
Опубликовано: 2022-03-10smashingCoin
, используя концепции классов JavaScript и Node.js. Попробуйте — это проще, чем вы думаете!Беспрецедентный рост криптовалют и лежащей в их основе технологии блокчейна покорил мир — от скромного начала академической концепции более десяти лет назад до текущего более широкого внедрения в различных отраслях.
Технология блокчейн привлекает большое внимание из-за ее способности повышать безопасность в ненадежных средах, обеспечивать децентрализацию и повышать эффективность процессов.
Традиционно Python был де-факто языком программирования для разработки блокчейнов. Однако с распространением этой удивительной технологии возможности разработки также увеличились — и Node.js не остался в стороне.
В этом уроке я расскажу о том, как создать простой блокчейн криптовалюты в Node.js. Это не будет слишком причудливо, но этого достаточно, чтобы помочь вам понять, как работает блокчейн.
Я назову эту простую криптовалюту smashingCoin
.
Если вы являетесь разработчиком JavaScript и хотите совершить прыжок в бурно развивающуюся область криптовалют, эта статья предоставит вам необходимые навыки для начала работы. Или, если вам интересно, как обстоят дела в мире криптовалют, то это руководство может помочь ответить на некоторые из ваших вопросов.
Рекомендуемая литература : Понимание целостности подресурсов, Дрю Маклеллан.
Предпосылки
Чтобы успешно следовать этому руководству, вам потребуется следующее:
- Node.js установлен на вашем компьютере. Вы можете скачать его отсюда;
- Редактор кода, например Visual Studio Code, Sublime Text или любой другой.
Давайте начнем…
Что такое блокчейн?
Блокчейн — это технология, которая поддерживает цифровые валюты, такие как Биткойн и Эфириум. Это инновационная технология распределенной публичной бухгалтерской книги, которая поддерживает постоянно растущий список записей, называемых блоками, которые надежно связаны с использованием криптографии.
Термин « блокчейн » получил свое название из-за того, как он хранит данные транзакций, то есть в блоках , которые связаны друг с другом для создания цепочки . Размер блокчейна растет с увеличением количества совершаемых транзакций.
Любые действительные данные транзакций регистрируются в сети блокчейна, которая регулируется правилами одноранговой сети, установленными участниками. Например, эти данные могут содержать «стоимость» блока, например, в цифровых валютах, запись транзакций (например, когда стороны обмениваются товарами и услугами) или привилегии, например, когда цепочка записывает информацию о праве собственности.
Помимо данных транзакции, каждый блок может содержать свой собственный криптографический хэш (уникальный идентификатор или цифровой след), собственное значение nonce (произвольное случайное число, используемое один раз в криптографических вычислениях), хеш предыдущего блока и метку времени недавнего. аутентифицированные транзакции.
Поскольку каждый новый блок должен указывать на предыдущий блок, если блок включается в цепочку без правильного хэша последнего блока, это может сделать всю цепочку блоков недействительной. Это свойство неизменности является ключом к безопасности блокчейнов.
Кроме того, для поддержания подлинности блокчейна часто применяются различные типы протоколов консенсуса. Консенсус гарантирует, что все участники согласны с транзакциями, проверенными сетью.
Например, широко используемый консенсусный протокол является доказательством работы, целью которого является определение числа, которое находит решение сложной математической задачи после выполнения определенного объема вычислительной работы.
Основная идея работы с доказательствами заключается в том, что любой участник сети блокчейна должен счесть этот номер трудным для идентификации, но легко проверяемым. Следовательно, это препятствует рассылке спама и вмешательству в структуру блокчейна.
В случае с большинством криптовалют добавление нового блока в блокчейн требует решения сложного математического уравнения, сложность которого со временем возрастает по мере роста блокчейна. Следовательно, любой человек, который доказывает, что он проделал работу, решая эту проблему, получает компенсацию в виде цифровой валюты в процессе, называемом «майнинг».
Как создать блок
Теперь, после знакомства с технологией блокчейн и ее работой, давайте посмотрим, как мы можем применить эти концепции при создании блока. Как упоминалось ранее, блоки — это то, что связывается друг с другом, образуя цепочку блоков.
Чтобы создать валюту smashingCoin
, я буду использовать классы 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
и добавил к нему методstructor 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/01/2020", "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 smashingCoin = new CryptoBlockchain(); smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50})); smashingCoin.addNewBlock(new CryptoBlock(2, "01/07/2020", {sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100}) ); console.log(JSON.stringify(smashingCoin, null, 4));
Как видно из приведенного выше кода, я создал новый экземпляр класса CryptoBlockchain
и назвал его smashingCoin
. Затем я добавил два блока в блокчейн, используя произвольные значения. В параметре data
я использовал объект и добавил сведения об отправителе, сведения о получателе и количество транзакций.
Если я запускаю код на терминале, вот что я получаю:
Вот как выглядит smashingCoin
! Это объект, содержащий свойство blockchain
, которое представляет собой массив, содержащий все блоки в цепочке. Как вы можете видеть на изображении выше, каждый блок ссылается на хэш предыдущего блока. Например, второй блок ссылается на хэш первого блока. Протестировав и убедившись, что наш блокчейн работает, давайте добавим еще несколько функций, чтобы улучшить возможности smashingCoin
.
Как проверить целостность блокчейна
Как упоминалось ранее, ключевой характеристикой блокчейна является то, что после добавления блока в цепочку его нельзя изменить без нарушения целостности остальной части цепочки.
Поэтому для проверки целостности блокчейна я добавлю метод checkChainValidity()
в класс CryptoBlockchain
.
Хэши имеют решающее значение для обеспечения достоверности и безопасности блокчейна, поскольку любое изменение содержимого блока приведет к созданию совершенно нового хэша и аннулированию блокчейна.
Таким образом, метод checkChainValidity()
будет использовать операторы if
для проверки того, был ли подделан хэш каждого блока. Начиная с первого созданного блока, он будет перебирать весь блокчейн и проверять его достоверность. Обратите внимание, что, поскольку блок генезиса был жестко запрограммирован, он не будет проверен.
Кроме того, метод проверит, указывают ли друг на друга хэши каждых двух последовательных блоков. Если целостность блокчейна не нарушена, возвращается 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; }
Как добавить доказательство работы
Как упоминалось ранее, доказательство работы — это концепция, применяемая для увеличения сложности, связанной с майнингом или добавлением новых блоков в блокчейн.
В случае smashingCoin
я буду использовать простой алгоритм, который удерживает людей от простого создания новых блоков или рассылки спама в блокчейне.
Итак, в класс CryptoBlock
я добавлю еще один метод с именем proofOfWork().
По сути, этот простой алгоритм идентифицирует число, переданное как свойство difficulty
, так что хэш каждого блока содержит начальные нули, соответствующие этому уровню difficulty
.
Обеспечение того, чтобы хэш каждого блока начинался с количества нулей, заданного на уровне difficulty
, требует больших вычислительных мощностей. Чем выше уровень сложности, тем больше времени требуется для добычи новых блоков.
Кроме того, я добавлю случайное значение 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); }
Подведение итогов
Вот весь код для создания криптовалюты smashingCoin
с использованием Node.js:
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/01/2020", "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 smashingCoin = new CryptoBlockchain(); console.log("smashingCoin mining in progress...."); smashingCoin.addNewBlock( new CryptoBlock(1, "01/06/2020", { sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50 }) ); smashingCoin.addNewBlock( new CryptoBlock(2, "01/07/2020", { sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100 }) ); console.log(JSON.stringify(smashingCoin, null, 4));
Если я запускаю код на терминале, вот что я получаю:
Как вы можете видеть на изображении выше, хэши теперь начинаются с четырех нулей, что соответствует уровню сложности, установленному в механизме проверки работоспособности.
Заключение
Вот и все! Вот как вы можете создать простой блокчейн криптовалюты, используя Node.js.
Конечно, криптовалюта smashingCoin
далека от завершения. На самом деле, если вы выпустите ее без дополнительных улучшений, она вряд ли удовлетворит текущие потребности рынка в безопасной, надежной и интуитивно понятной цифровой валюте, что сделает вас единственным, кто ее использует!
Тем не менее, я надеюсь, что это руководство снабдило вас некоторыми базовыми навыками, которые помогут вам освоиться в захватывающем мире криптовалют.
Если у вас есть какие-либо комментарии или вопросы, пожалуйста, оставьте их ниже.
Дополнительные ресурсы
- «Блокчейн 101», CoinDesk
- «Биткойн: одноранговая электронная кассовая система», Сатоши Накамото, Bitcoin.org