Web3js
使用 Ropsten 網路時,方法 eth_sendTransaction 不存在/不可用
我的以下程式碼以前在 Ganache 上執行良好,但是當我將其切換到 Ropsten Network 時,它給出了標題錯誤。 這是程式碼:
async function finalSettersFunctions(){ var myFunc; var myContAddr ; for(i=0; i < contractAddressess.length; i++) { myContAddr = contractAddressess[i] for(j=1; j<finalSetters[i].length; j++) { myFunc = finalSetters[i][j]; try { await web3.eth.sendTransaction( {from:account1, to:myContAddr, data: myFunc }, function(err, receipt) {console.log("Normal Setters: ",receipt)}); } catch (error) { console.log(" Normal Setters: ERROR !", error); } } } }
需要注意的是,我所有的 setter 函式都是編碼形式,意味著它們的所有 methodId 和參數都是嵌入的,即myFunc= 0x34fcd000000000033400000000000678888800000000……..
這是詳細的錯誤:
The method eth_sendTransaction does not exist/is not available at Object.ErrorResponse (C:\Users\aa\node_modules\web3-core-helpers\src\errors.js:29:16) at C:\Users\aa\node_modules\web3-core-requestmanager\src\index.js:140:36 at XMLHttpRequest.request.onreadystatechange (C:\Users\aa\node_modules\web3-providers-http\src\index.js:102:13) at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\aa\node_modules\xhr2-cookies\dist\xml-http-request-event-target.js:34:22) at XMLHttpRequest._setReadyState (C:\Users\aa\node_modules\xhr2-cookies\dist\xml-http-request.js:208:14) at XMLHttpRequest._onHttpResponseEnd (C:\Users\aa\node_modules\xhr2-cookies\dist\xml-http-request.js:318:14) at IncomingMessage.<anonymous> (C:\Users\aa\node_modules\xhr2-cookies\dist\xml-http-request.js:289:61) at IncomingMessage.emit (events.js:203:15) at endReadableNT (_stream_readable.js:1143:12) at process._tickCallback (internal/process/next_tick.js:63:19)
更新:我的提供者是
Web3.providers.HttpProvider("https://ropsten.infura.io/v3/
**更新 2:**我已經根據評論更改了我的程式碼(簽署我的交易和 sendSignedTransaction)……我的新程式碼也是如此
async function finalSettersFunctions(){ var myFunc; var myContAddr ; for(i=0; i < contractAddressess.length; i++) { myContAddr = contractAddressess[i] for(j=1; j<finalSetters[i].length; j++) { myFunc = finalSetters[i][j]; /// here i have changed ! rawTx = { nonce: await web3.eth.getTransactionCount(account1), gasPrice: '0x09184e72a000', gasLimit: '0x2710', to: myContAddr, data: myFunc } var tx = new Tx(rawTx); tx.sign(privateKey2); var serializedTx = tx.serialize(); web3.eth.sendSignedTransaction('0x' + serializedTx.toString('hex')) .on('receipt', console.log); } } }
但它給出了這個錯誤
Error: Returned error: invalid sender
你
account1
在 Infura 上解鎖了嗎?當然,這是不可能的(你也不希望這樣)。
此操作模式僅在您使用自己的私有節點時可用,這樣其他人將無法利用您的帳戶。
即便如此,這也不是推薦的操作模式,因為任何入侵您的節點的人都可以隨意利用您的帳戶。
因此,它主要用於測試目的(就像 Ganache 一樣,請參閱對您問題的評論)。
否則,建議使用您的私鑰對交易進行簽名,然後將其發送到節點(再說一次 - Infura 節點是公開的,這不僅是推薦的操作模式,而且是唯一可用的模式)。