我收到一个错误:“ MetaMask-RPC错误:错误:错误:带有有效负载的[ethjs-rpc] rpc错误”

时间:2019-06-09 11:52:55

标签: payload metamask

  1. 我通过javascript发送交易
  2. Metamask打开传输对话框
  3. 我确认
      

    我在metamask中收到一条错误消息(inpage.js:1 MetaMask-RPC错误:错误:错误:[ethjs-rpc] rpc错误,有效负载为{“ id”:3801695059583,“ jsonrpc”:“ 2.0”,“ PARAMS “:[” 0xf8ac098504a817c80082753094bd212f85764be5ecdb5d0ca44ed46ac866b352c781c8b844d0679d3400000000000000000000000058f9015d8b36eacbd4d105cb79872992c073583f0000000000000000000000000000000000000000000000000000000000000000822d45a028d2355a1149fac93070742fc4e14213f441d4a8dfd97611b4de238f1ef70ffaa048f0eed65a9c495ce42229d569d156a7ff4cc206efced1f25e1c779c53f24485 “],” 方法 “:” eth_sendRawTransaction“}错误:VM异常而处理事务:复归)

我在metamask-setting中重置了帐户的交易历史记录

**我的html中有关帐户的信息************************** 硬币:(obj / adr / data):[object Object] / 0xBd212f85764Be5ecDB5d0ca44ed46AC866B352c7 / undefined CoinContract:(obj / adr / data):[对象对象] /未定义/未定义 硬币安泽根·明德:0x6d8c98f8eb01f8f7ee55d25bf01e30fa64333940 Coin erzeugen Account1 0x6d8C98f8eb01F8f7ee55D25Bf01e30Fa64333940 Saldo1 65764158165999998600 Amount:0.37 硬币发送帐户2 0x58f9015d8B36EAcBD4d105CB79872992C073583F Saldo2 30997031680000000000金额:0.37 投币帐户3 0xBd212f85764Be5ecDB5d0ca44ed46AC866B352c7 Saldo3 0金额:0.37


************从container.js调用转译******************

CoinSenden函数(数据,地址){

console.log(“硬币发送:” + adressat);

尝试{

//
// Code für ändern ????
//
var param1=data.amount;
var myContract = web3.eth.contract(CoinABI);
var myContractInstance = myContract.at(CoinContractADR);
console.log("contract/contractinstanz:" + myContract + "/" + myContractInstance);
console.log("contract/contractinstanz:" + myContract.address + "/" + myContractInstance.address);
console.log("para:" + param1 + "/" + "adr:" + ContainerAccount2);

myContractInstance.send(
  ContainerAccount2,param1,
  {from : ContainerAccount2, value: 200, gas: 30000, gasPriceInWei : 1000}, 
  function(err, myContract){
    if(!err) {
       // NOTE: The callback will fire twice!
       // Once the contract has the transactionHash property set and once its deployed on an address.
        // e.g. check tx hash on the first call (transaction send)
       if(!myContract.address) {
           console.log("Phase1- " + myContract.transactionHash) // The hash of the transaction, which deploys the contract

       // check address on the second call (contract deployed)
       } else {
           console.log("Phase2- " + myContract.address) // the contract address
       }
        // Note that the returned "myContractReturned" === "myContract",
       // so the returned "myContractReturned" object will also get the address set.
    }
    else {

      console.log("Fehler in der Methode beim Coin senden: " + err);

    }
  });



console.log("Coin senden fertig.")

}捕获(错误){

console.log("Fehler beim Coin senden: " + err);

}

}

嗯,不是很多。我想看看它是否有效: 1. ganache中的已承诺交易 2.帐户的新余额

5 个答案:

答案 0 :(得分:3)

是的,我也遇到了同样的问题。但是对我来说答案很简单。我只需要清除Metamask中的交易记录。设置->重设帐户。 enter image description here。原因是因为Metamask在内部保存了跟踪本地区块链随机数的状态。当您重置本地区块链,但不要重置Metamask时,它会感到困惑,并认为它过去试图发送某个区块的交易。但是重设帐户会清除该历史记录,因此您一切顺利。它不会改变余额,因此非常快捷,简便。

答案 1 :(得分:2)

我遇到了这个问题,终于解决了。

当您在Metamask上从一个Ganache帐户更改为另一个帐户时,问题是刷新问题。如果不这样做,则App.js中不会刷新相应的代码,您将在某个地方出现null导致此错误。

对于一个买卖商品的DApp,在连接到MetaMask上的ganache帐户0(coinbase帐户)成功售出项目后,我出售了该项目,然后切换到Ganache帐户1(或任何其他ganache)帐户)购买刚售出的商品。现在,我不断收到此错误,这很糟糕。在检查我的代码时,我发现了from帐户:默认情况下,App.account指向0x0,并且在更改Metamask上的Ganache帐户后(即使您实际上是在浏览器上进行刷新)也可能没有刷新,您需要确保有一个代码刷新以重新加载项目。因此,您需要重新运行displayAccount函数以刷新App.account并确保它不为null,这可以解决问题:请参阅我的代码:

 App.displayAccountInfo(); //I added this line before the buyItem method could work  
    const transactionReceipt = await itemStoreInstance.buyItem(
        _itemId, {
            from: App.account,// This was null till i added displayAccountInfo() above
            value: _price,
            gas: 5000000
        }
    ).on("transactionHash", hash => {
        console.log("transaction hash", hash);
    });

在您更改为Metamask上的另一个Ganache帐户并将其分配给App.account后,显示帐户将仅调用eth.getAccounts:

displayAccountInfo: async () => {
    const accounts = await window.web3.eth.getAccounts();
    App.account = accounts[0];
    $('#account').text(App.account);
    const balance = await window.web3.eth.getBalance(App.account);
    $('#accountBalance').text(window.web3.utils.fromWei(balance, "ether") + " ETH");
},

将其应用于您的问题的上下文,查找null的位置,它将解决问题

答案 2 :(得分:0)

答案可能为时已晚。但是只是为了其他进来的人。 我今天有同样的问题。然后修复它。 看到它是由于在javascript中创建合同实例的方式不正确。请检查合同实例的创建方式。 好吧,这可能只是其中一种情况!

答案 3 :(得分:0)

Metamask使用localhost(本地节点)上的RPC连接到测试网络时,也会发生rpc-payload错误。在通过HTTP服务RPC的计算机上,应用于geth的传输块也会发生相同的情况。

enter image description here

如果您连接到网络上的另一个RPC服务节点,该限制就会消失。

enter image description here

答案 4 :(得分:0)

这是一个非常小的问题,并且我确实犯了与您相同的错误。但我想通了

只需更改此

{from : ContainerAccount2, value: 200, gas: 30000, gasPriceInWei : 1000} 

{from : ContainerAccount2, value: web3.utils.toWei( (200).toString() , 'ether'), gas: 30000, gasPriceInWei : 1000}

那么您的问题就会解决。

说明: 您不能像以前一样直接发送以太币,只能转换为“ 单位

希望你明白我的意思