---
# System prepended metadata

title: case3 生产对比

---

# 测试内容
此次测试是将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不超过原有的五分之一。