一份 2019 年的时间戳提案,至今没有上链
EIP-1681 在 2019 年 1 月 8 日提交到以太坊官方提案仓库,标题叫 Temporal Replay Protection,直译是时间维度的重放保护。它的核心设想只有一句话:给交易增加一个可选字段 valid-until,里面填一个 UTC 时间戳,节点在打包时检查当前区块的时间戳,只要区块时间已经不早于这个值,这笔交易就失去进块资格。按原文的规格,如果交易 t 带了 valid-until 字段,那么只有当区块时间戳严格小于该值时,t 才有资格被写进区块。截至本文按 EIPs 仓库原文核验时,这份提案的状态是 Stagnant——停摆,从未进入以太坊主网,也就是说今天你在钱包里签的普通交易并不带这个字段,也没有任何节点按它做校验。

提案原文想解决三件事
第一件是排队问题。提案的动机部分写得很直白:节点软件对保留哪些交易、丢弃哪些交易没有公认标准,一笔交易如果 gas 出价偏低,可能在内存池里躺好几天,最后仍然被某个矿工打包执行——用户为一笔早就不要的购买付了全额 gas。如果交易自带截止时间,过期即作废,用户就不必担心几天前的点击在几天后突然成交。第二件是尘埃账户清理。当时社区在讨论清理长期无活动的微型账户,一旦余额可以被系统重置,旧签名就可能被重新利用;有了时间维度的有效期,旧交易过了时间窗天然不可再用,就不必去改状态里的 nonce 规则。第三件是给用户一个「要么几小时内成交、要么干脆别成交」的表达方式,提案特别举了 ICO 抢购的例子。
为什么用墙钟时间,而不是区块高度
同类思路在更早的讨论里用区块高度表达有效期——「这笔交易只在前 N 个块内有效」。EIP-1681 专门解释了自己为什么改用 UTC 时间:首先,时间戳在离线环境也能取到,签名方哪怕完全接触不到链,也能凭自己设备的时钟生成带截止期的交易,而区块高度必须查询链才知道;其次,出块间隔本来就不精确,所谓 14 秒只是期望值,实际受算力和难度炸弹影响会漂移,用高度换算时间会引入额外误差;再者,测试网和私有链的出块节奏更不可靠;最后,对签名软件的使用者来说,「今晚 8 点前有效」比「在未来 3421 个块内有效」直观得多。这个取舍在中文搜索里对应一个常见问题:为什么不能简单填「多少分钟内有效」——提案给出的答案恰恰是,填绝对时间点比换算相对块数更稳。
两阶段上线与一个没写上限的细节
原文设计了分两步的部署:第一步在某个区块高度做硬分叉,把 valid-until 作为 RLP 编码里的可选字段加入,类型与 nonce 一样是 uint64;第二步再做一次软分叉,把该字段变成必填,没有这个字段的交易直接视为无效。兼容性一节提醒:所有造交易的软硬件在第二步之后必须写入时间戳,否则将无法签名。值得注意的是,原文明确说了这份提案不引入任何 valid-until 的上限——你仍然可以签一笔有效期近乎无限的交易,提案只给了「能过期」的能力,没有强制「必须合理」。这也意味着它即使生效,也不等于每张签名都自带保险。
它和别的过期思路差在哪
如果你看过用 nonce 序列防重放的办法,会发现 EIP-1681 的哲学完全不同:nonce 靠状态里的递增序列,时间戳靠时钟,两条路各解一半问题。同类讨论里还有直接改区块时间戳容差的提案,两者常被混淆:容差管的是「节点接受多新的块」,与交易字段无关,可以参考 区块时间戳能有多准:EIP-1482 与链上查询的时间基准 里的辨析;也有给交易加到期块的思路,那类设计用块高而非墙钟做尺子,思路对照见 取消不掉的交易能让它自己过期吗:EIP-5081 的 expire_by 字段。EIP-1681 的差异化卖点始终是使用 UTC 这一点:签名设备无需联网也能决定截止时刻,这对离线签名器是实打实的便利。
停摆状态下的正确读法
Stagnant 意味着讨论长期停滞、不代表被否决,也不代表即将复活。对普通持有者的实际含义是:第一,不要在任何工具里寻找「valid-until 设置」按钮,主网交易结构里没有这个字段;第二,想让卡住的交易失效,现实手段仍然是用同 nonce 发一笔空转或高价替换,而不是等它过期,这条路径的边界在交易卡住时的重发讨论里有完整梳理;第三,签离线交易时,把「签好之后多久内必须被处理」写进自己的操作流程,本质上是用纪律替代了协议没给的能力。提案的价值更多在思路层面:它把「交易应该有权自然死亡」这个问题第一次写进了正式文本,后面十年里反复出现的到期与过期类提案,都在这片讨论的延长线上。
风险提示
本文涉及的提案状态按 EIPs 官方仓库原文核验,状态可能随社区推进变化,请以仓库当前内容为准。理解交易有效期机制有助于减少误操作,但不构成任何投资或交易策略建议;链上操作不可逆,签名前请仔细核对目标、数量与费用。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。