合约签名:在相关状态下核验有效性
合约签名的字节不变,也可能在一个状态有效、另一个状态无效。研究ERC1271时,应把结果绑定实际查询的合约、摘要、签名和历史状态,不能用今天的答案自动判定过去应用能否接受请求。
本题重做同一签名在两个观察点的核验,再区分结果支持什么。它不重建完整治理过程,也不从返回值推断签署人的法律身份。
保留完整核验对象
ERC1271的Specification部分定义isValidSignature,针对给定摘要和签名,以bytes4类型的magic value 0x1626ba7e表示通过。规范明确允许状态、时间与签署权限等上下文依赖,并要求核验不修改状态。
记录网络、签名合约地址、确切摘要、原始签名字节、区块哈希和调用上下文。外层交易发送者的EOA签名属于另一对象;应用若依赖合约授权,本地恢复出某EOA地址不等于完成合约决定。
摘要必须是应用实际验证的摘要,保存原消息与域如何生成它。两条可读请求文本相近,也可能哈希不同;复制来的摘要还可能与研究中所述请求脱节。不能只保留人类可读标题。
签名长度和格式由实现处理,不能把某个示例的固定长度视为全部合约签名规则。共享报告可用脱敏编号,但私有底稿应能连接到完整原始输入。
假设主例:owner轮换
设虚构签名合约W采用简单规则:从输入恢复签署者,只有与当前授权owner相同才接受。这是本例实现假设,不是所有ERC1271钱包必须采用的政策。
H一百时,Alice是授权owner,摘要D与签名S通过。到H一百二十,已验证政策更新使Bob成为当前owner。对完全相同D、S再次调用,在假设的当前owner规则下不通过。
| 观察 | 相关owner状态 | 相同D与S的结果 | 解读 |
|---|---|---|---|
| H一百 | Alice | 0x1626ba7e | 此状态下W接受该签名 |
| H一百二十 | Bob | 本例返回0xffffffff | 后续政策下不接受 |
| 通过缺历史状态的接口查H一百 | 此次调用未知 | 取回或执行错误 | 历史核验未解决 |
非magic返回只是本例的拒绝方式,不是规范要求统一使用的失败码。前两条有效观察说明W判断改变,不证明Alice从未授权D,也不自动让过去应用接受行为追溯失效。
两次调用保存为独立记录。状态过渡是解释,不应成为用最新结果覆盖旧结果的理由。若只能取得H一百二十,早期结论应保持未知,不能凭owner轮换叙述替代旧状态查询。
按类型解码返回值
以所需bytes4值作为成功条件,不能接受任意非零值或一般交易成功标志。保存原始返回数据和解码结果,便于检查ABI、填充或截断问题。
区分明确非magic、调用revert、提供方错误和返回数据畸形。revert可能来自签名拒绝处理,也可能因执行额度不足或历史依赖不可取回而无法完成检查。诊断之前,不要统称密码学失败。
调用环境应有充分且有记录的资源。若逻辑读取另一合约、依赖caller或其他上下文,也保存依赖。不同条件下方便执行的一次查询,不必然重现应用当时的检查。
对所谓“同样输入结果冲突”,先核区块哈希、调用者、实现和依赖状态是否真的相同。只比较D与S两个字段而漏掉状态,容易将合理变更误报为不确定系统行为。
不同政策可能保留旧签名
owner轮换不会普遍让旧签名失效。另一实现可能接受预先批准摘要、历史owner快照或其他编码政策,此时D与S在当前owner改变后仍可能通过。
因此要查实际政策及有效版本,不能从标准接口名推规则。代理实现等依赖发生变化时,把每个历史调用连接当时代码和配置。当前ABI或页面说明未必解释过去结果。
政策未解释清楚时,仍可发布窄观察:某块调用返回magic value。但不能进一步声称为何通过,或预测会一直通过。返回结果和机制解释应分别保留核验状态。
核验不等于消费或执行
接受查询不是资产已移动的证据,也不独自说明消息已消费或不能重放。使用签名的应用可能另设nonce、到期、取消或一次性规则。
例如W在H一百接受D,应用却因为订单nonce已用而拒绝请求;另一应用签名通过,但转账因余额条件不满足失败。应分开合约签名核验、应用资格和已提交执行三栏,不能把相同签名通过两次算成两笔经济行动。
研究授权事件时,magic value截图不识别法律自然人、不证明抵押品充足,也不证明已完成损失。要找到应用记录与最终状态,再作数量结论。这样也能明确下一步要补的是状态、签名对象还是执行材料。
记录三个不同时间
签名所称创建时间、被核验状态和研究者执行查询的日期可以不同。假设S在H一百三十才提供给分析者,但成功重建H一百检查,则结果描述H一百,不证明分析者当时已经取得或看过S。证据可得历史与合约接受历史要分别保留。
应用存档也要确定显示的是原始核验结果,还是界面重新用当前状态计算。旧请求页面显示新判断,不必然表示执行时记录被改;先核接口语义,再讨论历史矛盾。若应用保存了原始返回或验证事件,它支持当时决定,若仅给当前查询按钮,则只说明今天重算。
同一报告中可并列“当时应用留存接受”“今天在新状态不接受”和“旧状态独立重核成功”三个陈述。它们可以相容,不需强选一个覆盖另外两个。缺少原始存档时,应写明哪条过渡尚不能独立建立。
可复做核验清单
| 操作 | 保存材料 | 暂停条件 |
|---|---|---|
| 固定签名对象 | 原消息、域、摘要构造 | 摘要不能连接所称请求 |
| 保留签名 | 完整字节与脱敏标识 | 只剩截断截图 |
| 选历史状态 | 网络、W、块哈希、实现 | 把当前状态贴旧日期 |
| 执行检查 | 上下文、原始返回、bytes4 | 服务错误未解释 |
| 比较状态 | 政策过渡和两次结果 | 不同条件被称完全相同 |
| 核下游行动 | 应用nonce、资格、回执 | 将核验当执行 |
政策变化、历史状态补回、摘要更正或同条件出现不同结果后,应重开记录。发布哪个状态接受哪个签名对象,同时保留不可观察时点的不确定性。它提供可审查授权决定,而非永久有效证书。
常见问题
ERC1271通过后会永久有效吗?
不一定。实现可依赖时间或状态,需要保留观察上下文与实际政策。
签名核验通过能证明应用已执行吗?
不能。应用资格、重放处理与已提交执行都需独立证据。