重放域:地址相同不等于签名行动绑定同一网络
地址在两个网络相同,签名行动仍可能只属于特定重放域。调查授权时,应检查所签内容与验证方实际规则,不能用地址、钱包标签或代币符号相同,推断两对象授权同一行动。
legacy交易保护与消息签名保护要分开。EIP155解释一种交易编码,不是所有名为v的签名字段都能套的算式。
先分类签名对象
EIP155的Specification部分把链身份加入legacy交易签名载荷,并定义相应v编码;其所述规则也保留较早v为二十七或二十八的方式。研究实际交易格式和网络规则,不能把旧式签名一概判成不可能。
typed交易有自己的信封和字段;Permit是由代币合约核验的消息;任意链下文档又可能用另一套哈希约定。未确认属于相应legacy编码之前,不做这道反解。
保存原始签名载荷、解码字段、网络身份和解析器版本。浏览器显示链名是需要与字节及选定链上下文核对的解释,不能反过来用显示文字替代输入。
假设的legacy反解表
受保护legacy编码为:v等于三十五加二乘链ID,再加零或一的parity。适用该格式时,链ID可由(v减三十五)除二向下取整,余数恢复parity。
| v | 编码链ID | parity | 此编码下解释 |
|---|---|---|---|
| 三十七 | 一 | 零 | 受保护legacy载荷指定链一 |
| 三十八 | 一 | 一 | 同链,不同恢复奇偶位 |
| 三十九 | 二 | 零 | 载荷指定链二 |
| 四十 | 二 | 一 | 同链,不同恢复奇偶位 |
| 二十七或二十八 | 不按此方式编码 | 较早约定 | 不把缺失链字段叫链零 |
第一行复算三十五加二乘一加零,等于三十七。parity换一后是三十八,不是另一条链。这些是假设解码练习,既未认证真实交易,也不证明某RPC响应来自哪条链。
常见错法是把typed交易零或一的parity也带入公式,得到没有意义的负数。这不是特殊链ID,而是选错对象格式。正确分类必须先于计算。
Permit另有域记录
ERC2612的Specification与Security Considerations描述用DOMAIN_SEPARATOR与Permit字段构造摘要,给出对合约和链唯一的域及常见构造,并提示部署时固定separator在链分裂时的风险。
取得一份Permit后,保留该代币实际使用的域字段和separator。熟悉构造可包括name、version、chainId与verifyingContract,但文档示例不表示所有实现字段和更新行为相同。
设虚构代币T的消息指定链一、验证合约T,其ECDSA签名恢复值仍可能采用二十七或二十八。这不会抹掉消息域内的链身份。相反,外层交易读到三十七,也不证明其中另一个消息具备充分重放域。
分别保留外层交易字节与Permit摘要输入。支付提交费用的交易可以正确绑定链,而消息验证具有另一组重放性质;两者不能合成一个未经说明的“已保护”标签。
不广播也能核对签名范围
按实际实现重建原摘要,固定其他字段,再对照更换链字段或验证合约地址的摘要构造。如果相关字段被正确纳入,域字节和所签摘要会改变。保存每一步使用的字节编码,而不是只记录两串显示哈希。
这是签名范围检查,不是证明替代提交在所有网络都一定成功或失败。实际验证代码、nonce、deadline、账户状态及其他资格仍需核对。研究不需要为补结果而广播行动。
可读钱包提示与解码域冲突时,保存双方。查提示是否略去字段、解析器是否套错schema,或合约是否真验证另一摘要,不能用更让人放心的显示替换实际字节。
若原始类型定义缺失,单有签名与一段文本通常不足重建摘要,应标为对象范围未核;不能通过反复尝试熟悉格式,只挑一个能恢复合理地址的结果当答案。
边界例:两个环境共用标识
链ID是命名空间的一部分,不是整条链身份的密码学证书。两个环境共用数字标识时,需要由核实链上下文和应用设计继续区分;地址与域字段恰好相同,不独自建立独立授权边界。
ERC2612关于缓存separator的提醒说明,链分裂需查具体实现。记录验证方重新构造有关域,还是继续使用存储值,不能仅凭原部署说明推今天行为。
同样要区分重放范围与资产身份。一份对某代币合约绑定正确的签名,不证明另一同符号代币有相同储备或赎回权利。那是资产来源问题,不是v值算术能够解决的事。
用单字段对照定位绑定
比较摘要时用两列工作表,第一列保留原类型内容与实际域,第二列只改一项候选边界,其余字段明确保持不变。若链和合约同时改变,即使摘要不同,也看不出究竟哪一项被绑定。单字段对照能暴露漏域,不能只因恢复出看似合理地址就宣布全部范围正确。
链字段取不到时,应标不可用,不能拿界面当前所选网络补入。用户可以签完再切换界面;决定范围的是实际签名字节和验证方域构造,当前屏幕只是背景线索,不是原始签名内容。
同样,域中的version是签名机制字段,不一定等于当前应用产品版本号。应核实现使用值,而非从页面页脚抄版本。若发现域缓存或版本变化,分别保存签名前后构造,判断旧消息是否仍按旧值验证。
对照实验输出仅说明受检查构造中一项字段如何影响摘要,不给未知自定义消息提供普遍保护认证。没有完整类型与编码规则时,最可靠下一步是取得缺失定义,而非继续换工具挑一个好看的结果。
签名范围核验表
| 操作 | 保存材料 | 防止的错误 |
|---|---|---|
| 识别格式 | 原始信封、消息类型、解析器 | 所有v都套legacy算式 |
| 解交易域 | 所签链字段与恢复约定 | 把parity当另一个网络 |
| 重建消息域 | 实际separator及类型字段 | 外层交易自动保护消息 |
| 匹配验证方 | 网络、合约、历史代码 | 用今天实现解释旧签名 |
| 另查资格 | nonce、时限、相关状态 | 域匹配等于完成执行 |
| 留链上下文 | 独立选定链身份 | 数字ID就是完整认证 |
解析器更正、实现变化、链分裂或域重建冲突,都应触发复查。发布哪种签名对象在什么重放域得到核验,结论应比“链ID阻止所有重用”更窄,也不把同地址扩张成到处拥有同样权利。
常见问题
Permit的v是二十七,是否证明没有链保护?
不能。链身份可能另在消息域中,要查真实摘要与验证方。
v为三十七能把任何消息都解释成链一吗?
不能。它只适用于这里规定的受保护legacy交易编码,不适用任意消息和其他信封。