Criando a base da estrutura de uma blockchain simples em Node.js.
Elementos principais de um Blockchain:
- 1. Blocos: Contêm dados, o hash do bloco anterior e um hash próprio.
- 2. Hash: Identificador único gerado a partir do conteúdo do bloco.
- 3. Encadeamento: Cada bloco referencia o hash do anterior, formando uma cadeia.
- 4. Proof-of-Work ( PoW ): Processo que valida blocos resolvendo um problema computacional.
Crie um novo projeto Node.js
2. Instale dependências necessárias
Para essa introdução, usaremos apenas o módulo crypto, que já está embutido no Node.js.
Estrutura do projeto:
3. Criando a Classe Block
Abra o arquivo block.js e comece criando a classe Block:
4. Criando o Bloco Gênesis
Agora, no mesmo arquivo, crie a classe Blockchain para iniciar a cadeia de blocos:
5. Testando o Blockchain
No arquivo app.js, inicialize e teste a cadeia de blocos:
mkdir meuBlockchain
cd meuBlockchain
npm init -y
2. Instale dependências necessárias
Para essa introdução, usaremos apenas o módulo crypto, que já está embutido no Node.js.
Estrutura do projeto:
meuBlockchain/
├── block.js
├── blockchain.js ├── app.js └── package.json
3. Criando a Classe Block
Abra o arquivo block.js e comece criando a classe Block:
const crypto = require('crypto');
class Block {
constructor(index, timestamp, data, previousHash = '') {
this.index = index; // Posição do bloco na cadeia
this.timestamp = timestamp; // Data e hora do bloco
this.data = data; // Dados armazenados no bloco
this.previousHash = previousHash; // Hash do bloco anterior
this.hash = this.calculateHash(); // Hash do bloco atual
this.nonce = 0; // Contador usado na 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');
}
}
module.exports = Block;
4. Criando o Bloco Gênesis
Agora, no mesmo arquivo, crie a classe Blockchain para iniciar a cadeia de blocos:
const Block = require('./block');
class Blockchain {
constructor() {
this.chain = [this.createGenesisBlock()]; // Inicia com o bloco Gênesis
}
// Gera o Bloco Gênesis
createGenesisBlock() {
return new Block(0, "2024-01-01", "Bloco Gênesis", "0");
}
// Retorna o último bloco da cadeia
getLatestBlock() {
return this.chain[this.chain.length - 1];
}
// Adiciona um novo bloco à cadeia
addBlock(newBlock) {
newBlock.previousHash = this.getLatestBlock().hash; // Define o hash anterior
newBlock.mineBlock(this.difficulty); // Minera o bloco
this.chain.push(newBlock); // Adiciona à cadeia
}
}
module.exports = Blockchain;
5. Testando o Blockchain
No arquivo app.js, inicialize e teste a cadeia de blocos:
const Blockchain = require('./blockchain');
// Inicializa o blockchain
const myBlockchain = new Blockchain();
// Adiciona novos blocos
myBlockchain.addBlock(new Block(1, "2024-01-02", { amount: 100 }));
myBlockchain.addBlock(new Block(2, "2024-01-03", { amount: 50 }));
// Exibe o blockchain completo
console.log(JSON.stringify(myBlockchain, null, 4));
6 .Executando o Projeto
Execute o programa:
O resultado deve mostrar os hashes dos blocos minerados e a estrutura da blockchain:
Próximos Passos
Agora que você tem uma blockchain funcional com mineração básica, no próximo tutorial vamos implementar transações e um sistema de tokens. Fique ligado no blog! 🚀
Execute o programa:
node index.js
O resultado deve mostrar os hashes dos blocos minerados e a estrutura da blockchain:
{
"chain": [
{
"index": 0,
"timestamp": "2024-01-01",
"data": "Bloco Gênesis",
"previousHash": "0",
"hash": "0000abcd... (hash do bloco)",
"nonce": 1234
},
{
"index": 1,
"timestamp": "2024-01-02",
"data": { "amount": 100 },
"previousHash": "0000abcd...",
"hash": "0000efgh... (hash do bloco)",
"nonce": 5678
},
{
"index": 2,
"timestamp": "2024-01-03",
"data": { "amount": 50 },
"previousHash": "0000efgh...",
"hash": "0000ijkl... (hash do bloco)",
"nonce": 91011
}
]
}
Próximos Passos
Agora que você tem uma blockchain funcional com mineração básica, no próximo tutorial vamos implementar transações e um sistema de tokens. Fique ligado no blog! 🚀
0 Comentários