逐指令账单是什么
节点除了回答这笔交易结果如何,还能回答它是怎么一步步执行的:开启追踪后,每执行一条 EVM 指令就输出一行 JSON,记录程序计数器、操作码、剩余额度、内存大小、栈快照这些状态。这份格式的正式定义是 2020 年 12 月 7 日创建的 EIP-3155,状态 Last Call,现成格式的逐字段拆解见 把合约执行的每一步打印成账单:EIP-3155 的 EVM 追踪格式。追踪行的读者通常是调试器作者和差分模糊测试作者:同一笔交易在两个客户端上跑出的追踪序列应当逐行一致,不一致就是实现缺陷,这是客户端质量工程里性价比极高的手段。

EOF 来了,账单字段不够用了
2024 年 8 月 13 日,Martin Holst Swende、Marius van der Wijden 与 Danno Ferrin 提交 EIP-7756,动机写得务实:EVM 对象格式(EOF,由 7692 打捆、其中函数机制由 4750 定义)给合约执行加了一批新结构,3155 时代的字段表读不懂新合约的执行过程;而追踪的用途也已从状态测试扩展到实时区块追踪与差分模糊,字段欠账越来越碍事。7756 没有在 3155 上打补丁式地写增量,而是干脆重述了完整规格,把改动内嵌在正文里——这个写法本身就是给实现者的诚意:读一份文档就能开工。
新字段各管什么
按 7756 的字段表,每行仍必须有 pc、op、opName、gas,可选字段大幅扩充,EOF 相关的新增主要有三个。section 标记当前执行落在容器的哪个代码段——EOF 合约的代码被装进带校验的容器,代码段是容器内部结构,旧格式没有这个概念,追踪不写出来就无法解释 pc 的取值范围。immediate 输出当前指令的立即数字节——EOF 的 RJUMP 一类相对跳转指令把目标编码为指令自带的带符号偏移,不再依赖栈顶值,不打印立即数就看不懂跳去哪。functionDepth 对应容器内函数调用(CALLF)的返回栈深度,这是容器内的第二层调用深度,和外层合约之间的 depth 是两本账。规格同时澄清了 3155 时代的一处模糊:出错或耗尽指令时,STOP 不得输出追踪行;每执行一条指令至多输出一行。
同一份追踪读两种合约
7756 的一个明确目标是在同一笔交易的追踪里同时容纳容器合约与传统合约:字段对旧代码取默认值或省略,对新代码才出现。这个兼容性设计透露了 EOF 阵营的现实立场——不搞一刀切,新旧代码长期共存。对追踪消费者,规格里还有条防御性提醒值得抄进解析器:客户端可以选择用 JSON 数字替代十六进制字符串(或反之),因为超过 2 的 53 次方减一的大数必须用十六进制字符串表示,这是 JSON 精度极限的让步。所以健壮的解析器两种形态都要能吃。
停滞的提案,超前的字段表
7756 的状态是 Stagnant,原因是它悬在半空:EOF 分叉打包本身此后推进不顺,配套追踪格式自然无人抢装。但它留下的东西不比任何生效标准差——一份把容器合约执行过程讲清楚的字段语义表,section、immediate、functionDepth 三个字段各自对应容器规范里一个真实机制,读它就等于读了一份 EOF 执行模型的侧面切片。提案考古的收获常常在这里:不看提案会不会生效,看它迫使概念被定义得多精确。
对普通读者的意义
你不直接生产追踪,但追踪决定了两件事:其一,出问题时工程师能否快速定位是哪条指令、哪次调用改坏了状态——调试工具链的成熟度会传导到钱包的事故响应速度;其二,不同节点实现对同一交易的执行是否一致——这是链本身可信的地基之一。下次在技术讨论里见到逐指令追踪、差分模糊这类词,可以先想起这份 2020 年的账单格式和 2024 年那次没换成功的改版。风险提示:本文为追踪格式与提案历史分析,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。