Ethereum web3错误:执行eth_estimateGas时发生VM异常:操作码无效

Ethereum web3错误:执行eth_estimateGas时发生VM异常:操作码无效,ethereum,solidity,web3js,remix,Ethereum,Solidity,Web3js,Remix,我试图测试简单的传输方法(将某人的以太移动到另一个以太),但remix(solidity web编译器)说 我的文件结构是 pragma solidity ^0.4.18; contract Exchange { mapping (address => uint256) public balances; string public helloworld; event LogDeposit(address sender, uint amount); event LogWi

我试图测试简单的传输方法(将某人的以太移动到另一个以太),但remix(solidity web编译器)说

我的文件结构是

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;
  }

}

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

每个链都有一个gas limit,即矿工完成作业所能提供的最大gas量。因此,当你得到一个错误“基本费用超过天然气限制”时,它表示为执行你的操作而供应的天然气量超过了我解释的限制。您可以手动更改此限制,如下所示:

transfer(receiver.toString(),2,{gas:'amount here'})

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


至于你在混音中的错误,很难说清楚到底发生了什么,但毫无疑问,利用你提供的气体和类似的参数可能会奏效。

看起来你没有在你的客户中发送任何气体/加斯普里斯的交易选项。你能提供吗?看起来合同在混音中运行得很好(我使用了默认的3000000气体限制)
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;
  }

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