# 测试内容 此次测试是将case3和vertex实际生产哈希进行比较 ## 前置补充 ![image](https://hackmd.io/_uploads/rks8Y4aO6.png) 在tenderly的数据下有 Total Gas和 Actual Gas Used 两个字段 在ETH mainnet 前者绝对大于后者 且二者关系为 Total Gas = Actual Gas Used + Gas refuend (erc 1559) 在arb中 推测为 Actual Gas used - Total Gas = Call Data Gas Used Total Gas 视为VM执行消耗 此实验基于以上关系为起点出发。 ## 具体比较方式 1. 从vertex链上拿到真实哈希 2. 将哈希改变的合约的storage的slot和value拿出来,例如: 一笔vertex submit改变了三个合约中各20,10,60个slot的值为values。 3. 部署caller和target合约,target合约等效于vertex submit交易中被修改的合约,其中有一个修改本地slot的函数。caller相当于multicall,在一笔交易中对所有涉及的target的storage进行修改 4. 进行pre state的设置,因为在实际生产中,storage中修改前已经有值了(0 -> !0 和!0 -> !0 还有!0 -> 0的gas计算方式不同),因此此步骤将初始状态进行设置 5. 进行post state的设置,这部分是生产中实际更改的storage部分的操作。 caller 入参数据结构 ``` struct UpdateData { address targetAddress; bytes32[] slots; bytes32[] values; } ``` ## 测试的交易: 1. 满单状态: 220+笔单子 https://dashboard.tenderly.co/tx/arbitrum/0xe06fafa5386ef4033a65feb69e5b03c832d49dc91739b3c4cf123d811044afd9?trace=0 2. 非满状态: 60+笔单子 https://dashboard.tenderly.co/tx/arbitrum/0x7c3ab997155f9eeefff9c8a07f5d5958c467a1490351dd84664cda981950222b?trace=0.1 ### 观测结果: **1.满单生产消耗:** **生产** 总消耗: 24,743,717 vm部分消耗:12,399,636 总calldata 字节数:84293 总非0 calldata 字节数:15959 **测试** 总消耗: 24,878,379 vm部分消耗:4,902,757 总calldata 字节数:17864 总非0 calldata 字节数:10589 **2.非满单生产消耗:** **生产** 总消耗: 11,881,161 vm部分消耗: 4,695,648 总calldata 字节数:22533 总非0 calldata 字节数:4284 **测试** 总消耗: 15,499,381 vm部分消耗:1,848,211 总calldata 字节数:9477 总非0 calldata 字节数:5063 ## 观测结论: 1. 在VM层面,这种计算能节省至少50%以上的计算成本,适用于mainnet的各种计算数据复杂的场景,比如说AA。 2. 在字节数较多的情况下,calldata对gas的影响基本上相同,或者是测试工具的问题。 3. 在字节数较少的情况下,非0字节占比非常重要 理论上除了VM部分的成本我们不能避免,calldata的成本基于设计可以无限趋近于0. 参考上述的例子 vm部分消耗(测试) / 总消耗(生产)x 100% ≈ 20% 即在vertex场景下,极限能节省的gas不超过原有的五分之一。