质押世界里有一种常见分工:一方出钱,另一方出运维的节点与验证密钥。出钱方保留资金的最终控制权,方式是把自己的执行层地址设成提款凭据。这个看似稳妥的安排在特定顺序下会漏风——运行方可以抢在出资方之前提交一笔自己的存款,把验证者的提款凭据定成旧式格式,让随后到账的大额存款变成一笔由别人控制的追加。停滞提案EIP-7684想从协议层堵住这个抢跑:凡是带不同执行层凭据的追加存款,不接收,直接退回。
抢跑的三步
把攻击路径摊开。第一步,运行者用自己的验证密钥发起一笔小额存款,此时验证者的提款凭据被登记成BLS哈希的旧式0x00前缀。第二步,按协议,旧式凭据需要在后续通过BLSToExecutionChange操作换成执行层地址,而提交这个操作的门槛是持有那组BLS密钥——也就是运行者本人。第三步,出资方把约定好的整笔质押打进来。协议把这笔钱视为已有验证者的追加,而追加不更新提款凭据。于是验证者的资金规模由出资方撑起,提款去向却仍捏在运行者手里,等待被改写成运行者指定的地址。出资方名义上控制质押,实质上只是给别人做了嫁衣。
问题根源是协议把追加存款的语义定得太薄:钱要进池、余额要涨,但没规定这笔钱自带的凭据声明该怎么办。
用退回代替改写
面对这个漏洞,至少有三种修法。第一种是允许追加存款直接更新提款凭据,但这会让任何人向任意验证者打钱就改变提款路径,制造更危险的劫持。第二种是要求运行者必须先提交凭据变更才允许追加,但这依赖流程自觉,协议管不住顺序。EIP-7684选第三种:识别这种冲突——存款对象是已存在的验证者记录、且存款里携带的执行层凭据与记录上的不同——然后把这笔钱退回给存款人。退回让出资方至少回到起点:钱还在自己手里,可以重新设计合作结构,比如换一组验证密钥再存。
提案在共识层与执行层各安排了配套逻辑,其中一条细节是挂起提款的持久化。被退回的款项在协议里要先挂在待提款队列中,等待提款扫描付款;如果节点只记一时状态而不清算,队列可能无限增长。把挂起提款写进持久状态,是为了让退回不会变成新的拒绝服务入口。
需要强调的是,这条提案至今停在停滞状态,抢跑风险目前仍靠流程手段防守:先由出资方发起存款、存款时就写明自己的执行层地址凭据;或在合约与托管条款里约定密钥轮换顺序。协议没有替你检查合作对象的诚意。
快速问答
问:怎么看出一个验证者还是旧凭据? 答:看提款凭据前缀,0x00开头即旧式BLS哈希;正常完成迁移的验证者应是0x01开头加执行层地址。
问:退回是即时的吗? 答:不是即时到账,款项进入提款队列后由标准提款扫描支付,与其他退出场景的节奏一致。
问:提案为什么停在停滞? 答:公开记录未给出明确原因。此类仅修复边角场景的提案常在评审优先级中被排后。
一条判断线
凡是先手权决定资金去向的协议规则,都要问同一句话:抢跑者在第一个区块出现之前能得到什么?质押分工里,先存款、先写凭据的一方占便宜,这个结构在协议补上前只能靠合作顺序设计来防守。
风险提示:本文内容为质押机制科普,不构成任何投资建议或法律意见;质押与凭据规则以官方规范为准。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。