在本系列文章中,我们将在不到 5 分钟的时间内基于 Golang 中的简单区块链实现构建一种简化的加密货币。 你必须先安装 golang 才能制作这个项目。 对于文本编辑器,你可以使用任何东西,这里我使用 Visual Studio Code。
你安装了吗? 好吧,我们开始吧!
如果您已创建项目,请创建一个文件 m去吧。 ok 让我们开始编码,首先我们从 main.go 开始,让我们从“区块链”的 struct Block 部分开始。 在区块链中,它会阻止存储有价值的信息。 例如,比特币区块存储交易,这是任何加密货币的本质。 除此之外,区块还包含一些技术信息,例如版本、当前时间戳和前一个区块的哈希值。 在本文中,我们不会像区块链或比特币规范中描述的那样实现该块,而是使用它的简化版本,其中仅包含重要信息。 它看起来是这样的。 这里我们有一个结构块:
类型块结构{时间戳 time.Time交易[]字符串前哈希[]字节哈希[]字节}
Timestamp
是当前时间戳(创建块时), transactions
是块中包含的实际有价值的信息, prevhas
存储前一个块的哈希值,以及 Hash
是块的哈希值。 在比特币规范中 Timestamp
, prevhash
及 Hash
是块头,它们形成单独的数据结构,交易(transaction
在我们的例子中)是一个单独的数据结构。 因此,为了简单起见,我们在这里将它们混合在一起。
那么我们如何计算哈希值呢? 哈希值的计算方式是区块链的一个非常重要的特性,正是这个特性使得区块链安全。 问题是,计算哈希值是一项计算困难的操作,即使在快速计算机上也需要一些时间(这就是人们购买强大的 GPU 来挖掘比特币的原因)。 这是一种有意的架构设计,这使得添加新块变得困难,从而防止添加后对其进行修改。 我们将在以后的文章中讨论并实现此机制。
现在,我们只需获取块字段,将它们连接起来,然后对连接的组合计算 SHA-256 哈希值。 让我们这样做 Newhash
方法:
func NewHash(time time.Time, transactions []string, prevhash []byte) []byte {输入 := 追加(prevhash, time.String()...)对于交易:=范围交易{输入=附加(输入,字符串(符文(交易))...)}哈希 := sha256.Sum256(输入)返回哈希值[:]}
接下来,遵循 Golang 约定,我们将实现一个函数来简化块的创建并完成:
func Blocks(transactions []string, prevhash []byte) *Block {当前时间 := 时间.Now()返回&阻止{时间戳:时间.时间{},交易: 交易,前哈希: 前哈希,哈希:NewHash(currentTime, transactions, prevhash),}}
我们继续创建打印功能。 打印功能对于打印执行交易的每个块的内容非常有用。 这是代码:
函数打印(块*块){fmt.Printf("ttime: %sn", block.timestamp.String())fmt.Printf("tprevhash: %xn", block.prevhash)fmt.Printf("thash: %xn", block.Hash)}
以及打印事务的函数事务:
func 交易(块*块) {fmt.Println("tTransactions:")对于 i,交易 := range block.transactions {fmt.Printf("tt%v: %qn", i, 交易)}}
完成所有必需的功能后,我们将在主函数中使用它:
func main(){ryan := []string{"ryandi 向 Reza 发送了 50 BTC"}block_1 := 块(ryan, []byte{})fmt.Println("这是我们的第一个块")打印(块_1)交易(区块_1)jack := []string{"jack 发送 20 BTC 给 Reynold"}block_2 := 块(jack, block_1.Hash)fmt.Println("这是我们的第二个块")打印(块_2)交易(区块_2)}
好了,我们已经写完了所有的代码。 让我们通过在终端中输入 go run main.go 来运行它。 输出 :
结论
我们构建了一个非常简单的区块链原型:它只是一个块数组,每个块都与前一个块有连接。 但实际的区块链要复杂得多。 在我们的区块链中添加新块既简单又快速,但在实际的区块链中添加新块需要一些工作:在获得添加块的许可之前必须执行一些繁重的计算(这种机制称为工作量证明)。 此外,区块链是一个没有单一决策者的分布式数据库。 因此,一个新的区块必须得到网络其他参与者的确认和批准(这种机制称为共识)。 我们的区块链中还没有交易!