我应该可靠地依赖其他合约的 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()")
);
}
}
假设我的合约正在与不同的合约交互。
我正在与之交互的合同有一个 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()")
);
}
}