重組發生時,撤消文件究竟是如何使用的?
很明顯,撤銷文件(rev*.dat 文件)被儲存以在重組發生時將區塊鏈恢復到以前的版本。我不清楚這些文件內容的確切用途是什麼。
我的問題基於這個解釋撤消文件內容的答案和這個解釋徹底解釋鏈狀態數據庫結構的答案。
首先,為什麼 CTxInUndo 記錄不包含任何提及所用輸出的父 TXID?將這些輸出作為 UTXO 插入到鏈狀態中是否不需要這些資訊?如何僅使用這些記錄中包含的資訊來恢復鏈狀態?
其次,這個區塊的交易產生的輸出呢?既然它們應該在重組後從鏈狀態中刪除,為什麼撤消文件中沒有它們的記錄?
最後,為什麼 CTxInUndo 記錄中的高度儲存為
2*height (+1 if it was a coinbase output)
而不是 justheight
?如果交易是 coinbase 的話,偏移量是否用於儲存?
首先,為什麼 CTxInUndo 記錄不包含任何提及所用輸出的父 TXID?將這些輸出作為 UTXO 插入到鏈狀態中是否不需要這些資訊?如何僅使用這些記錄中包含的資訊來恢復鏈狀態?
塊本身也用於撤消操作。它列出了正在使用的 UTXO(按 txid 和輸出索引)。撤消文件以相同的順序包含那些使用的 UTXO 的內容。
其次,這個區塊的交易產生的輸出呢?既然它們應該在重組後從鏈狀態中刪除,為什麼撤消文件中沒有它們的記錄?
該資訊也是從塊數據中提取的,因為它列出了交易,因此可以從中計算出需要在回滾中刪除的 UTXO 的 txid。
最後,為什麼 CTxInUndo 記錄中的高度儲存為 2*height(如果是 coinbase 輸出則為 +1),而不僅僅是高度?如果交易是 coinbase 的話,偏移量是否用於儲存?
UTXO 為每個條目儲存以下資訊:
- 創建它的 txid
- 創建它的 tx 中的輸出索引
- scriptPubKey
- 數量
- 它創建的高度(能夠強制執行相對時間鎖)
- 創建它的 tx 是否是 coinbase 交易(因為適用於花費 coinbase 輸出的特殊成熟度規則)。
最後兩項需要儲存在撤消數據中,因為它們無法從支出交易中推斷出來。
使用的編碼是將高度和coinbase儲存為單個數字(2 * height + coinbase),因此它只佔用數據庫中的最小空間。