Возможны ли повторные атаки, как только баланс в хранилище будет изменен после вывода? - PullRequest
0 голосов
/ 20 апреля 2020

Я только что видел что-то вроде этого:

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 операцию с точки зрения стоимости газа?

...