3分钟Solidity: 10.4 多重调用

35 阅读1分钟

欢迎订阅专栏3分钟Solidity--智能合约--Web3区块链技术必学

如需获取本内容的最新版本,请参见 Cyfrin.io 上的多重调用(代码示例)

在Solidity中,多重调用(Multicall) 允许在一次交易中执行多个合约函数,以提高效率并节省Gas费用。

其主要应用场景包括:

  • 批量读取数据:可以在一次请求中读取多个合约的状态,而不需要发送多个RPC请求。

  • 批量执行操作:在一个交易中执行多个操作,实现原子性,确保所有操作要么全部成功,要么全部失败。

  • 节省Gas:通过将多个交易合并为一个,显著降低交易费用。

使用Multicall时,合约需要定义Call和Result结构体,以处理调用结果并确保原子性。

一个使用for循环和staticcall来聚合多个查询的合约示例。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract MultiCall {
    function multiCall(address[] calldata targets, bytes[] calldata data)
        external
        view
        returns (bytes[] memory)
    {
        require(targets.length == data.length, "target length != data length");

        bytes[] memory results = new bytes[](data.length);

        for (uint256 i; i < targets.length; i++) {
            (bool success, bytes memory result) = targets[i].staticcall(data[i]);
            require(success, "call failed");
            results[i] = result;
        }

        return results;
    }
}

测试MultiCall的合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract TestMultiCall {
    function test(uint256 _i) external pure returns (uint256) {
        return _i;
    }

    function getData(uint256 _i) external pure returns (bytes memory) {
        return abi.encodeWithSelector(this.test.selector, _i);
    }
}

Remix Lite 尝试一下