Einfache Amortisationsfunktion ohne Benzin

Ich habe einen sehr einfachen Vertrag wie diesen:

pragma solidity ^0.4.15;

contract Test {
    function() public payable {
    }

    function pay(uint _amount) public returns (uint) {
        require(this.balance >= _amount);
        msg.sender.transfer(_amount);
    }
}

Sobald Remix mit JavascriptVM gestartet wurde, funktioniert es wie erwartet - die kostenpflichtige Funktion empfängt Ether und payzahlt sie an eine beliebige Adresse. testrpcAber wenn ich Remix an den lokal laufenden bzw. ans Netzwerk anschließe Rinkebyschlägt dieser Vertrag online bei transferAufruf mit Fehler fehl transact to Test.pay errored: VM Exception while processing transaction: out of gas.

transferIch habe versucht, mit sendohne Erfolg zu ersetzen .

Natürlich habe ich versucht, weniger als den aktuellen Vertragssaldo zu zahlen (10 ETH gesendet, versucht, 5 ETH auszuzahlen).

AKTUALISIERT:

Es ist verdammt seltsam, aber fast der gleiche Vertrag funktioniert:

contract Test {

    event Event(string _msg, address _address, uint _amount);

    function() public payable {
    }

    function pay(uint _amount) public returns (uint256) {
        require(this.balance >= _amount);

        _pay(msg.sender, _amount);
    }

    function _pay(address _to, uint _amount) private {
        _to.transfer(_amount);
        Event("Outcome", _to, _amount);
    }
}

ABER! Wenn ich Erwähnungen entferne Event- funktioniert es nicht mehr mit dem gleichen Fehler!

UPD2: Es wird immer seltsamer. Wenn im Vertrag das funktioniert, entferne ich returns (uint256)es und höre auch auf zu arbeiten. Ich bin total verwirrt - warum wirkt sich der Rückgabewert auf Auftragsarbeiten aus? Warum getrennte Logik funktioniert und zu einer Funktion zusammengeführt wird - nein?

Welches Gaslimit hast du eingestellt? Haben Sie einen Link zur Transaktion auf rinkeby?
Ist msg.senderein Vertrag? Beim Senden von Ether zu einem Vertrag mit Überweisung ist das Gas als Sicherheitsmaßnahme auf 2300 'Gas-Stipendium' begrenzt. Um mehr Gas zuzulassen, müssen Sie die niedrige Stufe verwenden call, wie hierrequire(msg.sender.call.value(_amount).gas(_gas)());
@medvedev1088 Standard für die Übertragung vom Vertrag.
@Ismael nein, msg.sender ist die Adresse des Benutzers.
@AlexG.P. Ich meine das Gaslimit, das Sie für die Transaktion festgelegt haben
@medvedev1088 32144. Die zweite Vertragsfunktion payarbeitet mit demselben Gaslimit, ist also nicht mit dem Problem verbunden.
@AlexG.P. Übertragungsfunktion kostet 9700, daher kann es sein, dass das angegebene Gaslimit nicht ausreicht. Haben Sie einen Link zu der Transaktion auf Rinkeby?
@medvedev1088 9700 < 37144
@AlexG.P. Sie müssen intrinsisches Gas und Gas für Berechnungen hinzufügen, es könnte sehr nahe an der von Ihnen festgelegten Gasgrenze liegen. Alle Transaktionen in dem von Ihnen angegebenen Link sind erfolgreich.
@medvedev1088 ja, jetzt sehe ich, dass alle tx in Ordnung sind, aber wenn dieser Vertrag auf lokal laufendem testrpc erstellt wird, schlägt er trotzdem fehl. Es hat keine zusätzliche Berechnung/Logik.
Es ist ein Fehler von Remix. Versuchen Sie zu verwenden truffle console. Bei mir funktioniert es mit dem gleichen Problem.

Antworten (1)

out of gasFehler bedeutet manchmal , dass nicht genug Gas vorhanden ist, um die Transaktion abzuschließen.

Während vor der Einführung des REVERTOpcodes out of gasim Falle eines Wurfs ein Fehler auftreten konnte, da er das gesamte Gas verbrauchte, REVERTist dieser Fehler zuverlässiger und Sie können mit hoher Wahrscheinlichkeit davon ausgehen, dass es sich um eine tatsächliche out of gasund nicht um eine andere Ausnahme handelt.

Versuchen Sie, das Gaslimit für Ihre Transaktion zu erhöhen, und prüfen Sie, ob es funktioniert.