从零开始用 Golang 构建区块链

在本文中,我们将重点关注从头开始的 Go 区块链开发。 但是,在我们开始之前,您应该确保您熟悉 Golang 中的基本概念。 如果不是,那么明智的做法是先了解初步概念,然后再回到区块链。 

那么,让我们直接进入主题。 

从新目录开始 

我们将首先建立一个新目录。 让我们假设这个目录的名称为“blockchain”。 我们将在命令提示符中输入代码(或者如果您使用的是 macOS 或 Linux,则必须使用终端)。 因此,我们键入:

cd 去工作区 

mkdir 区块链 

cd区块链 

代码。

随着 VS Code 打开,我们将在命令提示符中创建一个 Go 模块。 我们如何做到这一点? 好吧,我们输入:

去 mod init github.com/golang-company/blockchain

在 main.go 中编码 

接下来,我们将创建一个名为“main.go”的 Go 源文件,并在其中键入代码。 但首先让我们了解什么是区块链。 一个 blockchain 可以定义为分散并分布在多个对等方之间的公共数据库。 区块链允许数据库自我纠正,即使节点产生不准确的数据。 

通常,区块链上的一个块由我们在数据库中共享的数据、哈希和前一个块的加密哈希组成。 

 那么,你准备好了吗 去区块链开发? 伟大的! 让我们开始吧。 

编程部分 

在本节中,我们将研究 main.go 文件。 

包主

进口 (

“字节”

“加密/sha256” 

“fmt” 

)

类型 Cryptoblock 结构 {

哈希 [] 字节 

数据[]字节 

PrevHash[]字节 

}

  • 如您所见,只创建了一个结构。 

func (c *Cryptoblock) BuildHash() {

详细信息 := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

哈希:= sha256.Sum256(详细信息)

c.Hash = 哈希[ : ]

}

  • 我们现在将构建一个方法,使我们能够根据数据和先前的哈希生成哈希。 我们将导入“字节”库,因为我们将使用它。
  • 下一步是创建一个名为 details 的变量并使用数据类型字节。 我们将使用 Join() 连接字节切片。

详细信息 := bytes.Join([][] byte{c.Data, c.PrevHash}, []byte{}) 

在这里,我们正在获取一个 2D 字节切片,我们传输 c.Data 和之前的哈希。 然后我们将合并空的字节片。 

  • 在此之后,我们将借助 sum256 散列函数在细节上创建实际散列。 我们可以使用它,因为我们将导入 sha256 库。 
  • 接下来,我们将创建的哈希推送到块的哈希字段中。 

func BuildBlock(数据字符串,prevHash[]字节)*Cryptoblock {

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

块.BuildHash()

返回块

  • 我们现在将构建一个能够创建 Block 的函数。 该函数接受一串数据作为输入,来自前一个块的 prevHash 作为输入,然后输出对 Cryptoblock 的引用。 我们将使用块构造函数构建块。 
  • &Cryptoblock 充当对块的引用。 对于 Hash 字段,我们合并了一个空的字节切片。 对于数据字段,我们获取数据字符串并将其转换为字节切片。 我们将 prevHash 合并到 PrevHash 字段中。 
  • 最后,我们在块上调用 BuildHash() 并返回块。 

键入区块链结构 {

块 []*加密块

}

  • 需要一种有助于表达区块链的类型。 我们实现了一个结构来实现这一点。 类型 BlockChain 结构由指向 Cryptoblock 的指针数组组成。

func (链 *BlockChain) AddBlock(数据字符串) {

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

新 := BuildBlock(data, prevBlock.Hash)

链块 = 附加(链块,新)

}

  • 在这里,我们正在创建一种方法,使我们能够将块加入链中。 该方法检索区块链指针。 在此之后,它接受一个数据字符串。 
  • 调用chain.blocks,我们进入区块链中的前一个区块。 接下来,我们传递了区块链的长度 [len(chain.blocks)-1]。
  • 在新变量中,我们调用 BuildBlock 函数并传递数据字符串和 prevBlock.Hash。
  • 通过使用 append 函数,将其添加到 chain.blocks,然后我们将新块附加到区块链。

func Inception() *密码块{

返回 BuildBlock(“初始”,[]byte{})

}

  • 下一步是创建一个名为 Inception 的函数,该函数将描述区块链的第一个区块。 我们将在函数中返回一个新的 BuildBlock,以及第一个块中的数据。 这里。 我已经合并了“Inception”和一个代表空的先前哈希的字节片。 

func InitBlockChain() *区块链 {

返回 &BlockChain{[]*Cryptoblock{Inception()}}

}

  • 为了创建第一个区块链,我引入了 InitBlockChain 函数。 在这里,我只是返回对 BlockChain 的特定引用。 接下来,我们构建一个 Cryptoblock 数组,在其中调用 Inception 函数。 

func main(){

链 := InitBlockChain()

chain.AddBlock(“Inception 后的第一个块”)

chain.AddBlock(“Inception 之后的第二个区块”)

chain.AddBlock(“Inception 之后的第三个区块”)

对于_,块:=范围链.块{

fmt.Printf(“上一个哈希: %x\n”, block.PrevHash)

fmt.Printf(“块中的数据: %s\n”, block.Data)

fmt.Printf(“哈希: %x\n”, block.Hash)

}

}

  • 最后,我们到达了 main 函数。 如您所见,我们调用了 InitBlockChain() 并将其分配给链变量。 
  • 接下来,我们通过 chain.AddBlock 向链中添加块,并传递必要的数据。 
  • 在此之后,我们运行一个 for 循环来检查区块链。 然后我们挑出每个块并打印每个块内的字段。 我们只需输入:

fmt.Printf(“上一个哈希: %x\n”, block.PrevHash)

fmt.Printf(“块中的数据: %s\n”, block.Data)

fmt.Printf(“哈希: %x\n”, block.Hash)

输出: 

因此,我们可以说该计划是成功的。 我希望你能够理解 Golang 中区块链概念的实现。 只要继续练习,您将能够处理复杂的项目。 

您的加密货币值得最好的安全性。 得到 Ledger 硬件钱包仅需 79 美元!

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