Gas 科普

Conflux 用户在使用钱包(Fluent)或 SDK 发送交易时,经常会看到gasFee(燃气费), gas(燃气上限)gasPrice(燃气价格) 那这些概念的具体含义是什么,又该如何合理的设置 gas 和 gasPrice,本文将会为你做详细讲解。

Screen Shot 2022-07-13 at 14.24.27.png

gasFee

现实世界中我们去银行办理转账业务的时候通常需要支付一定的手续费,在区块链世界(比特币,以太坊,Conflux)中发送交易也是如此,gasFee 即是交易发送的手续费, 通常手续费需要使用区块链的原生代币来支付,比如在 Conflux 发送交易,需要使用 CFX 来支付交易手续费(燃气费)。

tx-gas-charged.jpeg

为什么要支付手续费

众所周知区块链是一个去中心化账本,而账本的维护工作是由矿工来完成的。而矿工存储数据,参与出块(计算哈希)是有一定成本的。为了激励矿工积极参与维护账本,并保护网络的安全,区块链共识系统在设计时即包含了对矿工的奖励机制,而交易手续费即是矿工的奖励之一,会被支付给参与出块的矿工。该机制可以保证整个去中心化网络的持久健康发展。

另外手续费机制也可以防止滥发交易,提高区块链网络资源的有效利用。

gas 燃气

gas 按字面意思来看是燃气,汽油。汽车燃烧汽油来提供动力来完成行驶和移动。汽车行驶的距离越远,所消耗的汽油越多。EVM 区块链世界中借用了该概念来用于表示交易执行所需付出工作量的多少,所以 Gas是一个单位,用于测量执行某些操作所需的计算量。

更详细的来讲,Conflux 的所有交易都是由 EVM 来完成执行的,包括普通的 CFX 转账以及智能合约方法调用。而这些操作最终执行时,会被编译为一个个 OPCode 来被执行,不同的 OPCode 执行所需要的工作量也不同,具体各 Opcode 执行所花费燃气量可参看

通常普通 CFX 转账交易消耗的 gas 为 21000, 智能合约交互交易所需 gas 通常比较多,为几万到几十万不等,跟合约执行的复杂程度有关。

gas 上限

构造交易时,gas 字段非常重要,该字段的本身含义是本笔交易执行所能消耗的燃气上限

交易 gas 的正确填写非常重要,如果设置的 gas 上限比实际执行所需燃气量小的话,交易会执行失败。如果 gas 上限设置过大,则有可能会导致支付比实际所需更多的燃气费

在 Conflux 网络单笔交易的最大燃气上限为 1500w, 该机制保证了交易不会无限制占用 EVM 计算资源。

gasPrice

交易的 gasPrice 是由交易发送者指定的,表示愿意为每单位燃气所支付的费用,其单位为 GDrip, 1 GDrip 等于 0.000000001 CFX (10^-9 CFX)。

交易 gasPrice 值的大小会影响交易被矿工打包的速度,因为矿工会优先打包 gasPrice 更高的交易,这样他们的收益才会更高。在网络不拥堵的情况下 gasPrice 设置为 1Gdrip 即可正常被打包,但在网络拥堵时,等待打包的交易很多,这时如果 gasPrice 值设置的比其他大部分交易小的话,会一直等待,迟迟不被打包。

所以如果想让交易快速被打包,设置一个比较大的 gasPrice 即可,在 Conflux 网络通常 10G-1000G gasPrice 即是一个比较大价格,可以保证交易被快速执行。

NOTE:gasPrice 也不能设置过大,这样会导致天价交易费用的交易,比如如果把 gasPrice 设置为 1CFX,那一笔普通转账交易的手续费为 21000 CFX,这是一个非常大的数值。

gasFee 的计算方式

gasFee 是为某笔交易支付的燃气费总费用,其金额计算方式为 gasFee = gasUsed * gasPrice。gasFee 的单位为 CFX 的最小单位 Drip。

假设发送一笔金额为 1CFX 的普通交易,这时交易的 gas 上限可直接设置为 21000, 如果将 gasPrice 设置为 1GDrip,则发送该笔交易一共需要支付 1 + 21000 * 0.000000001 = 1.000021 CFX. 其中 1CFX 会转到接收者账户中,另外 0.000021 会奖励给矿工。

另外在 Conflux 网络中,交易燃气上限比交易实际执行所消耗燃气(gasUsed)多的部分会进行返还,但最多只会返还 gas 上限的四分之一。

假设一笔普通 CFX 交易的 gas 上限设置为了 10w,交易的实际执行用量为 21000,但因为交易的燃气上限设置过大,所以最多只会返回 25000 燃气的费用,使用的交易燃气费为 0.000075 CFX.

如果交易燃气设置不是过大,比如还是上述的这笔交易,燃气上限设置为了 25000, 比实际使用量多了 4000,没有超过燃气上限的四分之一,多出的部分会全部返还,最终收取手续费数量还是 0.000021 CFX

如何正确的设置 gas 和 gasPrice

gasPrice

通常 gasPrice 的设置范围为 1-10000G,在网络不拥堵的情况直接使用 1G 即可,如果交易发出后等待时间过长,可将交易 gasPrice 提高到 10G 或 100G。

gas

对于普通的 CFX 转账交易,直接将 gas 设置为 21000 即可。

对于合约交互交易则一般通过 cfx_estimateGasAndCollateral 方法来进行预估, 该方法会模拟执行交易,在gasUsed字段中返回交易实际使用的 gas 数量。但由于在EVM中每次子函数调用只会传入63/64的gasLimit,将gasLimit直接设置为gasUsed常常会因gas不足而导致交易失败。通常推荐将cfx_estimateGasAndCollateral返回的gasLimit字段设置为交易的燃气上限,该值为gasUsed4/3倍。这样一般可以保证 gas 上限设置得足够,多余的燃气也可以全额返还。

FAQs

1. Conflux 网络中是否有跟以太坊 1559 类似的交易?

目前 Conflux 网络中只有跟以太坊 155 格式相对应的交易

扩展阅读


Revision #11
Created 13 July 2022 05:18:25 by Pana
Updated 28 July 2022 07:10:57 by Darwin