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

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

-
交易哈希(Transaction Hash / RLP Hash):
- 将上述交易的所有字段(除了签名相关的
v,r,s)按照RLP(Recursive Length Prefix)规则进行编码。 - 对编码后的数据进行Keccak-256哈希计算,得到一个32字节的交易哈希值,这个哈希值就是实际被签名的“消息摘要”。
- 将上述交易的所有字段(除了签名相关的
-
签名过程:

- 发送方使用自己的私钥(privateKey)对上述交易哈希值进行ECDSA签名。
- ECDSA签名会生成两个数值:r 和 s,它们都是大整数,通常表示为64字节的十六进制字符串。
- 为了恢复公钥和防止重放攻击,会生成一个恢复ID(recovery ID),记作 v,在以太坊中,
v的值通常通过chainId * 2 + 35或chainId * 2 + 36计算(对于EIP-155),这使得签名可以绑定到特定链。
-
签名交易构造:
- 将生成的
v,r,s三个值附加到原始交易数据中,构成一个完整的已签名交易。
- 将生成的
交易签名的解析
解析交易签名,即从已签名的交易中提取出发送方的公钥,并验证签名的有效性,这通常发生在节点接收交易并准备将其打包进区块时,或者用户/开发者需要验证交易来源时。
解析步骤如下:
-
提取交易数据:
- 从已签名的交易中,解析出原始交易的所有字段(
chainId,nonce,to,value,data等)以及签名部分v,r,s。
- 从已签名的交易中,解析出原始交易的所有字段(
-
重新计算交易哈希:
- 使用与签名时相同的RLP编码规则和Keccak-256哈希算法,仅根据原始交易字段(不含
v,r,s)重新计算交易哈希TxHash,这个哈希应该与签名者当初签名的哈希一致。
- 使用与签名时相同的RLP编码规则和Keccak-256哈希算法,仅根据原始交易字段(不含
-
从
v,r,s恢复公钥:- 这是解析签名的核心步骤,利用
v,r,s和交易哈希TxHash,通过ECDSA的公钥恢复算法可以计算出发送方的公钥。 - 恢复过程大致如下:
- 根据
v计算出恢复IDrecId(recId = v - 35 - 2 * chainId,对于EIP-155)。 - 利用
r,s,TxHash和recId,在secp256k1曲线上进行数学运算,找到满足签名验证方程的点,从而恢复出原始的公钥点,并将其转换为压缩或非压缩格式的公钥。
- 根据
- 这是解析签名的核心步骤,利用
-
验证签名:
- 将恢复出的公钥与签名时使用的私钥对应的公钥进行比对(如果已知公钥)。
- 或者,更直接地,使用恢复出的公钥、交易哈希
TxHash和签名(r, s)执行ECDSA签名验证,如果验证通过,则证明签名有效,且该公钥就是发送方的公钥。
-
地址推导(可选):
- 以太坊地址是从公钥通过Keccak-256哈希后取最后20个字节得到的,一旦恢复出公钥,就可以进一步计算出发送方的地址,用于验证交易中
from字段(虽然from字段在交易中不显式存在,但可以通过计算得出并与节点解析出的from对比)。
- 以太坊地址是从公钥通过Keccak-256哈希后取最后20个字节得到的,一旦恢复出公钥,就可以进一步计算出发送方的地址,用于验证交易中
签名解析的意义与应用
- 交易验证:节点通过解析签名来验证交易的有效性,确保交易由合法的发送方发起且未被篡改。
- 来源追踪:开发者或用户可以通过解析交易签名来获取交易的发送方地址,追踪资金流向或合约调用来源。
- 安全审计:在智能合约安全审计中,分析交易签名可以帮助理解交易的发起上下文和权限。
- 钱包开发:钱包软件需要能够正确解析用户的交易签名,并帮助用户构造有效的签名交易。
- 数据分析:区块链数据分析平台通过对大量交易签名的解析,构建地址标签、交易关系等网络图谱。
注意事项
- 私钥安全:签名依赖于私钥,私钥的泄露意味着账户控制权的丧失。
- 签名算法兼容性:以太坊主要使用ECDSA (secp256k1),未来也可能引入其他签名算法(如BLS)。
- EIP-155的重要性:
chainId的引入(通过v体现)有效防止了跨链交易重放攻击,是签名解析中需要特别注意的部分。 - RLP编码的正确性:交易哈希的计算依赖于正确的RLP编码,错误的编码会导致哈希不匹配,签名验证失败。
