交易從節點中的待處理交易中消失
我的乙太錢包已經工作了一年多。今天我的節點出現記憶體問題,節點關閉。當我通過 geth 客戶端重新啟動節點時,節點迴響了大約 5000 個塊並再次開始同步。我的節點正在托盤上趕上大約 5000 個塊,這需要幾個小時。
我的一位客戶在此期間送出了一筆交易,它在節點等待交易中停留了 3 個小時。
我一直在檢查交易的狀態。
由於同步很慢,我重新啟動了節點。
一段時間後我再次檢查了節點,突然我注意到交易不再在池中。
eth.getTransaction 返回 null。它也沒有出現在etherscan上。
- 我的交易怎麼了?
- 節點重啟是否從池中清除了事務?
- 它超時並消失了嗎?
感謝任何幫助解決這個問題。
我認為是超時。預設情況下,tnx 的生命週期為 3 小時
https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options
--txpool.lifetime value Maximum amount of time non-executable transaction are queued (default: 3h0m0s)
更新
“為什麼交易在 3 小時後就消失了?
每個 eth tx 都帶有一個 nonce 標記。這允許停止重新送出相同的事務。今天添加的交易與使用者昨天添加的交易具有相同的隨機數。所以從技術上講,他今天添加的交易是無效的,因為昨天的 tx 已經處理。但它在待處理的交易池中保留了大約 3 個小時。
所以現在的問題是今天的交易如何與昨天的交易具有相同的隨機數。
我們認為原因是記憶體,這是理論。
目前記憶體設置為2048MB。一旦達到門檻值,Geth 可能會將記憶體中的數據持久化(到磁碟)。最後一個持久點是昨天在塊 8142312。來自該點的數據被添加到記憶體記憶體中。然後,使用者昨天在塊號 8142723 處進行了交易。此 TX 的隨機數被標記為 x + 1。此時此資訊仍未保存到磁碟。
今天出現了記憶體問題,get 客戶端在塊 8147136 處停止。由於這是一個意外故障,Geth 無法將記憶體持久化到磁碟中。因此,記憶體中的資訊失去了。所以 Geth 回到了昨天的一個區塊(8142312)的最後一個持久點。還原後節點的 nonce 現在是 x。現在節點正在同步回來並試圖追趕。然後使用者今天又送出了一筆交易,這筆交易的 nonce 現在又是 x + 1。nonce 現在是重複的,今天的交易變得無效。今天的交易在等待隊列中停留了一段時間,最終由於重複的隨機數而從網路中刪除。”