EOA签名可从椭圆曲线恢复签名者地址,但Safe、多签或其他智能合约账户没有一把对应地址的普通私钥。ERC-1271把问题改成链上询问:把消息哈希和签名字节交给账户合约,由它按当前权限规则判断是否有效。
验签前先区分账户类型
- ERC-1271定义isValidSignature(bytes32,bytes),有效时返回0x1626ba7e这一magic value。
- 验证函数不能修改状态;合约可依据任意内部规则判断签名,因此合约签名的有效性可能随链上状态变化。
- 统一验证器通常先处理ECDSA EOA签名,再对有代码的账户调用ERC-1271,但仍需同时防范域分离、nonce和期限重放。
magic value必须精确匹配
标准接口接收bytes32哈希和任意bytes签名,有效时返回0x1626ba7e。调用不应修改状态。集成方不能把“不revert”当成功,也不能接受任意非零值;应检查返回长度和精确4字节结果,对超时、revert与空返回统一判为失败。
合约签名具有动态有效性
多签合约可以更换owner、提高阈值、禁用模块或撤销会话密钥。同一组签名字节昨天返回magic value,今天可能失效;反之,某些预批准哈希也可能在状态改变后变为有效。离线缓存必须附带chainId、合约地址、区块高度和验证时间。
| 账户类型 | 验证入口 | 成功标志 | 是否可能日后变化 |
|---|---|---|---|
| EOA | ECDSA恢复地址 | 恢复地址等于签名者 | 通常不因链上状态变化 |
| 合约账户 | isValidSignature | 0x1626ba7e | 可能因所有者、阈值或模块变化 |
ERC-1271不替代防重放
验签只回答账户是否认可给定哈希。订单、Permit或登录消息仍要纳入域名、chainId、verifyingContract、nonce、deadline与具体动作。若应用在两条链或两个合约复用相同哈希,合约钱包正确返回true也无法阻止业务级重放。
合约签名接入清单
- 先读取账户地址是否存在代码
- EOA走ECDSA,合约账户走ERC-1271
- 精确验证0x1626ba7e返回值
- 把验证区块与链ID写入审计记录
- 在业务消息中加入nonce和期限并消费nonce
消息域与交易类型可参考以太坊Type 0到4,执行失败时按交易回执定位;连接未知签名站点前先执行智能合约连接检查。
合约签名可以动态失效
“合约签名不能撤销”是错误的,它恰恰可能随状态变化;“ERC-1271一定比EOA安全”也没有依据,安全性取决于合约逻辑、管理员和升级权限。调用者还要限制staticcall Gas,避免恶意验证逻辑拖垮批量订单结算。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。