在去中心化的世界里,如何确保一个交易是由账户所有者本人发起的?这就像在现实世界中需要验证签名或身份证一样,以太坊通过其精心设计的签名验证机制,为每一笔交易和智能合约交互提供了可靠的身份认证保障,本文将深入探讨以太坊签名验证的核心过程,揭秘其如何在不依赖中心化机构的情况下,确保交易的真实性和不可否认性。

以太坊的签名验证体系建立在非对称加密(公钥密码学)的基础之上,每个以太坊账户都拥有一对唯一的密钥:
以太坊账户还有一个地址(Address),它是从公钥进一步通过哈希算法(Keccak-256)计算得出的 shortened version,通常以 "0x" 开头,长度为40个十六进制字符,地址是用户在以太坊网络中的公开标识,类似于银行账号。
当一个用户(账户所有者)想要发起一笔交易时,签名过程如下:
构建交易原始数据(RLP编码): 将交易的所有关键信息(如接收方地址、转账金额、nonce、gas价格、gas限制等)按照以太坊规定的格式(RLP - Recursive Length Prefix)进行编码,形成一串原始的二进制数据,这串数据代表了用户的交易“意图”。

使用私钥对数据进行签名: 用户使用自己私钥,对上一步生成的原始交易数据进行签名,这个过程通常采用椭圆曲线数字签名算法(ECDSA - Elliptic Curve Digital Signature Algorithm)。
将签名附加到交易中: 生成的签名(r, s)以及一个恢复ID(v,用于从签名中恢复公钥)会被一起附加到原始交易数据中,形成一笔完整的、可以广播到以太坊网络的交易。
当以太坊网络中的节点(如矿工)收到一笔交易后,会执行签名验证以确保其有效性:
提取交易数据和签名: 验证节点首先从交易中提取出原始交易数据(RLP编码部分)以及签名(r, s, v)。

从签名和交易数据中恢复公钥: 利用签名(r, s, v)和原始交易数据,验证节点可以通过ECDSA的逆运算过程恢复出一个公钥,以太坊的签名格式(特别是v值)设计使得这一点成为可能,恢复出的公钥应该与交易发起方声称的公钥一致。
验证签名的有效性: 验证节点使用恢复出的公钥,对原始交易数据重新进行ECDSA签名验证。
检查其他交易属性: 签名验证通过后,节点还会检查交易的其他方面,如nonce值是否正确、gas是否充足、格式是否符合规范等,只有所有检查都通过,交易才会被纳入待打包的区块。
在当前的以太坊(主网为以太坊1.0的PoS版本)中,签名验证主要基于外部账户(EOA)的ECDSA签名,而正在发展的以太坊2.0以及账户抽象(Account Abstraction)计划将带来签名验证的革新: