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