在以太坊乃至整个区块链世界中,交易是价值转移和智能合约交互的基本单元,而交易签名则是确保交易真实性、完整性和不可否认性的核心技术机制,理解以太坊交易签名的原理与解析过程,对于开发者、安全研究员乃至普通用户都具有重要意义,本文将详细解析以太坊交易签名的构成、原理及其解析方法。

在去中心化的网络中,没有中心化的机构来验证交易发起者的身份,交易签名主要解决以下问题:
要理解签名,首先需要了解以太坊交易的基本结构,一个未签名的以太坊交易(以EIP-1559为例)主要包括以下字段:
chainId:链ID,用于防止重放攻击。nonce:发送方账户发出的交易数量,用于防止重放交易和确保交易顺序。maxPriorityFeePerGas:优先费用,用于支付给打包交易的矿工/验证者。maxFeePerGas:每 gas 最高总费用。gasLimit:交易愿意消耗的最大 gas 量。to:接收方地址,对于合约创建交易,此字段为空。value:发送的以太币数量(以 wei 为单位)。data:可选数据,用于调用合约方法或创建合约时包含初始化代码。accessList:可选的访问列表,用于优化某些交易的 gas 消耗(EIP-2930 引入)。这些字段共同构成了交易的数据部分,即需要被签名的“消息”。
以太坊交易签名采用椭圆曲线数字签名算法(ECDSA),基于secp256k1椭圆曲线,签名过程涉及以下几个关键步骤和哈希算法:

交易哈希(Transaction Hash / RLP Hash):
v, r, s)按照RLP(Recursive Length Prefix)规则进行编码。签名过程:

v 的值通常通过 chainId * 2 35 或 chainId * 2 36 计算(对于EIP-155),这使得签名可以绑定到特定链。签名交易构造:
v, r, s 三个值附加到原始交易数据中,构成一个完整的已签名交易。解析交易签名,即从已签名的交易中提取出发送方的公钥,并验证签名的有效性,这通常发生在节点接收交易并准备将其打包进区块时,或者用户/开发者需要验证交易来源时。
解析步骤如下:
提取交易数据:
chainId, nonce, to, value, data 等)以及签名部分 v, r, s。重新计算交易哈希:
v, r, s)重新计算交易哈希 TxHash,这个哈希应该与签名者当初签名的哈希一致。从 v, r, s 恢复公钥:
v, r, s 和交易哈希 TxHash,通过ECDSA的公钥恢复算法可以计算出发送方的公钥。v 计算出恢复ID recId(recId = v - 35 - 2 * chainId,对于EIP-155)。r, s, TxHash 和 recId,在secp256k1曲线上进行数学运算,找到满足签名验证方程的点,从而恢复出原始的公钥点,并将其转换为压缩或非压缩格式的公钥。验证签名:
TxHash 和签名 (r, s) 执行ECDSA签名验证,如果验证通过,则证明签名有效,且该公钥就是发送方的公钥。地址推导(可选):
from 字段(虽然 from 字段在交易中不显式存在,但可以通过计算得出并与节点解析出的 from 对比)。chainId的引入(通过 v 体现)有效防止了跨链交易重放攻击,是签名解析中需要特别注意的部分。