在区块链技术的世界里,数字签名是确保交易合法性、完整性和不可抵赖性的核心基石,以太坊,作为全球第二大区块链平台,其交易的安全验证离不开一套精心设计的签名算法,以太坊的签名算法究竟是什么呢?以太坊目前主要采用的是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm, ECDSA),具体而言是基于secp256k1椭圆曲线参数的变体。

为什么是ECDSA?—— 签名算法的重要性

在深入探讨ECDSA之前,我们首先要理解签名算法在以太坊(乃至整个区块链)中的作用,每一笔以太坊交易,都像一张数字支票,需要“签名”才能生效,这个签名需要满足以下关键特性:

  1. 认证性(Authentication):能够证明交易确实是由私钥的持有者(即账户所有者)发起的,防止身份伪造。
  2. 完整性(Integrity):确保交易数据在签名后未经任何篡改,一旦交易数据被修改,签名将无法验证通过。
  3. 不可抵赖性(Non-repudiation):签名者无法否认自己曾发起过的交易,因为签名依赖于其独有的私钥。

ECDSA因其较高的安全性、较短的签名长度(相比传统RSA等算法)以及较高的计算效率,成为了区块链领域(包括比特币)广泛采用的签名算法。

ECDSA的核心原理:数学的巧妙结合

ECDSA的安全性基于椭圆曲线离散对数问题的难解性,这意味着,在已知椭圆曲线上的某点P(基点)和另一个点kP(k为整数)的情况下,要计算出k是非常困难的。

ECDSA涉及三种主要的数学对象:

  • 椭圆曲线(Elliptic Curve):这里特指secp256k1曲线,它定义了一个特定的数学方程和有限域上的点集。
  • 私钥(Private Key):一个随机生成的大整数(在secp256k1曲线上,其范围在1到n-1之间,n是基点P的阶),私钥必须严格保密,它是账户所有权的唯一凭证。
  • 公钥(Public Key):通过私钥d和基点P计算得出,即 Q = d * P,公钥可以公开,用于验证签名。

签名过程(Signer使用私钥):

当用户发起一笔交易时,签名过程如下:

  1. 生成随机数k:签名者生成一个临时随机数k(也称为“nonce”,必须每次签名都不同且不可预测)。
  2. 计算点R:计算椭圆曲线上的点 R = k * P,R的x坐标取模后得到 r,如果r为0,则重新选择k。
  3. 计算签名s:计算 s = (hash(交易数据) + d * r) * k^(-1) mod nhash(交易数据) 是对交易内容进行哈希运算得到的结果,d 是私钥,k^(-1) 是k在模n下的乘法逆元,如果s为0,则重新选择k。
  4. 输出签名:最终的签名由 (r, s) 这两个整数组成,它们会附加在交易数据中广播到网络。

验证过程(网络节点使用公钥):

网络中的任何节点收到交易后,都可以使用交易发送者的公钥Q来验证签名的有效性:

  1. 获取数据:提取交易数据、签名 (r, s) 和公钥Q。
  2. 计算哈希:计算交易数据的哈希值 h
  3. 计算中间值
    • 计算 w = s^(-1) mod n(s的乘法逆元)。
    • 计算 u1 = h * w mod n
    • 计算 u2 = r * w mod n
  4. 计算点R':计算椭圆曲线上的点 R' = u1 * P + u2 * Q
  5. 验证:检查点R'的x坐标取模后是否等于r,如果相等,则签名有效,否则无效。

这个验证过程巧妙地利用了椭圆曲线的性质,能够在不暴露私钥的情况下,证明签名者确实拥有与公钥Q对应的私钥d,并且交易数据未被篡改。

以太坊中的具体应用:从签名到地址

在以太坊中,ECDSA的应用流程如下:

  1. 用户生成密钥对:用户首先生成一个256位的私钥,然后通过ECDSA(基于secp256k1)计算出对应的公钥(一个 uncompressed 的65字节字符串,以0x04开头)。
  2. 生成地址:以太坊地址并非直接使用公钥,而是通过对公钥进行一系列哈希运算得到:
    • 对公钥进行Keccak-256哈希,得到一个32字节的哈希值。
    • 取这个哈希值的最后20个字节,作为以太坊地址。
  3. 交易签名:当用户发起交易时,客户端(如MetaMask)会使用用户的私钥对交易数据进行ECDSA签名,生成 (r, s) 签名值。
  4. 交易广播与验证:签名后的交易(包含发送方地址、接收方地址、金额、数据、nonce、gas价格、gas限制以及签名 随机配图