ERC-191先用0x19阻止签名数据被直接解释成合法RLP交易,再用一个版本字节选择不同消息信封。读取签名时必须先还原“实际签了哪些字节”,不能从钱包弹窗的自然语言倒推。
本文回答0x00、0x01和0x45三种版本如何分流,并强调密码学有效与业务授权是两件事。
三个必须保留的事实
- 版本字节表:ERC-191签名数据以0x19开头,随后是单字节版本、版本专用数据和实际消息,使其不能直接成为一笔合法RLP交易。
- 三种消息信封:版本0x00用于绑定预期验证者,0x01对应EIP-712结构化数据,0x45对应Ethereum Signed Message个人签名格式。
- 签名验证流程:密码学验证成功只证明某个密钥签过这些字节,不证明钱包完整展示了消息、操作目的或授权后果。
操作前后逐项勾选
- 确认调用方使用personal_sign、typed data还是自定义ERC-191封装
- 从原始请求重建完整字节,包含长度、domain或预期验证者
- 用声明账户恢复签名地址,并核对合约钱包是否走ERC-1271
- 检查nonce、deadline、用途和消费状态是否由业务验证
- 把验证结果拆成“签名有效”“上下文匹配”“授权仍可用”三项
三种常见字节布局
| 版本 | 拼接骨架 | 典型用途 |
|---|---|---|
| 0x00 | 0x19 00 + intended validator + data | 把消息绑定到预期验证合约 |
| 0x01 | 0x19 01 + domainSeparator + hashStruct | EIP-712结构化数据 |
| 0x45 | 0x19 45 + “thereum Signed Message”前缀 + 长度 + message | personal_sign消息 |
0x45看起来少了字母E,是因为0x45本身就是ASCII的E。验证服务应保存版本、版本专用数据和消息原文,然后用相同字节重算哈希。若应用在0x00数据里没有加入链、nonce或期限,前缀本身不会自动补齐这些业务约束。
故障与停止条件
| 误判 | 正确处置 |
|---|---|
| 只验证恢复地址,不展示实际消息字节 | 保留原始证据,停止外推并按本文步骤复核 |
| 把0x19前缀当成防重放机制,省略一次性nonce | 保留原始证据,停止外推并按本文步骤复核 |
| 把结构化数据中的name或logo当成合约身份 | 保留原始证据,停止外推并按本文步骤复核 |
四问复评签名验证流程
输入是否能被别人重放?
用已知对象执行“确认调用方使用personal_sign、typed data还是自定义ERC-191封装”,保存所有必需字段,而不是截图。第二个人根据版本字节表重建同一请求或字节,再做“从原始请求重建完整字节,包含长度、domain或预期验证者”。如果缺少网络、版本、区块、账户或时间上下文,即使数值相同也不能算复现。
错误是否真的被拦住?
先只注入“只验证恢复地址,不展示实际消息字节”,记录预期错误与实际返回;恢复成功样本后,再单独注入“把0x19前缀当成防重放机制,省略一次性nonce”。错误处理不得使用旧缓存冒充新结果,也不能把null、未知类型或权限失败自动改成零值。每个反例只变一个条件,才能定位校验是否生效。
状态变化后旧结论会不会残留?
围绕业务授权边界制造一次可控变化,并在变化前后分别执行“用声明账户恢复签名地址,并核对合约钱包是否走ERC-1271”。页面同时展示两份证据的对象、上下文和时间;新状态不能覆盖审计历史,旧状态也不能继续显示为当前完成。
什么时候停止自动流程?
一旦出现“把结构化数据中的name或logo当成合约身份”,状态转为待核验,并要求人工执行“检查nonce、deadline、用途和消费状态是否由业务验证”。交接时把版本字节表原文、三种消息信封推导和签名验证流程验收分栏保存,使复核者能判断问题来自规范理解、现场环境还是展示逻辑。
来源、增量与风险边界
| 来源 | 本文用途 |
|---|---|
| Ethereum Improvement Proposals | 正式接口、字段与规范语义 |
| EIP-712 | 实现路径、兼容性或安全边界 |
本文资料读取于2026-07-20。应用自定义消息仍可能省略链、合约、nonce或截止时间;不能因使用ERC-191前缀就自动判断不可重放。
站内相邻主题可继续阅读:EIP-712签名核对、合约签名验证。签名有效只说明密钥签过指定字节,不等于同意界面描述的后果。缺少用途、期限或验证者绑定时应拒绝高风险操作。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。