Web3js

使用 Ropsten 網路時,方法 eth_sendTransaction 不存在/不可用

  • December 25, 2019

我的以下程式碼以前在 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 節點是公開的,這不僅是推薦的操作模式,而且是唯一可用的模式)。

引用自:https://ethereum.stackexchange.com/questions/78496