Blockchain é sem dúvida uma das tecnologias mais difundidas da última década. Se você já ouviu falar de blockchain, mas não o entende completamente, tudo bem! Neste artigo, mostrarei como o Blockchain funciona construindo-o do zero com apenas 50 linhas de código JavaScript.

Antes de começarmos, quero observar que este artigo será mais fácil de seguir se você souber alguma linguagem de programação. Mas não se preocupe se você não fizer isso, porque vou tentar o meu melhor para explicar cada pedaço de código em detalhes. Antes de tudo, precisamos entender como o blockchain é criado.

Blockchain, como o próprio nome indica, é formado por vários blocos ligados em uma cadeia.


Cada bloco normalmente contém as seguintes informações:

  • Data:  isso pode ser qualquer coisa como dados de transação
  • Hash Value: este é basicamente o ID do bloco
  • Previous Hash Value: isso mantém o controle do ID do bloco anterior. Por enquanto, você só precisa saber que usamos esse valor para formar uma cadeia entre o bloco atual e o bloco anterior. Explicarei por que esse valor é importante mais adiante no artigo
  • Timestamp: isso nos diz quando o bloco é criado
  • Proof of Work: este é um número que mostra o esforço para encontrar o valor de hash do bloco atual. Se você já ouviu falar em mineração, esse valor representa quanto tempo leva (na forma de um número) para as máquinas calcularem o valor de hash.

    Na vida real, um bloco é muito mais complexo do que isso, mas tentamos simplificar aqui para o entendimento.

Criando a classe dos blocos

Vamos criar uma classe chamada “Block” dentro de um arquivo index.js vazio.

O construtor desta classe aceita 2 argumentos. O primeiro é o valor de hash do bloco anterior e o segundo são os dados do bloco atual.

Dentro do constructor, inicializamos os dados do bloco com os argumentos do construtor. Definimos timeStamp como a hora atual e proofOfWork como zero.

Lembra quando eu disse que precisamos calcular o valor do hash? Sim, o valor de hash não é apenas uma string aleatória, precisamos encontrar o valor de hash atual com base nos dados atuais e no hash anterior por questões de segurança.

