Concrete Logo
Hamburger button

Como implementar o Blockchain em JavaScript

  • Blog
  • 7 de Fevereiro de 2018
Share

Ouvimos falar sobre Bitcoin, Ethereum além de outras moedas praticamente todos os dias. 2017, afinal, foi o ano das cryptocurrencies. Neste post, porém, não vou focar em nenhuma dessas moedas digitais, mas sim na tecnologia por trás delas, que muitas pessoas dizem ser tão revolucionárias quanto a própria internet, o Blockchain.

A ideia é implementar o passo a passo de uma versão simplificada do Blockchain em JavaScript e ir explicando como essa tecnologia disruptiva funciona por baixo dos panos.

Então, continue lendo este post para aprender:

  • O que é e como funciona o Blockchain
  • Proof of Work?
  • Para que servem os Blocos
  • O que é Mineração

Introdução

O Blockchain parece uma tecnologia de outro mundo e gera muitas dúvidas. Apesar disso, é algo extremamente fácil de definir:

O Blockchain nada mais é do que um banco de dados aberto e distribuído.

Esse banco de dados é composto de Blocos. E todos esses Blocos são ligados entre si em uma sequência. Daí o nome, Blockchain (cadeia de blocos).

Além disso, esse banco de dados é imutável.

E faz sentido que seja.

Imagina se fosse possível que alguém, intencionalmente. modificasse sua conta. Agora os 10 Bitcoins que você possui viraram 1.

Blocos

Vamos começar a implementação pela parte mais fácil: os Blocos. A estrutura de um Bloco deve possuir os seguintes campos:

  • index
  • timestamp
  • hash
  • previousHash
  • data

Crédito da imagem

index e o timestamp são campos comuns em praticamente todos bancos de dados. O campo data serve principalmente pra guardar transações, mas podemos também colocar outras informações. O hash é calculado internamente e serve para manter a integridade de cada Bloco e a segurança de todo o sistema (como vamos ver no final do post). E, por final, o previousHash, elo de ligação que liga cada Bloco ao seu Bloco anterior.

Com isso, temos a primeira implementação de um Bloco:

A função generateHash usa a biblioteca externa crypto-js pra gerar o hash seguindo o padrão sha256.

Parece complicado, mas tudo o que você precisa saber é que essa função vai receber uma string, como por exemplo:

E vai retornar uma string encriptada:

Blockchain

Agora que já temos uma versão mínima de um Bloco, já podemos começar a construir o Blockchain, que, como falei anteriormente, é uma sequência de Blocos ligados entre si.

Com isso, essa é a primeira versão do Blockchain:

No construtor da classe, temos o array de Blocos inicializado já com o Genesis Block (o primeiro bloco criado no registro do Bitcoin). Adicionei também o index para poder incrementar toda vez que um novo Bloco for adicionado no Blockchain.

Além disso, duas funções foram criadas:

  • getLastBlock
  • addBlock

A primeira é extremamente simples, ela serve para pegar o último Bloco que foi criado.

A segunda é uma um pouco mais complicada, mas também não é nada de outro mundo. Ela serve para adicionar novos Blocos ao Blockchain.

Integridade

Apesar de a versão anterior já funcionar razoavelmente bem, precisamos adicionar alguma garantia de que o Blockchain não tenha sido alterado por algum ataque malicioso.

Precisamos adicionar uma nova função para checar a integridade do Blockchain:

Lembrando que para verificarmos a integridade do Blockchain precisamos garantir três características:

  • Se o hash de cada Bloco foi gerado corretamente
  • Se o index dos Blocos está em sequência
  • Se os Blocos estão ligados entre si através dos hashes

Com essa simples função podemos testar se as modificações maliciosas foram feitas e se o Blockchain deve ser invalidado:

E finalmente com isso já temos uma primeira versão básica e funcional do Blockchain em JavaScript:

Problemas

Apesar de já termos uma versão inicial funcionando, ainda podemos melhorar bastante a nossa implementação.

Um dos problemas com essa versão atual é que usuários podem criar novos Blocos de forma muito rápida, podendo invalidar o Blockchain, ou coisas ainda piores. Não vou entrar em muitos detalhes dessa particularidade da tecnologia, mas esse post faz um excelente trabalho nesse sentido.

Em resumo, precisamos de alguma ferramenta que não permita que os usuários possam criar Blocos desenfreadamente.

Proof of Work

O conceito de Proof of Work, como o próprio nome já sugere, é um mecanismo que faz com que um usuário tenha um trabalho computacional significativo ao realizar determinada tarefa.

Essa ferramenta já era utilizada antes do Bitcoin ser inventado para evitar, por exemplo, spams e ataques DoS.

No Bitcoin, o Proof of Work funciona da seguinte forma: o hash que é gerado automaticamente em cada Bloco deve começar com uma quantidade X de zeros, dependendo da dificuldade geral do sistema.

Por exemplo, se a dificuldade geral do sistema for 1, esse hash é inválido porque não começa com um zero:


Porém, esse outro hash é válido porque começa com um zero:

Sempre que um usuário for criar um novo Bloco, ele vai precisar criar diversos hashes até que um deles tenha a quantidade de zeros no começo fazendo com que a regra geral do sistema seja atendida.

Ah, o nome disso é Mineração.

Lembrando que quanto maior o número de zeros que devem estar no começo do hash, maior o poder computacional necessário para a tarefa.

Dito isso, vamos agora implementar a versão final do Blockchain com a Mineração.

Primeiramente, vamos alterar os Blocos.

No construtor, adicionamos os campos difficulty (dificuldade geral do sistema) e nonce (quantidade de tentativas até que o hash correto seja criado). Além disso, temos também um chamada para a função mine.


A função mine vai criar hashes até que a quantidade de zeros à esquerda do hash seja atentida.

Lembrando que para que os hashes criados sejam diferentes, devemos adicionar o campo nonce na função generateHash:


Com isso temos a versão final dos Blocos com a Mineração:

Agora basta alterarmos o Blockchain para que o campo difficulty seja passado para os Blocos:

E é só isso. 🙂

Lembrando que o código está todo no GitHub.

Ah! E se você quiser saber mais sobre o Blockchain, ouça esse ProdCast.

Outras implementações:

  • https://www.savjee.be/2017/07/Writing-tiny-blockchain-in-JavaScript/
  • https://medium.com/@lhartikk/a-blockchain-in-200-lines-of-code-963cc1cc0e54
  • https://github.com/openblockchains/awesome-blockchains/blob/master/blockchain.js/blockchain_with_proof_of_work.js

É desenvolvedor web/mobile e quer trabalhar em times ágeis, criando produtos desafiadores? Mande seu currículo para trabalheconosco@concrete.com.br.