Bitcoin-Core-Development

需要非常舊的 rev*.dat 文件的案例有哪些?

  • October 11, 2021

對此有多個問題,但沒有一個,IMO,真正解決這個問題:

鑑於:

  1. rev*.dat 文件保存“撤消”數據,用於逐塊回滾 UTXO 狀態,
  2. 並且它們是 1::1 的塊文件(即,對於給定的 NNNNN 文件blkNNNNN.datrevNNNNN.dat保存相同塊的資訊),
  3. 並且它們按照節點(來自網路)接收塊的順序被寫入和分塊
  4. 並且 UTXO 集是通過考慮區塊鏈順序的塊來計算(只能計算)的,
  5. 並且在任何區塊中,coinbase 交易對於 101 次確認(通過共識)都是不可花費的,因此多達 100 個區塊的重組不會導致硬幣突然消失的嚴重問題,並且堆積在頂部的 100 個區塊顯然足以等待任何重組…

然後: 是否曾經使用過非常舊的 rev.dat 文件?* 比方說,那些屬於埋在距離鏈頂深 100 多個區塊的區塊?如果曾經使用過它們**,案例是什麼?

(並且,在這裡回答以下列表中的第一個問題,如果 rev 文件全部被刪除,為什麼需要重新生成它們?

(獎勵問題:給定一個 txindex:rev*.dat 文件中是否有任何內容無法通過查看相應 blk*.dat 文件中的塊並使用 txindex 查找以前的交易來重新生成?

這裡的其他問題接近這個問題但不是欺騙:

  1. 並且它們是 1::1 的塊文件(即,對於給定的 NNNNN 文件blkNNNNN.datrevNNNNN.dat保存相同塊的資訊),
  2. 並且它們按照節點(來自網路)接收塊的順序被寫入和分塊

這個假設是不正確的。這些rev*.dat文件實際上是按高度順序編寫的。這是因為它們是在不同的時間編寫的。一個塊的撤消數據只有在它連接到鏈尖後才被寫入,因此撤消數據最終按照塊連接的順序進行。因此,對於已下載但從未連接的塊,它們不存在撤消數據(儘管這種情況不太可能,因為除非它們應該連接,否則不會下載塊)。

然後: 是否曾經使用過非常舊的 rev.dat 文件?* 比方說,那些屬於埋在距離鏈頂深 100 多個區塊的區塊?如果曾經使用過它們**,案例是什麼?

當涉及到節點的操作時,不,實際上並沒有使用舊的撤消數據。然而,它在節點操作之外確實有一些用途,特別是在通過 RPC 檢查區塊鏈,以及創建塊過濾器和硬幣統計索引時。

RPC 在某些地方使用撤消數據,因為它包含該塊花費的 UTXO。這允許getblock計算為區塊中的每筆交易支付的交易費用。但這並不是硬性要求,如果沒有找到撤消數據,則根本不計算費用。

另一個使用 undo 數據的 RPC 是使用getblockstatsundo 數據來計算塊的費用以及塊引起的 UTXO 集大小的變化。如果撤消不存在,則此 RPC 將失敗。

對於塊過濾器和硬幣統計索引,撤消數據用於建構它們,因為它提供了 UTXO 集更改的快照。這允許填充索引而無需在建構時跟踪 UTXO 集,因此它減少了記憶體使用並提高了性能。

對於節點操作,僅當塊與尖端斷開連接時才需要撤消數據。這只發生在重組發生時。然而,比特幣的建構有可能進行非常大規模的工作重組,這可能會重組被認為是古代歷史的事物。

但是,在節點的操作中確實沒有使用舊的undo數據,並且可以添加一種刪除它們的模式。在我的節點上,總共有 48 GB 的數據,因此節省的空間幾乎沒有正常修剪那麼顯著。

(並且,在這裡回答以下列表中的第一個問題,如果 rev 文件全部被刪除,為什麼需要重新生成它們?

由於塊索引的工作方式,它們需要重新生成。由於它還包含撤消數據的位置,如果該數據失去,塊索引將發現這是一個錯誤,因此需要重新索引。如果添加了允許刪除 rev*.dat 文件的選項,那麼顯然必須更改。

(獎勵問題:給定一個 txindex:rev*.dat 文件中是否有任何內容無法通過查看相應 blk*.dat 文件中的塊並使用 txindex 查找以前的交易來重新生成?

是的,但這會很慢。

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