eth_simulateV1怎样连续模拟? 图 1
eth_simulateV1怎样连续模拟? · 图 1

eth_simulateV1 能在共享的模拟状态上连续执行多个区块调用,并支持区块与状态覆盖。本文解释请求结构、结果字段、验证模式,以及模拟成功为何不等于真实上链成功。

单笔 eth_call 适合回答一个静态问题,却难以表达“第一笔调用先改变状态,第二笔调用再读取变化”的连续场景。eth_simulateV1 把多个模拟块串到共享状态上,能够观察更长的因果链。代价是请求假设更多,结果也更容易被误当成上链保证。

实验问题:第二个调用能否读取第一个调用的状态

eth_simulateV1可模拟一系列按共享状态顺序构建的区块调用,但不会把这些模拟交易写入真实链。

实验结论必须限定为“在给定起始区块、覆盖项、验证模式和调用顺序下”。它不是对公开内存池、打包顺序或未来区块的预测。先把可证伪的问题写清楚,才能设计最小请求。

基线组:单调用、无覆盖

固定 chainId、客户端版本和具体区块哈希,执行第一个调用并保存 status、gasUsed、returnData 与 logs。这个基线回答真实起点下的最小行为,也为后续每个新增假设提供对照。若基线无法复现,实验到此停止。

实验组 A:加入状态覆盖

请求可包含区块覆盖、状态覆盖和验证开关,并以区块标签或哈希指定起点;后续模拟块会承接前一块的模拟状态。

观察项正确用途常见误读
block tag/hash选择真实链起点必须保存以便复现
block overrides改写模拟块上下文会改变费用与时间相关逻辑
state overrides临时改写账户状态不会写回真实链
validation控制协议校验模式会影响默认值和失败原因
calls按顺序执行的调用后项可依赖前项模拟结果

只加入一项余额、nonce 或存储覆盖,然后重跑相同调用。若结果变化,报告要把变化归因于该覆盖,不能只写“模拟成功”。覆盖数据与真实链数据分栏显示,避免读者误以为目标账户确实具备该状态。

实验组 B:连续调用

一个常见测试是先模拟授权,再模拟使用授权的合约调用。第二步可以承接第一步的模拟状态,但真实用户是否真的签署授权、交易是否按同样顺序打包、区块费用和时间是否一致,仍是模拟之外的问题。

第二个调用承接第一个调用的模拟状态,这正是方法的核心价值。逐项添加调用,并在第一处状态分叉时停止扩展;一次放入过多交易会让失败原因变得不可辨认。

结果解释表

现象可以得出的结论仍需验证
基线失败当前起点下最小调用未通过输入、客户端、链状态
覆盖后成功指定假设可改变结果假设在真实链是否成立
前项成功、后项失败共享状态或顺序存在问题中间状态与调用参数
全部成功模拟世界内可执行签名、费用、排序与最终性

结果按模拟块返回calls,单次调用可含status、gasUsed、returnData与logs;模拟成功只说明给定假设下可执行,不保证公开内存池、排序或最终上链结果。

反证与复现记录

  • 反证检查:省略起始区块后无法复现。
  • 反证检查:忘记状态覆盖使结果只在虚构余额下成立。
  • 反证检查:只看最后一个调用,遗漏中间失败。
  • 反证检查:把模拟成功写成内存池接纳或最终确认。

固定一个历史区块,先运行不含覆盖的基线,再加入一项余额覆盖和两项连续调用。复核者需根据原始请求解释每一步状态来源,并指出哪些结论能用于代码排障、哪些绝不能写成真实交易预测。

复核者从一份模拟报告反向重建起始状态和每项覆盖;若无法判断某个余额或时间戳来自真实链还是覆盖,报告必须退回。

状态覆盖非常适合测试边界,却也可能掩盖真实权限、余额或代码差异。报告必须把覆盖值放在结论之前,让读者知道结果属于哪个模拟世界。

当前未知边界:客户端实现、验证模式和协议分叉会影响默认区块字段与费用校验,生产使用前应对目标客户端做兼容性测试。

eth_simulateV1 实验资料

  1. Ethereum Execution APIs eth_simulateV1:支撑“eth_simulateV1怎样连续模拟”中的第 1 组字段定义与边界判断;访问于 2026 年 7 月 26 日。
  2. eth_simulateV1 design notes:支撑“eth_simulateV1怎样连续模拟”中的第 2 组字段定义与边界判断;访问于 2026 年 7 月 26 日。

配套阅读 eth_getCode核对合约交易回执状态判断以太坊节点同步健康。模拟是实验工具,不是交易必然成功或按预期排序的承诺。