由於以太坊已升級至 PoS 共識機制,因此本文中的礦工部分信息已過時,僅供參考。以太坊的最新共識機制介紹請點擊下方鏈接查看。
在《儒林外史》裡有一個吝嗇鬼叫嚴監生,臨終前躺在床上,豎起兩根指頭來。家裡的侄子,奶媽就圍著他問,是不是有什麼心願未了,卻都不解其意。最後,嚴監生的老婆趙氏猜到了原因,屋子裡的燈點著兩莖燈草,嚴監生覺得太浪費了,才遲遲不肯嚥氣。當趙氏把燈裡的燈草挑掉了一莖,嚴監生這才兩腿一蹬,雙眼一閉,安心去投胎了。
假設在多年輪迴後,嚴監生在 2017 年成了一個加密貨幣投資者。這天他用 imToken 1.0 給趙氏轉賬了 10 個 USDT,卻仍不改其吝嗇的本質,把手續費設定得很低,可這筆交易過了很久也沒有顯示轉賬成功。
嚴監生有些焦急,又給趙氏發去了一筆 10 個 USDT 的轉賬,這次手續費多給了一些,很快便成功了,而原先發起的第一筆交易則顯示失敗。
Emmmm~ 這是為什麼呢?
最近以太坊網絡轉賬的礦工費越來越貴,原因我們在《為什麼礦工費這麼貴?》解釋過了,那麼面對昂貴的礦工費,多數人都會選擇把礦工費調低一些,畢竟節儉一點沒啥不好的。
可是當我們使用 imToken 1.0 進行轉賬,把手續費調得很低時就可能會出現上面這種情況:第一筆交易遲遲不被打包,再次發起第二筆交易成功後,第一筆交易則會顯示失敗。
究其原因,是一個叫 nonce 的值造成的。
在以太坊上發生的每筆交易都有一個值叫 nonce,這個值用於計算一個以太坊地址中發出的交易數量。一個以太坊地址裡的所有轉賬會按照你發起轉賬的時間,給每一筆交易排序,從 0 開始計數。地址每發送一筆交易,交易的隨機數 nonce 就會增加 1,而轉入這個地址的交易則不會改變 nonce 值。
舉個例子:0x336d3e7fdFB677Bd1c7324919556EB6E98F6eDEF
這個地址中截止撰稿一共向外發起了 4 筆向外轉賬和 2 筆進賬收款,其中紅色框框標出的這兩筆交易不納入該地址的 nonce 值計算,其餘 4 筆向外轉賬交易的 nonce 值從下往上分別為 0,1,2,3。
以太坊區塊鏈對 nonce 做了這樣三條規定
- 礦工需要按照 nonce 值從小到大去打包轉賬,所以在 nonce 為 0 的交易未被礦工打包前,nonce 為 1,2,3···的交易無論礦工費給的多高,都必須一直排隊等著(就好比早高峰堵車的時候我們不能加塞,無論是拉斯萊斯還是奇瑞,都只能老老實實排隊)。
- nonce 是連續的,不能跳過。當 nonce 為 1 的交易沒有發起時,nonce 不能從 0 直接跳到 2,即 nonce 為 2 的交易只能發生在 nonce 為 1 的交易後面。
- 如果有兩筆交易 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 值相同的交易,就像是起跑線不同,終點線卻相同的運動員,只有第一名的飛人博爾特能被大眾關注,其他人則籍籍無名。
升級後的 imToken 2.0 則支持發起連續轉賬,如果嚴監生是用 imToken 2.0 進行轉賬,那麼他的第一筆交易 nonce 值為 0,第二筆交易 nonce 值則為 1,即便前面的交易還未被打包,後續發起的交易 nonce 值也會自動累加 1。
上面我們提到了 nonce 為 0 的交易未被礦工打包時,nonce 為 1 的交易就得一直等著,所以雖然後續發起的交易 nonce 值可以累加,卻必須排隊等著 nonce 值更小的交易被打包後,才能輪到自己。
這 n 筆先後發起, nonce 值不斷累加的交易,就像是起跑線不同,終點線也不同的運動員,但必須等到第一跑道的運動員到達終點後,第二、三、··· n 跑道的運動員才可以起跑。
如果第一跑道的人是博爾特,那麼後續的幾筆交易也能很快陸續上場,可要是第一跑道的人是海綿寶寶的寵物——小蝸,那後面跑道的運動員們可能就得等到天荒地老了。這個時候就該給小蝸一根能量棒,提提速!
imToken 2.0 針對到賬慢的交易推出了加速功能,這個功能就像是一個能量棒,吃下去後就能讓交易迅速被礦工打包。 imToken 會根據以太坊上的網絡情況,自動幫你計算出性價比最高的礦工費,點擊「加速交易」,就可以完成交易加速打包。
「加速交易」的原理其實也很簡單,就是再發起一筆 nonce 值相同,但礦工費更高的轉賬,來覆蓋原來的。這樣這筆交易就會更快被打包,原來的轉賬則被替代掉。
如果你拿不准自己轉賬的礦工費該如何設定,是貴了還是便宜了。別擔心,最新版的 imToken 已經支持多擋變速,「最快、快速、一般、緩慢」四種交易打包速度,任你選擇。
小結:
imToken 1.0 不支持交易加速和連續發起多筆交易。當一筆交易設置的礦工費過低時,會導致遲遲不被打包,也無法進行加速。而如果在第一筆交易還未成功被打包,就急於發起第二筆交易,則會導致其中一筆交易失敗。
imToken 2.0 支持交易加速、四擋變速和連續發起多筆交易。當一筆交易設置的礦工費過低時,可以追加礦工費,加速打包確認。在最新版 imToken 中,你可以按需選擇礦工費,「四擋變速」一目了然;如果不介意打包時間的話,可以連續發起多筆交易,靜靜等待交易被打包確認就可以了。