摘要:實際驗證發現交易中有一個要求導致兩個錯誤要求以太坊要求一個賬戶的每筆交易有一個連續的計數。
在我們發布eth智能合約后希望可以同時轉賬多筆代幣,又不希望將群發幣寫入智能合約,所以只能手動寫web3腳本交易,當我們測試geth接口在一個交易失敗問題后,之后的交易都將阻塞,也無法看到pendding狀態,最終他們將被取消。最后發現交易設置了相同nonce。
什么是nonce?nonce有兩個意義在以太坊官方:
1.工作量證明:為了證明工作量的無意義的值,這是采礦的本質,這個值將決定采礦的難度,
2.賬戶的隨機數:在一個賬戶中的防止多重交易的用途。例如一個交易從A到B 20個幣,可能從A到B發送多次。
要求:
以太坊要求一個賬戶的每筆交易有一個連續的計數。每個節點將根據計數順序嚴格執行來自一個用戶的交易。
錯誤:
重復的計數:如果我們發送一筆交易設置一個等于或者小于121的計數交易,節點將拒絕它。
間隔:如果我們發送一個新的交易123或者更高,交易將不被執行直到間隔交易成功,也就是122成功執行。
如之前提到的,我們因為發送交易設置相同的nonce,導致了重復計數錯誤,為了解釋原因讓我們先了解以太坊交易流程和pending狀態:
以太坊交易過程
用戶將一筆交易發送到一個以太坊節點
這個以太坊節點將交易轉發給其它挖礦的節點
挖礦的節點收到交易后將交易放入txpool(交易池)
所有挖礦節點都在txpool中選擇gas價高者,做成交易塊,然后運算塊的hash
若干個節點中的一個幸運兒運算出來hash,并交該塊廣播給其它節點驗證
其它節點驗證通過,在txpool中刪除上鏈交易
交易的pending狀態:當一筆交易已經被轉發到大多數的挖礦節點的txpool時候
獲取當前nonce方法web3.eth.getTransactionCount: 獲取已完成區塊中的該賬號最后的nonce
結論:所以錯誤原因已經浮出水面了,如果有處于pending中的交易正在挖礦節點的txpool中,web3.eth.getTransactionCount只能獲取成功區塊的最后nonce而不能獲取txpool的最后的nonce,所以當使用getTransactionCount方法將導致發送同樣的nonce號給挖礦節點。這時已經已在節點中的大于或者等于該nonce的交易將被取消。
在循環發送交易時候累加nonce,在自己服務其記錄發送到多少nonce
通過getBlockByNumber獲得正在pending的塊,便利所有交易,找到合適的nonce,運算量較大
增強自己以太坊節點查找整個txpool而不是pending block,有一個github的話題在談論這個問題,并有一個非標準的api parity_nextNonce,也有正在討論重新定義pendding對另外幾個JSON-rpc方法,也包括txpool。
無法解決問題中間如果有交易失敗無法監控,因為只有補全間隔才能繼續交易。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24081.html
摘要:比特幣區塊鏈無疑是當今業界的最熱門的。目前,每個成功的礦工獲得可能每年更換一次或通過比特幣社區決策作為成功向區塊鏈添加一塊交易的獎勵。填寫其他詳細信息,例如比特幣金額和可選說明。 比特幣區塊鏈無疑是當今業界的最熱門的。通過這篇博客,我將盡力向大家介紹加密貨幣比特幣的概念,以及它如何創造我們稱之為區塊鏈的革命性技術。 這個問題經常引起混淆。這篇文章可以快速解釋和清理這方面的混亂! 什么是...
摘要:在中,該隨機數稱為,它需要滿足一個公式其中,去除區塊頭中生成的哈希值,見。固定值,生成的哈希值的最大取值。哈希值滿足條件的概率是,礦工需要進行次的判斷,才有可能找到一個符合條件的,當前以太坊難度為。 前言 Ethash實現了PoW,PoW的精妙在于通過一個隨機數確定,礦工確實做了大量的工作,并且是沒有辦法作弊的。接下來將介紹: Ethash的挖礦本質。 Ethash是如何挖礦的。 如...
閱讀 2448·2021-10-08 10:17
閱讀 1824·2021-09-06 15:02
閱讀 2538·2019-08-29 17:30
閱讀 2663·2019-08-29 13:24
閱讀 1521·2019-08-29 11:12
閱讀 3337·2019-08-28 17:52
閱讀 666·2019-08-26 11:30
閱讀 3575·2019-08-26 11:01