Truffle v4.1.8 node 10.0.0 pragma solidity ^0.4.21;
Ich rufe die claimRefund
Funktion in meinem Smart Contract mit Metamask auf. Beim Aufruf der Funktion mit 37081 Gaslimit bei 20 gwei Gaspreis gibt die Transaktion 36924 Gas aus und wird mit EVM Revert rückgängig gemacht.
Wenn ich die Parameter auf 58080 Gaslimit bei einem Gaspreis von 20 gwei ändere, wird die Transaktion bestanden und 24721 Gas ausgegeben.
Der Code ist unten gezeigt:
/**
* @param investor Investor address
*/
function refund(address investor) public {
require(state == State.Refunding);
uint256 depositedValue = deposited[investor];
deposited[investor] = 0;
investor.transfer(depositedValue);
emit Refunded(investor, depositedValue);
}
}
function claimRefund() public {
require(isFinalized);
require(!goalReached());
vault.refund(msg.sender);
}
Wie ist es möglich, dass derselbe Anruf zu unterschiedlichen Gasausgaben führt? Außerdem, wie kann eine Funktion versagen, nachdem sie mehr Gas verbraucht hat, und bestanden werden, nachdem sie weniger Gas verbraucht hat?
Das Problem ist, dass die Menge an Gas, die Sie liefern müssen, manchmal größer ist als die Menge, die tatsächlich abgezogen wird.
Dies geschieht, weil beim Löschen des Speichers, wie beim Löschen des Guthabens aus deposited[investor]
, eine Gasrückerstattung erfolgt, die von Ihrem insgesamt abgezogenen Gas abgezogen wird. Diese Rückerstattung wird jedoch erst am Ende der Transaktion gutgeschrieben und kann daher nicht zur Bezahlung der darauf folgenden Schritte verwendet werden, in diesem Fall Ihres transfer
Anrufs und Ihrer Refunded
Veranstaltung.
Tudor Constantin
goalReached()
würde auch helfen.Ismael