![](/img/trans.png)
[英]ethers.js swapExactETHForTokens and swapExactTokensForTokens on pancake swap
[英]In ethers.js, can recoverPublicKey be used for signature verification?
在比特币 wiki 中,他们描述了用于使用 ECDSA 和 Secp256k1 验证签名的算法。 该算法有 3 个输入:签名、消息 hash 和 publicKey。
https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm
在 ethers.js 中有 aa function 和 2 个输入,hash 和签名:
ethers.utils.recoverPublicKey( digest , signature )
https://docs.ethers.io/v5/api/utils/signing-key/
我很想认为验证签名是否正确只是将 publicKey 与 recoverPublicKey 的结果进行比较:
publicKey === ethers.utils.recoverPublicKey( digest , signature )
但是,我犹豫要不要做出这样的断言,因为根据这个问题: https://bitcoin.stackexchange.com/questions/107954/does-every-private-key-have-two-public-keys-ie-y- and-negated-y-secp256k1私钥可以有多个关联的公钥,因此我担心对于相同的输入 recoverPublicKey 可能会返回几个不同的有效答案,从而使相等性无效。
此外,在高效加密标准 1 (SEC 1) ( https://www.secg.org/sec1-v2.pdf ) 的第 4.1.6 节中。 公钥恢复操作,它说:
“潜在地,可以从签名中恢复多个候选公钥。以很小的成本,签名者可以以只有一个候选公钥可行的方式生成 ECDSA 签名”
它返回签署消息的公钥
ethers.utils.recoverPublicKey( digest, signature ) ⇒ string< DataHexString< 65 >> 返回私钥的未压缩公钥(即第一个字节将为 0x04),该私钥用于签署提供签名的摘要。
如果您想验证公钥,则必须从元掩码中获取公钥以查看它们是否相等。 metamask
曾经有eth_getEncryptionPublicKey
方法来获取公钥,但它已被弃用。 我不确定现在使用什么方法:
window.ethereum.request({
method: 'eth_getEncryptionPublicKey',
params: [accounts],
});
醚有这个方法
ethers.utils.verifyMessage( message , signature ) ⇒ string< Address >
返回生成签名的签名消息的地址。 签名可能有一个非规范的 v(即不需要是 27 或 28),在这种情况下,它将被规范化以计算
recoveryParam
,然后用于计算地址; 这允许使用 v 来编码附加数据的系统(例如 EIP-155),因为 v 参数仍然是完全明确的。
我认为这种方法会更容易使用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.