一枚签名多条链通用:ERC-7964 把链标识从域名里拿掉之后 图 1
一枚签名多条链通用:ERC-7964 把链标识从域名里拿掉之后 · 图 1

为什么要一条链签一次

结构化签名标准 EIP-712 的弹窗里有一块“域名信息”,其中有应用名、版本、验证合约地址,还有一项链标识。链标识不是装饰:签名哈希把域名信息整个折进去,换一条链,同一枚签名就验证不过。这个属性叫域分离,正是它挡住了把 A 链上的签名挪去 B 链重放的老路账。但同一个账户部署在多链的场景越来越多——跨链意图交易、多链治理、跨链社交恢复,每条链弹一次签名窗,体验割裂,聚合签名方案又要钱包做专门适配。草案 ERC-7964 选择了一条最朴素的路:不加新哈希结构,就把域名里的链标识字段省略掉。

省略链标识之后发生什么

规范的做法是从 EIP-712 的域定义中删去 chainId 字段。域不变,签名哈希就不区分链,同一枚签名在所有认这套域的配置链上都可验证——验证方仍用标准 EIP-712 逻辑,合约可以用 ERC-1271 走合约侧验证,钱包可以用 ERC-5267 的域发现接口读取这份不含链标识的域参数。跨链里真正链特有的内容,被拆成一组结构化消息:每条链拿到全部消息哈希组成的数组,加上仅与本链相关的完整消息数据。这样单枚签名覆盖多链操作,链上验证开销接近普通单笔,而且不需要任何特殊钱包支持。它目前为草案,依赖 712、1271、5267 三个既有标准拼装而成。

弹窗少了一行,安全重心就变了

对用户最直观的变化:签名窗口的域名信息里不再显示链。过去你核对链标识,等于被系统强制回答“这笔授权在哪个世界生效”;省略之后,这个问题被推迟到消息正文里的链相关内容数组中回答。这既是设计的聪明处也是风险集中处。一枚签名对多条链可验证,意味着签名泄露或误签的爆炸半径从一条链扩大到配置允许的每条链。缓解不是来自链字段,而来自正文:每条链绑定了什么内容、验证合约在哪、有效期多长。所以 EIP-712签名是什么?钱包风险 里讲的四查纪律在跨链场景只增不减,其中域名与验证合约两项尤其要逐字符核对——链这层隔离被拿掉后,合约地址与版本字段成了仅剩的两道空间边界,它们只要有一项与预期不符,这枚签名落地的世界就不是你以为的那个。

与批量签名的相邻问题

同一需求下还有别的解法:把多条链的消息折进一棵哈希树、或把多次签名聚合到一起,这类方案往往要求钱包做专门的界面来核验树的每个叶节点。ERC-7964 的取舍是反过来的:结构上完全复用标准的数组类型,任何能正确显示嵌套结构的签名界面都能展示它,代价是所有链的内容同时出现在一枚签名里,展示面积大、误读窗口也大。对钱包产品来说,这意味着理想的实现应当能把各链内容分标签页呈现并逐链确认,但规范本身没有强制这种交互。规范的安全考量部分明确列出了对签名重用、包含证明与验证方职责的讨论要求。

实操建议

如果你要参与使用这类接口的跨链桥、意图交易或跨链治理,三条建议。第一,把“弹窗没有链标识”本身当作一个需要解释的信号:先确认这个协议确实采用 ERC-7964 思路,而不是某个忘填链字段的粗制签名;分不清时按危险处理。第二,核对正文数组的完整清单——你是在给几签名?每条在哪些链生效?有没有哪条链你根本不认识?任何一条超出预期就停。第三,签完把各链的执行状态分别核对,一枚签名不等于各链自动完成,去每条链的浏览器确认落地情况仍是必要动作。本文为机制说明,不构成任何投资建议。