Сб. Фев 24th, 2024

Как пример реализации блокчейна на Node.js можно использовать следующий код. Этот пример демонстрирует простую реализацию блокчейна с возможностью создания транзакций и добавления их в блоки.

const crypto = require('crypto');

class Transaction {
  constructor(sender, recipient, amount) {
    this.sender = sender;
    this.recipient = recipient;
    this.amount = amount;
    this.timestamp = new Date();
    this.hash = this.calculateHash();
  }

  calculateHash() {
    const data = this.sender + this.recipient + this.amount + this.timestamp;
    return crypto.createHash('sha256').update(data).digest('hex');
  }
}

class Block {
  constructor(timestamp, transactions, previousHash = '') {
    this.timestamp = timestamp;
    this.transactions = transactions;
    this.previousHash = previousHash;
    this.hash = this.calculateHash();
    this.nonce = 0;
  }

  calculateHash() {
    const data = this.timestamp + JSON.stringify(this.transactions) + this.previousHash + this.nonce;
    return crypto.createHash('sha256').update(data).digest('hex');
  }

  mineBlock(difficulty) {
    while (this.hash.substring(0, difficulty) !== Array(difficulty + 1).join('0')) {
      this.nonce++;
      this.hash = this.calculateHash();
    }
    console.log('Block mined:', this.hash);
  }
}

class Blockchain {
  constructor() {
    this.chain = [this.createGenesisBlock()];
    this.difficulty = 2;
    this.pendingTransactions = [];
    this.miningReward = 100;
  }

  createGenesisBlock() {
    return new Block(new Date(), [], '0');
  }

  getLatestBlock() {
    return this.chain[this.chain.length - 1];
  }

  minePendingTransactions(miningRewardAddress) {
    const rewardTransaction = new Transaction(null, miningRewardAddress, this.miningReward);
    this.pendingTransactions.push(rewardTransaction);

    const block = new Block(new Date(), this.pendingTransactions, this.getLatestBlock().hash);
    block.mineBlock(this.difficulty);

    console.log('Block successfully mined!');
    this.chain.push(block);

    this.pendingTransactions = [];
  }

  createTransaction(transaction) {
    this.pendingTransactions.push(transaction);
  }

  getBalanceOfAddress(address) {
    let balance = 0;

    for (const block of this.chain) {
      for (const transaction of block.transactions) {
        if (transaction.sender === address) {
          balance -= transaction.amount;
        }

        if (transaction.recipient === address) {
          balance += transaction.amount;
        }
      }
    }

    return balance;
  }

  isChainValid() {
    for (let i = 1; i < this.chain.length; i++) {
      const currentBlock = this.chain[i];
      const previousBlock = this.chain[i - 1];

      if (currentBlock.hash !== currentBlock.calculateHash()) {
        return false;
      }

      if (currentBlock.previousHash !== previousBlock.hash) {
        return false;
      }
    }

    return true;
  }
}

// Usage

const blockchain = new Blockchain();

blockchain.createTransaction(new Transaction('address1', 'address2', 100));
blockchain.createTransaction(new Transaction('address2', 'address1', 50));

console.log('\nStarting the miner...');
blockchain.minePendingTransactions('miner-address');

console.log('\nBalance of address1:', blockchain.getBalanceOfAddress('address1'));
console.log('Balance of address2:', blockchain.getBalanceOfAddress('address2'));
console.log('Balance of miner:', blockchain.getBalanceOfAddress('miner-address'));

console.log('\nStarting the miner again...');
blockchain.minePendingTransactions('miner-address');

console.log('\nBalance of address1:', blockchain.getBalanceOfAddress('address1'));
console.log('Balance of address2:', blockchain.getBalanceOfAddress('address2'));
console.log('Balance of miner:', blockchain.getBalanceOfAddress('miner-address'));

В этом примере создается простой блокчейн с возможностью создания транзакций и их добавления в блоки. Блоки майнятся с использованием алгоритма Proof-of-Work (доказательство работы), где блок должен быть «добыт» с определенной сложностью. Каждый блок содержит список транзакций, хэш предыдущего блока и свой собственный хэш. Каждая транзакция имеет отправителя, получателя, сумму и временную метку.

Приведенный пример является упрощенной реализацией блокчейна в целях демонстрации и образовательных целей. В реальных проектах блокчейн может иметь более сложную архитектуру и множество дополнительных функций.

От admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

PHP Code Snippets Powered By : XYZScripts.com