Blockchain

區塊鏈 levelDB 中使用了哪些鍵(即鍵:值對是什麼)?

  • December 12, 2021

我想知道是否可以使用 node.js 和 levelup 直接訪問區塊鏈數據庫的副本。

但據我所知,在獲取任何數據之前,我需要知道鍵的名稱,因為這是在getlevelup 方法中使用的。

但是,我無法找到與鍵值對中的值關聯的可能鍵的任何資訊,因此我不知道如何檢索數據。

首先,鍵值對中的鍵是什麼,其次是否可以只選擇第一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 方法可以從數據庫(getblockgettxoutsetinfogettxout)中查詢數據,而無需直接訪問。

如您所見,只有標頭儲存在此數據庫中。實際的塊和交易儲存在塊文件中,這些文件不是數據庫,而只是包含網路格式塊的原始附加文件。

至於你的第二個問題:什麼是n?如果您只想訪問一些記錄,當然,請遍歷鍵並在您閱讀足夠多時停止。

引用自:https://bitcoin.stackexchange.com/questions/28168