Burrow 借助 Tendermint 管理 p2p 网络和区块共识,在 Tendermint 之外自己维护了一个 StateDB 存储 Burrow 中各种交易的状态数据。
1. 存储结构
Burrow 在 KV DB
之上通过前缀的形式划分出了多个用途的空间,主要有三大类
1.1 Plain
这一类简单直接,直接操作 DB 存储 KV
。
包含两种数据:
-
Tx 存储的存储位置
存储 Tx 的区块高度和在Event Tree
中的区块数据中的偏移
前缀 + Tx Hash 为key,存储区块高度和偏移值hth
+<tx_hash>
->
{height, offset}
type TxExecutionKey struct { // The block height Height uint64 `protobuf:"varint,1,opt,name=Height,proto3" json:"Height,omitempty"` // The offset of the TxExecution in bytes Offset uint64 `protobuf:"varint,2,opt,name=Offset,proto3" json:"Offset,omitempty"` }
-
智能合约的元数据
存储智能合约相关 abi 的元数据,与存放在Account Tree
下的智能合约账号中ContractMeta
通过codehash
和metahash
进行关联habi
+<metahash>
->
<abi meta>
1.2 Tree
这一类是大部分状态数据的存储形式,Burrow 使用 IAVL+ Tree 来组织各前缀空间下的数据。
iavl
是一个平衡二叉树实现,只在叶子节点存放数据
存储结构:
-
版本对应的
root hash
ft<type>r
+version
->
<root hash>
-
hash
对应的Node
ft<type>n
+hash
->
{Node}
// Node represents a node in a Tree. type Node struct { key []byte value []byte hash []byte leftHash []byte rightHash []byte version int64 size int64 leftNode *Node rightNode *Node height int8 saved bool // saved to memory or disk persisted bool // persisted to disk }
<type>
为各种类别的前缀
主要有以下的状态树:
类别 | 前缀 | 描述 | Node Key | Node Value |
---|---|---|---|---|
Account | a | 存储账号状态,包含智能合约账号 | address | Account |
Storage | s | 智能合约中字段的状态数据 | address + Field Key | Field Value |
Name | n | NameReg提供一个基于名称,数据对的全局键值存储,这些数据对受帐户的到期和所有权约束 | name | Entry |
Proposal | p | 存储 ProposalTx 信息 | proposalHash | Ballot |
Validator | v | 存储参与 Tendermint Voting 的节点 Power | address | power |
Event | e | 存储区块执行的状态信息 | Height | []StreamEvent |
Registry | r | 存储 Validator 节点信息 | address | NodeIdentity |
1.3 Commit
Commit 类状态与 1.2 一样也使用 IAVL+ Tree
来组织数据,不同的是,Commit 记录的是 1.2 中所有 Tree
的保存状态也就是账本的 Commit 状态
存储结构:
-
版本对应的
root hash
fcr
+version
->
<root hash>
-
hash
对应的Node
fcn
+hash
->
{Node}
node key:<type prefix>
node value: CommitID
// This is the object that is stored in the leaves of the commitsTree - it captures the sub-tree hashes so that the
// commitsTree's hash becomes a mixture of the hashes of all the sub-trees.
type CommitID struct {
Version int64 `protobuf:"varint,1,opt,name=Version,proto3" json:"Version,omitempty"`
Hash []byte `protobuf:"bytes,2,opt,name=Hash,proto3" json:"Hash,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
2. 代码结构
Burrow 抽出 Forest
来管理各种状态树(包括Commit),State
封装 Forest
对外提供状态查询、更新功能