Aufrufen eines Vertrags aus einem aufgerufenen Vertrag

Ich versuche, verschachtelte Anrufe oder wie auch immer sie heißen, zu tätigen. Ich komme immer aus der Gasausnahme heraus . Was vermisse ich?

Von JS-Seite mache ich dascaller.makeCall(firstAddress, secondAddress, {gas:300000, value: 300000000000000000}, callback)

Hier die Verträge:

contract caller {
    function makeCall(address first, address second){
        first.call.gas(100000).value(200000000000000000)(bytes4(bytes32(sha3('makeCall(address)'))), second);
    }
}

contract first {
    function makeCall(address second) {
        second.call.gas(100000).value(100000000000000000)(bytes4(bytes32(sha3('make()'))));
    }
}

contract second {
    uint public x = 1;
    function make(){
        x = 2;
    }
    function(){
        x = 3;
    }
}

Ich habe alles doppelt überprüft. Ich habe bis zu 3 Millionen Gas geliefert und komme immer noch aus der Gasausnahme heraus .

Hier ist ein TX https://testnet.etherscan.io/tx/0xf5986e85f7601e6a896eda22d72cb302d59013f9750c9997bf112acea757f839

Bitte helfen Sie!

Antworten (2)

Sie ändern die Funktionsparameter, nicht die Gaswerte. Informationen zur korrekten Syntax zum Aufrufen externer Vertragsmethoden aus Verträgen finden Sie in der Dokumentation .

Verwenden Sie niemals call() für Methoden, die den Zustand der Blockchain ändern. call() wird nur zum Abfragen (Lesen) der Blockchain verwendet.

Puh, ich habe einen Fehler gefunden.

Das Problem war also, dass first.call.gas(100000)Forwards firstgenau diesen Betrag abschließen. Wenn die EVM-Steuerung erreicht second.call.gas(100000)ist, leitet sie diese Menge an den zweiten Vertrag weiter, und als Ergebnis ist kein Gas mehr für den ersten Vertrag übrig . Und daher kommt die Gasmangel- Ausnahme. Jetzt habe ich auf geändert first.call.gas(100000)und first.call.gas(200000)alles funktioniert einwandfrei.

  • Anrufer hat 0,1 Ether Guthaben
  • hat zuerst 0,1 Ether Balance
  • zweite hat 0,1 Ether Balance
  • uint öffentlich x == 2