ERC-1271如何验证合约签名? 图 1
ERC-1271如何验证合约签名? · 图 1

EOA签名可从椭圆曲线恢复签名者地址,但Safe、多签或其他智能合约账户没有一把对应地址的普通私钥。ERC-1271把问题改成链上询问:把消息哈希和签名字节交给账户合约,由它按当前权限规则判断是否有效。

验签前先区分账户类型

  1. ERC-1271定义isValidSignature(bytes32,bytes),有效时返回0x1626ba7e这一magic value。
  2. 验证函数不能修改状态;合约可依据任意内部规则判断签名,因此合约签名的有效性可能随链上状态变化。
  3. 统一验证器通常先处理ECDSA EOA签名,再对有代码的账户调用ERC-1271,但仍需同时防范域分离、nonce和期限重放。

magic value必须精确匹配

标准接口接收bytes32哈希和任意bytes签名,有效时返回0x1626ba7e。调用不应修改状态。集成方不能把“不revert”当成功,也不能接受任意非零值;应检查返回长度和精确4字节结果,对超时、revert与空返回统一判为失败。

合约签名具有动态有效性

多签合约可以更换owner、提高阈值、禁用模块或撤销会话密钥。同一组签名字节昨天返回magic value,今天可能失效;反之,某些预批准哈希也可能在状态改变后变为有效。离线缓存必须附带chainId、合约地址、区块高度和验证时间。

账户类型验证入口成功标志是否可能日后变化
EOAECDSA恢复地址恢复地址等于签名者通常不因链上状态变化
合约账户isValidSignature0x1626ba7e可能因所有者、阈值或模块变化

ERC-1271不替代防重放

验签只回答账户是否认可给定哈希。订单、Permit或登录消息仍要纳入域名、chainId、verifyingContract、nonce、deadline与具体动作。若应用在两条链或两个合约复用相同哈希,合约钱包正确返回true也无法阻止业务级重放。

合约签名接入清单

  1. 先读取账户地址是否存在代码
  2. EOA走ECDSA,合约账户走ERC-1271
  3. 精确验证0x1626ba7e返回值
  4. 把验证区块与链ID写入审计记录
  5. 在业务消息中加入nonce和期限并消费nonce

消息域与交易类型可参考以太坊Type 0到4,执行失败时按交易回执定位;连接未知签名站点前先执行智能合约连接检查

合约签名可以动态失效

“合约签名不能撤销”是错误的,它恰恰可能随状态变化;“ERC-1271一定比EOA安全”也没有依据,安全性取决于合约逻辑、管理员和升级权限。调用者还要限制staticcall Gas,避免恶意验证逻辑拖垮批量订单结算。