区块体中包含了由区块链系统产生的一系列交易数据,
并以Merkle根的形式保存在区块头中,
与前一区块的哈希值、时间戳和版本号等组成一个完整的区块。
上图表示的是比特币的区块结构,
其区块头中还包含了难度目标、随机数Nonce等数据,以支持 PoW 共识机制中的挖矿运算。
区块间采用链式结构进行连接,具体表现为每个区块的区块头中都包含了前一区块的哈希值,从而形成一条不可更改的完整区块数据链。
链式结构使得区块链具有溯源的功能。
区块链系统可以采用基于交易的数据模型或基于账户的数据模型。
基于交易的数据模型将表明交易来源的输入和表明交易去向的输出组合到一起,使得每笔交易可追溯。
基于账户的数据模型能够快速查询用户余额和业务状态数据。
由于智能合约需要执行复杂的业务逻辑,因而更适合通过基于账户的数据模型进行构建。
为了控制区块大小,区块链系统中通过哈希函数将原始交易数据编码为特定长度的字符串哈希值进行储存。
哈希函数也称散列函数,可以把一个空间的数据集尽可能均匀的映射到另外一个比原数据集更小的空间,
即对于输入的任意长度字符串 x 都可以输出长度固定的 H(x) ,且无法通过 H(x) 反推得到 x
原始交易数据的哈希值通过Merkle树的形式进行组织。
Merkle树中文译为梅克尔树或默克尔树。
以比特币中使用的二叉Merkle树为例,每条交易的哈希值就是一个叶子节点,
从下往上将两个相邻叶子节点的组合哈希作为新的哈希值,
新的哈希值成为树节点继续与相邻的树节点组合成新的哈希值。
在重复一定次数后直到形成唯一的根节点。
最后得到的Merkle根需要保存到区块头中,
以便仅需通过区块头就可以对交易进行简单支付验证,
这一过程也成为SPV(Simplified Payment Verification)。
对于Merkle树而言,并不需要知道整棵Merkle树中每个节点的值,
可以通过节点的值、Merkle根的值和相关路径来快速验证该节点是否属于该Merkle树,
从而快速验证该区块中是否包含了某条交易。
此外,时间戳用于标记区块顺序。
时间戳表示自格林威治时间 1970 年 1 月 1 日 0 时 0 分 0 秒到当前时刻的总秒数,
是一种完整且可验证的电子证据,能够为某一数据提供特定时间点的存在性证明。
区块链根据时间戳的先后顺序通过链式结构将一个个区块关联起来,
因此篡改区块数据的难度以时间的指数倍增加,
区块链越长篡改难度就越高,这也是确保区块链不可更改性的重要因素之一。
Merkle树的作用:
快速比较大量数据:当两个Merkle树的根哈希值相同时,说明所代表的的数据都相同。
快速定位修改:当两个Merkle树的根哈希值相同时,说明所代表的的数据都相同快速定位修改:
如下图,如果交易C发生改变,那么就会导致N2、N5和Merkle根发生改变。
所以,我们想要快速定位,只需要沿着Merkle根→N5→N2就可以定位到交易C发生改变。
零知识证明:例如,想要证明一组交易中包含某个交易A,但又不想让对方知道交易A的具体内容,
那么就可以构建Merkle树,如上图,向对方公布N0、N1、N4和根节点,
对方就可以确认交易A的存在,但无法知道交易A的具体内容。