StateDB和Trie (上)

作者:Annchain

(本文一切著作权归annchain技术团队所有,未经许可,不得转载。若需转载请联系页尾二维码。)

 

在以太坊中,所有和账户相关的状态信息都是通过 StateDB 来存储和获取的。StateDB 作为表层和其他逻辑模块交互,在 StateDB 之后使用 Merkle Patricia Trie (MPT) 结构来构建编码后的 state 关系,用于快速索引以及回滚等操作。MPT 中的所有节点最后都会以 key - value 的形式存入磁盘数据库。

这篇文章将重点介绍 StateDB 和 Trie 在以太坊中的实现以及两者在账户状态存储流程中所扮演的角色。

Merkle Patricia Trie

MPT 是结合了 Merkle Tree 和 Patricia Tree 的特点后创建的树形数据结构。其包含了如下的一些特点:

  • 能存储任意长度的键值对数据。

  • 支持 Merkle Proof,用于节点的快速校验。

  • 能快速的查询 key 所对应的 value 数据。

01 mpt.png

 

在以太坊中,MPT被定义为四种不同类型的节点:fullNode, shortNode, valueNode, hashNode

type (
    fullNode struct {        Children [17]node // Actual trie node data to encode/decode (needs custom encoder)
        flags    nodeFlag
    }
    shortNode struct {        Key   []byte
        Val   node
        flags nodeFlag
    }
    hashNode  []byte
    valueNode []byte)

 

valueNode 存储具体的 value 数据,它的 key 是从 root 到此节点的路径上所有 key 的总和。

hashNode 存储一个数据库中其他节点的哈希用作索引。

shortNode 是 MPT 的枝干节点之一。"Key" 字段存储当前 shortNode 之后所有 node 共同的一段前缀 key。"Val" 字段存储一个后续的节点。如果从根节点到当前节点所组成的 key 前缀已经键值对结构中的"键"完全吻合,且没有其它符合此前缀的键值对存在,则后续节点为一个 valueNode。如果满足此前缀 key 的键值对组合多于一个,则后续存储一个 fullNode。

fullNode 是 MPT 的枝干节点之一。和 shortNode 不同的是,full

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值