功能何时恢复?

Kul*_*y14 4 reentrancy solidity smartcontracts

因此,由于重入攻击,我正在构建我的函数以防止被黑客攻击。因此,首先更新映射等,然后发送付款。

我的问题是如果付款失败怎么办?仅付款即可恢复整个功能吗?

因为只要付款就意味着我的映射将被更新,就像付款已完成一样。

是这样吗?

感谢您的解答!

Pet*_*jda 5

function withdraw(uint256 _amount) external {
    balances[msg.sender] -= _amount;
    (bool success, ) = payable(msg.sender).call{value: _amount}("");
}
Run Code Online (Sandbox Code Playgroud)

如果低级别.call()不成功,则 的值success将设置为false,但这不会恢复整个事务。因此,balances即使付款没有完成,价值也会反映出来。

您可以添加require()条件来检查付款结果。如果内部事务失败,这将使父事务失败。

(bool success, ) = payable(msg.sender).call{value: _amount}("");
require(success);
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用.transfer()函数( 的成员address payable,不要与令牌传输混淆),如果内部交易失败,该函数也会使父交易失败:

function withdraw(uint256 _amount) external {
    balances[msg.sender] -= _amount;
    payable(msg.sender).transfer(_amount);
}
Run Code Online (Sandbox Code Playgroud)