unchecked {
balances[msg.sender] -= _amount;
}
Реентранси снова пройдет! В общем, такое получилось небольшое расследование. Если все так же не очень понятен смысл поста, то рекомендую сначала посмотреть видео про рекурсию, а потом еще раз почитать про реентранси.
P.S. Если захотите увидеть, как все происходит внутри, добавьте этот тест в Foundry:
contract TestReentrancy is Test {
using stdStorage for StdStorage;
Wallet public wallet;
AttacWallet public attacWallet;
function setUp() public{
wallet = new Wallet();
attacWallet = new AttacWallet(payable(wallet));
vm.deal(address(wallet), 10 ether);
vm.deal(address(attacWallet), 2 ether);
}
function test_testSetup() public {
attacWallet.depositAttack();
attacWallet.attack();
console.log(address(attacWallet).balance);
}
}
И запустите команду в терминале:forge test --match-contract TestReentrancy -vvvv
Надеюсь, некоторым, как и мне вчера, стало чуть более понятна эта атака.
#reentrancy