Kul*_*y14 4 reentrancy solidity smartcontracts
因此,由于重入攻击,我正在构建我的函数以防止被黑客攻击。因此,首先更新映射等,然后发送付款。
我的问题是如果付款失败怎么办?仅付款即可恢复整个功能吗?
因为只要付款就意味着我的映射将被更新,就像付款已完成一样。
是这样吗?
感谢您的解答!
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)
| 归档时间: |
|
| 查看次数: |
1001 次 |
| 最近记录: |