一个最基本的区块链,采用 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
领取专属 10元无门槛券
私享最新 技术干货