以太坊交易类型综述

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 进行交互。

以下方法会根据交易类型使用不同的专有格式:

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 参数。该参数的返回值只能是 0x00x1,表示 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_list
  • signature_y_parity
  • signature_r
  • signature_s

其中,authorization_list 是一个授权列表,由多个授权项组成,每个授权项是一个包含以下字段的元组:

  • chain_id
  • address
  • nonce
  • y_parity
  • r
  • s

参考资料

1\] [Ethereum transaction types](https://docs.metamask.io/services/concepts/transaction-types) \[2\] \[3\] [Transaction types](https://reth.rs/run/faq/transactions/)

相关推荐
搬砖魁首18 小时前
密码学系列 - 零知识证明(ZKP) - Schnorr协议
区块链·密码学·零知识证明·schnorr·fiat-shamir
MQLYES1 天前
04-BTC-协议
区块链
m0_603888712 天前
Decentralized Autoregressive Generation
ai·去中心化·区块链·论文速览
反向跟单策略2 天前
期货反向跟单—高频换人能够提高跟单效率?
大数据·人工智能·学习·数据分析·区块链
知识分享小能手2 天前
Ubuntu入门学习教程,从入门到精通,Ubuntu 22.04 中的区块链 —— 知识点详解 (23)
学习·ubuntu·区块链
电报号dapp1192 天前
钱包开发:在虚无中为数字自我筑巢
游戏·去中心化·区块链·智能合约
数据大魔方3 天前
【期货量化入门】期权交易入门:从零开始学期权量化(TqSdk完整教程)
数据库·python·mysql·算法·区块链·程序员创富
期货资管源码3 天前
期货资管分仓软件开发/平台搭建经验分享
经验分享·算法·eclipse·区块链
数据皮皮侠AI3 天前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节