以太坊的数据结构(状态树、交易树、收据树)

一、状态树

以太坊是基于账户的账本,因此需要进行账户地址和账户状态的映射,如下所示:
在这里插入图片描述
我们尝试寻找一种合适的数据结构来完成这个需求:

  1. 如果以哈希表的形式保存状态数据,可以非常有效率地查找、更新账户状态数据,但是由于状态数据只保存在区块体中,轻节点难以进行Merkle Proof,因此考虑构建Merkle tree;
  2. 如果将账户数据简单组织成Merkle tree,不进行排序,就需要发布所有账户到区块中,保证根哈希一致,但是数量级太大,不可行;如果只发布状态变化的账户,就会导致所有节点的根哈希不一致,无法共识;
  3. 如果使用排序的Merkle tree,各个节点的根哈希就会相同,但是增加账户时,需要重构Merkle tree,代价太大。另外Merkle tree不能够快速查找、更新状态数据。因此需要考虑一种新的数据结构Merkle Patricia trie。

1. trie

trie是一种字典前缀树,信息检索较为方便。如果有General、Genesis、Go、God、Good这几个单词,组成trie如下所示:
在这里插入图片描述
trie具有如下特点:

  1. 每个节点的分支取决于元素范围,上面例子中为26个英文字母和结束标志,最多27个分叉。在以太坊中使用16进制(0~F)表示账户,加上结束标志,最多17个分支;
  2. 查找效率取决于key值长度,键值越长,查找访问次数越多。以太坊中账户为40位16进制数,因此查找长度固定是40;
  3. 不会出现碰撞,哈希表则有碰撞的问题;
  4. 给定一组输入,构成的trie一致;
  5. 更新数据非常容易,只需访问局部分支。

2. Patricia tree(trie)

Patricia tree称为路径压缩前缀树,可以节省存储空间,同时还可以降低了查找访问次数,提高查找效率。例如将上例中的trie改进为Patricia tree,如下图所示:
在这里插入图片描述
Patricia tree适合键值分布比较稀疏的数据,压缩效果比较明显,如下图所示:
在这里插入图片描述
在以太坊中,为防止碰撞,使用了160bit长的账户,非常稀疏,因此适合使用Patricia tree数据结构。

3. Merkle Patricia tree(trie)

将Patricia tree的指针全部换成哈希指针,就构建成了Merkle Patricia tree,可以计算出根哈希值,保存在区块头中。

  1. 通过根哈希保证树不被篡改,每个账户的状态都是不可篡改的;
  2. 通过Merkle proof,可以用来证明任意一个账户的状态,比如账户余额;
  3. 通过Merkle proof,可以证明某个账户不存在。

4. Modified Merkle Patricia tree(trie)

以太坊使用的是修改版的Merkle Patricia tree,与Merkle Patricia tree没有本质区别。例如下图中有4个7位的地址,保存账户余额信息(value),树中有3种节点,每个节点存储关联节点的哈希值:

  1. Extension Node:扩展节点,保存路径压缩压缩数据,即shared nibbles中保存的16进制数据;
  2. Branch Node:分支节点,无法压缩;
  3. Leaf Node:叶子节点,保存账户状态数据;
    在这里插入图片描述

另外新发布一个区块的时候,某些账户的状态会发生变化,新区快中会为变化的账户重新建立分支,大部分不变的数据则指向历史区块中的分支,因此区块间会共享大部分不变的状态分支。如下图所示:
在这里插入图片描述
保留历史状态的好处:未胜出的临时性分叉需要回滚才能继续出块,由于智能合约的执行不易反推执行,保留起始与结束的记录,回滚才比较方便。

5. 账户状态值存储

账户状态数据经过RLP(Recursive Length Prefix)序列化后存储,RLP序列化方式相比protobuf较为简单,只支持字符嵌套数组(nested array of bytes),实现起来比较容易。

6. 区块代码分析

区块头的结构定义如下所示:
ParentHash表示父区块的哈希,UncleHash表示叔父区块哈希,Coinbase表示矿工账户地址,Root表示状态树的根哈希,TxHash表示交易树的根哈希,ReceiptHash表示收据树的根哈希,Bloom表示bloom filter(用于高效查询符合某种条件的结果),Difficulty表示挖矿难度(可根据需要调整),GasLimit和GasUsed与汽油费相关,Time表示区块大致产生时间,MixDigest与挖矿过程相关,从Nonce经过一些列计算而来,Nonce表示挖矿的谜底随机数。

// Header represents a block header in the Ethereum blockchain.
type Header struct {
    ParentHash  common.Hash    `json:"parentHash"       gencodec:"required"`
    UncleHash   common.Hash    `json:"sha3Uncles"       gencodec:"required"`
    Coinbase    common.Address `json:"miner"            gencodec:"required"`
    Root        common.Hash    `json:"stateRoot"        gencodec:"required"`
    TxHash      common.Hash    `json:"transactionsRoot" gencodec:"required"`
    ReceiptHash common.Hash    `json:"receiptsRoot"     gencodec:"required"`
    Bloom       Bloom          `json:"logsBloom"        gencodec:"required"`
    Difficulty  *big.Int       `json:"difficulty"       gencodec:"required"`
    Number      *big.Int       `json:"number"           gencodec:"required"`
    GasLimit    uint64         `json:"gasLimit"         gencodec:"required"`
    GasUsed     uint64         `json:"gasUsed"          gencodec:"required"`
    Time        uint64         `json:"timestamp"        gencodec:"required"`
    Extra       []byte         `json:"extraData"        gencodec:"required"`
    MixDigest   common.Hash    `json:"mixHash"`
    Nonce       BlockNonce     `json:"nonce"`
}

区块结构如下所示:
header为指向区块头(Header)的指针,uncles为指向叔父区块头的指针,transactions为区块内的交易列表。

// Block represents an entire block in the Ethereum blockchain.
type Block struct {
    header       *Header
    uncles       []*Header
    transactions Transactions

    // caches
    hash atomic.Value
    size atomic.Value

    // Td is used by package core to store the total difficulty
    // of the chain up to and including the block.
    td *big.Int

    // These fields are used by package eth to track
    // inter-peer block relay.
    ReceivedAt   time.Time
    ReceivedFrom interface{}
}

发布的区块信息:
extblock为发布到网络中的区块信息,包括区块头、交易列表、叔父区块头。

// "external" block encoding. used for eth protocol, etc.
type extblock struct {
    Header *Header
    Txs    []*Transaction
    Uncles []*Header
}

二、交易树、收据树

发布了15 篇原创文章 · 获赞 2 · 访问量 2967

猜你喜欢

转载自blog.csdn.net/ice_fire_x/article/details/104211388