题目
日常调用合约时,你只需要给出函数名和参数,工具会处理编码。但产品提出两个需求:一是把多个调用合并成一次交易提交,二是让合约代表用户去调用另一个合约。
请说明这类需求为什么需要自己处理调用数据,以及手工拼接时要保证什么。
考察目标
- 能否识别需要手工构造调用数据的场景。
- 是否知道调用数据的结构组成。
- 能否说出手工拼接的校验要点。
考察手工构造调用数据的真实场景,以及它与常规合约调用方式的边界。
日常调用合约时,你只需要给出函数名和参数,工具会处理编码。但产品提出两个需求:一是把多个调用合并成一次交易提交,二是让合约代表用户去调用另一个合约。
请说明这类需求为什么需要自己处理调用数据,以及手工拼接时要保证什么。
这两个需求都不是「直接调用某个函数」,而是要把「对另一个合约的调用」当作数据传递:批量调用把多个调用数据组成数组交给聚合合约,代调用把目标地址与调用数据一起交给执行合约。调用数据由 4 字节选择器与按 ABI 规则编码的参数组成,拼接时需要保证选择器由完整签名算出、参数顺序与类型与签名一致,否则链上会执行到别的入口。
aggregate3 接收目标地址、allowFailure 与 callData 组成的数组,并返回逐项结果,是把多个调用拼成一次提交的常见载体(依据:Multicall3 README §Batch Contract Reads)。msg.sender 是聚合合约自身;只有在合约内对它 delegatecall 才会保留原上下文(依据:Multicall3 README §Batch Contract Writes)。发现这道题有问题? 反馈此题