MalukChain-基本结构

一个最基本的区块链,采用 Go 实现。

区块结构

定义区块

区块,区块链基本的单元。在区块链中通常存储各种有价值的信息,比如我们常听说的比特币,在比特币系统中,每一个区块都存储了交易信息,除此之外,一个区块通常还会存储其他一些信息,比如时间戳,版本,区块的 Hash 和上一个区块的 Hash。在我们 MalukChain 中,我们暂时不考虑特别复杂的交易信息结构,我们简化一下,就把这些信息叫做 Data 吧。

ok,我们的 Block 应该长这个样子:

麻雀虽小,五脏俱全

Timestamp 表示区块创建的时间,Data 表示我们存储的有价值的信息,PrevBlockHash 表示上一个区块的 hash 值,Hash 则是这个区块的 hash 值。

在比特币系统的区块定义中,Timestamp、PrevBlockHash 和 Hash 是放在区块头结构中的,为了简化,我们把它们放到一起定义了我们这个最简单的区块结构

Hash 计算

我们知道每一个区块都需要计算它的 Hash 保证其唯一性,同时为了保证这个唯一性,计算 Hash 的算法复杂度要很高,而且要保证新增一个区块很难(你知道比特币现在有多难挖吗)。

为了方便理解区块链原理,我们先采用最简单的 SHA-256 来计算区块的 hash 值。

生成区块

ok,我们现在要创建一个区块了!首先我们将是上一个区块的 hash 和我们这一区块中要存储的信息以及当前时间组成一个区块,同时我们再计算一下当前这个区块的 hash 存储回去,这样我们就生成了一个新的区块。

区块链链结构

定义区块链

区块链是由一系列区块组成的链条,它的结构呢应该像一条有序链条一样,每一个区块都链接着上一个区块,这样的结构能够很方便的根据区块的 hash 找到它,也能很快的找到最新的区块。在 Go 里实现一个链条的结构一般采用 Array + Map 的方式,Array 中存储了一系列 hash 值,它是一个有序的列表,Map 存储了这些 hash 和 block 对,通过 Array 中的 hash 来快速定位到区块。

我们目前先用 Array 来存储区块。

因为暂时还用不到根据 hash 获取区块的功能

添加区块

我们现在要实现往区块链里添加区块的操作,首先要把上一个区块的 hash 取出来,生成一个新的区块,然后往链条中加入这个新生成的区块。

创建创世块

我们把第一个区块叫做创世块,为什么要有创世块呢,通过上面添加区块的函数我们可以看到,新生成一个区块依赖上一个区块的 hash,那么第一个区块没有上一个区块,因此第一个区块的产生和其他的区块有点儿不一样,我们把这个过程叫做创建创世块。

很简单,我们就利用 NewBlock 生成一个创世块就好了。

创建区块链

有了创世块之后,我们就可以创建一个包含创世块的区块链啦。

感受一下

我们写一个测试函数来感受一下 MalukChain 的结构。

运行结果:

小结

ok,截止目前,我们把一个区块链的架子已经搭好了,接下来我们要不断丰富区块链中的各种要素,调整成一个完整的区块链。

MalukChain 的代码地址:

https://git.coding.net/MrNullPoint/MalukChain.git

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

扫码关注云+社区

领取腾讯云代金券