以太坊 交易类型
以太坊作为一个不断发展的区块链平台,随着时间的推移引入了多个改进提案来提升其性能和用户体验,其交易的数据结构也在一直“进化”
交易类型
过去,以太坊的交易都采用同一种格式:RLP([nonce, gas_price, gas_limit, to, value, data, v, r, s])
在 EIP-2718(2021 年 4 月 15 日柏林(Berlin) 升级)改进协议中,定义了一种带交易类型的通用交易格式:TransactionType || TransactionPayload
将上述字段连接(合并)起来,即可得到一个类型化交易。字段的定义是:
- TransactionType:0 至 0x7f 范围内的某个值,最多可代表 128 种事务类型。
- TransactionPayload:由事务类型定义的任意一个字节数组。
EIP-2718 没有为交易的有效负载定义格式。因此,交易的有效负载可以是任意一段经过编码的字节序列,只要采用符合新的交易类型(如 RLP、SSZ 等)定义的编码器即可。之所以选择简单的字节相连方式,是因为读取字节数组的第一个字节非常简单,无需使用任何库或工具。
新的交易类型最多可达 0x7f 种。选择这一上限是为了保证向后兼容传统交易。经过 RLP 编码的交易的第一个字节始终大于或等于 0xc0,因此类型化交易永远不会与传统交易产生冲突,而且类型化交易和传统交易之间可以通过第一个字节来区分。
以太坊目前的源代码中定义了四种交易类型:
// Transaction types.
const (
LegacyTxType = 0x00
AccessListTxType = 0x01
DynamicFeeTxType = 0x02
BlobTxType = 0x03
)
Legacy 交易
Legacy 交易是以太坊早期的交易类型,从链开始持续很长时间都是此类型的交易。
特点:
- Gas 价格(Gas Price):用户设定的固定值,表示愿意为每个 Gas 单位支付的费用。
- Gas 限额(Gas Limit):用户愿意为交易支付的最大 Gas 数量。
- 交易费用:由 Gas Price * Gas Used 计算得出。
示例:
{
"from": "0xSenderAddress",
"to": "0xRecipientAddress",
"value": "1000000000000000000", // 1 ETH in Wei
"gas": 21000,
"gasPrice": "20000000000" // 20 Gwei
}
AccessList 交易
EIP-2930(2021 年 4 月 15 日柏林(Berlin) 升级)改进协议,引入了访问列表(Access List)功能,以优化 Gas 费和提高交易效率。增加了以下格式的交易:
0x01 || RLP([chain_id, nonce, gas_price, gas_limit, to, value, data, access_list, y_parity, r, s])
特点:
- 访问列表(Access List):提前声明交易将访问的存储和合约地址,减少 Gas 费。
- Gas 价格和 Gas 限额:与 Legacy 交易类似,但增加了访问列表字段。
示例:
{
"from": "0xSenderAddress",
"to": "0xRecipientAddress",
"value": "1000000000000000000", // 1 ETH in Wei
"gas": 21000,
"gasPrice": "20000000000", // 20 Gwei
"accessList": [
{
"address": "0xContractAddress",
"storageKeys": ["0xStorageKey1", "0xStorageKey2"]
}
]
}
DynamicFee 交易
EIP-1559(2021 年 8 月 5 日伦敦(London) 升级)改进协议,引入动态费用功能,旨在改善 Gas 费的预测和用户体验。增加了以下格式的交易:
0x02 || RLP([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, y_parity, r, s])
特点:
- 基础费用(Base Fee):由网络动态调整,不会支付给矿工,而是被销毁。
- 优先费(Priority Fee):支付给矿工的费用,类似于小费,以激励矿工优先处理交易。
- 最大费用(Max Fee):用户愿意支付的最高费用,包括基础费用和优先费。
示例:
{
"from": "0xSenderAddress",
"to": "0xRecipientAddress",
"value": "1000000000000000000", // 1 ETH in Wei
"maxFeePerGas": "30000000000", // 30 Gwei
"maxPriorityFeePerGas": "2000000000", // 2 Gwei
"gasLimit": 21000
}
Blob 交易
EIP-4844(2024 年 3 月 13 日坎昆(Cancun)升级)改进协议,可以将 L2 分片数据以廉价的方式提交到链上,旨在大幅提升以太坊的扩展性。增加了以下格式的交易:
0x03 || RLP([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, max_fee_per_blob_gas, blob_versioned_hashes, y_parity, r, s])
特点:
- 数据分片(Data Sharding):引入数据分片来分担以太坊主链的负载,大幅提高交易吞吐量。
- Blob 数据:EIP-4844 引入了新的交易类型,包含“blob”数据,这些数据不会永久存储在以太坊节点中,而是短期存储,提高数据处理效率。
示例:
{
"from": "0xSenderAddress",
"to": "0xRecipientAddress",
"value": "1000000000000000000", // 1 ETH in Wei
"gas": 21000,
"maxFeePerGas": "30000000000", // 30 Gwei
"maxPriorityFeePerGas": "2000000000", // 2 Gwei
"maxFeePerBlobGas": "3000000000", // 3 Gwei
"blobVersionedHashes": "0xBlobData"
}
主要区别总结
Gas 费用机制:
- Legacy:用户设定固定的 Gas 价格。
- EIP-2930:类似 Legacy,但增加了访问列表以优化 Gas 费。
- EIP-1559:引入动态调整的基础费用和优先费机制。
- EIP-4844:引入数据分片和 blob 数据。
新功能:
- Legacy:无特别优化,使用最早的交易机制。
- EIP-2930:通过访问列表优化 Gas 费和交易效率。
- EIP-1559:改善 Gas 费预测和用户体验。
- EIP-4844:大幅提升扩展性,引入数据分片和 blob 数据。