以太坊交易池處理邏輯

  以太坊網絡中,我們發送一筆交易時,可能發送成功,也可能發送失敗,那麼交易是如何判斷能否發送成功的呢。當我們發送交易後,交易會被廣播到礦工,礦工會監聽交易的廣播,然後把交易放到本地的交易池中等待處理,但是交易能否放到交易池中,以及在交易池中的交易如何處理的,具體如下:

當交易進入交易池(tx_pool)時,礦工節點會做以下驗證:

  1. 通過交易Hash判斷交易在交易池中是否存在,如果存在就使用新的交易替換以前的交易
  2. 驗證交易的合法性,如長度、value、是否溢出當前區塊的GasLimit、Nonce值等、Gas是否足夠,如果驗證不通過就會返回對應的錯誤代碼
  3. 驗證是否孤兒交易,如果是就本地保存,不轉發,防止DDOS攻擊
  4. 如果交易池滿了,就會驗證交易Gas是否比當前交易池中的最低Gas低,如果低於交易池的最低Gas會返回ErrUnderpriced,如果高於最低值,就剔除最低Gas的交易。發生這種情況後,在etherscan中會發現在這筆交易pending中消失了(也有很大機率依然能夠查到這筆交易在pending列表中,因爲etherscan連接了很多節點,每個節點的交易池的狀態都是不一樣的,那條被踢出的交易可能在別的節點中仍然處於pending狀態)
  5. 如果交易已經在交易池中,會判斷Gas是否高於上一條相同Nonce的交易Gas某一個閾值(默認10%),如果Gas高於,就剔除前一筆交易,就使用新的交易替換前一筆交易,如果沒有高於當前的交易就會返回失敗
  6. 按順序放入到交易池中,等待打包
  7. 等待新的交易加入到交易池,會重複上述步驟。

在明白上述邏輯之前我們需要了解幾個細節

  1. 礦工不能在一個區塊中打包任意多的tx(只能儘可能多的打包),因爲一個區塊有GasLimit限制和區塊大小限制。
  2. 礦工運行以太坊實例時,是可以根據需要修改最低的GasPrice值,這樣可以過濾很多低Gas的交易。
  3. 交易池容納的交易數默認是有上限的。以太坊的txpool中的pending集合(miner是從pending中拿交易組裝block的)中容納的交易數量默認設置爲最大4096。但是在Geth v1.6.2中支持外部重置交易池默認配置。具體是–txpool.globalslots value。在Parity v1.6.8中也支持外部設置,具體是--tx-queue-size LIMIT。Parity默認是1024。一個賬戶默認只能放16條交易到pending中,滿了以後,第17條乃至以後更多的交易會有一套規則來替換先前位於pending中的16條交易。



歡迎訂閱「K叔區塊鏈」 - 專注於區塊鏈技術學習

博客地址:http://www.jouypub.com
簡書主頁:https://www.jianshu.com/u/756c9c8ae984
segmentfault主頁:https://segmentfault.com/blog/jouypub
騰訊雲主頁:https://cloud.tencent.com/developer/column/72548
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章