以太坊地址每發送一筆交易,交易的隨機數 nonce 就會增加 1,nonce 值高的交易要等待 nonce 值低的交易先完成。

原文標題:《決定轉賬打包順序的「神祕」值:Nonce》
撰文:Daisy

在《儒林外史》裏有一個吝嗇鬼叫嚴監生,臨終前躺在牀上,豎起兩根指頭來。家裏的侄子,奶媽就圍着他問,是不是有什麼心願未了,卻都不解其意。最後,嚴監生的老婆趙氏猜到了原因,屋子裏的燈點着兩莖燈草,嚴監生覺得太浪費了,才遲遲不肯嚥氣。當趙氏把燈裏的燈草挑掉了一莖,嚴監生這才兩腿一蹬,雙眼一閉,安心去投胎了。

以太坊轉賬打包順序由什麼決定?瞭解隨機數 Nonce

假設在多年輪迴後,嚴監生在 2017 年成了一個加密貨幣投資者。這天他用 imToken 1.0 給趙氏轉賬了 10 個 USDT,卻仍不改其吝嗇的本質,把手續費設定得很低,可這筆交易過了很久也沒有顯示轉賬成功。

嚴監生有些焦急,又給趙氏發去了一筆 10 個 USDT 的轉賬,這次手續費多給了一些,很快便成功了,而原先發起的第一筆交易則顯示失敗。

Emmmm~ 這是爲什麼呢?

以太坊轉賬打包順序由什麼決定?瞭解隨機數 Nonce

最近以太坊網絡轉賬的礦工費越來越貴,原因我們在 《爲什麼礦工費這麼貴?》 解釋過了,那麼面對昂貴的礦工費,多數人都會選擇把礦工費調低一些,畢竟節儉一點沒啥不好的。

可是當我們使用 imToken 1.0 進行轉賬,把手續費調得很低時就可能會出現上面這種情況:第一筆交易遲遲不被打包,再次發起第二筆交易成功後,第一筆交易則會顯示失敗。

究其原因,是一個叫 nonce 的值造成的。

在以太坊上發生的每筆交易都有一個值叫 nonce,這個值用於計算一個以太坊地址中發出的交易數量。一個以太坊地址裏的所有轉賬會按照你發起轉賬的時間,給每一筆交易排序,從 0 開始計數。地址每發送一筆交易,交易的隨機數 nonce 就會增加 1,而轉入這個地址的交易則不會改變 nonce 值。

舉個例子:

0x336d3e7fdFB677Bd1c7324919556EB6E98F6eDEF

這個地址中截止撰稿一共向外發起了 4 筆向外轉賬和 2 筆進賬收款,其中紅色框框標出的這兩筆交易不納入該地址的 nonce 值計算,其餘 4 筆向外轉賬交易的 nonce 值從下往上分別爲 0,1,2,3。

以太坊轉賬打包順序由什麼決定?瞭解隨機數 Nonce

以太坊區塊鏈對 nonce 做了這樣三條規定:

  1. 礦工需要按照 nonce 值從小到大去打包轉賬,所以在 nonce 爲 0 的交易未被礦工打包前,nonce 爲 1,2,3···的交易無論礦工費給的多高,都必須一直排隊等着(就好比早高峯堵車的時候我們不能加塞,無論是拉斯萊斯還是奇瑞,都只能老老實實排隊)。
  2. nonce 是連續的,不能跳過。當 nonce 爲 1 的交易沒有發起時,nonce 不能從 0 直接跳到 2,即 nonce 爲 2 的交易只能發生在 nonce 爲 1 的交易後面。
  3. 如果有兩筆交易 nonce 相同,其中一筆交易成功後,另外一筆交易就會顯示被替代,轉賬失敗。

嚴監生在使用 imToken 1.0 進行轉賬時,第一筆 nonce 爲 0 的交易,因爲手續費過低,沒有被礦工及時打包,一直處於等待狀態。這時他再次發起的第二筆交易 nonce 值,你猜是 0 還是 1 ?

答案是 0。

你可能有點疑惑,前面不是說隨着地址每發出一筆向外轉賬, nonce 值就會 +1 麼,怎麼這裏兩筆轉賬的 nonce 值卻都是 0 呢?

