深入理解以太坊系列(6): 以太坊区块链

同比特币区块链一样,以太坊的区块链也是一个有序后向链表。以太坊区块链与比特币区块链最大的不同在于区块结构。以太坊区块中除了包含有交易信息列表之外,还包括所有账户的状态信息、区块高度及当前系统难度系数。

区块结构

以太坊的区块包含如下信息:

Field Description
Block Header  区块头
Block Uncles  叔区块
Transactions  区块中的交易信息

区块头

以太坊区块头信息除了比特币区块头中有的父区块哈希、难度、时间戳、随机数nonce及区块交易信息的根哈希外,还拥有一系列其他信息。具体区块头数据结构如下:

Field Description
Parent Hash  父区块哈希
Uncle Hash  叔区块哈希
Coinbase  矿工账户信息
State Root  账户状态根哈希
Transactions Root  区块交易根哈希
Receipts Root  交易收据根哈希
Bloom  日志信息组成的过滤器
Difficulty  难度系数
Number  区块号,创世区块为0
Gas Limit  可使用的Gas最大值
Gas Used  消耗的Gas数量
Timestamp  时间戳
Extra Data  与此区块相关的额外数据
Mix Hash  256-bit哈希,与nonce一起用来证明区块已进行了有足够的计算
Nonce  64-bit哈希,与MixHash一起用来证明区块已进行了有足够的计算

区块头中包含3个树根哈希:状态、交易和收据。分别对应着3个Merkle Patricia树状结构。另外,根哈希是通过Keccak256算法计算得出的。

区块哈希

以太坊的区块哈希是通过Keccak256算法对区块头进行的哈希计算而得。在以太坊系统中,所有用到哈希函数的地方几乎都是用的Keccak256(SHA-3)。

顺便提一下以太坊中采用的序列化格式——RLP,它是一种编码格式,其目的是存储嵌套的字节数组。在区块、交易、状态等很多地方都有使用,在计算哈希时也是如此,每次做Keccak256计算之前都需要先做RLP编码转换。