什么时候恢复功能?

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);
}