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!
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 first
genau 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.