【译】数据库设计

By | 2018年7月23日

cpp-ethereum 使用三个key-value数据库(LevelDB或RocksDB,编译时决定)

它们在磁盘上的物理位置如下:

 

  • Blocks – “ {ETH_DATABASE_DIR}/{GENESIS_HASH}/blocks ”
  • Extras – “ {ETH_DATABASE_DIR}/{GENESIS_HASH}/{DATABASE_VERSION}/extras ”
  • State – “ {ETH_DATABAS_DIR}/{GENESIS_HASH}/{DATABASE_VERSION}/state ”

 

Blocks

blockchain 存储。其中仅存储RLP编码的区块数据

每条记录都是 blockHash => blockData

 

对Blocks和Extras数据库的连接都封装在BlockChain类中。(位于./libethereum/BlockChain.h)

 

Extras

支持对区块链数据进行高效查询的额外数据

为区分不同类型的记录,将一个比特长度的常量与键连接起来。下文中的”+”符号就代表着这种连接。

 

  • 对Blocks DB 中存储的每一个区块,Extras都有如下记录:
blockHash + ExtraDetails => rlp(number, totalDiffiulty, parentHash, rlp(childrenHashes)) // ExtraDetails = 0blockHash + ExtraLogBlooms => rlp(blockLogBlooms) // ExtraLogBlooms = 3blockHash + ExtraReceipts => rlp(receipts) // ExtraReceipts = 4

blockNumber + ExtraBlockHash => blockHash // ExtraBlockHash = 1

 

  • 对区块链Extras中的每个交易,都有如下记录:

transactionHash + ExtraTransactionAddress => rlp(blockHash, transactionIndex) // ExtraTransactionAddress = 2

 

  • 为一些区块存储log blooms的记录

chunkId + ExtraBlocksBlooms => blooms // ExtraBlocksBlooms = 5

(chunkId = index * 255 + level)

详见 BlockChain::blocksBlooms()方法。(ethereum/libethereum/BlockChain.h)

 

额外记录(additional record)的一个实例:

“best” => lastBlockHash // best block of the canonical chain

“chainStart” => firstBlockHash // used when we don’t have the full chain, for example after snapshot import

 

State

State数据代表着完整的以太坊state(即所有账户)

State数据组成了一个 Merkle Patricia Trie(https://github.com/ethereum/wiki/wiki/Patricia-Tree),这棵树的节点数据存储在State数据库中。

  • 树的每个节点存储“sha3(address)=>accountData”的映射,详见黄皮书。

“accountData=rlp(nonce, balance, storageRoot, codeHash)”

  • 对每个存储了某些数据的账户,都有一个存储trie用于存储数据。树中的节点存 sha3(key)=>value 的映射
  • 每个存储有代码的账户都被单独存储在trie中: “sha3(code) => code“(翻译可能不准确,原文:For each account with non-empty code, it is stored separately out of the tries: “sha3(code) => code“.)
  • 上面所有trie的每一个sha3 hash映射中key的前像(地址或storage key)都被存储为:”hash + 255 => preimage”

 

state详见State类 (/libethereum/State.h)

Merkle Patricia Trie 实现位于 /libdevcore/TrieDB.h

控制数据库的较底层代码见 /libdevcore/OverlayDB.h 和 /libdevcore/MemoryDB.h

点击量:423

发表评论

邮箱地址不会被公开。 必填项已用*标注