前言
区块链是21世纪最具革命性的技术之一,至今仍在成熟,潜力尚未完全实现。从本质上讲,区块链只是一个分布式记录数据库。但它的独特之处在于它不是私人数据库,而是公共数据库,即用它的每个人都有完整或部分副本。只有得到数据库其他管理员的同意,才能添加新记录。此外,由于区块链,使得加密货币和智能合约成为可能。
在本系列文章中,我们将实现一个简化版的区块链,基于它来构建简化版的加密货币。
块
让我们从“区块链”的“块”部分开始。在区块链中,存储有价值信息的是区块。例如,比特币块存储事务,这是任何加密货币的本质。除此之外,块包含一些技术信息,如版本,当前时间戳和前一个块的哈希值。
在本文中,我们不打算实现一个如同比特币规范中描述的区块链,而是我们将使用一个简化版本的区块链,它只包含重要信息。这是它的样子:
Timestamp是当前时间戳,也就是区块创建的时间。
Data是区块存储的实际有价值的信息。
PrevBlockHash存储前一个块的哈希
我们这里的 TimestampPrevBlockHash, Hash,在比特币技术规范中属于区块头(block header),区块头是一个单独的数据结构。而交易,也就是这里的Data, 是另一个单独的数据结构。为了简便起见,我把这两个混合在了一起。
那么我们如何计算哈希?哈希是区块链非常重要的部分。正是这个特征使区块链变得安全。计算一个哈希是一个在计算上很困难的操作,即使在高速运行的计算机上也需要花费不少时间(这就是人们购买功能强大的GPU来挖掘比特币的原因)。这是一种有意的架构设计,使得添加新块很困难,从而防止它们在添加后难以再被修改。我们将在以后的文章中讨论并实现这种机制。
现在,我们将只获取块字段,连接它们,并在连接后的结果上计算SHA-256哈希值。我们在SetHash方法中这样做:
接下来,按照Golang约定,我们将实现一个简化块创建的函数:
这就是块!
区块链
现在让我们实现一个区块链。从本质上讲,区块链只是一个具有特定结构的数据库:它是一个有序的反向链接列表。这意味着块以插入的顺序进行存储,并且每个块都链接到前一个块。这种结构允许快速获取链中的最新块,并通过其散列(有效地)获得块。
在Golang中,这个结构可以通过使用array和map来实现:array将保持有序哈希(array在Go中有序排序),并且map将保持hash block对(map是无序的)。对于我们的区块链原型,我们只使用array,因为我们现在不需要通过哈希来获取块。
这是我们的第一个区块链!我从没想过会这么容易。
现在让我们可以添加块:
完成了!?
未来要添加新块,我们需要一个现有的块,但是我们的区块链中没有块!因此,在任何区块链中,必须至少有一个区块,而链条中的第一个区块被叫做创世块。让我们实现一个创建创世块的方法:
现在,我们可以实现一个函数来创建有创世块的区块链:
让我们检查区块链是否正常工作:
输出:
结论
我们构建了一个非常简单的区块链原型:它只是一个块数组,每个块都与前一个块连接,实际的区块链虽然比这复杂得多。在我们的区块链中添加新块很容易并且快速,但在实际中在区块链中添加新块需要一些工作:在获得添加块的权限之前必须执行一些繁重的计算(这种机制称为工作证明)。此外,区块链是一个没有单一决策者的分布式数据库。因此,必须由网络的其他参与者确认并批准新的块(该机制称为共识)。我们的区块链中还没有交易!
在接下来的文章的我们将会介绍其他功能。
领取专属 10元无门槛券
私享最新 技术干货