Transactions

何時從區塊鏈中刪除“待處理”交易?

  • January 18, 2022

何時從區塊鏈中刪除交易?

假設我向區塊鏈廣播了一筆交易,那麼它就是一個等待被探勘的待處理交易。

但是,何時會從區塊鏈中刪除待處理的交易,例如,如果 gas 價格太低?有人能想到礦工不願意加入交易的其他原因嗎?

如果交易在某個時候沒有被丟棄,那麼可能會導致大量的待處理交易。

重要的是要注意,在這個問題的上下文中,交易永遠不會從區塊鏈中刪除。區塊鏈代表由節點(本地)驗證並在區塊鏈上(遠端)註冊為塊的交易。乙太坊網路中的每個完整節點都在本地記憶體中擁有自己的區塊鏈副本,這意味著當交易到達這些節點之一進行驗證時,此過程是離線完成的。由於多種原因,交易可以在節點中保持未決狀態或永遠不會進入區塊鏈,這些原因可以分為四類。

第一個,也許是最明顯的,是機器故障。該節點可能會以某種形式損壞。然而,有足夠多的節點驗證交易,少數失敗不足以停止鏈,但廣泛的機器故障可能會阻止待處理的交易註冊。

第二個原因是交易本身是無效的,不能被驗證,或者還不能被驗證。如果交易是無效的,因為它本質上是無效的,那麼它永遠不會進入鏈。但是,“應該”有效的交易可能會因為 nonce 差距而發現自己在完整節點的記憶體池中。也許多個交易是快速連續進行的,並且網路沒有將它們整齊地序列化,或者生成交易的客戶端編碼不良並分配了一個無效的隨機數,導致一個交易到達一個具有更高隨機數的節點(或甚至更低)比節點預期的要低。在這種情況下,該交易將駐留在記憶體池中,直到來自同一地址且缺少隨機數的另一筆交易進入鏈,然後節點將嘗試驗證這個“亂序”事務。但是,如果缺少 nonce 的交易永遠不會進入鏈,那麼這個“亂序”交易將無限期地駐留在記憶體池中,直到它被節點清除,除了缺少本地記憶體(磁碟空間)之外沒有其他原因. 如果節點有無限量的記憶體,那麼它可能會永遠掛在這個事務上,但情況肯定不是這樣。

第三個原因是競爭。如果網路足夠熱,有更多的交易願意支付比你更多的gas,足以讓你的交易在記憶體池中保持足夠長的時間以使其被清除(同樣,除了節點本身磁碟空間不足之外沒有其他原因),那麼你的交易可能永遠不會成為鏈上的一個區塊。

第四個原因是規則的例外。乙太坊的核心宗旨是“破壞”,未來對協議的更改肯定有可能危及待處理的交易。乙太坊開發人員在門口被警告要為過去的任何事情和事件做好準備,即臭名昭著的硬分叉,強化了這一建議的智慧。

但是這個問題的實際答案是節點用完它的記憶體池分配的磁碟空間。那麼問題就變成了:為什麼交易會在記憶體池中閒置?

引用自:https://ethereum.stackexchange.com/questions/31303