引言
在以太坊生态中,交易(Transaction,简称 Tx)是区块链交互的核心。随着网络升级,交易格式不断演进,出现了多种改进提案(EIP),同时为提升用户体验,诞生了元交易(Meta Transaction)这种免 Gas 费交互模式。本文将深入解析以太坊交易格式演变与元交易的工作原理。
交易格式与广播流程
用户向以太坊网络提交交易的过程,主要通过 RPC 方法 eth_sendRawTransaction 实现。该方法的输入参数由签名后的交易数据构成,关键点在于:交易签名者将支付交易中指定的 ETH 转移金额及消耗的 Gas 费用。普通 ETH 转账与合约调用交易格式基本一致,区别在于合约交易的 input data 字段包含了调用数据。
交易签名计算涉及九个元素:
- nonce:账户交易序号
- gas price:Gas 价格(影响打包速度)
- gas limit:Gas 消耗上限
- to:目标地址
- value:转移 ETH 数量
- input data:调用数据(合约交易需填充)
- chain id:链标识符(EIP-155 引入)
- 两个固定为 0 的字段(EIP-155 引入)
引入 chain id 旨在防止跨链重放攻击,例如避免以太坊经典(Ethereum Classic)上的交易被重放至主网。交易哈希(TxHash)通过 Keccak256(RawTransaction) 计算得出,其中 RawTransaction 即 eth_sendRawTransaction 的签名交易数据。
EIP-2718:交易类型标准化
EIP-2718 定义了两种交易形式:
- LegacyTransaction:传统 EIP-155 交易
- TransactionType || TransactionPayload:新型交易,首字节为交易类型(0x00-0x7f)
首字节在 0x00-0x7f 范围内即为新型交易,否则为传统交易。交易类型由其他 EIP 具体定义。
EIP-2930:可选访问列表(交易类型 1)
EIP-2930 定义了类型为 0x01 的交易,格式为:
0x01 || rlp([chainId, nonce, gasPrice, gasLimit, to, value, data, accessList, signatureYParity, signatureR, signatureS])此格式引入了访问列表(accessList),可优化部分合约交互的 Gas 成本。
EIP-1559:Gas 费机制改革(交易类型 2)
EIP-1559 定义了类型为 0x02 的交易,格式为:
0x02 || rlp([chainId, nonce, maxPriorityFeePerGas, maxFeePerGas, gasLimit, to, value, data, accessList, signatureYParity, signatureR, signatureS])该提案废除了 gasPrice 字段,代之以两个新字段:
- maxPriorityFeePerGas:用户支付给矿工的小费
- maxFeePerGas:用户愿意支付的最高 Gas 费
EIP-1559 将 Gas 费分为两部分:基础费(baseFeePerGas)被销毁,优先费(maxPriorityFeePerGas)支付给矿工。用户实际支付费用为:
min(maxFeePerGas * gasUsed, (baseFeePerGas + maxPriorityFeePerGas) * gasUsed)需确保 maxFeePerGas 不低于 baseFeePerGas,否则交易无效。传统 EIP-155 交易仍被兼容,其 Gas 费中基础费部分被销毁,剩余部分归矿工所有。
EIP-4844:数据分片支持(交易类型 3)
EIP-4844(Dencun 升级引入)定义了类型为 0x03 的交易,格式为:
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])该提案通过 blob 数据支持数据分片,降低 Layer2 数据成本。
EIP-7702:授权列表交易(交易类型 4)
EIP-7702 定义了类型为 0x04 的交易,格式为:
0x04 || rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, authorization_list, y_parity, r, s])其中 authorization_list 包含授权信息,支持更灵活的账户控制模式。
元交易:免 Gas 交易机制
基本原理
元交易(Gasless Transaction)允许用户在不持有 ETH 的情况下调用智能合约,Gas 费用由中继者(Relayer)支付。实现原理是用户对函数参数签名,中继者将签名与参数转发至合约,合约验证签名后执行操作。这需对合约进行两方面改造:
- 函数增加签名参数(如 signature 或 V/R/S),并在合约内验证签名有效性
- 函数内部使用从签名恢复的用户地址而非 msg.sender(即中继者地址)
签名处理可参考 EIP-191(签名数据标准)和 EIP-712(结构化数据哈希与签名)。实例可借鉴 Compound 协议的 delegateBySig 函数,它实现了与 delegate 函数相同的功能,但支持元交易。
中心化中继者方案
中心化中继者模式下,用户将签名后的请求发送至中继服务器,中继者验证后支付 Gas 费并提交交易至区块链。优点是实现简单,但依赖中继者的可信度与可用性。
去中心化中继者方案
Gas Station Network (GSN) 提供了去中心化中继解决方案,通过开放网络中继节点降低中心化风险。开发者可集成 GSN 使 dApp 支持免 Gas 交易,提升用户体验。
安全机制
为防止签名交易被重复提交(重放攻击),需在合约层面实施安全措施:
- 使用 nonce 机制:每个用户设置 nonce,每次调用递增并包含在签名中,确保每次签名唯一
- 设置过期时间(expiry):签名请求有效期限制,超时作废
中继者亦需实施策略防止滥用,如限制用户每日提交次数,避免恶意消耗 Gas。
常见问题
什么是 EIP-1559 交易?
EIP-1559 引入了基础费与优先费机制,基础费被销毁,优先费奖励矿工。用户设置 maxFeePerGas 和 maxPriorityFeePerGas 控制成本,交易效率更高。
元交易如何保证安全?
合约通过验证用户签名确保参数未被篡改,并从签名恢复用户地址。结合 nonce 与过期时间机制,防止重放攻击与过期请求。
哪些场景适合使用元交易?
适合新用户无 Gas 费启动、推广活动免交互成本、批量操作节约 Gas 等场景。需注意中继者成本覆盖与合约安全实现。
EIP-4844 如何降低费用?
EIP-4844 引入 blob 数据存储,大幅降低 Layer2 数据上链成本,进而减少用户交易费用,提升网络可扩展性。
中继者如何避免亏损?
中继者可通过 dApp 补贴、服务收费、流量激励等模式覆盖成本,同时需监控恶意请求并实施频率限制等风控措施。