题目
你在做签名登录时发现:同一个用户用 personal_sign 签的内容,无法直接拿到合约里做链上校验,需要额外封装一层。同时团队里有人担心「用户签的这串字是否可能被拿去当交易用」。
请说明 personal_sign 实际签名的字节构成,以及这套前缀设计要防的是什么。
考察目标
- 能否说出签名数据的整体格式与版本字节的含义。
- 是否理解前缀设计的两个防护目标。
- 是否知道不同版本字节的用途分布。
考察签名数据的版本前缀设计,以及它为什么能防住跨用途重放。
你在做签名登录时发现:同一个用户用 personal_sign 签的内容,无法直接拿到合约里做链上校验,需要额外封装一层。同时团队里有人担心「用户签的这串字是否可能被拿去当交易用」。
请说明 personal_sign 实际签名的字节构成,以及这套前缀设计要防的是什么。
personal_sign 使用 0x19、版本字节 0x45(字符 E)、其后的 "thereum Signed Message:\n"、消息字节长度和消息内容构造待签数据;合起来的前缀是 "\x19Ethereum Signed Message:\n"。0x19 使整段数据不构成完整 RLP 结构,版本字节区分签名用途。域、随机数与有效期仍需由业务层设计。
0x19 + 1 字节版本 + 版本相关数据 + 待签内容(依据:EIP-191 §Specification)。0x19 的用意是让签名数据不构成合法 RLP:取值在 0x00–0x7f 范围内的单字节是自身的 RLP 编码,因此整段数据不能是一个完整的 RLP 结构,也就不能是一笔以太坊交易(依据:EIP-191 §Specification)。0x00(带预期验证者地址的数据)、0x01(EIP-712 结构化数据)、0x45(personal_sign 消息)区分开(依据:EIP-191 §Specification 的 Registry of version bytes)。0x45 对应字符 E,版本相关数据从 "thereum Signed Message:\n" 开始,后接消息字节长度;组合后的前缀是 "\x19Ethereum Signed Message:\n",不能重复拼入 E(依据:EIP-191 §Specification 的 Version 0x45)。0x00 把预期验证者地址纳入签名内容正是为此(依据:EIP-191 §Motivation)。0x01,域分隔符由 EIP712Domain 结构计算(依据:EIP-712 §Specification 的 domainSeparator)。personal_sign 直接对消息原文签名,忽略长度前缀(【协议保证】0x45 的版本相关数据包含消息字节长度;依据:EIP-191 §Specification 的 Version 0x45)。0x45 理解成十进制「版本号 45」(【协议保证】0x45 是字符 E 的十六进制编码;依据:EIP-191 §Specification 的 Version 0x45)。0x00 与 0x01 的用途记混(【协议保证】依据:EIP-191 §Specification 的 Registry of version bytes)。0x19 就能让整段数据不构成合法 RLP?0x19 开头并带版本字节。personal_sign 会给消息加上固定前缀。0x19 的作用是让数据不构成合法 RLP,从而不能作为交易使用。0x00 如何解决跨验证者复用,并指出前缀不覆盖同用途重放。发现这道题有问题? 反馈此题