時(shí)間:2023-06-13|瀏覽:246
在以太坊黃皮書中,nonce是一個(gè)標(biāo)量值,等于從該地址發(fā)送的交易數(shù)量或在具有關(guān)聯(lián)代碼的賬戶情況下創(chuàng)建的合約數(shù)量。
以太坊所有交易都是基于賬戶,不同于比特幣的基于utxo,因此需要記錄每個(gè)交易的順序。nonce值就是這個(gè)順序,它是交易原始地址的屬性。盡管nonce不存儲(chǔ)在以太坊區(qū)塊鏈上,但是通過計(jì)算從地址發(fā)送的交易數(shù)量來計(jì)算它。
每次發(fā)起一筆交易,nonce值會(huì)加一。對(duì)于發(fā)起交易的兩種情況:1.外部賬戶(EOA)每發(fā)送一筆交易;2.合約賬戶(ContractWallet)每創(chuàng)建一個(gè)合約。轉(zhuǎn)入交易和合約調(diào)用其他合約等則屬于內(nèi)部調(diào)用,因此nonce值不變。
它有哪些作用?
作用1:交易順序。假設(shè)你要發(fā)送兩個(gè)值為1和4ETH的交易,并希望按順序打包。發(fā)送一筆交易后,你直接繼續(xù)發(fā)送第二筆交易,礦工將無法知道你維護(hù)交易順序的意圖。如果你的第一筆交易(1ETH)的nonce值為0(假設(shè)是新賬戶),那么4ETH交易的nonce值為1。礦工可根據(jù)nonce值的順序打包交易。
作用2:防止重放攻擊。如果沒有nonce,則交易很容易被重復(fù)提交給以太坊網(wǎng)絡(luò),消耗你的余額。而包含nonce的交易,同一nonce的交易只能被打包一次。
如何使用nonce?
以太坊內(nèi)部有一個(gè)交易池(txpool),它存放交易。發(fā)起轉(zhuǎn)賬或創(chuàng)建合約時(shí),可使用web3從以太坊網(wǎng)絡(luò)查詢當(dāng)前的nonce值,并將其需要傳遞參數(shù)nonce,官方文檔對(duì)于nonce的說明如下: "nonce: QUANTITY - (可選) 一個(gè)nonce的整數(shù)。這允許覆蓋使用相同nonce的待處理事務(wù)。"
使用eth_getTransactionCount獲取nonce值時(shí),需要傳遞以下參數(shù):[地址,QUANTITY(最新)、pending]。如果有處于pending狀態(tài)的交易,請(qǐng)將參數(shù)更換為pending,否則將無法獲取正確計(jì)數(shù)。
加速和取消以太坊的交易。
由于nonce的特性,可使用相同的noncehttps://segmentfault.com/a/18999