跳到主要内容
ecdsa.com

ECDSA 公钥恢复

根据 ECDSA 签名和消息哈希计算出签名者的公钥(SEC 1 §4.1.6);以太坊和比特币的消息签名用这种方法代替传输公钥。
其他写法key recoveryrecovery idrecid

验证者根据 r 重建 x 坐标为 r 的候选点 R(对应两个 y 值,极少数情况下 x 坐标为 r + n),并计算 Q = r⁻¹·(s·R − z·G)。恢复 ID 用于选定候选点,通常为 0 或 1,表示 R 的 y 坐标奇偶性。以太坊把它放在 v 中:personal_sign 和旧式消息为 27 或 28,EIP-155 交易为 chainId × 2 + 35 或 + 36,类型化交易为 0 或 1。比特币的签名消息格式把它放在一个头部字节中(取值为 27~42,取决于地址类型,见 BIP-137)。

位于地址 0x01 的 ecrecover 预编译合约返回恢复出的公钥所对应的 20 字节地址;合约正是借此在不存储公钥的情况下检查 personal_sign、EIP-712 和 permit 签名。对于格式正确的签名,恢复总能得到某个公钥,因此在把结果与预期地址比较之前,它什么也证明不了;而且 ecrecover 失败时返回零地址,合约必须拒绝这个地址。

公钥恢复适用于任何曲线上的 ECDSA,包括 P-256。Schnorr 签名(BIP-340)和 EdDSA 无法恢复公钥,因为它们的挑战哈希对公钥作出了承诺。

标准与参考资料

全部术语