41-Solidity8.0-低级call()

428 阅读1分钟

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