Se um hacker altera os dados de um bloco, ele também precisa recalcular os valores de hash de todos os blocos à frente para tornar a cadeia válida (isso pode levar milhares de anos.

Para quem não sabe sobre hash, é basicamente como convertemos nossos dados em um monte de caracteres aleatórios. Por exemplo, a palavra “hello” pode ser transformada em “e2d48e7bc…”. Como o hash funciona apenas em uma direção, é fácil encontrar a saída do hash dada a entrada, mas é super difícil prever a entrada da saída do hash.

Vamos verificar a função calculateHash

A função basicamente gera o valor hash baseado na combinação do hash anterior, dados atuais, timestamp atual e prova de trabalho.

Nós usamos a função de crypto-js pacote npm. Este pacote basicamente disponibiliza para nós utilizarmos diversos métodos de hash.

Usamos o Secure Hash Algorithm 256 (SHA 256) neste tutorial. Como você pode ver, importamos o hash no topo do arquivo.

Vejamos a função final da classe Block. A função mina.

Essa função mine continua aumentando o proofOfWork até encontrarmos um hash começando com o número 0 desejado (chamamos isso de dificuldade). Quanto maior a dificuldade, mais tempo leva para o hash ser criado. Isso ocorre porque a única maneira de encontrar a entrada da saída de hash é tentar entradas diferentes uma a uma.

Curiosidade: o valor de hash de um bloco Bitcoin requer 18 zeros, o que leva cerca de 10 minutos para todos os computadores em sua rede blockchain serem criados.

Se você já ouviu pessoas falando sobre mineração de criptomoedas, é assim que funciona nos bastidores. Eles investem em supermáquinas para calcular o hash de um novo bloco e recebem uma série de criptomoedas como recompensa.

Você pode se perguntar por que tem que ser tão complexo?

Imagine se criar um hash fosse simples e rápido, os dados armazenados no blockchain seriam facilmente alterados. Portanto, o valor de hash é criado de maneira tão complexa que, mesmo que um bloco seja hackeado, levará uma eternidade para atualizar todos os blocos seguintes. É por isso que o Blockchain é tão seguro.

Se você leu até aqui, sinta-se à vontade para dar um tapinha nas costas porque criamos com sucesso um Bloco em Blockchain.

A próxima parte é criar o Blockchain para armazenar todos os blocos.

Criando uma classe blockchain

Vamos criar a classe Blockchain

Nosso array Blockchain armazena 1 chamada chain . Também adicionaremos um genesisBlock à cadeia. O bloco de gênese é basicamente o primeiro bloco da cadeia. Portanto, poderíamos passar “0” como o valor de hash anterior, pois não há bloco anterior.

Em seguida, implementaremos a função addBlock que adiciona um novo bloco à cadeia

Esta função aceita novos dados como parâmetro e cria um novo bloco com base nesses dados e no hash do bloco anterior.

Lembre-se que quando criamos um novo bloco, temos que calcular seu valor de hash usando a função mine. Para torná-lo rápido, eu apenas defino a dificuldade para 2, então o novo valor de hash deve começar com 2 zeros.

Depois de encontrar o valor do hash, só precisamos adicionar o novo bloco à cadeia.

Finalmente, precisamos da função isValid para validar se a corrente atual é válida ou não.

Esta função basicamente passa por cada bloco (exceto o genesis) e verifica se há alguma violação no valor do hash. Retorna true se não houver violação.

Parabéns! Você construiu com sucesso um blockchain.

Vamos ver como isso funcion

a na seção de exemplo abaixo.

Usando o exemplo

Vamos tentar adicionar 2 novos blocos que contenham informações de transições ao nosso blockchain.

Nosso blockchain ficará assim depois de adicionar esses 2 valores.

Se você notar, o previousHash de cada bloco é exatamente o mesmo que o hash do bloco anterior.

Imagine que David, que é o destinatário da primeira transação, quer mais dinheiro e modifica os dados do bloco assim.

A blockchain será inválida porque o novo valor de hash do primeiro bloco é diferente de seu hash calculado anteriormente.

Boa tentativa, Davi! A quantidade de dinheiro pode mudar, mas todo o blockchain é inválido. David deve recalcular o hash de cada bloco para torná-lo válido. Isso é impossível na vida real!

É isso para o meu artigo de hoje. Espero que você ache útil entender mais sobre blockchain.

Sinta-se à vontade para deixar um comentário se tiver alguma dúvida e siga-me para ler mais sobre desenvolvimento de software e tecnologia. Obrigado por ler!

Abaixo você encontra o código fonte full deste mencionado aqui no artigo

const hash = require("crypto-js/sha256");
class Block {
  constructor(previousHash, data) {
    this.data = data;
    this.hash = this.calculateHash();
    this.previousHash = previousHash;
    this.timeStamp = new Date();
    this.proofOfWork = 0;
  }

  calculateHash() {
    return hash(
        this.previousHash + 
        JSON.stringify(this.data) +
        this.timeStamp +
        this.proofOfWork
    ).toString();
  }

  mine(difficulty) {
    while (!this.hash.startsWith("0".repeat(difficulty))) {
      this.proofOfWork++;
      this.hash = this.calculateHash();
    }
  }
}

class Blockchain {
  constructor() {
    let genesisBlock = new Block("0", { isGenesis: true });
    this.chain = [genesisBlock];
  }

  addBlock(data) {
    let lastBlock = this.chain[this.chain.length - 1];
    let newBlock = new Block(lastBlock.hash, data);
    newBlock.mine(2); // find a hash for new block
    this.chain.push(newBlock);
  }

  isValid() {
    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;
  }
}