在以太坊乃至整个区块链世界中,交易是驱动网络运行的基本单元,无论是简单的以太转账,还是复杂的智能合约交互,最终都需要以交易的形式被广播到网络中,并被矿工打包进区块,这些交易在应用程序层面(如钱包、DApp)是如何被构造,又如何在网络上传输的呢?这就涉及到一个至关重要的概念——以太坊交易序列化,本文将深入探讨以太坊交易序列化的定义、重要性、实现方式及其核心组成部分。
以太坊交易序列化就是将一个结构化的交易对象(包含发送者、接收者、金额、数据、gas限制、gas价格、nonce等一系列字段)按照特定的规则和格式,转换成一串连续的字节(byte)序列的过程,这串字节序列就是我们在区块链浏览器中看到的交易哈希(TX Hash)的原始数据,也是节点之间广播和存储交易的标准格式。

可以将其理解为一种“标准化打包”过程:就像将不同大小的物品按照固定模板放入一个标准化的集装箱,以便于运输和存储,序列化后的交易数据具有以下特点:
交易序列化在以太坊生态中扮演着不可或缺的角色,其重要性体现在:

以太坊交易序列化主要依赖于RLP(Recursive Length Prefix,递归长度前缀)编码,RLP是以太坊中用于编码任意嵌套的二维数组的编码方法,其设计简洁高效,特别适合编码结构化数据。
RLP的核心思想是:

以太坊交易本身可以被看作是一个有序的字段列表(数组),按照固定的顺序包含以下元素(以EIP-1559交易为例):
chainId:链ID,用于防止重放攻击。nonce:发送者账户发出的交易数量。maxPriorityFeePerGas:优先费用(小费)的最高单价。maxFeePerGas:愿意支付的最高gas单价。gasLimit:交易愿意消耗的gas总量。recipient:接收地址(对于合约创建交易,此字段为空)。value:发送的以太币数量(以wei为单位)。data:交易附带的数据,对于合约调用是函数调用参数,对于合约创建是合约初始化代码。accessList:访问列表(EIP-2930引入,用于优化gas费用)。v, r, s:签名分量,用于验证交易发送者的身份。序列化时,RLP编码器会按照这个顺序,将每个字段依次进行RLP编码,然后将这些编码后的结果再作为一个整体进行RLP编码,最终形成一串连续的字节流,在交易被签名前,v, r, s字段为空。
值得注意的是,交易签名是在序列化(但未包含签名部分)之后进行的,具体流程如下:
v, r, s)的交易对象。rawTx。rawTx进行签名:使用发送者的私钥对rawTx进行椭圆曲线签名(ECDSA),得到签名分量r, s,并根据chainId计算出v值。v, r, s添加到原始交易对象中。这种设计确保了签名是对交易原始数据的唯一承诺,防止了签名数据被篡改。
序列化后的交易是一串十六进制表示的字节, 0x02f86c8a...(这是一个简化示例,实际交易更长更复杂)。
区块链浏览器、钱包软件或以太坊客户端(如Geth, Parity)接收到这串字节后,会使用相同的RLP解码规则进行反序列化,将其拆解回原始的交易对象,从而提取出发送者、接收者、金额、gas限制等所有信息,并进行验证和显示。