3分钟Solidity: 5.4 call 调用

19 阅读1分钟

如需获取本内容的最新版本,请参见 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 尝试一下

solidity-call


END