【区块链整理】四、区块链数据结构
哈希指针
对前一个区块做哈希计算得到的哈希值,包含在当前区块当中作为引用。
Merkle Tree 和 Merkle Patricia Tree
Merkle Tree 中,叶子节点为保存的数据值。形成过程如下:
- 叶子节点经过哈希计算得到哈希值。
- 将哈希值两两结合计算哈希值。
- 重复步骤2,直到得到 Root 节点。
了解 Merkle Patricia Tree 之前,除了了解 Merkle Tree 以外,还需要知道 Trie (字典树、前缀树)以及 Patricia Tree 相关知识。
Merkle Patricia Tree 中包含三种节点:扩展节点、分支节点、叶节点。官方示意图如下:
Merkle Tree 应用场景
Merkle Tree 应用最多的地方是数据的比对和完整性校验。如 TX4 值发生了改变:
1. 首先对根节点 Root 进行对比,不一致即表示数据发生篡改行为。
2. 分别对 H12、H34 进行比较,此时 H34 不一致。
3. 分别对 H3、H4 进行对比,最终发现 H4 哈希值不一致。
简略的区块链结构示意图
区块头包含的内容及意义
Previous Hash:前一区块头哈希值。
Version:当前区块版本。
Target:挖矿难度。
Nounce:比特币中为随机数,用来不断尝试进而得到满足挖矿难度的哈希值;以太坊中存在不同的结构上,包含 nounce 含义不同。状态数中外部账户情况下代表为此账户地址发送的交易序号,合约账户表示为此账户创建的合约序号;交易树中代表交易者发送交易数的计数;
以太坊中包含的三种 MPT 结构树
1. 状态树
存储整个区块链当前所有账户的状态数据
2. 交易树
存储在本区块中发生的所有交易的数据。
3. 收据树
存储在本区块中发生的所有收据的信息。包括:区块序号、区块哈希值、交易哈希值、当前交易使用的 Gas、当前交易执行完当前区块使用的累计 Gas、执行交易创建的日志等。
以太坊账户状态包括哪些内容
nounce:外部账户情况下代表为此账户地址发送的交易序号,合约账户表示为此账户创建的合约序号。
balance:此地址拥有的以太币数量。
storageRoot:Merkle Tree 根节点哈希值。默认值为空。
codeHash:此账户以太坊虚拟机代码的哈希值。对于合约账户,就是被哈希的代码作为 codeHash 保存。外部账户来说,是空字符串的哈希值。
比特币交易过程
参考 【区块链整理】二、比特币交易脚本 中 脚本执行步骤 内容。
参考资料:
《区块链原理及技术应用》——赵其刚