1. 引言
随着时间推移,以太坊网络经历了多次升级与改进,以提升交易效率、安全性和用户体验。根据https://github.com/ethereum/go-ethereum/blob/master/core/types/transaction.go#L48中有:
go
// Transaction types.
const (
LegacyTxType = 0x00 // 传统交易(Legacy Transactions)
AccessListTxType = 0x01 // EIP-2930 交易
DynamicFeeTxType = 0x02 // EIP-1559 交易
BlobTxType = 0x03 // EIP-4844 交易
SetCodeTxType = 0x04 // EIP-7702 交易
)
可知当前以太坊在演进过程中形成了五种重要的交易类型:
- 1)传统交易(Legacy Transactions),
- 2)EIP-2930 交易,
- 3)EIP-1559 交易,
- 4)EIP-4844 交易,
- 5)EIP-7702 交易
这些交易类型各自为以太坊网络带来了独特的特性与改进。
可以通过不同的交易类型(由 transactionType 参数指定)来与 Ethereum JSON-RPC API 进行交互。
以下方法会根据交易类型使用不同的专有格式:
- eth_call
- eth_estimateGas
- eth_getTransactionByBlockHashAndIndex
- eth_getTransactionByBlockNumberAndIndex
- eth_getTransactionByHash
- eth_getTransactionReceipt
2. 以太坊传统交易(Legacy Transactions)
传统交易(类型 0x0)是自以太坊网络诞生以来一直使用的交易形式,使用的是在 2020年 EIP-2718 引入"Typed Transaction 类型化交易"之前就存在的交易格式。
传统交易包含以下参数:
- nonce,
- gasPrice,
- gasLimit,
- to,
- value,
- data,
- v,
- r,
- s。
这类交易不使用访问列表(access lists,指定将要访问的地址和存储键),也不包含 EIP-1559 引入的手续费市场机制变更。
传统交易对象示例:
{
nonce: "0x0", // 发送方在此交易之前已发送的交易数量。
gasPrice: "0x09184e72a000", // 发送方提供的 gas 价格,单位为 wei。
gasLimit: "0x2710", // 发送方提供的最大 gas。
to: "0x0000000000000000000000000000000000000000", // 接收方地址。在合约创建交易中未使用。
value: "0x0", // 转移的数值,单位为 wei。
data: "0x7f7465737432000000000000000000000000000000000000000000000000000000600057", // 用于定义合约创建和交互。
v: "0x1", // ECDSA 恢复 ID。
r: "0xa07fd6c16e169f0e54b394235b3a8201101bb9d0eba9c8ae52dbdf556a363388", // ECDSA 签名 r。
s: "0x36f5da9310b87fefbe9260c3c05ec6cbefc426f1ff3b3a41ea21b5533a787dfc", // ECDSA 签名 s。
}
3. 以太坊EIP-2930 交易------访问列表交易(Access list transactions)
2020年8月提出的 EIP-2930 引入了类型为 0x1 的交易,在传统参数的基础上增加了 accessList 参数。
accessList 指定了交易计划访问的一组地址和存储键,通过预先声明将要访问的合约和存储槽,可以在跨合约调用时节省 gas 成本。
访问列表交易必须指定一个访问列表,并且不包含 EIP-1559 手续费市场机制的变更。
此外,访问列表交易还包含 yParity 参数。该参数的返回值只能是 0x0 或 0x1,表示 secp256k1 签名中 y 值的奇偶性(0 表示偶数,1 表示奇数)。
可以使用 eth_createAccessList API 来模拟一笔交易,该 API 会返回发送真实交易时可能访问的地址和存储键,以及大致的 gas 成本。
访问列表交易对象示例:
{
nonce: "0x0", // 发送方在此交易之前已发送的交易数量。
gasPrice: "0x09184e72a000", // 发送方提供的 gas 价格,单位为 wei。
gasLimit: "0x2710", // 发送方提供的最大 gas。
to: "0x0000000000000000000000000000000000000000", // 接收方地址。在合约创建交易中未使用。
value: "0x0", // 转移的数值,单位为 wei。
data: "0x7f7465737432000000000000000000000000000000000000000000000000000000600057", // 用于定义合约创建和交互。
v: "0x1", // ECDSA 恢复 ID。
r: "0xa07fd6c16e169f0e54b394235b3a8201101bb9d0eba9c8ae52dbdf556a363388", // ECDSA 签名 r。
s: "0x36f5da9310b87fefbe9260c3c05ec6cbefc426f1ff3b3a41ea21b5533a787dfc", // ECDSA 签名 s。
chainId: "0x1", // 交易所属的链 ID。
accessList: [ // 交易计划访问的地址和存储键列表。
{
"address": "0xa02457e5dfd32bda5fc7e1f1b008aa5979568150",
"storageKeys": ["0x0000000000000000000000000000000000000000000000000000000000000081"]
}
],
yParity: "0x1" // secp256k1 签名中 y 值的奇偶性。
}
Infura团队2023年博客 Optimizing Ethereum Transactions with eth_createAccessList 中介绍了 eth_createAccessList 如何帮助优化 gas 成本、减少 out-of-gas 错误,并用于验证客户端以获得基础设施访问权限。
4. EIP-1559 交易
2019年提出的 EIP-1559 交易(类型 0x2)在以太坊的 London 分叉 中引入,用于解决历史手续费市场导致的网络拥堵和交易费用过高问题。
在旧机制中,用户通过 gasPrice 参数给出出价,矿工则选择出价最高的交易进行打包。
EIP-1559 交易不再指定 gasPrice,而是使用协议内动态变化的 基础费用(base fee) (按每单位 gas 计)。
在每个区块中,基础费用都会根据以 gas 目标衡量的网络拥堵情况进行调整。
在保留 accessList 参数和传统参数(不包括 gasPrice)的同时,EIP-1559 交易还包括:
maxPriorityFeePerGas:发送者愿意在基础费用之上为每单位 gas 支付的最大小费,用于提高交易优先级;maxFeePerGas:发送者愿意为每单位 gas 支付的最大总费用(基础费用 + 优先费)。
其中,base fee 基础费用会被销毁(burn),而priority fee 优先费会支付给打包该交易的矿工,以激励矿工优先包含具有更高优先费的交易。
交易中每单位 gas 的优先费会激励矿工优先包含该交易,而不是那些优先费更低的交易。
EIP-1559 交易对象示例:
{
nonce: "0x0", // 发送方在此交易之前已发送的交易数量。
gasLimit: "0x2710", // 发送方提供的最大 gas。
maxPriorityFeePerGas: "0x0", // 发送方愿意在基础费用之上为每单位 gas 支付的最大小费,单位为 wei。
maxFeePerGas: "0x6f4d3132b", // 发送方愿意为每单位 gas 支付的最大总费用(基础费用 + 优先费),单位为 wei。
to: "0x0000000000000000000000000000000000000000", // 接收方地址。在合约创建交易中未使用。
value: "0x0", // 转移的数值,单位为 wei。
data: "0x7f7465737432000000000000000000000000000000000000000000000000000000600057", // 用于定义合约创建和交互。
v: "0x1", // ECDSA 恢复 ID。
r: "0xa07fd6c16e169f0e54b394235b3a8201101bb9d0eba9c8ae52dbdf556a363388", // ECDSA 签名 r。
s: "0x36f5da9310b87fefbe9260c3c05ec6cbefc426f1ff3b3a41ea21b5533a787dfc", // ECDSA 签名 s。
chainId: "0x1", // 交易所属的链 ID。
accessList: [], // 交易计划访问的地址和存储键列表。
yParity: "0x1" // secp256k1 签名中 y 值的奇偶性。
}
Consensys团队2021年 EIP-1559 入门文章 What is EIP-1559? How Will It Change Ethereum?中介绍了更多关于 EIP-1559 如何改变以太坊的内容。
5. EIP-4844 交易
2022年提出的EIP-4844 交易(类型 0x3)在以太坊的 Dencun 分叉中引入。
该提案为 Rollup 提供了一个临时但显著的扩容缓解方案,使其最初可以扩展到每个 slot 0.375 MB,并引入了一个独立的手续费市场,在系统使用受限时可以保持非常低的费用。
在包含传统参数和 EIP-1559 参数的基础上,EIP-4844 交易还包括:
max_fee_per_blob_gas:发送者愿意为 blob gas 支付的每单位 gas 的最大总费用(以 wei 计),blob_versioned_hashes:与该交易的 EIP-4844 数据 blob 相关联的版本化 blob 哈希列表。
实际的 blob 费用会在交易执行前从发送者余额中扣除并被销毁(burn),即使交易执行失败,该费用也不会退还。
6. EIP-7702 交易
2024年提出的 EIP-7702 交易(类型 0x4)在以太坊的 Pectra 分叉中引入。
该提案使钱包能够将其执行权限委托给一个被授权的智能合约。
在包含 EIP-1559 交易类型中的所有字段之外,EIP-7702 交易还包括:
authorization_listsignature_y_paritysignature_rsignature_s
其中,authorization_list 是一个授权列表,由多个授权项组成,每个授权项是一个包含以下字段的元组:
chain_idaddressnoncey_parityrs
参考资料
1\] [Ethereum transaction types](https://docs.metamask.io/services/concepts/transaction-types)
\[2\]