在本文中,我们将重点关注从头开始的 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/