什么时候恢复功能?
When is function reverted?
因此,由于重入攻击,我正在构建我的函数以防止被黑客入侵。所以先更新映射等,然后发送付款。
我的问题是如果付款失败怎么办。是否仅恢复付款的整个功能?
因为如果只有付款,那意味着我的映射将被更新,就像付款已经完成一样。
是这样吗?
感谢解答!
如果要防止重入攻击,您可能会使用修饰符。因此,当检测到Reentrancy时,该函数将被还原,甚至不允许进入该函数。也就是说,不会有其他参数更新。
此外,我可以给你看一些演示代码来回答你的问题。
contract test {
uint public a = 0;
// a will still be a
function addRevert() public{
a += 1;
goRevert();
}
// a = a + 1
function addNoRevert() public{
a += 1;
}
function goRevert() pure public{
revert();
}
}
function withdraw(uint256 _amount) external {
balances[msg.sender] -= _amount;
(bool success, ) = payable(msg.sender).call{value: _amount}("");
}
如果 low-level .call()
不成功,success
的值将设置为 false
但这不会恢复整个交易。因此,即使付款没有通过,balances
值也会反映出来。
您可以添加一个require()
条件来查看支付结果。如果内部事务失败,这将使父事务失败。
(bool success, ) = payable(msg.sender).call{value: _amount}("");
require(success);
或者您可以使用 .transfer()
函数(address payable
的成员,不要与代币转账混淆)如果内部交易失败,该函数也会使父交易失败:
function withdraw(uint256 _amount) external {
balances[msg.sender] -= _amount;
payable(msg.sender).transfer(_amount);
}
因此,由于重入攻击,我正在构建我的函数以防止被黑客入侵。所以先更新映射等,然后发送付款。
我的问题是如果付款失败怎么办。是否仅恢复付款的整个功能?
因为如果只有付款,那意味着我的映射将被更新,就像付款已经完成一样。
是这样吗?
感谢解答!
如果要防止重入攻击,您可能会使用修饰符。因此,当检测到Reentrancy时,该函数将被还原,甚至不允许进入该函数。也就是说,不会有其他参数更新。
此外,我可以给你看一些演示代码来回答你的问题。
contract test {
uint public a = 0;
// a will still be a
function addRevert() public{
a += 1;
goRevert();
}
// a = a + 1
function addNoRevert() public{
a += 1;
}
function goRevert() pure public{
revert();
}
}
function withdraw(uint256 _amount) external {
balances[msg.sender] -= _amount;
(bool success, ) = payable(msg.sender).call{value: _amount}("");
}
如果 low-level .call()
不成功,success
的值将设置为 false
但这不会恢复整个交易。因此,即使付款没有通过,balances
值也会反映出来。
您可以添加一个require()
条件来查看支付结果。如果内部事务失败,这将使父事务失败。
(bool success, ) = payable(msg.sender).call{value: _amount}("");
require(success);
或者您可以使用 .transfer()
函数(address payable
的成员,不要与代币转账混淆)如果内部交易失败,该函数也会使父交易失败:
function withdraw(uint256 _amount) external {
balances[msg.sender] -= _amount;
payable(msg.sender).transfer(_amount);
}