src/validation.cpp 中的 DumpMempool() 和 LoadMempool()
我的理解是
DumpMempool()
將記憶體池狀態(從其他對等方接收到的未確認 txs 以及是否從該節點廣播的任何 txs)保存到磁碟,並LoadMempool()
在需要此狀態時使用。這是正確的還是它是如何工作的?如果我正在測試蒲公英(現在正試圖解決衝突),我應該採取什麼方法?<https://github.com/bitcoin/bitcoin/blob/3caee16946575e71e90ead9ac531f5a3a1259307/src/validation.cpp#L5139>
這是我在
mempool.dat
文件中看到的:究竟發生了
src/validation.cpp
什麼以及保存了什麼mempool.dat
,何時需要這些數據,如果從文件中保存或載入數據時出現問題會發生什麼?
src/validation.cpp 中到底發生了什麼,mempool.dat 中保存了什麼,什麼時候需要這些數據,如果從文件中保存或載入數據時出現問題會發生什麼?
節點的目前記憶體池在節點執行時保存在 RAM 中。作為節點運營商、礦工和使用者,我們希望記憶體池中的交易和我們自己的優先級在節點重啟時保持不變。想像一下,你是一個礦池運營商,你失去了你的記憶體池的內容。重新啟動後,與其他礦池運營商相比,您將處於很大的劣勢,因為其他礦池運營商可以從更廣泛的交易集中進行選擇以包含在他們提議的區塊中。
該
mempool.dat
文件是您的記憶體池在給定時間的快照。它在節點啟動時讀取,LoadMempool()
事務被添加到節點的記憶體池中。在節點關閉或通過 RPC時觸發savemempool
該功能。DumpMempool()
這會將節點記憶體池的目前快照寫入mempool.dat
文件。警告:文件格式是比特幣核心的內部文件格式,可以在不棄用或事先通知的情況下更改。下面描述了版本 1
mempool.dat
文件的內容(參見常量 MEMPOOL_DUMP_VERSION)。該
mempool.dat
文件包含一個標題,該標題由uint64
版本號和儲存在文件中的事務數組成uint64
。後面是一個記憶體池條目向量。一個條目包括原始交易,它進入節點記憶體池的時間int64
,以及uint64
用於礦工手動交易優先級的費用增量。條目向量後面是一個序列化的映射,該映射txid -> amount
也儲存礦工交易優先級資訊。在啟動時,比特幣核心節點嘗試將交易導入
LoadMempool()
. 導入期間會忽略某些事務:
- 同時過期的交易(交易預設在兩週後過期,除非節點配置發生變化)。
- 同時已經確認的交易
- 已經在記憶體池中的交易(例如,在我們導入之前,對等點已經將其發送給我們)
通常,可以在
debug.log
文件中找到類似這樣的內容:Imported mempool transactions from disk: 463 succeeded, 10 failed, 0 expired, 0 already there..
如果文件損壞或不存在,則不會將任何事務載入到記憶體池中。如果在關閉期間無法寫入文件,則節點在下一次啟動期間根本無法載入任何事務。這只是礦池運營商的真正問題,而不是普通使用者。
我在 2019 年 Chaincode Sumer Residency上就
LoadMempool()
和函式進行了展示。DumpMempool()
這些幻燈片可以在Google Slides或PDF中找到。