Bitcoind

bitcoind的LevelDB中塊密鑰內容的格式?

  • December 3, 2019

我正在嘗試使用 bitcoind 的 LevelDB 塊索引文件(儲存在 中blocks/index)來查找文件(例如blk00029.dat)和特定塊的字節位置。

感謝提問數據庫是乾什麼用的?以及區塊鏈 levelDB 中使用的鍵是什麼(即鍵:值對是什麼)?我知道在哪裡看,但是塊的數據庫鍵的內容讓我感到困惑。即使在原始碼的幫助下,我也無法弄清楚它的格式。

例如對於高度為 100,000 的塊,它位於數據庫鍵下b\x06\xe53\xfd\x1a\xda\x869\x1f?l42\x04\xb0\xd2x\xd4\xaa\xec\x1c\x0b \xaa'\xba\x03\x00\x00\x00\x00\x00(塊的雜湊字元串以小端順序轉換為字節),我得到以下內容,為了便於閱讀,我對這些內容進行了 hexlified:

87c628858c201d04009be99e5883d1e92c0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b5710

對於我從數據庫中獲取的每個塊,前 3 個字節 ( 87c628) 似乎都是相同的。我猜它是一些版本標識符?

最後 80 個字節(或 160 個十六進製字元)是塊頭:010000005 ... f2b5710. 它們與您通過執行獲得的結果相匹配bitcoin-cli getblock 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506 false

其餘的對我來說是個謎。我知道塊 100,000 有 4 筆交易,但保存該值的字節4具有129塊 #1,它只有一個交易。

我在哪裡可以找到有關 LevelDB 中塊鍵的格式的資訊?

難道每個密鑰的格式取決於序列化內容的 bitcoind 版本嗎?如果是這樣,我如何確定使用哪種格式?

是 Bitcoin Core v0.15.1 原始碼片段,它定義了CDiskBlockIndex. 各個領域是:

  • 編寫記錄的客戶端的 varint 版本號(用於將來的可擴展性)。這是87c628你看到的。
  • varint 塊高度。
  • 帶有各種標誌的 varint 狀態。
  • 確定塊中事務數的變數。
  • 如果狀態欄位設置了第 8 位或第 16 位,則 varint 確定塊儲存在哪個文件(blk*.dat 和 rev*.dat)中。
  • 如果狀態欄位設置了第 8 位,則 varint 確定塊開始所在的 blk*.dat 文件的偏移量。
  • 如果狀態欄位設置了第 16 位,則 varint 確定塊的撤消數據開始所在的 rev*.dat 文件中的偏移量。
  • 區塊頭

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