2017-11-16 1 views
0

Ich versuche einfach Übertragungsmethode zu testen (jemandes Äther zum anderen bewegen), aber der Remix (Solidität Web-Compiler) sagtweb3 Fehler: VM Ausnahme beim Ausführen eth_estimateGas: ungültige Opcode

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 

und meine Solidity Dateistruktur ist

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

} 

und auf der web3 JavaScript aktivieren, habe ich versucht, die Funktion „Transfer (Adresse, uint-Wert) wie folgt zu nennen:

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

Wenn ich einige Gas-, Wertparameter zu dieser Exchange.transfer() -Methode hinzugefügt hat, gibt die VM "Basisgebühr überschreitet Gaslimit" zurück

+0

Es sieht so aus, als ob Sie keine Transaktionsoptionen mit Gas/GasPrice in Ihrem Client senden. Können Sie das bieten? Es sieht so aus, als ob der Vertrag in Remix gut funktioniert (ich habe das Standard-Gaslimit von 3000000 verwendet) –

Antwort

0

Jede Kette hat eine Gasgrenze, dh die maximale Menge an Gas, die Sie anbieten können Ihre Aktion wird von den Bergleuten abgeschlossen. Wenn Sie also eine Fehlermeldung erhalten, dass die Grundgebühr das Gaslimit überschreitet, sagen Sie, dass die Menge an Gas, die zur Ausführung Ihrer Aktion geliefert wird, mehr ist als das Limit, das ich erklärt habe. Sie können dieses Limit wie folgt manuell ändern:

Exchange.transfer (receiver.toString(), 2, {gas: 'menge here'});

was Sie wahrscheinlich schon wissen, aber meine Vermutung wäre, dass Sie viel zu viel liefern.

Wie für Ihren Fehler in Remix, ist es schwer zu sagen, was los ist, aber kein Zweifel, so mit dem Gas zu spielen Sie liefern und ähnliche Parameter wird wahrscheinlich den Trick tun.

Verwandte Themen