Aprenda como validar transações e adicionar novos blocos à blockchain usando o mecanismo de mineração.
No arquivo block.js, adicione o método mineBlock na classe Block para realizar o processo 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 ?
Como Funciona a Prova de Trabalho (Proof-of-Work)?
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:
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! 🚀
0 Comentários