跳到主要内容
ecdsa.com

ecrecover

以太坊中位于地址 0x01 的预编译合约(以及 Solidity 的 ecrecover 函数),根据 32 字节哈希和 secp256k1 上的 ECDSA 签名 (v, r, s) 恢复出签名者的地址。
其他写法ecrecoverECRECOVER precompile0x01 precompile

调用它消耗 3,000 gas,返回恢复出的公钥所对应的 20 字节地址;遇到无效输入,例如 v 不是 27 或 28、r 和 s 超出取值范围,则返回零字节(在 Solidity 中即零地址)。它不强制 low-S,因此把签名用作唯一标识的合约必须自行拒绝大于 n/2 的 s(EIP-2 只对交易应用了这条规则)。

安全用法:始终把结果与预期的签名者比较,并拒绝零地址;检查签名数据中的 nonce 或截止时间,以防止重放;对按 EIP-191 或 EIP-712 构造的数据计算哈希,而不是直接对原始值计算哈希;对于智能合约账户,改用 ERC-1271。OpenZeppelin 的 ECDSA.recover 和 SignatureChecker 封装了这些检查。

标准与参考资料

全部术语