跳转至主要内容
Change page

交易

页面最后更新: 2025年10月22日

交易是由帐户发出,带密码学签名的指令。 帐户将发起交易以更新以太坊网络的状态。 最简单的交易是将 ETH 从一个帐户转到另一个帐户。

前提条件

为了帮助你更好地理解本页面,我们建议你先阅读帐户和我们的以太坊简介

什么是交易?

以太坊交易是指由外部持有帐户发起的行动,换句话说,是指由人管理而不是智能合约管理的帐户。 例如,如果 Bob 发送 Alice 1 ETH,则 Bob 的帐户必须减少 1 ETH,而 Alice 的帐户必须增加 1 ETH。 交易会造成状态的改变。

显示交易导致状态变化的图表 图表改编自 Ethereum EVM illustratedopens in a new tab

改变 EVM 状态的交易需要广播到整个网络。 任何节点都可以广播在以太坊虚拟机上执行交易的请求;此后,验证者将执行交易并将由此产生的状态变化传播到网络的其他部分。

交易需要付费并且必须包含在一个有效区块中。 为了使本概述更加简洁,我们将另行介绍燃料费和验证。

所提交的交易包括下列信息:

  • from – 发送者的地址,该地址将签署交易。 这将是一个外部帐户,因为合约帐户无法发送交易
  • to – 接收地址(如果是外部所有的帐户,交易将转移价值。 如果是合约帐户,交易将执行合约代码)
  • signature – 发送者的标识符。 当发送者的私钥签署交易并确保发送者已授权此交易时,生成此签名。
  • nonce - 一个顺序递增的计数器,表示来自该帐户的交易序号
  • value – 从发送者转移到接收者的 ETH 数量(以 WEI 为单位,其中 1ETH 等于 1e+18wei)
  • input data – 包含任意数据的可选字段
  • gasLimit – 交易可消耗的最大燃料单位数量。 EVM 指定了每个计算步骤所需的燃料单位
  • maxPriorityFeePerGas - 作为给验证者的小费,愿意为每单位燃料支付的最高价格
  • maxFeePerGas - 愿意为交易支付的每单位燃料的最高费用(包括 baseFeePerGasmaxPriorityFeePerGas

燃料是指验证者处理交易所需的计算。 用户必须为此计算支付费用。 gasLimitmaxPriorityFeePerGas 决定了支付给验证者的最高交易费用。 更多关于燃料的信息

交易对象看起来像这样:

1{
2 from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8",
3 to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a",
4 gasLimit: "21000",
5 maxFeePerGas: "300",
6 maxPriorityFeePerGas: "10",
7 nonce: "0",
8 value: "10000000000"
9}
显示全部

但交易对象需要使用发送者的私钥签名。 这证明交易只可能来自发送者,而不是欺诈。

Geth 这样的以太坊客户端将处理此签名过程。

示例 JSON-RPC 调用:

1{
2 "id": 2,
3 "jsonrpc": "2.0",
4 "method": "account_signTransaction",
5 "params": [
6 {
7 "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db",
8 "gas": "0x55555",
9 "maxFeePerGas": "0x1234",
10 "maxPriorityFeePerGas": "0x1234",
11 "input": "0xabcd",
12 "nonce": "0x0",
13 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
14 "value": "0x1234"
15 }
16 ]
17}
显示全部

示例响应:

1{
2 "jsonrpc": "2.0",
3 "id": 2,
4 "result": {
5 "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
6 "tx": {
7 "nonce": "0x0",
8 "maxFeePerGas": "0x1234",
9 "maxPriorityFeePerGas": "0x1234",
10 "gas": "0x55555",
11 "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0",
12 "value": "0x1234",
13 "input": "0xabcd",
14 "v": "0x26",
15 "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e",
16 "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663",
17 "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"
18 }
19 }
20}
显示全部

如有签名哈希,可通过加密技术证明交易来自发送者并提交网络。

数据字段

绝大多数交易都是从外部所有的帐户访问合约。 大多数合约用 Solidity 编写,并根据 来解析其数据字段。

前四个字节使用函数名称和参数的哈希指定要调用的函数。 有时,你可以使用这个数据库opens in a new tab从选择器中识别函数。

calldata 的其余部分是参数,按照 ABI 规范中的指定进行编码opens in a new tab

例如,我们来看这笔交易opens in a new tab。 点击 Click to see More 查看 calldata。

函数选择器是 0xa9059cbb具有此签名的已知函数opens in a new tab有多个。 在本例中,合约源代码opens in a new tab已上传至 Etherscan,因此我们知道函数是 transfer(address,uint256)

其余数据如下:

10000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279
2000000000000000000000000000000000000000000000000000000003b0559f4

根据应用程序二进制接口规范,整型值(例如地址,它是 20 字节整型)在应用程序二进制接口中显示为 32 字节的字,前面用零填充。 所以我们知道 to 地址是 4f6742badb049791cd9a37ea913f2bac38d01279opens in a new tabvalue 是 0x3b0559f4 = 990206452。

交易类型

以太坊有几种不同类型的交易:

  • 常规交易:从一个帐户到另一个帐户的交易。
  • 合约部署交易:没有“to”地址的交易,数据字段用于合约代码。
  • 执行合约:与已部署的智能合约进行交互的交易。 在这种情况下,“to”地址是智能合约地址。

关于燃料

如前所述,执行交易需要花费燃料。 简单的转账交易需要 21000 单位燃料。

因此,如果 Bob 在 baseFeePerGas 为 190 gwei、maxPriorityFeePerGas 为 10 gwei 的情况下,要发送 1 ETH 给 Alice,Bob 需要支付以下费用:

1(190 + 10) * 21000 = 4,200,000 gwei
2--或--
30.0042 ETH

Bob 的帐户将被扣除 -1.0042 ETH(1 ETH 给 Alice + 0.0042 ETH 作为燃料费)

Alice 的帐户将计入 +1.0 ETH

基本费用将被销毁 -0.00399 ETH

验证者保留小费 +0.000210 ETH

显示未用燃料如何退还的图表 图表改编自 Ethereum EVM illustratedopens in a new tab

任何未用于交易的燃料都会退还给用户帐户。

智能合约交互

任何涉及智能合约的交易都需要燃料。

智能合约也可以包含称为 viewopens in a new tabpureopens in a new tab 的函数,它们不改变合约的状态。 像这样,从外部帐户调用这些函数不需要任何燃料。 此场景的底层 RPC 调用是 eth_call

与使用 eth_call 访问不同,这些 viewpure 函数也常在内部(即从合约本身或从另一个合约)调用,这会消耗燃料。

交易生命周期

交易提交后,就会发生以下情况:

  1. 交易哈希是通过加密方式生成的: 0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017
  2. 然后,该交易被广播到网络,并添加到由所有其他待处理的网络交易组成的交易池中。
  3. 验证者必须选择你的交易并将它包含在一个区块中,以便验证交易并认为它“成功”。
  4. 随着时间的流逝,包含你的交易的区块将升级成“合理”状态,然后变成“最后确定”状态。 这些升级让你更加确信 你的交易已成功,并且永远不会被更改。 一旦区块被“最终敲定”,它只能被 耗资数十亿美元的网络级攻击所更改。

可视化演示

跟随 Austin 了解交易、燃料和挖矿。

类型化交易信封

以太坊最初有一种交易形式。 每笔交易都包含 Nonce、燃料价格、燃料限制、目的地地址、价值、数据、v、r 和 s。 这些字段经过 RLP 编码后,看起来像这样:

RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])

