VM-Ausnahme beim Ausführen von eth_estimateGas mit for-Schleife

Wichtig:

  • Verwenden von Solidity IDE mit Web3-Anbieter
  • Test RPC und web3 installiert
  • Testen mit 10 Ether-Konten mit genügend Ether (100 ETH) pro Konto.

Ich teste einen einfachen Vertrag, der Ether von einem Konto empfängt, den Wert aufteilt und auf 3 andere Konten überträgt.

contract testContract {

    address[] employees = [
        0x4cd28d9a0d66216382ad3e1c993797989d1a8e05,
        0xb871e16d7192cbaa2b5be32f85c1a19f61b8a50d,
        0x5e5527378c42b91e95fee2cfbe974259d983a99e
    ];

    function testContract() payable {

    }

    function () payable {
        uint amountPerEmployee = msg.value / employees.length;

        for(uint i = 0; i <= employees.length; i++) {
            employees[i].transfer(amountPerEmployee);
        }
    }

} 

Beim Ausführen der Callback-Funktion mit der Schleife erhalte ich eine Fehlermeldung:

Rückruf enthält kein Ergebnis Fehler: Fehler: VM-Ausnahme beim Ausführen von eth_estimateGas: ungültiger Opcode bei /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:59368:17 bei /usr/local/lib/node_modules /ethereumjs-testrpc/build/cli.node.js:69306:5 unter /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11335:9 unter /usr/local/lib/node_modules /ethereumjs-testrpc/build/cli.node.js:7895:16 bei replenish (/usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8415:25) bei iterateeCallback (/usr/ local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8405:17) unter /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:8380:16 unter /usr /local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:11332:13 unter /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:69302:9 unter /usr/local/lib/node_modules/ethereumjs-testrpc/build/cli.node.js:63982:7

Beim Testen der Callback-Funktion wie unten läuft alles gut:

function () payable {
    uint amountPerEmployee = msg.value / employees.length;

    // Test with only the first item in the array, no loop
    employees[0].transfer(amountPerEmployee);
}

Was geht hier vor sich? Ist es der Kreislauf, der zu viel Gas verbraucht?

Antworten (1)

Du gehst mit vom Ende des Arrays

for(uint i = 0; i <= employees.length; i++)

employees[]hat genau 3 Zeilen, nämlich: 0, 1, 2.

Du lässt izu 3, was nicht existiert, also ist es nicht glücklich.

Ein verwandter Tipp für später, wenn Sie fortfahren. Aus Gründen der Skalierbarkeit sollten Sie die Schleife aus dem Bild vollständig umgestalten.

Ich hoffe es hilft.

Vielen Dank! Das hat das Problem behoben. Und danke auch für den Tipp.