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