區塊鏈 levelDB 中使用了哪些鍵(即鍵:值對是什麼)?
我想知道是否可以使用 node.js 和 levelup 直接訪問區塊鏈數據庫的副本。
但據我所知,在獲取任何數據之前,我需要知道鍵的名稱,因為這是在
get
levelup 方法中使用的。但是,我無法找到與鍵值對中的值關聯的可能鍵的任何資訊,因此我不知道如何檢索數據。
首先,鍵值對中的鍵是什麼,其次是否可以只選擇第一
n
條記錄?
Bitcoind 從 0.8 開始維護兩個數據庫,塊索引(在 $DATADIR/blocks/index 中)和鏈狀態(在 $DATADIR/chainstate 中)。塊索引維護每個塊的資訊,以及它在磁碟上的儲存位置。鏈狀態維護有關作為目前最知名鏈的結果的驗證結果狀態的資訊。
在塊索引中,使用的鍵/值對是:
‘b’ + 32 字節塊雜湊-> 塊索引記錄。每條記錄儲存:
- 塊頭。
- 高度。
- 交易數量。
- 該塊在多大程度上得到驗證。
- 塊數據儲存在哪個文件中,以及該文件的哪個位置。
- 撤消數據儲存在哪個文件中,以及該文件的哪個位置。
‘f’ + 4 字節文件號-> 文件資訊記錄。每條記錄儲存:
- 具有該編號的塊文件中儲存的塊數。
- 具有該編號的塊文件的大小 ($DATADIR/blocks/blkNNNNN.dat)。
- 具有該編號的撤消文件的大小 ($DATADIR/blocks/revNNNNN.dat)。
- 具有該編號的塊文件中儲存的塊的最低和最高高度。
- 儲存在具有該編號的塊文件中的塊的最低和最高時間戳。
’l’ -> 4 字節文件號:最後使用的塊文件號。
‘R’ -> 1-byte boolean (‘1’ if true): 我們是否在重新索引的過程中。
‘F’ + 1 字節標誌名稱長度 + 標誌名稱字元串-> 1 字節布爾值(‘1’ 如果為真,‘0’ 如果為假):可以打開或關閉的各種標誌。目前定義的標誌包括:
- ’txindex’:是否啟用交易索引。
’t’ + 32 字節交易雜湊-> 交易索引記錄。這些是可選的,僅在啟用 ’txindex’ 時才存在(見上文)。每條記錄儲存:
- 事務儲存在哪個塊文件編號。
- 事務所在的塊儲存在該文件中的哪個偏移量。
- 從該塊的開始到儲存該事務本身的位置的偏移量。
在鏈狀態數據庫中,儲存了以下鍵/值對:
‘C’+ 32 字節交易雜湊 + 輸出索引長度 + 輸出索引(從 v0.15 開始)-> 單個未使用的交易輸出 (UTXO) 記錄。每條記錄都包含有關給定交易的指定輸出索引處的 UTXO 的資訊。該資訊包括:
- 交易是否是 coinbase。
- 哪個高度塊包含交易。
- 此未使用輸出的 scriptPubKey 和數量。
‘c’ + 32 字節交易雜湊(v0.14 之前)-> 該交易的未使用交易輸出記錄。與“C”不同,該條目代表單個交易中的所有 UTXO。這些記錄僅存在於至少有一個未使用輸出的交易中。每條記錄儲存:
- 交易的版本。
- 交易是否是 coinbase。
- 哪個高度塊包含交易。
- 該交易的哪些輸出未使用。
- 這些未使用輸出的 scriptPubKey 和數量。
‘B’ -> 32 字節塊雜湊:數據庫表示未使用交易輸出的塊雜湊。
最新版本的 bitcoind(請添加版本兼容性)使用混淆鍵/值對中的值。因此,您需要對混淆密鑰進行異或運算才能獲得真正的價值。
我不會詳細介紹特定記錄的具體序列化細節。它們通常被專門設計為在磁碟上緊湊,而不是真正打算被其他應用程序輕鬆使用(LevelDB 無論如何都不支持來自多個應用程序的並發訪問)。有幾種 RPC 方法可以從數據庫(
getblock
、gettxoutsetinfo
、gettxout
)中查詢數據,而無需直接訪問。如您所見,只有標頭儲存在此數據庫中。實際的塊和交易儲存在塊文件中,這些文件不是數據庫,而只是包含網路格式塊的原始附加文件。
至於你的第二個問題:什麼是
n
?如果您只想訪問一些記錄,當然,請遍歷鍵並在您閱讀足夠多時停止。