为了能第一时间造出来符合需求的calldata,我们需要了解一下calldata的编码方式
首先两个大前提:
1.大小已知的变量补0是在左边补,例如uint256(uint160(address)),这样你得到的回事0x00000.....的一串数据。
2.大小可变的变量补0,数组、bytes等是在右边补。
然后:
1.abi.encode编码会打乱你的元组数据,他会自己寻找最优解决方案来给你编码数据。
2.abi.encode编码动态数组的时候,会有多余的数据出现,例如数组的大小、数组在数据中的起始位置等参数。
3.abi.encodepacked则不会有上述现象,他会按照你给定的参数顺序进行单纯的拼接,你需要考虑到参数是否需要前面补充0?是否需要后面补充0?他也不会有多余的数据出现,你大可直接往后面进行累加。