有關以太坊nonce問題

2021-08-25 05:31:44 字數 2576 閱讀 3650

節點a和節點b集群(節點b連線到節點a)

為了防止交易重播,eth(etc)節點要求每筆交易必須有乙個nonce數值。每乙個賬戶從同乙個節點發起交易時,這個nonce值從0開始計數,傳送一筆nonce對應加1。當前面的nonce處理完成之後才會處理後面的nonce。集群環境下,不同節點共同維護同乙個使用者的nonce值。

txpool中由兩部分構成pending和queued組成,乙個為待打包狀態,乙個為佇列中。如果傳入的nonce就是某使用者下筆交易應該傳入的nonce,那麼該筆交易就會放置在pending中,等待節點打包。其次,如果傳入的nonce值過大,在進入txpool中檢查到它之前的nonce並沒有使用過,那麼此筆交易不會傳送到pending中,而且放置在queued中。只有當前面的nonce補齊之後,才會進入到pending中。

集群環境下,寫入節點a的pending交易會廣播到節點b中,因nonce問題寫入節點a的queued交易,不會被廣播。

集群環境下,節點b連上節點a(admin.addpeer(節點a)),節點a停掉的情況下再次啟動,會很快恢復集群,但是如果是節點b停掉的情況下,卻不會再次恢復集群,只能重新連線節點,才能恢復集群b。

}

並且txpool中可以看到該筆交易會把之前的交易替換掉,如下

也就是說,針對pending裡的交易相同nonce再次提交,並且提高gas price,後面的交易可以覆蓋之前的交易。

如果我們重複上面的情況,依然是在節點a的交易沒有及時同步到節點b中,但是我們往節點b中提交同樣nonce的交易,只是去改變提交的金額,同理我們也可以提交進去,但兩個節點都維護了同樣nonce,gas price相同,交易金額不同的交易,它們的交易hash肯定也是不一樣的,最終只會只有一筆會被打包,也就是哪個節點在挖礦,優先選擇自己pending中的交易。

(測試方法:節點a和集群b的情況下,停掉節點a的情況下,往節點b傳送一筆交易得到乙個新的交易hash,

然後迅速重啟節點a(保證還沒來得及恢復集群的情況下),往節點a傳送同樣nonce的交易,但交易**提高,同樣提交進去並且也得到乙個新的交易hash)

節點a

節點b

節點a

節點b

}

我們可以看到該筆交易可以被提交進去,但交易hash和節點a中相應的是一模一樣的,也就是說我們依然認為是同一筆交易。

節點a

節點b

在我們補齊nonce為1的交易後,我們觀察到節點a和節點b的queued雖然都維護著nonce為3的交易(hash不同),

但最終進入pending中會是gas price**高的交易,至此兩個節點又保持一致。

節點、a節點b都如下

結論是gas price**高的會被加入到pending中

,

"id":2

, "jsonrpc":"2.0"

}

如果改變交易金額提交(交易hash不一樣),響應如下

,

"id":0

, "jsonrpc":"2.0"

}

以太坊實戰 再談nonce使用陷阱

在 以太坊實戰之如何正確處理nonce 一文中我們介紹了nonce的基本概念和使用方法。也提到了它能夠覆蓋之前交易的特異功能。但是那只是nonce的冰山一角。今天再給大家分享在熱點賬戶下nonce會出現的問題。所謂的熱點賬戶就是頻繁被使用的賬戶,在以太坊中比如交易所的統一出幣賬戶,在短時間內頻繁發起...

3 3 以太坊 以太坊核心詞彙詳解

以太坊虛擬機器 以太坊中智慧型合約的執行環境。賬戶外部賬戶 被公鑰 私鑰對控制 合約賬戶 合約賬戶被儲存在賬戶中的 控制 外部賬戶與合約賬戶區別 內部結構 訊息 類似於位元幣上的交易與位元幣交易的不同點 以太坊的訊息可以由外部實體或者合約建立,位元幣的交易只能外部建立 以太坊的訊息可以包含資料 如果...

以太坊入門

貨幣單位稱為以太 eth ether被細分為更小的單位,最小的是wei 1 ether 10的18此方 wei 以太的值在以太坊內部表示為以wei表示的無符號整數 為什麼要用wei呢?貌似是因為他是這種區塊鏈貨幣的理論先驅,比中本聰更早的提出了這種p2p的東西。以太坊錢包 進入以太坊系統的門戶。包含...