Skip to content
This repository was archived by the owner on Oct 28, 2021. It is now read-only.

Commit 04709cf

Browse files
committed
Description of the database layout
1 parent 47524bd commit 04709cf

File tree

1 file changed

+71
-0
lines changed

1 file changed

+71
-0
lines changed

doc/database_layout.rst

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
Database Layout
2+
============
3+
4+
cpp-ethereum uses three databases, all of them are essentially just key-value storages (LevelDB or RocksDB is used depending on build settings). Their physical disk locations are as follows:
5+
6+
- Blocks - `{ETH_DATABASE_DIR}/{GENESIS_HASH}/blocks`
7+
- Extras - `{ETH_DATABASE_DIR}/{GENESIS_HASH}/{DATABASE_VERSION}/extras`
8+
- State - `{ETH_DATABASE_DIR}/{GENESIS_HASH}/{DATABASE_VERSION}/state`
9+
10+
where
11+
12+
`{ETH_DATABASE_DIR}` - base cpp-ethereum data directory
13+
`{GENESIS_HASH}` - hex representation of first 4 bytes of genesis block hash (`d4e56740` for main net, `41941023` for Ropsten)
14+
`{DATABASE_VERSION}` - encoded current version of the database layout (`12041` as of the time of this writing)
15+
16+
Blocks
17+
----------------------
18+
19+
The blockchain storage, the only thing stored here is binary (RLP-encoded) data of the blocks.
20+
21+
Every record is:
22+
```
23+
blockHash => blockData
24+
```
25+
26+
Low-level access to both Blocks and Extras databases is encapsulated in [BlockChain class](https://github.com/ethereum/cpp-ethereum/blob/develop/libethereum/BlockChain.h).
27+
28+
Extras
29+
----------------------
30+
31+
Additional data to support efficient queries to the blockchain data.
32+
33+
To distinguish between the types of records, a byte-long constant is concatenated to the keys. `+` in the following description means this concatenation.
34+
35+
- For each block stored in Blocks DB, Extras has the following records:
36+
37+
```
38+
blockHash + ExtraDetails => rlp(number, totalDiffiulty, parentHash, rlp(childrenHashes)) // ExtraDetails = 0
39+
blockHash + ExtraLogBlooms => rlp(blockLogBlooms) // ExtraLogBlooms = 3
40+
blockHash + ExtraReceipts => rlp(receipts) // ExtraReceipts = 4
41+
blockNumber + ExtraBlockHash => blockHash // ExtraBlockHash = 1
42+
```
43+
44+
- For each transaction in the blockchain Extras has the following records:
45+
```
46+
transactionHash + ExtraTransactionAddress => rlp(blockHash, transactionIndex) // ExtraTransactionAddress = 2
47+
```
48+
49+
- Records storing log blooms for a number of blocks at once have the form:
50+
```
51+
chunkId + ExtraBlocksBlooms => blooms // ExtraBlocksBlooms = 5
52+
```
53+
where `chunkId = index * 255 + level`. See comment to [BlockChain::blocksBlooms() method](https://github.com/ethereum/cpp-ethereum/blob/db7278413edf701901d2a054b32a31c2722708d5/libethereum/BlockChain.h#L193-L206) for details.
54+
55+
- Additional records, one instance of each:
56+
```
57+
"best" => lastBlockHash // best block of the canonical chain
58+
"chainStart" => firstBlockHash // used when we don't have the full chain, for example after snapshot import
59+
```
60+
61+
State
62+
----------------------
63+
64+
The data representing the full Ethereum state (i.e. all the accounts). The State data forms a [Merkle Patricia Trie](https://github.com/ethereum/wiki/wiki/Patricia-Tree) and the database stores the nodes of this trie.
65+
66+
- Nodes of the trie for the mapping `sha3(address) => accountData`, where according to Yellow Paper `accountData = rlp(nonce, balance, storageRoot, codeHash)`.
67+
- For each account with non-empty storage there is a storage trie with nodes for the mapping `sha3(key) => value`.
68+
- For each account with non-empty code, it is stored separately out of the tries: `sha3(code) => code`.
69+
- For each key of all the tries above the mapping of sha3 hash to its preimage (address or storage key) is stored: `hash + 255 => preimage` (`+` is concatenation).
70+
71+
For the code managing the state see [State class](https://github.com/ethereum/cpp-ethereum/blob/develop/libethereum/State.h) (also note free function `commit` there). Merkle Patricia Trie implemenation is in [TrieDB.h](https://github.com/ethereum/cpp-ethereum/blob/develop/libdevcore/TrieDB.h). For lower-level code accessing the database itself see [OverlayDB](https://github.com/ethereum/cpp-ethereum/blob/develop/libdevcore/OverlayDB.h) and [MemoryDB](https://github.com/ethereum/cpp-ethereum/blob/develop/libdevcore/MemoryDB.h).

0 commit comments

Comments
 (0)