Transactions
塊和嘗試的儲存方式
新手來了!
我仍然不確定我是否理解乙太坊的某些結構是如何物理儲存的(假設 Geth 實現)
- State Trie:只有一個鏈下 Merkle Patricia Tries 使用 LevelDB 儲存;
- Storage Trie:每個賬戶一個 Merkle Patricia Trie;使用 LevelDB 與 State Trie 一起儲存在鏈下;
- 交易嘗試:沒有真正物理儲存;Merkle Patricia Trie 在需要時使用塊交易列表動態創建;
- Receipts Trie:沒有線索;
- 塊:狀態樹和儲存嘗試儲存在 .ldb 文件 (LevelDB) 中,但我在哪裡可以找到塊文件以及它們儲存的格式?
低級 geth 數據庫格式為:
var databaseVerisionKey = new Buffer("DatabaseVersion"); // databaseVerisionKey tracks the current database version. var headHeaderKey = new Buffer("LastHeader"); // headHeaderKey tracks the latest know header's hash. var headBlockKey = new Buffer("LastBlock"); // headBlockKey tracks the latest know full block's hash. var headFastBlockKey = new Buffer("LastFast"); // headFastBlockKey tracks the latest known incomplete block's hash duirng fast sync. var fastTrieProgressKey = new Buffer("TrieSync"); // fastTrieProgressKey tracks the number of trie entries imported during fast sync. // Data item prefixes (use single byte to avoid mixing data types, avoid `i`, used for indexes). var headerPrefix = new Buffer("h"); // headerPrefix + num (uint64 big endian) + hash -> header var headerTDSuffix = new Buffer("t"); // headerPrefix + num (uint64 big endian) + hash + headerTDSuffix -> td var headerHashSuffix = new Buffer("n"); // headerPrefix + num (uint64 big endian) + headerHashSuffix -> hash var headerNumberPrefix = new Buffer("H"); // headerNumberPrefix + hash -> num (uint64 big endian) var blockBodyPrefix = new Buffer("b"); // blockBodyPrefix + num (uint64 big endian) + hash -> block body var blockReceiptsPrefix = new Buffer("r"); // blockReceiptsPrefix + num (uint64 big endian) + hash -> block receipts var txLookupPrefix = new Buffer("l"); // txLookupPrefix + hash -> transaction/receipt lookup metadata var bloomBitsPrefix = new Buffer("B"); // bloomBitsPrefix + bit (uint16 big endian) + section (uint64 big endian) + hash -> bloom bits var preimagePrefix = new Buffer("secure-key-"); // preimagePrefix + hash -> preimage var configPrefix = new Buffer("ethereum-config-"); // config prefix for the db var BloomBitsIndexPrefix = new Buffer("iB"); // BloomBitsIndexPrefix is the data table of a chain indexer to track its progress // Chain index prefixes (use `i` + single byte to avoid mixing data types).
要獲取數據,您必須從這些數據中遞歸地建構樹。知道狀態根的雜湊,你可以找到狀態根,然後你知道狀態根的孩子的雜湊,所以你知道孩子,所以你可以起床。
根據 geth 選項
--gcmode archive|fast|light
(您還可以指定要記住多少塊),geth 儲存或不嘗試一些嘗試。不同的嘗試是世界狀態樹(帳戶連結)、儲存嘗試(帳戶數據)和收據嘗試(用於交易收據)。
從樹中獲取值“樣本值”(例如契約地址)。您需要根據 32 個字元長度 sha3(“sample value”) 沿著樹向下走 32 個長度。
為了更好地了解哪些數據儲存在 db 中以及如何進行嘗試,請查看這些圖片: