在咱們發佈eth智能合約後但願能夠同時轉帳多筆代幣,又不但願將羣發幣寫入智能合約,因此只能手動寫web3腳本交易,當咱們測試geth接口在一個交易失敗問題後,以後的交易都將阻塞,也沒法看到pendding狀態,最終他們將被取消。最後發現交易設置了相同nonce。git
nonce有兩個意義在以太坊官方:
1.工做量證實:爲了證實工做量的無心義的值,這是採礦的本質,這個值將決定採礦的難度,
2.帳戶的隨機數:在一個帳戶中的防止多重交易的用途。例如一個交易從A到B 20個幣,可能從A到B發送屢次。github
要求:
以太坊要求一個帳戶的每筆交易有一個連續的計數。每一個節點將根據計數順序嚴格執行來自一個用戶的交易。
錯誤:
重複的計數:若是咱們發送一筆交易設置一個等於或者小於121的計數交易,節點將拒絕它。
間隔:若是咱們發送一個新的交易123或者更高,交易將不被執行直到間隔交易成功,也就是122成功執行。web
如以前提到的,咱們由於發送交易設置相同的nonce,致使了重複計數錯誤,爲了解釋緣由讓咱們先了解以太坊交易流程和pending狀態:api
以太坊交易過程測試
交易的pending狀態:當一筆交易已經被轉發到大多數的挖礦節點的txpool時候
獲取當前nonce方法web3.eth.getTransactionCount: 獲取已完成區塊中的該帳號最後的nonce
結論:因此錯誤緣由已經浮出水面了,若是有處於pending中的交易正在挖礦節點的txpool中,web3.eth.getTransactionCount只能獲取成功區塊的最後nonce而不能獲取txpool的最後的nonce,因此當使用getTransactionCount方法將致使發送一樣的nonce號給挖礦節點。這時已經已在節點中的大於或者等於該nonce的交易將被取消。接口
中間若是有交易失敗沒法監控,由於只有補全間隔才能繼續交易。rpc