交易还没跑完,规则先挑明:EIP-7906 的状态差异操作码与断言 图 1
交易还没跑完,规则先挑明:EIP-7906 的状态差异操作码与断言 · 图 1

授权时的信任缺口

你在钱包里确认一笔交换,签名前看到的只是合约代码和数据字段;执行结束前,谁也不知道这枚代币会不会顺手多转一笔、那个授权会不会被链上某处悄悄用完。问题的根源是授权粒度:EVM 让交易跑完之后才把结果摊开,授权时刻你能声明的只有”允许执行”,不能声明”只允许执行结果长这样”。EIP-7906 想补的就是这层——引入一枚操作码,让被调用的合约在执行的某个时刻读取本笔交易结束前会造成的状态差异,一旦与预设断言不符,就主动中止。规范把它描述为对交易执行结果的检查机制:交易结果可以被程序化约束,而不是只能在事后核对。提案 2025 年 2 月创建,状态 Draft。

状态差异从哪来

以太坊执行交易时维护一套”本笔交易改了什么”的脏状态集合:哪些账户的余额变了、哪些存储槽从什么值变成什么值、哪些账户是新建的。这些差异本来就是执行引擎为提交阶段准备的中间产物,EIP-7906 做的事是把它以只读形式暴露给执行中的合约。操作码带参数,合约可以声明”检查某个地址的某存储槽”或”检查某账户余额变化幅度”,返回的正是差异的当前快照。这里有个时序上的微妙:断言发生在交易还没执行完的时刻,检查的是截至当下已累计的差异——提案用执行顺序与检查语义把窗口收窄到合理范围,而”检查最终全量差异”则依赖把断言点放在交易尾部的模式,这正是规范讨论里反复被追问的细节之一。

它改变了谁的剧本

最有动力的采用者是账户抽象与授权类场景:智能账户在收到一笔 UserOperation 时运行检查器,若差异包含未批准的转账就 revert,等于给”授权边界”写了个运行时守卫;聚合器与支付通道结算也可以用它验证批量意图是否被满足。对普通用户,它对应一种新体验——钱包把交易翻译成可验证的断言集合,签名前展示的不再只是”与某合约交互”,而是”本次只改变这三处”。另一边的剧本则被改写:恶意合约惯用的”在嵌套调用里偷偷做别的”若被外层断言覆盖,会在同一笔交易内被撤销,攻击从”需要对手发现”变成”当场失败”。

争议写在哪里

草案要过的关卡也有目共睹:状态差异的序列化格式要稳定,否则不同客户端读出的差异文本不同,跨实现断言会产生分歧;检查本身消耗 Gas,且”读到差异”这一动作把正在执行中的中间状态暴露给合约,涉及信息泄漏与重排博弈的新边界;还有账户抽象生态的前置依赖——提案 requires 列表挂着访问列表与 Gas 计量相关 EIP,它的节奏和那批提案绑定。断言替代不了审计,把运行时守卫写进钱包逻辑后,断言表达式自身的正确性成了新依赖,这是任何验证层机制的共同宿命。

快速问答

问:这个操作码上线了吗? 答:没有,状态 Draft,未进入任何已计划升级,主网不存在该指令。

问:它和 eth_call 模拟有什么区别? 答:模拟是事后外部核对,断言是交易内的硬约束——不满足条件时交易根本不会生效。

问:会不会拖慢每笔交易? 答:成本取决于断言被使用的密度,没人使用断言的交易开销接近零,用了的按访问差异的规模计费。

风险提示:本文为协议草案科普,不构成投资建议;交易级自动化检查依赖具体实现正确性,重要交互仍建议人工核对与专业审计。