Skip to the content.

ECDSA - 椭圆曲线数字签名算法

什么是数字签名

ECDSA: Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法。在以太坊网络中,主要使用 ECDSA 算法来对消息进行签名及验证。

为什么要用 ECDSA

在 ethereum 及 bitcoin 网络中,使用 ECDSA 算法,能够保证交易只能由私钥的拥有者签署,网络上的其他节点可以从签名及消息哈希中验证交易的完整性及正确性

如何使用 ECDSA

  1. 使用 ECDSA 算法生成一对公私钥,并由公钥推到出地址
  2. 生成待签名的消息哈希(msg_hash)
  3. 使用 private key 对 msg_hash 进行签名得到签名值(signature)
  4. 根据 signature 及 msg_hash 可以推导出公钥,再根据公钥导出地址与签名的 signer 对比,即可验证签名是否正确

ethereum 中 ECDSA 对消息进行签名及验证,有以下特殊点:

  1. ethereum 中消息分为: 可执行交易以及任意消息
  2. 为了避免用户签名恶意消息,在生成 msg_hash 时,ethereum 建议在消息前,加上 "\x19Ethereum Signed Message:\n32 再计算消息哈希,这叫做 以太坊签名消息,经过 toEthSignedMessageHash() 函数处理后的消息,不能被用于执行交易

solidity 中使用 ECDSA

在合约中可以使用 ECDSA 算法,实现类似白名单空投的效果(本质就是验证调用者是否为项目方指定的地址; 即是否有项目方的授权):

  1. 调用者链下向项目方请求签名,如果调用者地址是属于白名单中,则项目方使用私钥,对该地址进行签名,并返回签名结果
  2. 调用者调用链上领取空投的合约方法,并带上项目方给的签名作为参数
  3. 领取空投方法根据计算出的消息哈希,以及参数中的签名,计算出 signer,并与合约中设置的项目方地址比较,一致则允许领取,否则不允许领取

Ref