区块链(Blockchain) 可简单形象化地可理解为很多分散在世界各地的区块(Block)以"链"(Chain)的形式串连在一起,就犹如一串铁链一样,由很多小铁环串成一条铁链。这就是区块链的形象化概念。

那么,区块链中的区块实际上是什么呢以下以比特币(BitCoin)区块链中的区块为例:

一、区块(Block)

上述这张简化版的比特币区块链图中有三个区块Block 1, Block 2, Block 3.

每个区块都包含两个部份:

区块头(Block Header)

区块体(Block Body)

1. 区块头(Block Header)

先看看区块头的数据结构

1 2 3 4 5 6 7 8

struct header_structure { uint32_t nVersion; // 4 bytes - Version uint8_t hashPrevBlock[32]; // 32 bytes - Previous block header hash uint8_t hashMerkleRoot[32]; // 32 bytes - Merkle root hash uint32_t nTime; // 4 bytes - Timestamp uint32_t nBits; // 4 bytes - Difficulty Target uint32_t nNonce; // 4 bytes Nonce };

版本号(Version) 前一个区块的Hash值 能让当前区块与上一个区块形成一个连结,而且能确保区块的顺序及过去区块的准确性; 当前区块的Hash值一定比这个Hash值小; Merkle Tree Root(Merkle树根节点的Hash值) Timestamp 时间戳 Difficulty Target 困难值: 这个困难值每2016个区块会调整一次; Nonce 随机数 表示当前区块工作量证明PoW演算法进行的随机数; 总区块大小固定为80 Bytes

2. 区块体(Block Body)

包含了产生该区块的所有数据,以比特币区块链为例,这里数据即交易记录(Transactions),并以Merkle Tree形式表示;

在比特币区块中,比特币支出和接收交易是一起记录的,整个收支记录包括很多笔记录,而每一笔记录都有自己的索引编号,方便查询。

同时,每笔记录中还包含了生成时间、引用交易的Hash值、交易记录索引编号、比特币支出地址等等的数据。而每一笔收支交易记录都有一个Merkle 节点Hash值,这也是Merkle Tree的一部份,决定了每一个地址都不能够重复交易或被伪造。

以上就是比特币区块链中区块(Block)的结构,那刚才一直说的Merkle Tree 又是怎么一回事呢

二、Merkle Tree

Merkle Tree是一种用来表示Hash值的数据结构。它的基本结构就是Binary Tree(二元树),每一个非叶子节点(Node),都被标示一个Hash值。由于Merkle Tree的发明人是Ralph Merkle,当然这就是这个资料结构的名称由来。

他是会把每一笔交易的TxID透过SHA256做加密

HA = SHA256(SHA256(TxA))

HB = SHA256(SHA256(TxB))

HC = SHA256(SHA256(TxC))

HD = SHA256(SHA256(TxD))

如此类推,然后两两连接(Concat)在一起,再进行加密:

HAB = SHA256(SHA256(HA+HB))

HCD = SHA256(SHA256(HC+HD))

直至出现Merkle Tree Root为止:

HABCD = SHA256(SHA256(HAB+HCD))

这样就得出与上图一样的Merkle Tree。

而这里Merkle Tree Root 也就是上面提到的头块头中的 Merkle Tree Root 部份,而下面的部份就是所有的交易记录。

三、创世区块Genesis Block

创世区块Genesis Block 这个名字听起来很像很了不起的样子,实际上就是区块链的第一个区块,结构上与链中其他区块都没差别。

那么区块链中的创世区块、区块、Mrekle Tree的关系是怎样的

在创建区块链时,首先要建立创世区块Genesis Block,此时,Genesis Block 就会有属于它的Hash值,然后使用演算法运算,得出第一个区块Block #1,那么,Block #1也会有属于它的Hash值,还记得区块头结构中有个叫"前一个区块的记录"(Hash Of Previous Block Header)吗没错,Block #1 就会把Genesis Block的值放进这个位置,这样,就相当于连结到前一个Block,即创世区块Genesis Block ,如此类推,不断产生的区块都使用这种方式连接起来,这样,就形式大家耳熟能详的区块链Blockchain了。

区块到底能做什么呢每一个区块,都能用来「记帐」,整个区块链Blockchain 串接起来就是一本完整的帐册,所以说,区块链Blockchain 也叫做Distributed Ledger(分散式帐本)。

慢着,上面一直在说的Hash值又是什么啊

四、Hash

Hash值比较

在工作量证明PoW时,到底是怎样比较Hash 值的大小其实就是将Hash值先转换为big integer再比较。

Hash值对区块的影响

每个区块的Hash 都是不一样的,可以通过Hash 标识区块; 如果区块的内容变了,它的Hash 一定会改变;

Hash的不可修改性

由于区块与Hash 是一一对应的,每个区块的Hash 都是针对"区块头"(Head)计算的。

上面提到,区块头包含很多内容,其中有当前区块体的Hash(注意是"区块体"的Hash,而不是整个区块),还有上一个区块的Hash。这也意味着,如果当前区块的内容变了,或者上一个区块的Hash 变了,一定会引起当前区块的Hash 改变。

这一点对区块链有重大意义。如果有人修改了一个区块,该区块的Hash 就变了。为了让后面的区块还能连到它,该人必须同时修改后面所有的区块,否则被改掉的区块就脱离区块链了。由于Hash 的计算非常耗时,同时修改多个区块几乎不可能发生,除非有人掌握了全网51% 以上的计算能力。

正是通过这种联动机制,区块链保证了自身的可靠性,数据一旦写入,就无法被篡改。这就像历史一样,发生了就是发生了,从此再无法改变。

看到这里,如果还不清楚,可以从这里倒着向上看一次,应该就会很清楚区块到底实际上是怎么一回事了。

区块是区块链中的基本组成部份,每个区块链的数据结构、每个在结构内包含的元素(前一个区块的Hash值、加密运算方式、时间戳、签名等等)都与整个区块、甚至整个区块链息息相关,正因为这种巧妙设计,令到区块链可靠性、不可逆、无法篡改的特性更为突出。而深入地了解区块中各项的组成部份及相互之间的关系,将对接下来学习建立属于自己的区块链及应用,打下良好的基础。