我的职能是:
function setAccount(BaseUBI _ubi, address _user, uint256 _startTime, uint _esiaID, bool _setToZero) external {
uint256 _refund = (gasleft() + 0/*FIXME*/) * tx.gasprice;
require(msg.sender == server, "System function"); // don't refund otherwise
require(_refund <= balances[_user], "Not enough balance");
balances[_user] -= _refund; // must be called before transfer() against reentrancy attack
server.transfer(_refund); // refund gas to the server
_ubi.setAccount{gas: balances[_user]}(_user, _startTime, _esiaID, _setToZero);
// We may be in a wrong state now, don't change any variables here.
}应该用哪个数字来代替TODO,以确保服务器至少会收到它花费的那么多的气体?
是否有自动执行此任务的库?
发布于 2020-09-05 09:52:02
我想你可以用修饰符来做这个。
modifier refundGas {
uint256 gasAtStart = gasleft();
_;
uint256 gasSpent = gasAtStart - gasleft() + 28925;
msg.sender.transfer(gasSpent * tx.gasprice);
}
function anyFunction() refundGas public {
// Do something
}注意:数字28925是一个大约。在gas used for calculations + transfer的末尾。我用过混音器把它放在这里。然而,它可能也会稍微偏离。
不过,我也认为,如果你要退还汽油,那么有人可能会把合同内的ETH全部浪费在退款上。例如,server可以故意设定一个非常高的天然气价格,即使没有必要这样做,因为知道合同将100%退款。
https://ethereum.stackexchange.com/questions/87023
复制相似问题