DevGang
Авторизоваться

Создаем блокчейн в 50 строк на NodeJS

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

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

Нам понадобятся два основных файла:

  1. blockchain.JSON будет хранить данные Blockchain
  2. app.js для приложения

Я не буду описывать каждую строку кода, поскольку я уже добавил комментарии к исходному коду.

blockchain.JSON будет хранить архитектуру данных Blockchain:

blockchain.JSON
[
  {
    "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:

Источник:

#NodeJS #Blockchain
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу