> For the complete documentation index, see [llms.txt](https://wiki.aptos.movemove.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.aptos.movemove.org/ji-chu/gas-he-jiao-yi-fei.md).

# Gas 和交易费

当在 Aptos 区块链上执行交易时，会以 gas 跟踪和衡量资源使用情况。

## 介绍

Gas 确保在 Aptos 区块链上运行的所有 Move 程序最终终止。这限制了所使用的计算资源。 Gas 还提供了收取交易费用的能力，部分基于执行期间消耗的资源。

当客户端向 Aptos 区块链提交要执行的交易时，它包含指定的：

* `max_gas_amount`: 可用于执行交易的最大气体单位数量。这限制了事务可以消耗的计算资源。
* `gas_price`: 指定 gas 货币的 gas 价格。 Gas 价格是一种将 Gas 单位（虚拟机消耗的资源的抽象单位）转换为指定 Gas 货币的交易费用的一种方式。
* `gas_currency`: 交易费用的货币。

向客户收取的交易费用最多为 `gas_price * max_gas_amount`。

随着资源供需的波动，gas 价格以及交易费用应遵循 Aptos 区块链的市场特征。

### 资源使用类型[​](https://aptos.dev/basics/basics-gas-txn-fee#types-of-resource-usage) <a href="#types-of-resource-usage" id="types-of-resource-usage"></a>

为了让虚拟机（VM）执行交易，gas 系统需要跟踪交易使用的主要资源。这些分为三个资源维度：

1. 执行交易的计算成本。
2. 通过 Aptos 生态系统传播交易的网络成本。
3. 在 Aptos 区块链上交易执行期间创建和使用的数据的存储成本。

这些资源中的前两个（计算和网络）是短暂的。但是，第三个（存储）是长久的。分配数据后，该数据将一直存在，直到被删除。在帐户的情况下，数据无限期地存在。

这些资源维度中的每一个都可以独立波动。但是，也只有一个 gas 价格。因此，这意味着必须正确跟踪每个维度的 gas 使用量，因为 gas 价格仅作为总 gas 使用量的一个乘数。因此，交易的 gas 使用量需要与执行交易相关的实际成本密切相关。

### 用 gas 计算交易费用[​](https://aptos.dev/basics/basics-gas-txn-fee#using-gas-to-compute-transaction-fees) <a href="#using-gas-to-compute-transaction-fees" id="using-gas-to-compute-transaction-fees"></a>

当您发送交易时，执行的交易费用（以指定的 gas 货币表示）是 gas 价格乘以 VM 为该交易计算的资源使用量。

在事务流的不同时间，对资源使用的不同方面进行收费。 下图详细介绍了交易流程的基础知识和与 gas 相关的逻辑：

![FIGURE 1.0 Gas and Transaction Flow](/files/dwbpxDBuK1lKsNzSbJ9J)

&#x20;在图中，prologue 和 epilogue 部分都用相同的颜色标记。这是因为交易流的这些部分不需要被计量：

* 在 prologue 中，不知道提交账户是否有足够的资金来支付其 gas 责任，或者提交交易的用户是否甚至对提交账户有权限。由于缺乏这种知识，在执行 prologue 时，需要不计量。为 prologue 失败的交易扣除 gas 可能会导致未经授权的账户扣除。
* epilogue 部分负责从提交帐户中扣除执行费用并进行分配。正因为如此，即使事务执行已经耗尽了 gas，epilogue 也必须运行。同样，我们不希望它在向提交账户扣款时耗尽 gas，因为这会导致执行额外的计算而不收取任何交易费用。

这意味着最低交易费用 MIN\_TXN\_FEE 需要足以支付运行 prologue 和 epilogue 的平均成本。

在 prologue 运行后，我们已经部分检查了该帐户是否可以承担其 gas 责任，其余的交易流程从 max\_gas\_amount 的“gas tank”满开始。对 MIN\_TXN\_FEE 进行充值，然后为 VM 执行的每条指令向 gas tank 充值。这种每条指令的扣除一直持续到：

* 交易执行完成，之后收取存储交易数据的费用，运行 epilogue 并扣除执行费用，或&#x20;
* “gas tank”变空，在这种情况下会引发 OutOfGas 错误。&#x20;

在前者中，收取费用并将交易结果保存在 Aptos 区块链上。在后者中，当出现错误时，事务的执行将停止。之后，收集交易的总 Gas 花费。除了案例中的扣除外，没有其他的执行剩余。

### 使用 gas 来确定交易的优先级[​](https://aptos.dev/basics/basics-gas-txn-fee#using-gas-to-prioritize-a-transaction) <a href="#using-gas-to-prioritize-a-transaction" id="using-gas-to-prioritize-a-transaction"></a>

当您发送交易时，它会根据不同的标准进行优先级排序。其中之一是交易的标准化 gas 价格。

对于需要按 gas 价格排序的交易（即非治理交易），这些价格首先被标准化为 Aptos Coins。这是通过使用存储在链上的当前 gas 货币到 Aptos Coin 的转换率来完成的。然后根据这个标准化的 gas 价格（部分）对交易进行排名。

例如：

* Bob 发送了一笔交易， `gas_price` 是 10， `gas_currency` 是 “BobCoins”。
* Alice 在相同时间也发送了一笔交易，`gas_price` 是 20，`gas_currency` 是 “AliceCoins”.

如果链上“BobCoins”对 Aptos Coins 的汇率是 2.1，而链上“AliceCoins”对 Aptos Coins 的汇率是 1，

* Bob 的交易标准化 gas 价格是 `10 * 2.1 = 21`。
* Alice 的交易标准化 gas 价格是 `20 * 1 = 20`。

然后，Bob 的交易排名将高于 Alice 的交易。

### 核心设计原则[​](https://aptos.dev/basics/basics-gas-txn-fee#core-design-principles) <a href="#core-design-principles" id="core-design-principles"></a>

三个核心原则驱动了 Aptos 和 Move 中 gas 的设计：

| 设计原则                 | 描述                                                                                                                              |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| Move 是图灵完备的          | <p>因此，不能静态地确定给定的 Move 程序是否终止。 但是，通过确保</p><ul><li>每条字节码指令都有非零的gas消耗，并且</li><li>任何程序可以启动的 gas 量是有限的。</li></ul><p>我们拥有程序的终止属性。</p> |
| 阻止 DDoS 攻击并鼓励明智地使用网络 | 交易的 gas 使用量与该交易的资源消耗相关。 gas 价格以及交易费用应该随着网络中的竞争而上升和下降。 在启动时，我们预计 gas 价格将处于或接近于零。 但在竞争激烈的时期，您可以使用 gas 价格优先处理交易，这将帮助在此期间仅发送重要交易。   |
| 程序的资源使用需要达成共识        | 这意味着计算资源消耗的方法需要是确定性的。 这排除了跟踪资源使用的其他方法，例如循环计数器或任何类型的基于时间的方法，因为它们不能保证在节点之间是确定性的。 跟踪资源使用情况的方法需要抽象。                                 |
