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/