Transactions

塊和嘗試的儲存方式

  • September 1, 2018

新手來了!

我仍然不確定我是否理解乙太坊的某些結構是如何物理儲存的(假設 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 中以及如何進行嘗試,請查看這些圖片:

在此處輸入圖像描述

在此處輸入圖像描述

引用自:https://ethereum.stackexchange.com/questions/57883