Hyperledger Burrow StateDB

文章目录

  • 1. 存储结构
    • 1.1 Plain
    • 1.2 Tree
    • 1.3 Commit
  • 2. 代码结构

Burrow 借助 Tendermint 管理 p2p 网络和区块共识,在 Tendermint 之外自己维护了一个 StateDB 存储 Burrow 中各种交易的状态数据。

1. 存储结构


Burrow 在 KV DB 之上通过前缀的形式划分出了多个用途的空间,主要有三大类

Hyperledger Burrow StateDB_第1张图片

1.1 Plain


这一类简单直接,直接操作 DB 存储 KV

包含两种数据:

  1. Tx 存储的存储位置
    存储 Tx 的区块高度和在 Event Tree 中的区块数据中的偏移
    前缀 + Tx Hash 为key,存储区块高度和偏移值

    hth + -> {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"`
    }
    
  2. 智能合约的元数据
    存储智能合约相关 abi 的元数据,与存放在 Account Tree 下的智能合约账号中 ContractMeta 通过 codehashmetahash 进行关联

    habi + ->

1.2 Tree


这一类是大部分状态数据的存储形式,Burrow 使用 IAVL+ Tree 来组织各前缀空间下的数据。

iavl 是一个平衡二叉树实现,只在叶子节点存放数据

存储结构:

  1. 版本对应的 root hash
    ftr + version ->

  2. hash 对应的 Node
    ftn + 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
    }
    

为各种类别的前缀

主要有以下的状态树:

类别 前缀 描述 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 状态

存储结构:

  1. 版本对应的 root hash
    fcr + version ->

  2. hash 对应的 Node
    fcn + hash -> {Node}

node key:
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 对外提供状态查询、更新功能

Hyperledger Burrow StateDB_第2张图片

你可能感兴趣的:(Burrow)