重入锁可以不写存储吗:EIP-5283 的信号量预编译与它的三个对手 图 1
重入锁可以不写存储吗:EIP-5283 的信号量预编译与它的三个对手 · 图 1

一把不碰账本的锁

大多数智能合约教材里的重入锁是这样的:进函数前把一个存储槽从 0 改成 1,函数结束时改回 0,进来时发现槽里是 1 就直接拒绝。它有效,但代价是每次锁定解锁都要动一次链上状态——写存储是 EVM 里最贵的动作之一,而且这笔写入会永久留在状态数据库里。2022 年 7 月 17 日提出的 EIP-5283 提出了一个釜底抽薪的思路:锁的根本不需要是账本上的一行字,它可以是一句”此刻调用栈上有没有我的重复身影”。提案想在地址 0x0A 部署一个名为 Semaphore(信号量)的预编译合约:被调用时检查调用者地址是否在当前调用栈上出现不止一次,出现说明发生了重入,按失败返回;否则一切照常。提案状态为 Stagnant,从未进入主网,而它提出的地址正是借了 EIP-1352 那份保留区文本的坐标系往下排的号。

重入锁可以不写存储吗:EIP-5283 的信号量预编译与它的三个对手 图 2
重入锁可以不写存储吗:EIP-5283 的信号量预编译与它的三个对手 · 图 2

规格只有三句话,账本却有零头

原文的规格短得罕见:从某个待定激活块起,地址 0x0A 出现一个 Semaphore 预编译;调用它时,若调用者地址在调用栈上出现多于一次,就表现得像第一条指令是 REVERT,调用返回失败;否则什么都不做、返回成功;无论成败,这次调用固定烧掉 100 Gas。为什么敢定价这么低?因为调用栈本来就常驻节点内存,扫一遍栈顶到底只是内存操作,100 Gas 是按栈接近装满(约 400 层地址)的最坏情况估的。真正要算的是总账:预编译调用本身有 700 Gas 的底钱,加上去是 800,而传统存储锁在当年的定价下只要 200。单看这笔账信号量方案贵四倍,毫无竞争力。作者对此很坦白:提案建议这条与预编译降价同批实施,若预编译底钱降下来,整个检查可以压到约 140 Gas,反超传统锁。一句话,方案本身省的是”写状态”,可它被旧价目表的框架成本卡住了脖子。

三个对手与一个时代背景

原文的 Alternatives 一节罕见地列出竞争方案,等于自曝家丑。第一条路线是瞬态存储——同一笔交易内存在、交易结束即蒸发的临时格子,用它做锁天然不写最终状态。这套机制后来以 EIP-1153 的身份随坎昆升级正式上线主网,两个 TLOAD 与 TSTORE 指令今天人人可用,这恰恰抽空了 5283 的立项理由。第二条路线是数 SSTORE 执行次数的指令,第三条是只锁上层写权限的新 CALL 变体,两条都要新操作码,而作者自己承认:同样的功能若能用预编译以相同 Gas 做到,就不该动操作码表——改操作码要连编译器、调试器、静态分析工具一起改。把这些摆在一起就能看懂这份提案的时代位置:它诞生在瞬态存储还是草案的 2022 年年中,等更顺手的公共零件到货,专用工具自然退场。它也从未打算拯救旧合约——已用存储锁部署在链上的合约不会被改写,信号量只保护”未来的合约”,这条边界原文写得毫不含糊。

从竞赛里带走的三条判断

普通用户不需要装编译器,但这轮攻防留下三条可复用的判断。第一,重入锁的实现方式与安全性不是一回事:存储锁、瞬态锁、调用栈锁,防的都是同一个攻击模式,攻击者的试法也不会挑锁的实现方式,评估合约时先确认”有没有锁、有没有在每处资金路径上锁”,再谈锁的档次;重入攻击本身的原理见 重入攻击是什么?智能合约如何被“先取钱后记账”掏空。第二,Gas 结构会替一种写法投票:5283 用 800 对 200 的账单说明,任何新安全原语如果让每次函数调用都肉眼可见地变贵,生态会用脚投票选旧写法,哪怕新写法更干净;读 Gas 提案时把”每次调用多花多少”当成第一敏感词。第三,地址 0x0A 这类低地址只是分配表,不代表权重,链上功能贵贱与地址数字大小毫无关系。

状态词决定读法

Stagnant 的准确含义是讨论停滞而非被否决:提案随时可能被翻出来续会,但在没有客户端实现之前,任何教程都不该写”用 0x0A 地址的锁”——今天真去调那个地址,它什么都不是。给开发者的落地建议很简单:要交易内临时锁,直接用瞬态存储两条指令;要永久账目,仍用存储槽,两者都有成熟模式;不要为二十年后的 Gas 节约在今天的生产合约里发明民间协议。给阅读者的对照练习也顺手:在 EIPs 站点把 5283 与 1153 并排放,看前者 Alternatives 里预言的那条路线如何变成后者的正式规格,再对照 EIP-1153瞬态存储怎么用? 里瞬态存储的使用口径——一份提案的价值有时不在它自己上线,而在它把哪条路论证得更清楚了。

风险提示

本文涉及的提案状态、Gas 数值与地址分配按 EIPs 官方仓库原文核验,均可能随社区推进变化,请以仓库当前内容为准。理解重入防护结构有助于阅读审计报告,但不构成投资建议;与合约交互前请核实项目来源与审计情况。