Web3 学习之GAS 机制与手续费详解
GAS 机制
GAS机制是一个比较重要的一个东西,因为我们在传统的开发里面就没有这个东西。
GAS是一个特有的EVM的一个计价方式。因为在程序里面有一个问题叫图灵死机的问题。
就是你没有办法证明一个程序,它是可以终止。
我们在写代码的时候,例如我们写了一个赋值语句:
a = 3 + 5 --> add
b = 4 + a
我们有一系列这样的语句,这样的语句在EVM执行的时候,首先它会转化成一系列字节码。
它会定义某一个语句它要消耗多少gas。
比如说你这个加号需要消耗这个三个Gas。
当然这里面可能会有两个,一个是做这个加法的运算,也可能有做存储的。
我们的所有的代码最终都会转化成一堆EVM的OPcode。
然后每一个opcode它都会在黄皮书里面定义会消耗多少GAS。
它首先会转换成指令集,EVM在每一个执行的时候,它会加载到栈里面。
然后每执行一步就执行一个指令集,去根据GAS( 用户在请求的时候,它需要先指定你需要用多少)去扣除对应的GAS费用,直到把GAS全部扣完,执行就停止了。
这样就不会产生死循环了。如果是在一个for循环中,它就会一直不停的扣费,扣没了它就会抛出一个错误out of gas
。
也就是说你在执行的时候需要指定大概使用多少GAS。这样就可以防止图灵死机问题。它是一个工作量单位。
总结:
- EVM 的计价规则,也防止图灵死机问题。
- GAS 是一个工作量单位,EVM 规范里定义操作的 Gas 值,复杂度越大,所需 gas 越多。
以太坊虚拟机操作码交互详情参考:https://www.evm.codes/
GAS也与具体参数的数据有关系,就是你的数据越多,它的消耗也就越多。
存储是比较贵的。
每一个操作都有对应的值显示需要消耗多少GAS。复杂度越大消耗也就越多。
Gas 机制详解
Gas 机制是区块链平台(特别是以太坊)中的一个重要概念,用于计算和支付交易和智能合约执行的费用。它在确保网络安全性和效率方面发挥了关键作用。以下是对 Gas 机制的详细解释:
什么是 Gas?
- Gas 是一种计量单位,用于衡量执行交易或智能合约所需的计算工作量。
- Gas Price(Gas 价格) 是用户愿意为每单位 Gas 支付的价格,通常以以太坊(ETH)表示。
- Gas Limit(Gas 限额) 是用户愿意为一笔交易支付的最大 Gas 数量。
Gas 机制的工作原理
-
交易费计算:
- 交易费用 = Gas 费用(Gas Used)× Gas 价格
- Gas 费用是指交易或智能合约执行所需的实际 Gas 数量。
- 用户可以通过设置 Gas 价格和 Gas 限额来控制他们愿意支付的最大费用。
-
交易执行:
- 当用户发起一笔交易时,他们需要为该交易设置 Gas 价格和 Gas 限额。
- 矿工会优先处理那些 Gas 价格较高的交易,因为他们从中获得的奖励更多。
- 交易执行时,会消耗一定量的 Gas。如果交易执行过程中消耗的 Gas 超过了用户设置的 Gas 限额,则交易会失败,但已消耗的 Gas 不会退还。
-
矿工奖励:
- 矿工通过处理交易和打包区块来获得 Gas 费用作为奖励。这激励了矿工积极参与区块验证和维护网络安全。
Gas 机制的作用
- 防止滥用:通过为每笔交易和智能合约执行设置费用,防止恶意用户在网络上发起大量无意义的交易,保护网络资源。
- 激励矿工:Gas 费用作为矿工的奖励,激励他们进行交易验证和区块生成,保障区块链网络的正常运行。
- 资源管理:通过动态调整 Gas 价格和 Gas 限额,确保网络在高负载时能够有效管理资源,保持运行效率。
Gas 机制的实际应用
- 交易费用:在以太坊网络上进行转账时,用户需要支付一定的 Gas 费用来完成交易。
- 智能合约:智能合约的执行也需要消耗 Gas。复杂度越高的合约,需要的 Gas 越多,因此用户在部署和调用智能合约时需要考虑 Gas 费用。
- 优化交易:用户可以通过设置合理的 Gas 价格来加快交易确认速度,但也要权衡成本。Gas 价格过低可能导致交易长时间未被确认。
如何管理 Gas
- 使用钱包:大多数 Web3 钱包,如 MetaMask 和 Trust Wallet,会自动建议一个合理的 Gas 价格和 Gas 限额,用户也可以手动调整。
- 监控网络:用户可以通过一些 Gas 追踪工具(如 EthGasStation)来监控当前网络的 Gas 价格和拥堵情况,优化交易费用。
- 智能合约优化:开发者在编写智能合约时,应尽量优化代码以减少 Gas 消耗,降低用户调用合约的成本。
GAS 手续费
EIP1559 之前
-
所有的手续费都是矿工拿走
-
用户发起交易的时候要设置两个值,一个是gas limit
,一个是gas price
-
gas limit
用来控制程序的复杂度,它每执行一个指令就会从gas limit
里面扣,直到扣没了就没了。防止运算量过大
-
gas price
用来指定每一个GAS需要支付多少以太币,它是一个单价。
-
工作量会按gas price
去排序
-
gas used
根据程序的复杂度决定,它最终会转换成opcode去执行。
-
gas price
是变化的。你给的越多,矿工拿到的手续费就越多。
-
手续费用 = gas used(< gas limit) * gas price单价 (gas limit 和 gas price 由用户指定 )
-
矿工收益 = 手续费用
EIP1559 之后
-
gas price
拆成两个部分,一个是 base fee
,一个是tips fee
-
tips fee
也叫这个private,就是优先级的费用,也就是你给的小费
-
它拆成两个部分之后呢,一部分矿工拿走一部分会被燃烧掉
-
base fee
是会根据当时网络的应用情况确定
-
每一个打包的时候如果上一个区块超过了gas limit的一半,那么你这一次的这个base fee就会在上一次的基础上增加12.5%
-
用户现在要指定3个东西,用户最多愿意付出的优先级费用、最多要支付的总费用、gas limit
-
base fee
是随着这个网络的使用的情况不停的波动,用户指定最高愿意支付多少,超过了就不愿意打包这笔交易了
-
手续费用 = gas used(<gas limit) * (base fee + tips fee) (gas limit 、 max tips fee 、 max fee 由用户指定 )
-
燃烧掉 = base fee * gas used ( base fee 是打包时动态确认的)
-
矿工收益 = tips fee * gas used
如果是一笔普通的转账GAS limit 固定为 21,000
,这个是任何一笔交易的最低要求。也就是说,你但凡发一笔交易至少需要21,000
Gas Limit
自定义设置GAS fee
base fee
+ tips fee
要小于 max fee
max tips fee
是你愿意给矿工的费用
现在钱包会根据当前网络情况给你一些参考值,当然你可以自行调整。
tips fee
更多的话,矿工会优先打包。
- 智能合约越复杂 用来完成运行就需要越多Gas
- 消耗的GAS越多,用户就需要更多的成本
- 你写的一个合约,一个程序... 你要让用户用的话,就要尽量去减少这个gas 的使用量
- 合约审计对方是看源代码的
- 区跨链改变信任模型,让别人来信任你,你要越简单越好,规则越透明越好
- 你的程序如果不开源则没有人会使用的
- gas price 用户指定,通常情况下,
Tips fee
决定交易的排序(矿工利息最大化)
- gas limit > gas used 交易才能顺利执行, 否则 out of gas 交易回滚
- 执行结束, gas limit 余下的部分不扣费用
- Gas limit 开发工具估算
修改Gas Limit
Gas 手续费详解
Gas 手续费是指用户在以太坊等区块链平台上进行交易或执行智能合约时所需支付的费用。这个费用用来补偿矿工(或验证者)处理交易和维护网络所付出的计算资源和电力成本。以下是对 Gas 手续费的详细解释:
Gas 手续费的组成部分
- Gas 费用(Gas Fee):执行特定操作所需的计算资源量,通常用“Gas 单位”表示。
- Gas 价格(Gas Price):用户愿意为每单位 Gas 支付的价格,以 Gwei 为单位(1 Gwei = 0.000000001 ETH)。
计算 Gas 手续费
Gas 手续费 = Gas 费用 × Gas 价格
例如:
- 如果一笔交易的 Gas 费用是 21,000 Gas 单位,Gas 价格是 50 Gwei,
- 那么总手续费为:21,000 × 50 = 1,050,000 Gwei = 0.00105 ETH
影响 Gas 手续费的因素
- 网络拥堵:当网络繁忙时,用户为了使交易更快被处理,往往会提高 Gas 价格,这导致手续费增加。
- 交易复杂度:简单的转账交易消耗的 Gas 较少,而复杂的智能合约执行会消耗更多的 Gas,因此费用更高。
- 用户设置:用户可以自己设置 Gas 价格和 Gas 限额。较高的 Gas 价格会加快交易处理速度,但也增加了费用。
优化 Gas 手续费的方法
- 监控网络状况:使用如 EthGasStation 等工具,了解当前的网络状况和推荐的 Gas 价格,选择合适的时机提交交易。
- 调整 Gas 价格:根据网络情况,合理设置 Gas 价格。在网络拥堵时,可以适当提高 Gas 价格以加快交易速度;在网络较空闲时,可以降低 Gas 价格以节省费用。
- 简化交易:对于开发者来说,优化智能合约代码,减少不必要的计算操作,降低 Gas 费用。
EIP-1559 和 Gas 手续费
以太坊在 2021 年进行了名为“伦敦升级”的硬分叉,其中包含了 EIP-1559 提案。EIP-1559 对 Gas 机制进行了改进:
- 基本费用(Base Fee):每个区块都有一个基本费用,动态调整,反映网络的拥堵情况。基本费用直接被销毁,不再支付给矿工。
- 小费(Tip):用户可以支付额外的小费给矿工,以激励他们优先处理自己的交易。
- Gas 限额:用户仍需设置 Gas 限额来确定愿意为交易支付的最大费用。
总结
Gas 手续费是区块链网络中重要的一环,确保了网络的安全性和稳定性。理解并优化 Gas 费用,可以帮助用户在以太坊等区块链平台上进行更高效的操作。
以太币单位
- 最小单位: Wei (伟)
- 10^9 Wei = 1 Gwei
- 10^12 Wei = 1 szabo (萨博)
- 10^15 Wei = 1 finey (芬尼)
- 10^18 Wei = 1 Ether
以太币(Ether,简称ETH)是以太坊区块链上的原生加密货币。以太币有多个单位,用于表示不同的金额和精度。以下是常见的以太币单位及其换算关系:
以太币单位及换算
单位名称 |
符号 |
数值关系 |
Wei |
wei |
1 wei = 1 |
Kwei |
kwei |
1 kwei = 1,000 wei |
Mwei |
mwei |
1 mwei = 1,000,000 wei |
Gwei |
gwei |
1 gwei = 1,000,000,000 wei |
Microether |
szabo |
1 microether = 1,000,000,000,000 wei |
Milliether |
finney |
1 milliether = 1,000,000,000,000,000 wei |
Ether |
eth |
1 ether = 1,000,000,000,000,000,000 wei |
常用单位解释
- Wei:最小单位,是以太币的基本单位,类似于比特币的“聪”。
- Gwei(Gigawei):常用于表示交易手续费(Gas 价格),因其精度适中而广泛使用。
- Ether:主要单位,用于表示大多数交易金额。
举例说明
- 1 ETH = 1,000,000,000 Gwei
- 0.01 ETH = 10,000,000 Gwei
- 1 Gwei = 1,000,000,000 Wei
实际应用
- 交易费用:Gas 价格通常用 Gwei 表示。比如,当前的 Gas 价格是 20 Gwei。
- 智能合约:在智能合约开发中,有时会需要更小的单位如 Wei 来精确表示金额。
- 钱包显示:大多数钱包会用 ETH 表示余额,但也允许用户查看和设置交易费用时使用 Gwei 或其他单位。
理解 Gas 机制
练习题
- 在以太坊上,用户发起一笔交易 设置了GasLimit 为 10000, Max Fee 为 10 GWei, Max priority fee 为 1 GWei , 为此用户应该在钱包账号里多少 GWei 的余额?
- 在以太坊上,用户发起一笔交易 设置了 GasLimit 为 10000, Max Fee 为 10 GWei, Max priority Fee 为 1 GWei,在打包时,Base Fee 为 5 GWei, 实际消耗的Gas为 5000, 那么矿工(验证者)拿到的手续费是多少 GWei ?
- 在以太坊上,用户发起一笔交易 设置了 GasLimit 为 10000, Max Fee 为 10 GWei, Max priority Fee 为 1 GWei,在打包时,Base Fee 为 5 GWei, 实际消耗的Gas为 5000, 那么用户需要支付的的手续费是多少 GWei ?
- 在以太坊上,用户发起一笔交易 设置了 GasLimit 为 10000, Max Fee 为 10 GWei, Max priority Fee 为 1 GWei,在打包时,Base Fee 为 5 GWei, 实际消耗的 Gas 为 5000, 那么燃烧掉的 Eth 数量是多少 GWei ?
答案
题目 1 10000 * 10 = 100000
题目 2 5000
题目 3 (5 + 1) * 5000 = 30000
题目 4 5 * 5000 = 25000