题目
你们的签名服务支持多条链部署同一个协议,测试网与主网共用一套签名代码。
有安全评审提出:如果签名内容里不包含链与合约信息,同一份签名可能被拿到另一条链的同一合约上使用。请说明域分隔字段的作用,以及它在实现上有哪些容易踩的坑。
考察目标
- 是否理解域分隔要解决的重放类型。
- 能否说清常见域字段及其作用。
- 是否知道部署期固化链标识带来的链分叉风险。
考察域分隔字段如何阻止签名被换链或换合约重放,以及部署期固化链标识的风险。
你们的签名服务支持多条链部署同一个协议,测试网与主网共用一套签名代码。
有安全评审提出:如果签名内容里不包含链与合约信息,同一份签名可能被拿到另一条链的同一合约上使用。请说明域分隔字段的作用,以及它在实现上有哪些容易踩的坑。
域让签名只在特定上下文有效:EIP712Domain 可包含 name、version、chainId、verifyingContract、salt,其中链标识与验证合约地址分别限定链与合约范围,字段不匹配时合约侧校验失败。跨链重放与跨合约重放是两类不同问题。
EIP712Domain 结构计算,字段包括 name、version、chainId、verifyingContract、salt,协议设计者按需包含其中的字段(依据:EIP-712 §Specification 的 domainSeparator)。chainId 使用 EIP-155 的链标识;用户代理在当前链与签名中的链不一致时宜拒绝签名(依据:EIP-712 §Specification 的 domainSeparator;EIP-155 §Specification)。verifyingContract 是验证该签名的合约地址,用户代理可以据此做合约级防钓鱼(依据:EIP-712 §Specification 的 domainSeparator)。name、version、chainId、verifyingContract 四字段,规范未把该组合固定为唯一结构(依据:EIP-2612 §Specification)。chainId 且在部署时定义、之后不再重建,未来链分叉时可能出现跨链重放(依据:EIP-2612 §Security Considerations)。verifyingContract 用于把签名绑定到具体合约;依据:EIP-712 §Specification 的 domainSeparator)。发现这道题有问题? 反馈此题