以太坊nonce詳解

在咱們發佈eth智能合約後但願能夠同時轉帳多筆代幣,又不但願將羣發幣寫入智能合約,因此只能手動寫web3腳本交易,當咱們測試geth接口在一個交易失敗問題後,以後的交易都將阻塞,也沒法看到pendding狀態,最終他們將被取消。最後發現交易設置了相同nonce。git

什麼是nonce?

nonce有兩個意義在以太坊官方:
1.工做量證實:爲了證實工做量的無心義的值,這是採礦的本質,這個值將決定採礦的難度,
2.帳戶的隨機數:在一個帳戶中的防止多重交易的用途。例如一個交易從A到B 20個幣,可能從A到B發送屢次。github

實際驗證發現交易中nonce有一個要求致使兩個錯誤

要求:
以太坊要求一個帳戶的每筆交易有一個連續的計數。每一個節點將根據計數順序嚴格執行來自一個用戶的交易。
錯誤:
重複的計數:若是咱們發送一筆交易設置一個等於或者小於121的計數交易,節點將拒絕它。
間隔:若是咱們發送一個新的交易123或者更高,交易將不被執行直到間隔交易成功,也就是122成功執行。web

獲取nonce方法,以太坊交易流程,txpool的概念

如以前提到的,咱們由於發送交易設置相同的nonce,致使了重複計數錯誤,爲了解釋緣由讓咱們先了解以太坊交易流程和pending狀態:api

以太坊交易過程測試

  1. 用戶將一筆交易發送到一個以太坊節點
  2. 這個以太坊節點將交易轉發給其它挖礦的節點
  3. 挖礦的節點收到交易後將交易放入txpool(交易池)
  4. 全部挖礦節點都在txpool中選擇gas價高者,作成交易塊,而後運算塊的hash
  5. 若干個節點中的一個幸運兒運算出來hash,並交該塊廣播給其它節點驗證
  6. 其它節點驗證經過,在txpool中刪除上鍊交易

交易的pending狀態:當一筆交易已經被轉發到大多數的挖礦節點的txpool時候
獲取當前nonce方法web3.eth.getTransactionCount: 獲取已完成區塊中的該帳號最後的nonce
結論:因此錯誤緣由已經浮出水面了,若是有處於pending中的交易正在挖礦節點的txpool中,web3.eth.getTransactionCount只能獲取成功區塊的最後nonce而不能獲取txpool的最後的nonce,因此當使用getTransactionCount方法將致使發送一樣的nonce號給挖礦節點。這時已經已在節點中的大於或者等於該nonce的交易將被取消。接口

可能的解決辦法:

  1. 在循環發送交易時候累加nonce,在本身服務其記錄發送到多少nonce
  2. 經過getBlockByNumber得到正在pending的塊,便利全部交易,找到合適的nonce,運算量較大
  3. 加強本身以太坊節點查找整個txpool而不是pending block,有一個github的話題在談論這個問題,並有一個非標準的api parity_nextNonce,也有正在討論從新定義pendding對另外幾個JSON-rpc方法,也包括txpool。

沒法解決問題

中間若是有交易失敗沒法監控,由於只有補全間隔才能繼續交易。rpc

相關文章
相關標籤/搜索