call() 是一个底层的接口,用来向一个合约发送消息,也就是说如果你想实现自己的消息传递,可以使用这个函数。函数支持传入任意类型的任意参数,并将参数打包成32字节,相互拼接后向合约发送这段数据。
源码:
pragma solidity ^0.8.7;
contract TestCall {
string public message;
uint public x;
event Log(string message);
fallback() external payable {
emit Log("fallback was called");
}
function foo(string memory _message, uint _x) external payable returns (bool, uint) {
message = _message;
x = _x;
return (true, 999);
}
}
contract Call {
bytes public data;
function callFoo(address _test) external payable {
(bool success, bytes memory _data) = _test.call{value: 111, gas:5000}(
abi.encodeWithSignature(
"foo(string,uint256)","call foo", 123
)
);
require(success, "call failed");
data = _data;
}
function callDoseNotExit(address _test) external {
(bool success,) = _test.call(abi.encodeWithSignature("doesNotExit() "));
require(success, "call failed");
}
}