以太坊已经发展到支持多种类型的交易,以便在不影响旧有交易格式的情况下,实现访问列表和 EIP-1559opens in a new tab 等新功能。

EIP-2718opens in a new tab 实现了这一行为。 交易解释如下:

TransactionType || TransactionPayload

其中,字段定义如下:

  • TransactionType - 一个介于 0 和 0x7f 之间的数字,总共有 128 种可能的交易类型。
  • TransactionPayload - 由交易类型定义的任意字节数组。

根据 TransactionType 的值,交易可以分为:

  1. **类型 0(传统)交易:**自以太坊推出以来使用的原始交易格式。 它们不包含 EIP-1559opens in a new tab 的功能,例如动态燃料费计算或智能合约访问列表。 传统交易在其序列化形式中缺少表示其类型的特定前缀,在使用递归长度前缀 (RLP) 编码时,以字节 0xf8 开头。 这些交易的 TransactionType 值为 0x0

  2. **类型 1 交易:**在 EIP-2930opens in a new tab 中作为以太坊柏林升级的一部分引入,这些交易包含 accessList 参数。 此列表指定交易期望访问的地址和存储密钥,有助于减少涉及智能合约的复杂交易的燃料成本。 EIP-1559 的费用市场变化不包含在 Type 1 交易中。 类型 1 交易还包含 yParity 参数,该参数可以是 0x00x1,表示 secp256k1 签名的 y 值的奇偶性。 它们以字节 0x01 开头进行标识,其交易类型 (TransactionType) 值为 0x1

  3. 类型 2 交易,通常称为 EIP-1559 交易,是在以太坊伦敦升级中通过 EIP-1559opens in a new tab 引入的交易。 它们已成为以太坊网络上的标准交易类型。 这些交易引入了一种新的费用市场机制,通过将交易费分为基础费用和优先费用来提高可预测性。 它们以字节 0x02 开头,并包括 maxPriorityFeePerGasmaxFeePerGas 等字段。 Type 2 交易因其灵活性和效率,现已成为默认选择,特别是在网络严重拥堵期间,由于它能够帮助用户提高管理交易费用的可预测性,因此特别受到青睐。 这些交易的 TransactionType 值为 0x2

  4. 类型 3 (Blob) 交易是在以太坊坎昆-Deneb (Dencun) 升级中通过 EIP-4844opens in a new tab 引入的。 这些交易旨在更高效地处理 "blob" 数据 (二进制大对象),它们提供了一种以更低成本将数据发布到以太坊网络的方法,尤其有利于二层网络卷叠。 Blob 交易包含额外的字段,例如 blobVersionedHashesmaxFeePerBlobGasblobGasPrice。 它们以字节 0x03 开头,其 TransactionType 值为 0x3。 Blob 交易代表了以太坊在数据可用性和可扩展性方面的重大改进。

  5. 类型 4 交易是在以太坊Pectra 升级中通过 EIP-7702opens in a new tab 引入的。 这些交易被设计为与账户抽象向前兼容。 它们允许 EOA 临时表现得像智能合约账户,而不会影响其原有功能。 它们包含一个 authorization_list 参数,该参数指定了 EOA 将其权限委托给哪个智能合约。 交易之后,EOA 的代码字段将包含被委托的智能合约的地址。

扩展阅读{#further-reading}

你还知道哪些对你有帮助的社区资源? 请编辑本页面并添加进来!

本文对你有帮助吗?