Uma Blockchain em 200 linhas de código

Esse artigo foi traduzido originalmente de: A blockchain in 200 lines of code escrito por Lauri Hartikka.

O conceito básico de blockchain é bastante simples: um banco de dados distribuído que mantém uma lista cada vez maior de registros ordenados.
No entanto, é facilmente confundível , que quando normalmente falamos sobre blockchains, também falamos sobre os problemas que estamos tentando resolver com eles. Este é o caso dos populares projetos baseados em cadeias de blocos, como Bitcoin e Ethereum. O termo “blockchain” geralmente está fortemente vinculado a conceitos como transações, contratos inteligentes ou cripto moedas.

Isso faz com que o entendimento sobre blockchain seja uma tarefa necessariamente mais difícil, do que deveria ser. Especialmente escrever um código-fonte sobre blockchain com sabedoria. Logo abaixo o autor Lauri Hartikka demonstrará em 200 linhas de Javascript o projeto chamado NaiveChain.

Estrutura do Bloco

O primeiro passo lógico é decidir a estrutura do bloco. Para manter as coisas tão simples quanto possível, incluímos apenas o mais necessário: índice, timestamp, data, hash e hash anterior.

O hash do bloco anterior deve ser encontrado no bloco para preservar a integridade da cadeia

Bloco hash

O bloco precisa ser esboçado para manter a integridade dos dados. Um SHA-256 é tomado sobre o conteúdo do bloco. Deve-se notar que este hash não tem nada a ver com “mineração”, uma vez que não existe um problema de Prova de Trabalho a ser resolvido.

Gerando um Bloco

Para gerar um bloco, devemos conhecer o hash do bloco anterior e criar o resto do conteúdo necessário (= index, hash, data e timestamp). Os dados do bloco é algo fornecido pelo usuário final.

Armazenando os blocos

Um Array Javascript em memória é usada para armazenar a cadeia de blocos. O primeiro bloco da cadeia de blocos é sempre chamado de “bloco gêneses”, que é codificado.

Validando a integridade dos blocos

Em qualquer momento, devemos ser capazes de validar se um bloco ou uma cadeia de blocos são válidos em termos de integridade. Isso é verdade, especialmente quando recebemos novos blocos de outros nós e devemos decidir aceitá-los ou não.

Escolhendo a cadeia mais longa

Deve sempre haver apenas um conjunto explícito de blocos na cadeia em um determinado momento. Em caso de conflitos (por exemplo, dois nós geram o número de bloco 72), escolhemos a cadeia que possui o maior número de blocos.

Comunicação com outros nós

Uma parte essencial de um nó é compartilhar e sincronizar o bloco com outros nós. As seguintes regras são usadas para manter a rede em sincronia.

  • Quando um nó gera um novo bloco, ele o transmite para a rede
  • Quando um nó se conecta a um novo número, ele consulta o último bloco
  • Quando um nó encontra um bloco com um índice maior do que o atual bloco conhecido, ele adiciona o bloco a sua corrente atual ou a consulta com a blockchain completa.
Alguns cenários de comunicação típicos que se seguem quando os nós obedecem ao protocolo descrito.

Não é utilizada uma descoberta automática de pares. A localização (= URLs) dos pares deve ser adicionada manualmente.

Controlando o nó

O usuário deve ser capaz de controlar o nó de alguma forma. Isso é feito configurando um servidor HTTP.

Como visto, o usuário pode interagir com o nó das seguintes maneiras:

  • Listar todos os blocos
  • Crie um novo bloco com um conteúdo fornecido pelo usuário
  • Listar ou adicionar pares

A maneira mais direta de controlar o nó é com Curl:

#get all blocks from the node
curl http://localhost:3001/blocks

Arquitetura

Deve notar-se que o nó realmente expõe dois servidores web: um para o usuário controlar o nó (servidor HTTP) e um para a comunicação peer-to-peer entre os nós. (Servidor HTTP do Websocket)

Os principais componentes do NaiveChain.

Conclusão

O NaiveChain foi criado para fins de demonstração e aprendizagem. Uma vez que não possui um algoritmo de “mineração” (PoS of PoW), ele não pode ser usado em uma rede pública. No entanto, implementa os recursos básicos para uma blockchain funcional.

Você pode verificar o repositório Github para obter detalhes mais técnicos.

Thank you very much Lauri Hartikka for sharing the knowledge. Blockchain will still revolutionize!