W3
EIP-1271EIP签名Final(2018-07-25)

合约签名验证

让合约也能「签名」:验签方调用 isValidSignature,由合约自己决定接受什么签名。

适用链:全部 EVM 链

为什么重要:多签钱包、ERC-4337 智能账户都是合约,它们没法用 ecrecover。不接 1271 就无法对它们验签。

函数签名与选择器

选择器是签名的 keccak256 前 4 字节;事件则是完整的 32 字节 topic0。 点一下即可复制。

签名 / 字段选择器 / topic0说明
isValidSignature(bytes32,bytes)校验通过必须返回 0x1626ba7e,其他任何返回值都视为失败。

代码模板

多签账户实现要点
多签账户实现要点Solidity

必须对签名者去重:不做去重的话,同一个人签两次就能满足 2/3 多签阈值。

实现与使用时的常见陷阱

  • 返回值不是 bool 而是固定的 4 字节魔数,返回 true 之类的值会被判定为无效。
  • 对 ecrecover 与 isValidSignature 的混合判断要有明确分支:先看长度,再决定走哪条路。
  • 验证逻辑必须去重签名者,否则多签形同虚设。

相关标准

同属「签名」的其他标准
想把这个标准用起来?开发者路径的第 1–2 阶段讲了怎么把它写进项目;合约 IDE里有对应的可编辑模板与静态自检;链上 API 参考则给出前端调用它的三种写法。