我应该可靠地依赖其他合约的 require 声明吗?

Should I rely on require statements from other contracts in solidity?

假设我的合约正在与不同的合约交互。

我正在与之交互的合同有一个 require 语句,例如,如果您没有足够的令牌,它将恢复。

现在我不确定是否应该将相同的要求声明添加到我的合同中。如果我只依赖于其他合约的 require 语句,它会很脆弱吗?

谢谢

这取决于您如何调用外部合约。

如果您使用 contract/interface 类型对象和命名函数(参见 getExternalValueNamed()),它会还原主事务。

但是如果您使用 low-level 调用(参见 getExternalValueCall()),它不会恢复主事务。

pragma solidity ^0.8;

contract ExternalContract {
    function getValue() public {
        revert();
    }
}

contract Caller {
    address externalContractAddress;

    constructor(address _externalContractAddress) {
        externalContractAddress = _externalContractAddress;
    }

    function getExternalValueNamed() public {
        // causes the main transaction to revert
        ExternalContract(externalContractAddress).getValue();
    }

    function getExternalValueCall() public {
        // does not revert the main transaction
        externalContractAddress.call(
            abi.encodeWithSignature("getValue()")
        );
    }
}