如需获取本内容的最新版本,请参见 Cyfrin.io 上的Call(代码示例)
call是一种与其他合约交互的低级函数。
当你仅需通过调用fallback函数发送以太币时,这是推荐使用的方法。
然而,它并非调用现有函数的推荐方式。
不推荐使用低级call的几个原因包括:
• 错误回滚不会被传递
• 类型检查会被绕过
• 函数存在性检查会被忽略
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract Receiver {
event Received(address caller, uint256 amount, string message);
fallback() external payable {
emit Received(msg.sender, msg.value, "Fallback was called");
}
function foo(string memory _message, uint256 _x)
public
payable
returns (uint256)
{
emit Received(msg.sender, msg.value, _message);
return _x + 1;
}
}
contract Caller {
event Response(bool success, bytes data);
// 假设调用者合约没有接收者合约的源代码,但我们知道接收者合约的地址以及要调用的函数。
function testCallFoo(address payable _addr) public payable {
// 您可以发送以太币并指定自定义的gas数量
(bool success, bytes memory data) = _addr.call{
value: msg.value,
gas: 5000
}(abi.encodeWithSignature("foo(string,uint256)", "call foo", 123));
emit Response(success, data);
}
// 调用不存在的函数会触发回退函数。
function testCallDoesNotExist(address payable _addr) public payable {
(bool success, bytes memory data) = _addr.call{value: msg.value}(
abi.encodeWithSignature("doesNotExist()")
);
emit Response(success, data);
}
}
Remix Lite 尝试一下
END