首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用GO语言构建区块链——第1部分:基本原型

前言

区块链是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,因为我们现在不需要通过哈希来获取块。

这是我们的第一个区块链!我从没想过会这么容易。

现在让我们可以添加块:

完成了!?

未来要添加新块,我们需要一个现有的块,但是我们的区块链中没有块!因此,在任何区块链中,必须至少有一个区块,而链条中的第一个区块被叫做创世块。让我们实现一个创建创世块的方法:

现在,我们可以实现一个函数来创建有创世块的区块链:

让我们检查区块链是否正常工作:

输出:

结论

我们构建了一个非常简单的区块链原型:它只是一个块数组,每个块都与前一个块连接,实际的区块链虽然比这复杂得多。在我们的区块链中添加新块很容易并且快速,但在实际中在区块链中添加新块需要一些工作:在获得添加块的权限之前必须执行一些繁重的计算(这种机制称为工作证明)。此外,区块链是一个没有单一决策者的分布式数据库。因此,必须由网络的其他参与者确认并批准新的块(该机制称为共识)。我们的区块链中还没有交易!

在接下来的文章的我们将会介绍其他功能。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180814A0XQZB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券