以太坊交易里有公钥吗?揭秘交易签名与公钥恢复机制
一笔以太坊交易被打包进区块链时,交易数据里到底包含不包含发送者的公钥?毕竟在传统的非对称加密体系中,验证签名似乎需要公钥的参与,直觉上,交易里应该带上公钥,否则节点如何验证签名的有效性呢?
答案是:以太坊交易中并不显式包含公钥,但公钥可以从交易签名中被“恢复”出来。这正是以太坊设计上的精妙之处,本文将带你深入理解这一机制。
一笔以太坊交易里到底有什么?
一笔标准的以太坊交易(以EIP-1559后的格式为例)主要包含以下字段:
- nonce:发送方账户的交易序号,防止重放攻击
- to:接收方地址
- value:转账金额(以Wei为单位)
- data / input:调用合约时的附加数据
- gasLimit:交易最大燃料消耗
- maxFeePerGas / maxPriorityFeePerGas:燃料费用相关参数
- chainId、v、r、s:签名相关字段
注意看最后几个字段:r、s、v 正是 ECDSA 签名的三个组成部分,而它们并不是公钥,整笔交易从头到尾,都找不到一个显式的公钥字段。
签名是如何生成的?
以太坊使用 ECDSA(椭圆曲线数字签名算法),基于 secp256k1 椭圆曲线(与比特币相同),签名流程大致如下:
- 钱包将交易内容进行 RLP 编码,并计算出交易的 Keccak-256 哈希值
- 使用私钥对这个哈希值进行 ECDSA 签名
- 签名结果输出为三个数值:r、s、v
- r 和 s 是签名本体的两个分量
- v 是“恢复标识符”(recovery identifier),用于在恢复公钥时从多个候选解中挑选正确的那个
值得注意的是,签名由私钥和交易哈希共同决定,而公钥本身并不参与签名的输入。
关键所在:公钥恢复(ecrecover)
ECDSA 有一个非常特殊且优雅的数学性质:给定消息哈希和签名 (r, s, v),可以反推出签名所对应的公钥。这个过程叫做“公钥恢复”。
验证交易的流程是这样的:
- 节点收到一笔交易,取出发送方地址(交易里的
from实际上是从签名推导出来的) - 节点利用交易哈希和 (r, s, v),通过椭圆曲线数学运算恢复出公钥
- 对恢复出的公钥再做一次 Keccak-256 哈希,取后 20 字节,得到一个地址
- 将这个地址与交易声称的发送方地址比对,一致则签名有效
也就是说,以太坊并不需要“用公钥去验证签名”,而是“从签名中恢复公钥,再验证地址是否匹配”,这种方式带来一个明显的好处:每笔交易节省了约 64 字节的公钥数据,别小看这几十字节——以太坊每年处理数亿笔交易,累积起来节省的存储和带宽是相当可观的。
以太坊甚至将公钥恢复做成了预编译合约 ecrecover(地址为 0x01),Solidity 智能合约也可以直接调用它。
地址与公钥的关系
这里补充一个很多人容易混淆的知识点,梳理一下从私钥到地址的推导链条:
私钥(32字节)
↓ 椭圆曲线乘法
公钥(64字节,即 x、y 两个坐标)
↓ Keccak-256 哈希,取后20字节
地址(20字节,0x开头的42位十六进制字符串)
这个过程是
The End
发布于:2026-10-15,除非注明,否则均为原创文章,转载请注明出处。
