最近研究btcd,看到了一个小哥的文章很不错,于是搬过来,这个系列都是翻译
原帖地址:
前言
区块链是21世界的颠覆性技术之一 ,尽管其还不成熟并且尚未兑现其全部潜力. 本质上说,区块链就是一个分布式数据库。区块链的独特之处在于它是一个公开而非私有的数据库,每个用户都有一个部分或完整的拷贝。在区块链中加一条新记录需要所有维护人(译注:keepers想不到一个准确的词翻译)同意。同时,区块链的存在世道加密货币和智能合约成为可能。
这个系列中我们将构建一个简单的区块链。
区块
在区块链中,由区块存储价值信息。例如,比特币区块存储了所有交易,而交易是加密货币的根本。同时,一个区块包含了一些专有信息,如版本,当前时间戳和上一个区块的hash值。我们不打算构建一个比特币区块,我们将构建一个简单的区块,其包含一些能够说明问题的重要信息。它看起来像这样:

TimestampDataPrevBlockHashHashTimestampPrevBlockHashHash
所以,我们如何计算hash值?hash值的计算是区块链中非常重要的环节(译注:features),该流程保证区块链的安全。事实上,hash的计算需要耗费大量的计算资源。这是区块链故意设计的,这大大增加了在区块链中新增数据的难度,防止区块链被篡改。我们会在后面的章节中介绍。
现在,我们仅仅填写区块,并将它们连接在一起并对连接结果计算SHA-256哈希。我们使用SetHash方法计算:

生成一个内容为空的新区块:

区块链:
我们一起来构建区块链。本质上区块链是一个数据库:它是一个有序的,反向链接的数据库。这意味着区块按照插入顺序存储并且每个区块都链接向前一个区块。这使得我们可以轻松获得最新的区块并且可以通过hash值获得区块。
在golang中,该结构可以使用一个array和一个map构建:array保存hash值,map保存hash到区块的映射(map是无序的)。但是对于我们的区块链原型,我们只使用array,因为我们现在无需通过hash获取区块。

这是我们的第一个区块链,从未想过如此简单。
让我们一起给该链加快

可以看出为了给链上新增一个区块,我们需要一个已经存在的块作为其prevblock,然而我们的链是空的。因此,在我们的链中,我们需要一个创始块,即 calledgenesis block,使用如下方法产生创始块:

有了创始块,我们将用其构建一个链

我们看看它如何工作的:


我们的第一个区块链就成功了!
结论
我们构建了一个非常简单的区块链模型:它仅仅是一个区块array,其中每个区块链接至上一个。实际上的区块链要远复杂。在我们的链中,添加新区块非常简单高效,但实际上区块的添加需要一些大量的额外计算(pow)。同时,区块链是一个没有中心决策者的分布式数据库。因此,新区块的确认必须被网络上每个参与者确认。此外,在我们的链中,并没有交易。
后文将继续讨论其他特性。