概念
在 Aptos 主网络上,想要实现任意一笔交易,都须要缴纳解决手续费。这笔手续费,会被分发给客户端利用、币权质押人、节点解决人或者投票人。交易手续费的多少,取决于你在链上耗费的计算和存储资源:
- 在链上解决交易
- 把已验证的交易记录流传到整个分布式网络
-
把交易记录写入链上分布式存储
概念上,这个手续费跟咱们居家缴纳的水电费很像
交易优先级
如果你违心付出更多手续费,就能够晋升交易在链上的优先级。对于本人的交易,你在提交时,就能够给一个高出市场的价格。这能够让你的交易在优先级列表中晋升权重,从而更快失去解决。
Gas 单位
你能够创立简略而便宜的交易,也能够创立简单又贵的交易,后者显然要耗费更多的计算和存储资源。无论哪种状况,你都须要领取一笔足够实现交易的手续费。这就是 gas 这个名称的由来。零碎是这样解决的:
Aptos 链上,一个单位的 gas 代表了资源的根本生产单元。一个单位的 gas 蕴含了:
- 计算资源
- 存储资源
当你的交易在链上执行的时候,Aptos 链不会别离统计每种资源耗费了多少,而是对立表白为生产了多少个 gas 单位。
详见 根底 Gas 是如何工作的,这份文档形容了 gas 费的类型和优化计划。
Gas 费
Aptos 的治理规定,会设置一个最小 gas 单位价格,不过真正的最初单位价格,是由市场决定的。原理见 以太坊 Gas 追踪,这里能够看到以太坊的 Gas 费是如何随着市场价格变动的。
1 个单位的 gas,是个无穷纲数,用整型示意。一笔交易耗费的总 gas 单位,取决于交易的复杂度。另一方面,Gas 价格是以 Aptos 链上的原生币(Octas)来示意的。想理解交易如何被提交到链,能够查看 交易与状态 文档。
Aptos 链上的 Gas 和交易
任何一笔提交到链上的交易,都必须蕴含以下对于 Gas 的字段:
max_gas_amount
:发送者违心为这笔交易付出的最大 gas 单元数。它决定了该交易能耗费的最大可计算资源-
gas_price
:发送者违心出的 gas 单位价格,用 Octa 示意:- 1 Octa = 10-8 APT
- APT 即 Aptos 链上币
交易执行的总 gas 费,能够这样计算:总耗费的 gas 单元数 * gas 单位价格
当然如果总 gas 费超过了 max_gas_amount
中定义的数,交易就被勾销了。所以最终,向客户端收取的最高费用,也就是gas_price * max_gas_amount
链上治理相干的 Gas 参数
Aptos 链上治理,会设置以下这些跟 Gas 相干的参数:
txn.maximum_numberof_gas_units
:一笔交易中,能够破费的最大 gas 单位数(也就是客户端可能设置的max_gas_amount
这个参数的下限)。这个设置,保障了在做动静价格调整的时候,总破费不会超过上限值。-
txn.min_transaction_gas_units
:能够破费的最小 gas 单位数,也就是客户端设置的max_gas_amount
这个参数的上限。存储资源的动静 gas 价格
Aptos 针对存储资源的价格,是动静调整的。这就意味着,随着 Aptos 链上状态数据库越填越满,存储的 gas 耗费(
gas_used
)会呈指数级增长。在 100% 的利用率下,存储老本会变得高大 100 倍。不过,有理由置信,验证者们将会应用更大、更便宜的存储设备,来缓解指数增长的老本。
动静价格能够保障 Aptos 网络面临最蹩脚的情景仍然可用。不过,咱们预计在陷入这高老本的场面之前,会通过降级网络来取得更好的后果。示例
示例 1:账户余额 vs 交易费
发送者账户必须有短缺的资金,来缴纳交易费
如果,你试图转走账户中所有的钱,以至于余额不足以领取交易费了,Aptos 链会反馈“交易失败”。也就是说,你不可能把账户中的钱转出为 0。示例 2:交易数额 vs 交易费
交易费和交易数额无关
有一笔交易,叫它“交易 A”吧,筹备把 1 千 个币,从一个账户转到另一个账户;同时有另外一笔“交易 B”,筹备把 10 万 个币,从一个账户转到另一个账户。假如它们简直同时产生,那么他们的交易费就简直是一样的。预估 gas 费
能够通过模仿一笔交易的执行,来预估须要破费的 gas 费。在模仿交易的时候,返回的后果示意了,在过后那个 时刻 ,那个 特定 的链 状态 下,须要破费 gas 的精确数量。Gas 费会随着链的状态变动而变动。因而,所有模仿进去的后果,都是预估。在设置最大 gas 费的时候,应该在预估后果的根底上,加上一个你能承受的量。
模仿交易来预估 gas 费
能够通过
SimulateTransaction
API 来模仿交易。这个 API 会执行你的交易。留神模仿交易的 签名 必须为全 0,以预防某些人应用真正的签名。
模仿交易的的时候,有以下两个标记位参数:
estimate_gas_unit_price
:这个标记就批示 API 返回gas_unit_price
,就像调用estimate_gas_price
这个 API 返回的后果一样。-
estimate_max_gas_amount
:这个标记提醒 API 返回可能须要破费的最大 gas 费,并且通过模仿交易返回一个“理论 gas 费”(gas_used
)模仿步骤
通过模仿交易,获取正确 gas 费设置的步骤如下:
- 把
estimate_gas_unit_price
和estimate_max_gas_amount
这个标记都设置为true
,模仿交易执行,并取得预估值。 - 应用返回的
gas_unit_price
值,作为新交易的gas_unit_price
。 - 把返回的
gas_used * gas_unit_price
,看作交易成本的上限。 - 要取得交易成本的下限,首先取返回的
max_gas_amount
中的最小值,而后计算gas_used * safety factor
(安全系数)。在 Aptos CLI 中,缺省安全系数为 1.5。把这个值当做你要真正提交交易的max_gas_amount
参数。请留神,交易费用的下限是max_gas_amount * gas_unit_price
,也就是说,这是交易的发送者被收取的最高费用。 -
此时你曾经取得了提交交易须要的两个参数:
gas_unit_price
:从模仿交易的返回值间接失去max_gas_amount
:gas_used * safety factor
中的最小值,或者,间接取回复的max_gas_amount
。
- 如果你须要扭转交易的优先级,就能够通过调整
gas_unit_price
来实现:调高价格进步优先级;调低价格升高优先级。
我的语雀原文链接在这里