web3 错误:执行 eth_estimateGas 时出现 VM 异常:操作码无效

Posted

技术标签:

【中文标题】web3 错误:执行 eth_estimateGas 时出现 VM 异常:操作码无效【英文标题】:web3 error : VM Exception while executing eth_estimateGas: invalid opcode 【发布时间】:2018-04-29 12:47:47 【问题描述】:

我正在尝试测试简单的转移方法(将某人的以太转移到另一个),但是 remix(solidity 网络编译器)说

transact to browser/Exchange.sol:Exchange.transfer pending ... 
transact to browser/Exchange.sol:Exchange.transfer errored: Error: VM Exception while executing eth_estimateGas: invalid opcode
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:59368:17
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:69306:5
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11335:9
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:7895:16
at replenish (/Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8415:25)
at iterateeCallback (/Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8405:17)
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8380:16
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11332:13
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:69302:9
at /Users/strender/.nvm/versions/node/v8.8.1/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:63982:7 

而且,我的 Solidity 文件结构是

pragma solidity ^0.4.18;

contract Exchange 
  mapping (address => uint256) public balances;
  string public helloworld;

  event LogDeposit(address sender, uint amount);
  event LogWithdraw(address receiver, uint amount);
  event LogTransfer(address sender, address receiver, uint amount);
  event HelloworldEvent(string helloworld);


  function Exchange() 
    helloworld = "helloworld!";
  

  function helloWorld() returns (string) 
    return helloworld;
  

  function deposit() payable returns(bool success) 
    balances[msg.sender] += msg.value;
    LogDeposit(msg.sender, msg.value);
    return true;
  

  function withdraw(uint value) returns (bool success) 
    if (balances[msg.sender] < value) throw;
    balances[msg.sender] -= value;
    msg.sender.transfer(value);
    LogWithdraw(msg.sender, value);
    return true;
  

  function transfer(address to, uint value) payable returns (bool success) 
    if (balances[msg.sender] < value) throw;
    balances[msg.sender] -= value;
    to.transfer(value);
    LogTransfer(msg.sender, to, value);
    return true;
  


并且,在 web3 javascript 上,我尝试像这样调用函数“transfer(address to, uint value):

  $("#button").click(function() 
      Exchange.transfer(receiver.toString(), 2);
      // $("#loader").show();
    );

当我向这个 Exchange.transfer() 方法添加一些 gas, value 参数时,VM 返回“基本费用超过 gas 限制”

【问题讨论】:

您的客户端似乎没有发送任何带有 gas/gasPrice 的交易选项。你能提供吗?看起来合同在 Remix 中运行良好(我使用了默认的 3000000 气体限制) 【参考方案1】:

每条链都有一个 gas 限制,即您可以为矿工完成您的操作提供的最大 gas 量。因此,当您收到错误“基本费用超过气体限制”时,它表示执行您的操作所提供的气体量超过了我解释的限制。您可以像这样手动更改此限制:

Exchange.transfer(receiver.toString(), 2,gas:'amount here');

你可能已经知道了,但我猜你提供的太多了。

至于您在混音中的错误,很难准确判断发生了什么,但毫无疑问,使用您提供的气体和类似的参数可能会解决问题。

【讨论】:

以上是关于web3 错误:执行 eth_estimateGas 时出现 VM 异常:操作码无效的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 web3.js 中的错误

如何在 web3 中设置手动气体限制?让智能合约执行?

Web3JS 发送事务

使用 web3 和 go-ethereum 在私有以太坊区块链上打开和进行交易时未捕获(承诺)错误

转让所有权 web3

反应错误:未定义 web3' no-undef