一文講清楚以太坊的nonce

續上篇:一文講清楚以太坊的gas,gasPrice,gasLimit

我們今天來講講以太坊的nonce。做過錢包開發的同學都應該知道,nonce是一個非常關鍵的參數。對於一般用戶來說,各種錢包已經幫我們解決掉這個問題,所以不用怎麼關注,但在一些特殊情況下,比如有一筆轉賬被pending住,但又着急轉賬,這個時候要是對nonce有足夠的認識,就可以很輕鬆解決。所以,我們有必要專門講一講nonce。

nonce的意義

遵循上文講gas的原則,我們追尋nonce的T-1層原理,並且追根溯源,先看看比特幣中的nonce。

比特幣中關於nonce的論述,在區塊鏈領域必讀書目《精通比特幣》中第十章 挖礦和共識有非常詳細的論述。簡單來說,礦工在挖礦的過程中,爲了算出符合要求的hash值(前面N個都是0, N取決於難度係數),不斷地替換nonce,來做hash運算。所以,nonce主要用於挖礦。

以太坊的共識算法目前也採用POW,肯定有類似的機制。但在以太坊中,我們提及nonce,更多是說的交易的一個參數。我們看一個標準的以太坊交易參數:

 

nonce是一個可選參數。可以覆蓋pending交易。但nonce在交易中存在意義是什麼呢?一句話:防止雙花,也就是防止同一地址的一筆錢被花兩次。

這個結論會引出兩個問題:

  1. nonce的機制如何能防止雙花?
  2. 比特幣交易中存在nonce嗎?如何沒有,它又是如何防止雙花的?

nonce的機制如何能防止雙花?

以太坊節點要求每筆交易必須有一個nonce數值。每一個賬戶從同一個節點發起交易時,這個nonce值從0開始計數,發送一筆nonce對應加1。當前面的nonce處理完成之後纔會處理後面的nonce。注意這裏的前提條件是相同的地址在相同的節點發送交易。

以下是nonce使用的幾條規則:

● 當nonce太小(小於之前已經有交易使用的nonce值),交易會被直接拒絕。

● 當nonce太大,交易會一直處於隊列之中,這也就是導致我們上面描述的問題的原因;

● 當發送一個比較大的nonce值,然後補齊開始nonce到那個值之間的nonce,那麼交易依舊可以被執行。

所以,在以太坊的交易中,對於每一個地址的,是嚴格按照nonce往上遞增的。nonce值不會重複,也不會跳躍。只有等上一筆交易成功之後,纔開始下一筆,這樣就能很好地防止雙花問題。

 

 

比特幣交易中存在nonce嗎?如何沒有,它又是如何防止雙花的?

比特幣的中不存在nonce。比特幣的交易基於UTXO模型,以太坊基於Balance模型。以太坊中一個賬戶有多少錢,已經直接存儲到世界狀態腫。比特幣的UTXO模型則不是這樣。他是根據賬本中未花費記錄,一點點計算而來。具體論述可以參考《精通比特幣》一書。二者不同的賬戶模型,決定了在處理雙花的問題上,採取不同的模式。其背後的設計原理,不可不察。

 

利用nonce解決pending問題

我們明白nonce這基本原理之後,看到地址上有一筆交易因爲某種原因被一直pending住,也就不會束手無策了。據我的經驗,存在兩種情況:

  1. 交易的gasPrice太低,遭到礦工的嫌棄,一直無法打包。
  2. 交易發起速度太快,餘額依然不足,無法被打包。

解決辦法很簡單:把找到pending交易的nonce值,重新發起一筆交易,設定好同樣的nonce就行。世面上支持這種操作的錢包不多,imToken都沒有這種高級設置。幸好,我深知存在這種需求,在我親自操刀的錢包中的高級轉賬設置中,可以讓用戶設置nonce,具體看下圖:

 

發佈了6 篇原創文章 · 獲贊 2 · 訪問量 1141
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章