Gas 和交易手续费
概念
要在主网上与 Aptos 区块链进行任何交易,您需要支付手续费。 该费用来自与客户端应用程序、权益所有者、节点运营商或选民的交易。 您需要支付的处理费取决于您在区块链上使用的计算和存储资源:
- 在区块链上处理您的交易。
- 在主网的分布式网络中传播经过验证的记录。
- 将经过验证的记录存储在分布式区块链存储中。
从概念上讲,这笔费用可以被认为与我们支付家庭电费或水费的方式非常相似。
优先处理您的交易
您甚至可以通过支付更高的处理费将您的交易提升到区块链上的更高优先级。 在您的交易中,您可以承诺支付高于市场 Gas 价格的 Gas 价格。 这是您可以在优先级列表中将交易移至更高位置并更快处理它的一种方式。
Gas 单位
您可以进行简单且廉价的交易或需要区块链执行大量计算和分布式存储的复杂交易。 无论哪种情况,您都需要支付足以完成交易的手续费。 这就是gas的概念变得清晰的地方。 下面是它的工作原理:
在 Aptos 区块链中,单位 Gas 代表资源消耗的基本单位。 单个 Gas 单位是以下各项的组合表示:
- 计算资源,以及
- 存储资源。
当您的交易在区块链上执行时,区块链不会单独向您显示消耗的特定资源的每个单位的帐户,而是简单地显示交易消耗的 Gas 单位数量的帐户。
有关 Gas 费用类型和可用优化的详细说明,请参阅 Base Gas 工作原理。
Gas 价格
在 Aptos 网络中,Aptos 治理设定了最低 gas 单价。 但是,市场决定了实际的最低 gas 单价。 例如,参见Ethereum Gas Tracker,它显示了以太坊 gas 价格的市场价格走势。
👉 单位 Gas 是一个无因次数,以整数表示。 您的交易消耗的总 Gas 单位取决于您的交易的复杂性。 另一方面,gas 价格以 Aptos 区块链的原生代币(Octas)表示。 另请参阅 交易和状态,了解提交到 Aptos 区块链的交易的外观。
Aptos 区块链上的 Gas 和交易费
当一笔交易提交到 Aptos 区块链时,该交易必须包含以下强制性 Gas:
max_gas_amount
:交易发送者愿意花费的最大 gas 单位数来执行交易。 这决定了事务可以消耗的最大计算资源。gas_price
:交易发送者愿意支付的 gas 价格。 它以八进制单位表示,其中:- 1 个八进制 = 10-8 APT 和
- APT 是 Aptos Coin 。
交易执行过程中,总 gas 量,表示为:
(消耗的总 Gas 单位)*(gas_price)
不得超过
max_gas_amount
,否则交易将中止执行。
向客户收取的交易费用最多为gas_price * max_gas_amount
。
Gas 参数设定
以下 Gas 参数由 Aptos 管理设置。
这些链上 Gas 参数发布在 Aptos 区块链上的 0x1::gas_schedule::GasScheduleV2
。
txn.maximum_number_of_gas_units
:可以花费的最大 Gas 单位数(这是交易中max_gas_amount
Gas 参数的最大允许值)。 这是为了确保动态定价调整不超过您愿意支付的总金额。txn.min_transaction_gas_units:
可以消耗的最小 Gas 单位数。 交易中的max_gas_amount
值必须设置为大于此参数的值。
存储的动态 Gas 定价
Aptos Gas 定价使用动态价格进行存储操作。这意味着随着 Aptos 区块链状态数据库的填满,存储成本(即gas_used
)会成倍增加。在 100% 的利用率下,存储成本可能高达100 倍
。然而,期望验证者将利用更大、更便宜的存储硬件来缓解存储成本的指数级增长。
动态定价用于在最坏的情况下保护 Aptos 网络。但是,我们预计 Aptos 网络的升级会在网络进入高成本区域之前发生。
例子
示例 1:账户余额与交易费用
发件人的账户必须有足够的资金来支付交易费用。
假设您将所有资金从您的帐户中转出,这样您就没有余额来支付交易费用。在这种情况下,Aptos 区块链会让您知道交易将失败,您的转账也不会成功。
示例 2:交易金额与交易费用
交易费用与交易中的转账金额无关。
在交易中,例如交易 A,您将 1000 个 Coin 从一个账户转移到另一个账户。在第二笔交易 B 中,使用与交易 A 相同的 Gas 值,您现在将 100,000 个 Coin 从一个账户转移到另一个账户。假设交易 A 和 B 大致同时发送,那么交易 A 和 B 的 gas 成本将几乎相同。
估计 Gas 单位
可以通过模拟交易来估计交易使用的 Gas 。在模拟交易时,模拟结果代表在模拟时区块链的确切状态所需的确切金额。这些使用的 Gas 单位可能会根据链的状态而改变。出于这个原因,从模拟中得出的任何数量都只是一个估计值,在设置最大 Gas 量时,应该将其增加一个您认为合适的量。
模拟交易估算 gas
可以使用 SimulateTransaction
API 模拟交易。此 API 将运行您计划运行的确切事务。
请注意,交易中提供的Signature
必须全为零。这是为了防止有人使用有效的签名。
为了模拟交易,有两个标志:
estimate_gas_unit_price
:该标志将使用与[estimate_gas_price
]相同的算法估算交易中的 gas 单价(https://fullnode.devnet.aptoslabs.com/v1/spec#/operations/estimate_gas_price) API。estimate_max_gas_amount
:这个标志会找到你可以使用的最大 gas,它会模拟交易告诉你实际的gas_used
。
模拟步骤
为交易找到正确的 Gas 量的模拟步骤如下:
- 通过模拟估算 Gas ,将
estimate_gas_unit_price
和estimate_max_gas_amount
设置为true
。 - 使用返回交易中的
gas_unit_price
作为你新交易的gas_unit_price
。 - 查看返回交易中的
gas_used * gas_unit_price
值作为交易成本的下限。 - 计算成本上限,取返回交易中的
max_gas_amount
的 minimum 和gas_used * 安全系数
。在 CLI 中,1.5
的值用于安全系数
。将此值用作您要提交的交易的max_gas_amount
。请注意,交易成本的上限为max_gas_amount * gas_unit_price
,即,这是向交易发送方收取的最高费用。 - 此时,您现在有了
gas_unit_price
和max_gas_amount
来提交您的交易,如下所示:- 返回的模拟交易中的
gas_unit_price
。 max_gas_amount
作为交易中gas_used
*a safe factor
或max_gas_amount
的最小值。
- 返回的模拟交易中的
- 如果您觉得需要优先或取消您的交易,调整交易的
gas_unit_price
。增加较高优先级的值,降低较低优先级的值。