Web3是一个正在快速发展的新型互联网技术,它基于区块链技术,提供了去中心化的应用程序(Dapps)和智能合约的开发平台。Web3的出现使得人们可以更加安全、透明和高效地交互和交易,并且不需要信任第三方的中介机构。在Web3生态系统中,智能合约和去中心化应用程序是核心组件,它们为Web3生态系统的发展提供了重要的基础和支持
multicall, 将多个合约调用打包进一次合约调用中, 这是事务性的关键操作, 其代码位于contracts\base\Multicall.sol, 参考代码如下:
function multicall(bytes[] calldata data) external payable override returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } results[i] = result; } }
可以看到逻辑其实很简单, 就是在一个for循环中依次调用之前打包的各个合约调用, 这里有一个非常关键的技术要点就是delegatecall, delegatecall的作用是当用户A通过合约B来delegatecall合约C的时候, 执行的是合约C的函数, 但是语境仍是合约B的: msg.sender是A的地址