# 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 价格优先处理交易，这将帮助在此期间仅发送重要交易。   |
| 程序的资源使用需要达成共识        | 这意味着计算资源消耗的方法需要是确定性的。 这排除了跟踪资源使用的其他方法，例如循环计数器或任何类型的基于时间的方法，因为它们不能保证在节点之间是确定性的。 跟踪资源使用情况的方法需要抽象。                                 |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.aptos.movemove.org/ji-chu/gas-he-jiao-yi-fei.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
