# 测试内容
此次测试是将case3和vertex实际生产哈希进行比较
## 前置补充

在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不超过原有的五分之一。