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 pay
zahlt sie an eine beliebige Adresse. testrpc
Aber wenn ich Remix an den lokal laufenden bzw. ans Netzwerk anschließe Rinkeby
schlägt dieser Vertrag online bei transfer
Aufruf mit Fehler fehl transact to Test.pay errored: VM Exception while processing transaction: out of gas
.
transfer
Ich habe versucht, mit send
ohne 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?
out of gas
Fehler bedeutet manchmal , dass nicht genug Gas vorhanden ist, um die Transaktion abzuschließen.
Während vor der Einführung des REVERT
Opcodes out of gas
im Falle eines Wurfs ein Fehler auftreten konnte, da er das gesamte Gas verbrauchte, REVERT
ist dieser Fehler zuverlässiger und Sie können mit hoher Wahrscheinlichkeit davon ausgehen, dass es sich um eine tatsächliche out of gas
und nicht um eine andere Ausnahme handelt.
Versuchen Sie, das Gaslimit für Ihre Transaktion zu erhöhen, und prüfen Sie, ob es funktioniert.
medwedew1088
Ismael
msg.sender
ein 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 verwendencall
, wie hierrequire(msg.sender.call.value(_amount).gas(_gas)());
Alex GP
Alex GP
medwedew1088
Alex GP
32144
. Die zweite Vertragsfunktionpay
arbeitet mit demselben Gaslimit, ist also nicht mit dem Problem verbunden.medwedew1088
Alex GP
Alex GP
medwedew1088
Alex GP
Maximus
truffle console
. Bei mir funktioniert es mit dem gleichen Problem.