原因是 imToken 1.0 不支持發起連續轉賬,如果在第一筆交易未被成功打包的情況下,就連續發送下一筆交易,其中一筆就一定會失敗,這是因爲這兩筆交易使用的是相同的 nonce 值。

根據以太坊 nonce 的第三條規則,當有兩個 nonce 值相同的交易發生時,就只能有一筆交易被成功打包,一山不容二虎。同理,在第一筆交易沒有轉賬成功時,後續發起的第二筆、第三筆、···· 第 n 筆交易的 nonce 值均爲 0,其中只有一筆交易能被礦工成功打包,其他的交易會全部顯示失敗。那麼,哪筆交易能成功呢,有什麼判斷標準麼?

Nonce 值相同的交易,給礦工的手續費最高的那筆更容易成功,這不是以太坊區塊鏈的規定,而是礦工們逐利使然,誰不想多賺點錢呢。礦工當然就會選擇給的手續費更多的那筆交易來打包,其他的相同 nonce 的交易則都會被礦工丟棄,顯示在你的錢包軟件裏就是失敗的狀態。

這 n 筆先後發起, nonce 值相同的交易,就像是起跑線不同,終點線卻相同的運動員,只有第一名的飛人博爾特能被大衆關注,其他人則籍籍無名。

以太坊轉賬打包順序由什麼決定?瞭解隨機數 Nonce

升級後的 imToken 2.0 則支持發起連續轉賬,如果嚴監生是用 imToken 2.0 進行轉賬,那麼他的第一筆交易 nonce 值爲 0,第二筆交易 nonce 值則爲 1,即便前面的交易還未被打包,後續發起的交易 nonce 值也會自動累加 1。

上面我們提到了 nonce 爲 0 的交易未被礦工打包時,nonce 爲 1 的交易就得一直等着,所以雖然後續發起的交易 nonce 值可以累加,卻必須排隊等着 nonce 值更小的交易被打包後,才能輪到自己。

這 n 筆先後發起, nonce 值不斷累加的交易,就像是起跑線不同,終點線也不同的運動員,但必須等到第一跑道的運動員到達終點後,第二、三、··· n 跑道的運動員纔可以起跑。

如果第一跑道的人是博爾特,那麼後續的幾筆交易也能很快陸續上場,可要是第一跑道的人是海綿寶寶的寵物——小蝸,那後面跑道的運動員們可能就得等到天荒地老了。這個時候就該給小蝸一根能量棒,提提速!

以太坊轉賬打包順序由什麼決定?瞭解隨機數 Nonce

imToken 2.0 針對到賬慢的交易推出了加速功能,這個功能就像是一個能量棒,吃下去後就能讓交易迅速被礦工打包。imToken 會根據以太坊上的網絡情況,自動幫你計算出性價比最高的礦工費,點擊「加速交易」,就可以完成交易加速打包。

以太坊轉賬打包順序由什麼決定?瞭解隨機數 Nonce

「加速交易」的原理其實也很簡單,就是再發起一筆 nonce 值相同,但礦工費更高的轉賬,來覆蓋原來的。這樣這筆交易就會更快被打包,原來的轉賬則被替代掉。

如果你拿不準自己轉賬的礦工費該如何設定,是貴了還是便宜了。別擔心,最新版的 imToken 已經支持三擋變速,「快速、一般、緩慢」三種交易打包速度,任你選擇。

小結

imToken 1.0 不支持交易加速和連續發起多筆交易。當一筆交易設置的礦工費過低時,會導致遲遲不被打包,也無法進行加速。而如果在第一筆交易還未成功被打包,就急於發起第二筆交易,則會導致其中一筆交易失敗。

imToken 2.0 支持交易加速、三擋變速和連續發起多筆交易。當一筆交易設置的礦工費過低時,可以追加礦工費,加速打包確認。在最新版 imToken 中,你可以按需選擇礦工費,「三擋變速」一目瞭然;如果不介意打包時間的話,可以連續發起多筆交易,靜靜等待交易被打包確認就可以了。

來源鏈接:mp.weixin.qq.com