传统钱包地址的安全模型有个残忍之处:私钥就是身份的全体,泄露即失去,且没有任何「改密」操作可救——地址与公钥的绑定刻在椭圆曲线上。用户能做的只有搬家:把资产逐币转去新地址,还要面对一堆「写死了旧地址」的合约权限可能永远搬不动。2022 年 3 月 26 日,MetaMask 生态的开发者 Dan Finlay 与 Sam Wilson 提交 EIP-5003,给搬家之外的第二条路画了图纸:不搬家,把旧房子原地改造成智能合约。新指令叫 AUTHUSURP(0xf8),意为「授权篡位」。
指令怎么工作
规范把 AUTHUSURP 定义为「行为与 CREATE 相同的特例」,差异逐条列出:执行前必须已有 EIP-3074 的授权上下文(authorized 地址),否则执行无效;initcode 不在新地址运行,而是直接跑在授权者——也就是签名者本人的地址上;initcode 若返回零长度代码则强制回滚并返回零,防止「部署了个寂寞」还能反复篡位;在代码正式落账前还要最后检查一次账户代码是否仍为空,堵住 initcode 里自我嵌套调用的后门。经济参数同样精确:对空账户收三万二静态 Gas,对已有内容可复用的路径收七千 Gas——提案特意不检查账户 nonce,因为这套机制的设计对象恰恰是已经发过交易的老地址。配合当时同为提案的 EIP-3607(禁止有码账户用原私钥发交易),链条闭合:一旦 AUTHUSURP 成功,该地址的交易发送权永久移交给新部署的代码,原私钥在交易层面被废黜——这就是「换钥匙」的激进版本:不换新钥匙,是把锁整个换掉。

它和 EIP-3074 的关系
提案对这对组合的关系写得极清楚:3074 教 EOA「把行动授权给合约」,但原文强调 3074 只能增加行动者、从不撤销——原签名键始终握着最终权威,钥匙泄漏的噩梦并不会因为多了一层委托而消失;5003 补的正是「撤销」这半边:从委托走向禅让。这也解释了 5003 的命运为什么跟着 3074 走。3074 因授权模型过于锋利(一次签名可能被恶意合约全权利用)争议多年后撤回、被 EIP-7702 取代,EIP-5003 头部随之一行定谳:withdrawal reason——Superseded by EIP-7702。7702 的答案是温和版的原地改造:地址不永久换代码,而是挂上一段期限内的委托指示,链上可查可撤,旧私钥在委托期内事实上让渡发送逻辑,但形式上仍在位。执念相同,火候不同。
一个被忽视的安全脚注
提案的安全考量段留了一句给合约开发者的提醒:用 ECDSA 签名做鉴权的合约不会知道地址已被篡位——私钥持有者在链上交易之外「依然能调用 ERC-20 的 permit 函数」,因为预编译的签名恢复函数只认曲线数学,不认账户历史。换言之,即便原私钥不能再发交易,它仍能靠签名在部分代币合约里刷授权。提案对此的答案是「应该通过修改 ecrecover 预编译来缓解」,一句话带过整个「签名人格分裂」的深层问题:一个地址在交易层与签名层可能从此属于两个主人。这个问题 EIP-7702 时代依然活着——委托生效期间,原私钥与委托合约各握一部分身份,钱包、风控、协议需要各自的分辨规则。5003 虽然撤回,它提出的这道题至今没人交出完整答案。
快速问答
问:AUTHUSURP 和 CREATE2 部署到预定地址有何不同? 答:CREATE2 造新合约账户;AUTHUSURP 把代码写进一个已存在、有过交易历史的 EOA 地址,且不查 nonce。
问:EIP-5003 上过测试网吗? 答:它与 3074 同属一批实现与讨论,从未进入主网激活。
问:今天普通地址还能「改私钥」吗? 答:没有等价机制;7702 提供的是身份加装而非钥匙更替,资产迁移仍是最终兜底手段。
常见误区
一是把 usurp 理解为临时接管——它是永久部署,代码落账即覆盖空账户,退不回纯私钥状态;二是以为它取代了 3074——5003 依赖 3074 的授权上下文才能工作,两者是叠加关系;三是以为 7702 就是 5003,实际上 7702 不删旧签名能力、不要求永久承诺,语义保守得多,这也是它胜出的原因。
风险提示:本文为账户模型科普,不构成投资建议;处理签名授权时请区分交易发送权与签名鉴权是两个战场。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。