Like On Facebook

header ads

4. Minerando Blocos

 https://assets.bizclikmedia.net/900/abd383e3db86c66034944d9d36d030f9:29cf2f6f4743a00f171baa61a24e8e65/gettyimages-892082986-jpg.webp

Aprenda como validar transações e adicionar novos blocos à blockchain usando o mecanismo de mineração.


O que é Mineração ?

  Mineração é o processo de validar e adicionar transações à blockchain. Envolve resolver um problema computacional complexo conhecido como proof-of-work ( prova de trabalho ).

Por que é necessário ?
  • Segurança: Evita que blocos sejam adicionados de forma fraudulenta.
  • Consenso: Garante que todos os participantes concordem sobre o estado atual da blockchain.
  • Recompensa: Os mineradores recebem um incentivo, como tokens, ao validar blocos. 

Como Funciona a Prova de Trabalho (Proof-of-Work)?
  • O objetivo é encontrar um hash que atenda a um critério específico, como começar com um número fixo de zeros (000...).
  • Para alcançar isso, o minerador incrementa um número (chamado nonce) até que o hash válido seja gerado.
 
1. Implementando o Método mineBlock

  No arquivo block.js, adicione o método mineBlock na classe Block para realizar o processo de mineração:
 
 class Block {
     constructor(index, timestamp, data, previousHash = '') {
         this.index = index;
         this.timestamp = timestamp;
         this.data = data;
         this.previousHash = previousHash;
         this.hash = this.calculateHash();
         this.nonce = 0; // Número incrementado durante a mineração
     }

     // Calcula o hash do bloco
     calculateHash() {
         return crypto
             .createHash('sha256')
             .update(this.index + this.timestamp + JSON.stringify(this.data) + this.previousHash + this.nonce)
            . digest('hex');
     }

     // Realiza a mineração do bloco
     mineBlock(difficulty) {
         // Enquanto o hash não começar com o número de zeros equivalente à dificuldade, continue ajustando o nonce
         while (!this.hash.startsWith('0'.repeat(difficulty))) {
             this.nonce++;
             this.hash = this.calculateHash();
         }
         console.log(`Bloco minerado: ${this.hash}`);
     }
 }

 

2. Recompensa para Mineradores


  Adicione uma recompensa para o minerador na classe Blockchain. Isso será feito por meio de transações especiais que transferem tokens para o endereço do minerador. 

No arquivo blockchain.js, adicione o seguinte código:

Definir Recompensa e Minerar Transações
 class Blockchain {
     constructor() {
         this.chain = [this.createGenesisBlock()];
         this.difficulty = 2; // Nível de dificuldade
         this.pendingTransactions = []; // Transações pendentes
         this.miningReward = 50; // Recompensa para mineradores
     }

     // Minera as transações pendentes
     minePendingTransactions(minerAddress) {
         // Cria uma transação de recompensa para o minerador
         const rewardTransaction = { from: "Sistema", to: minerAddress, amount: this.miningReward };
         this.pendingTransactions.push(rewardTransaction);

         // Cria um novo bloco com as transações pendentes
         const newBlock = new Block(
             this.chain.length,
             Date.now().toString(),
             this.pendingTransactions,
             this.getLatestBlock().hash
         ;

         // Minera o bloco
         newBlock.mineBlock(this.difficulty);

         // Adiciona o bloco à blockchain
         this.chain.push(newBlock);

         // Limpa as transações pendentes
         this.pendingTransactions = [];
     }
 }

3. Testando a Mineração

No arquivo app.js, teste o sistema de mineração. Atualize o código para incluir transações e mineração:
 const Blockchain = require('./blockchain');
 const Transaction = require('./transaction');
 const myBlockchain = new Blockchain();

 // Adiciona uma transação
 myBlockchain.addTransaction({ from: "Alice", to: "Bob", amount: 50 });

 // Minera as transações
 console.log("\nMinerando bloco...");
 myBlockchain.minePendingTransactions("Minerador1");

 // Exibe saldos
 console.log("\nSaldos:");
 console.log("Alice:", myBlockchain.pendingTransactions); // Exibe transações não mineradas
 console.log("Minerador1:", "Recompensa de mineração recebida!");

 // Adiciona mais transações e minera outro bloco
 myBlockchain.addTransaction({ from: "Bob", to: "Charlie", amount: 20 });

 console.log("\nMinerando outro bloco...");
 myBlockchain.minePendingTransactions("Minerador2");

 // Exibe saldos atualizados
 console.log("\nSaldos atualizados:");
 console.log(myBlockchain.chain);


4. Executando o Código

Execute o programa:
 node app.js
Saída esperada:
 Minerando bloco...
 Bloco minerado: 000f1e1ad1...

 Saldos:
 Alice: 50 tokens transferidos para Bob
 Minerador1: Recompensa de 50 tokens recebida.

 Minerando outro bloco...
 Bloco minerado: 000a7d4c3b...

 Saldos atualizados:
 Bob: Transferiu 20 tokens para Charlie
 Minerador2: Recompensa de 50 tokens recebida.

O que Aprendemos?

  Como implementar a mineração com prova de trabalho. Como criar um sistema de recompensa para incentivar os mineradores. Como testar a mineração e verificar os saldos na blockchain.

Próximos Passos

  No próximo tutorial, vamos explorar como expandir nossa blockchain para suportar uma rede descentralizada de nós e sincronizar os dados entre eles! 🚀

Postar um comentário

0 Comentários