Construir um Blockchain em Golang do zero

Neste artigo, vamos nos concentrar no desenvolvimento de blockchain Go a partir do zero. No entanto, antes de começarmos, você deve ter certeza de que está familiarizado com os conceitos básicos de Golang. Caso contrário, é aconselhável passar pelos conceitos preliminares e depois voltar ao blockchain. 

Então, vamos direto ao assunto. 

Começando com um novo diretório 

Vamos construir um novo diretório para começar. Vamos supor que esse diretório tenha o nome “blockchain”. Vamos digitar o código no Prompt de Comando (ou se você estiver usando macOS ou Linux, você deve usar o Terminal). Assim, digitamos:

cd go-espaço de trabalho 

blockchain mkdir 

blockchain de CD 

código.

À medida que o VS Code for aberto, criaremos um módulo Go no prompt de comando. Como fazemos isso? Bem, digitamos:

vá mod init github.com/golang-company/blockchain

Codificação em main.go 

Em seguida, criaremos um arquivo de origem Go chamado 'main.go' e digitaremos o código nele. Mas primeiro vamos entender o que é blockchain. UMA blockchain pode ser definido como um banco de dados público que é descentralizado e distribuído entre vários pares. Blockchain permite que o banco de dados se corrija, mesmo que um nó esteja produzindo dados imprecisos. 

Normalmente, um bloco em uma blockchain consiste em dados que compartilhamos no banco de dados, um hash e o hash criptográfico do bloco anterior. 

 Então, você está pronto para Vá para o desenvolvimento de blockchain? Excelente! Vamos começar. 

Parte de Programação 

Nesta seção, examinaremos o arquivo main.go. 

pacote principal

importar (

"bytes"

“cripto/sha256” 

"Fmt" 

)

tipo estrutura Cryptoblock {

Hash [] byte 

Dados [] byte 

AnteriorHash [] byte 

}

  • Como você pode ver, um struct foi criado apenas. 

func (c *Cryptoblock) BuildHash() {

detalhes := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

hash := sha256.Sum256(detalhes)

c.Hash = hash[:]

}

  • Vamos agora construir um método que nos permitirá gerar um hash dependendo dos dados e do hash anterior. Importaremos a biblioteca “bytes” porque a usaremos.
  • O próximo passo é criar uma variável chamada detalhes e usar o tipo de dados bytes. Usaremos Join() para conectar as fatias de bytes.

detalhes := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

Aqui, estamos pegando uma fatia 2D de bytes, transmitimos o c.Data e o hash anterior. Então vamos combinar a fatia vazia de bytes. 

  • Depois disso, estamos criando o hash real com a ajuda da função de hash sum256 nos detalhes. Podemos usar isso, pois importaremos a biblioteca sha256. 
  • Em seguida, colocamos o hash criado no campo Hash do bloco. 

func BuildBlock (string de dados, prevHash [] byte) *Cryptoblock {

block := &Cryptoblock{[]byte{}, []byte(data), prevHash}

bloco.BuildHash()

bloco de retorno

  • Vamos agora construir uma função que permite a criação de Block. A função aceita uma string de dados como entrada, prevHash do bloco anterior como entrada e, em seguida, gera uma referência para Cryptoblock. Construiremos o bloco usando o construtor de blocos. 
  • O &Cryptoblock atua como referência ao bloco. Para o campo Hash, incorporamos uma fatia vazia de bytes. Para o campo Dados, pegamos a string de dados e a convertemos em fatia de bytes. E incorporamos prevHash no campo PrevHash. 
  • Por fim, chamamos o BuildHash() no bloco e retornamos o bloco. 

tipo BlockChain struct {

blocos []*Criptobloco

}

  • É necessário um tipo que ajude a expressar o blockchain. E implementamos uma estrutura para fazer isso. O tipo BlockChain struct é composto por uma matriz de ponteiros para Cryptoblock.

func (cadeia *BlockChain) AddBlock(data string) {

prevBlock := chain.blocks[len(chain.blocks)-1]

new := BuildBlock(dados, prevBlock.Hash)

cadeia.blocos = append(cadeia.blocos, novo)

}

  • Aqui, estamos criando um método que nos permite unir um bloco à cadeia. O método recupera o ponteiro do blockchain. Depois disso, ele aceita uma string de dados. 
  • Chamando chain.blocks, chegamos ao bloco anterior no blockchain. Em seguida, passamos o comprimento do blockchain [len(chain.blocks)-1].
  • Na nova variável, estamos chamando a função BuildBlock e estamos passando a string de dados e prevBlock.Hash.
  • Utilizando a função append, adicionando isso ao chain.blocks, anexamos o novo bloco ao blockchain.

func Inception() *Criptobloco {

return BuildBlock(“Início”, []byte{})

}

  • O próximo passo é criar uma função chamada Inception que descreverá o primeiro bloco do blockchain. E retornaremos um novo BuildBlock na função, junto com os dados do primeiro bloco. Aqui. Eu incorporei “Inception” e uma fatia de bytes que representa um hash anterior vazio. 

func InitBlockChain() *BlockChain {

return &BlockChain{[]*Cryptoblock{Inception()}}

}

  • Para criar o primeiro blockchain, introduzi a função InitBlockChain. Aqui, estou apenas retornando a referência específica ao BlockChain. Em seguida, construímos um array de Cryptoblock, onde fazemos uma chamada para a função Inception. 

func main () {

cadeia := InitBlockChain()

chain.AddBlock(“Primeiro bloco após o início”)

chain.AddBlock(“Segundo bloco após o início”)

chain.AddBlock(“Terceiro bloco após o início”)

para _, bloco := intervalo cadeia.blocos {

fmt.Printf(“Hash anterior: %x\n”, block.PrevHash)

fmt.Printf(“Dados no Bloco: %s\n”, bloco.Dados)

fmt.Printf("Hash: %x\n", bloco.Hash)

}

}

  • Finalmente, chegamos à função principal. Como você pode ver, chamamos o InitBlockChain() e o atribuímos à variável chain. 
  • Em seguida, estamos adicionando blocos à cadeia via chain.AddBlock e passamos os dados necessários. 
  • Depois disso, executamos um loop for para verificar o blockchain. Em seguida, destacamos cada bloco e imprimimos os campos dentro de cada bloco. Apenas digitamos:

fmt.Printf(“Hash anterior: %x\n”, block.PrevHash)

fmt.Printf(“Dados no Bloco: %s\n”, bloco.Dados)

fmt.Printf("Hash: %x\n", bloco.Hash)

Saída: 

Assim, podemos dizer que o programa é bem sucedido. Espero que você tenha entendido a implementação do conceito de blockchain em Golang. Continue praticando e você será capaz de lidar com projetos complexos. 

Sua criptografia merece a melhor segurança. Arranje um Carteira de hardware Ledger por apenas US $ 79!

Fonte: https://coinfomania.com/build-a-blockchain-in-golang/