Создаем блокчейн в 50 строк на NodeJS
Мы создадим упрощенную версию того, что может быть блокчейном, и я сосредоточусь на процессе добычи, а не на том, как спроектировать сетевую систему между несколькими узлами.
Кроме того, поскольку NodeJS является однопоточным языком, я не могу рекомендовать его использовать для майнинга. Эта статья предназначена исключительно для того, чтобы прояснить, как работает блокчейн.
Нам понадобятся два основных файла:
- blockchain.JSON будет хранить данные Blockchain
- app.js для приложения
Я не буду описывать каждую строку кода, поскольку я уже добавил комментарии к исходному коду.
blockchain.JSON будет хранить архитектуру данных Blockchain:
[
{
"id": "0",
"timestamp": 0,
"nonce": 0
}
]
app.js:
// Sha3 - это модуль для хеширования документов
const { SHA3 } = require("sha3");
const hash = new SHA3(256);
const fs = require("fs");
const fileName = "./blochain.json";
// Мы начинаем наш nonce с 0
let nonce = 0;
// Сложность блокчейна. Чем больше вы добавите 0, тем сложнее будет добывать блок
const difficulty = "000";
// Переключатель, чтобы завершить цикл while
let notFounded = true;
// Функция, используемая для обновления вашей цепочки блоков
const updateBlockchain = (id, timestamp, nonce) => {
let blockchain = require(fileName);
// Создаем новый Блок
const addBlock = {
id: id,
timestamp: timestamp,
nonce: nonce
};
// Добавляем в блокчейн
blockchain.push(addBlock);
fs.writeFile(
fileName,
JSON.stringify(blockchain, null, 2),
function writeJSON(err) {
if (err) return console.log(err);
}
);
};
// Функция майнинга блока
const mining = () => {
var start = new Date().getTime();
// Импортируем блокчейн
const blockchain = require(fileName);
while (notFounded) {
// Нам нужно сбрасывать наш хеш в каждом цикле
hash.reset();
// Мы хэшируем новые данные (блок + одноразовый номер)
hash.update(JSON.stringify(blockchain) + nonce);
let hashed = hash.digest("hex");
// ЕСЛИ новые хешированные данные начинаются с «000»
if (hashed.startsWith(difficulty)) {
var diff = (new Date().getTime() - start) / 1000;
// Выключаем переключатель, чтобы завершить цикл while
notFounded = false;
console.log("\x1b[46m%s\x1b[0m", "//// FOUNDED ! ////");
console.log(`Hash : ${hashed}`);
console.log(`Nonce : ${nonce}`);
console.log(`Total time : ${diff}s`);
console.log("\x1b[46m%s\x1b[0m", "//// ////");
// Выполняем updateBlockchain
updateBlockchain(hashed, Date.now(), nonce);
} else {
// ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: если вы хотите, чтобы процесс майнинга был быстрее, удалите или закомментируйте следующий console.log ()
console.log(hashed);
// Мы увеличиваем значение nonce и снова запускаем цикл
nonce++;
}
}
};
// Запускаем майнинг
mining();
Чтобы запустить приложение:
Сначала установите yarn npm -g yarn
Затем установите sha3 yarn add sha3
И все! Вы готовы начать майнинг с помощью node app.js
. Если хотите, вы можете улучшить сложность, добавив больше 0 к постоянной сложности.
Репо под лицензией MIT:
Contribute to Icesofty/blockchain-demo development by creating an account on GitHub.