Я только что видел что-то вроде этого:
function sub(
uint a,
uint b
)
internal
pure
returns (uint)
{
require(b <= a, "SUB_UNDERFLOW");
return a - b;
}
function withdraw(uint amount) public {
msg.sender.call.value(amount).gas(gasleft())("");
balance[msg.sender]=balance[msg.sender].sub(amount);
}
Здесь возможна атака повторного входа, или balance[msg.sender]
перезагружается после вызова, делая вычитание на основе значения после вызова?
Может ли оптимизация компилятора повлиять на поведение посредством кэширования в стеке, чтобы иметь одну SLOAD
операцию с точки зрения стоимости газа?