随机数的隐藏成本
每笔以太坊交易带一个随机数,作用是”这笔签过的名只许用一次”。账户随机数是一条必须递增的整数线:发了 5 号,6 号才能落地。这条线对普通账户合理,但对”几秒内要么成功要么作废”的交易是枷锁——原子意图、限时代付这类交易只关心”这个窗口内别被重放”,线性随机数却强迫发送方承诺全局顺序、限制并行待发交易,还把上链顺序绑死在计数顺序上。更隐性的成本是状态:EIP-8141 帧交易的键控随机数方案每新增一个键,状态就多一条记录、永远多一条。EIP-8266(2026年5月起草,Draft 状态)给出第三条路:到期随机数——重放保护不再绑定账户计数,只绑定一个短得多的截止时间。
触发与校验
模式开关是一个哨兵值:当交易随机数字段等于 2 的 64 次方减 1,这笔帧交易进入到期模式,协议不再读写发送方账户的 nonce;其他情况一切按 EIP-8141 原样走。有效期检查依赖帧交易已有的 VERIFY 帧机制:交易必须恰好携带一个指向到期验证器的 VERIFY 帧,帧数据是一个 8 字节大端截止时间 d,校验条件是当前时间不晚于 d 且不早于 d 减 60 秒——上限 60 秒写死在常数里,杜绝把窗口拉成第二个永久随机数。
状态放在哪
追踪记录不存在发送方名下,而是集中放进一个环形缓冲合约。三族存储槽各司其职:每笔交易的签名哈希对应一个记录截止时间的位置,值为 0 表示没见过;一个最多 2 的 18 次方(262144)格的环,装签名哈希本身;再加一个单调递增的写指针。交易被包含后,其哈希连同期限写入当前指针格;时间越过期限,那格迟早被新交易覆盖复用。状态占用由环容量封顶,与累计交易量无关——这正是与键控随机数的本质差别。任何对该地址的普通调用都命中一段 revert(0,0) 等效代码,合约无法被外部误写。
快速问答
问:60 秒窗口重放风险真的小到可接受吗? 答:提案的框架是”窗口外重放本就需要重签,等价于新交易”;窗口内广播重放由环内记录拦截。它把防护对象从”永久唯一”缩小到”短期唯一”,攻击面随之缩小。
问:为什么环满了直接判 BufferFull? 答:这是纵深防御——正常节奏下 60 秒的期限意味着环不可能满,满了本身就是异常信号,宁可拒绝也不覆盖。
一笔状态账
普通随机数:每账户一个整数,零增量。键控随机数:每键一条记录,随使用永久增长。到期随机数:全网共享 262144 格,封顶。三档对应三种需求——长期唯一、多通道并行、短期意图。读状态膨胀类提案时,先问状态归谁所有、由什么封顶,比任何性能承诺都更能说明设计是否自洽。
和带时限交易长得很像的两条路
到期随机数容易被误认为”内建了过期时间的交易”,两者要分清。条件类提案管的是”满足什么上下文才允许执行”,与本提案”同一签名哈希多久内唯一”正交:一条带到期时间的交易依然要回答重放保护问题,本提案恰好给出答案——过期的交易即使重播,其追踪槽位早已释放,等价于一次全新提交。两类机制可以叠加而互不打架,这也是帧交易设计的卖点:可序列化、可组合、每层只管一个维度。
一次重放的两种命运
设想同一份签名的意图交易被节点收了两次。经典模型里第二次直接因随机数不等于当前值被丢弃;到期模型里,判定取决于时间:仍在窗口内且首笔已上链,环里查得哈希,拒;首笔被重组吐出,环里的记录随块失效,第二次上链反而”补票成功”,语义上这正是意图交易期望的行为——要么发生一次,要么没发生。写自动化系统的读者可以据此定策略:到期模式把”失败后自动重试”变成协议认可的常规路径,而不必自己在链下维护幂等表。
风险提示:本文为协议提案的科普介绍,EIP-8266 依赖的 EIP-8141 本身尚未激活,本文所述机制均处于提案阶段;不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。