以太坊中智能合约调用中用的gas相关概念详解
我想用一个以太坊应用程序谈论需要“gas”运行。 什么是gas,我在哪里得到它?
1
“gas”是以太坊使用的特殊单位的名称。它衡量一个动作或一系列动作需要执行多少“工作”:例如,计算一个Keccak256密码散列,每计算一次散列需要30个气体,每256位 数据被哈希。 Ethereum平台上的一项交易或合同可以执行的每项操作都会花费一定数量的天然气,其运营所需的计算资源比计算资源要求较少的运算需要更多的天然气。
gas的重要性在于它有助于确保提交给网络的交易支付适当的费用。 通过要求交易支付每个操作的执行(或导致合同执行),我们确保网络不会因为执行大量对任何人无价值的密集工作而陷入困境。 这与比特币交易费用不同,它仅基于交易的千字节大小。 由于以太坊允许运行任意复杂的计算机代码,所以短的代码实际上可能导致大量计算工作的完成。 所以衡量直接完成的工作非常重要,而不是仅仅根据交易或合同的长度选择费用。
所以,如果gas基本上是交易费用,那么你如何支付? 这是一个棘手的地方。 虽然gas是一个可以测量物质的单位,但gas并没有任何实际的标志。 也就是说,你不能拥有1000gas。 相反,gas只存在于以太坊虚拟机内部,作为正在执行多少工作的计数。 在实际支付gas时,交易费用是ether的一定数量,以太坊网络上的内置令牌和矿工奖励生产块的令牌。
起初这可能看起来很奇怪。 为什么不直接用ether衡量成本? 答案是,就像比特币一样,以太网的市场价格可能会迅速变化! 但是计算的代价并不是因为以太的价格变化而上升或下降的。 所以将计算价格与以太币的价格区分开来是很有用的,这样每次市场走势就不需要改变操作成本。
这里的术语有点混乱。 EVM中的操作具有gas成本,但gas本身也具有以ether的gas价格。 每笔交易都规定了每个gas单位愿意支付的gas价格,从而使市场能够决定gas价格和计算成本(以天然气计量)之间的关系。 这是两者的总和,即所用gas总量乘以gas price,得到交易支付的全部费用。
尽管这很棘手,但了解这个区别是很重要的,因为这会导致以太坊交易对最初的学习者来说最混乱的一件事情:您的交易没有用完,交易也没有足够高费用。 如果我在我的交易中设定的gas price太低,那么没有人会在第一时间去管理我的交易。 它不会被矿工包括在区块链中。但如果我提供一个可以接受的天然气价格,那么我的交易就会产生如此多的计算工作,以至于合并后的天然气成本超过了我所附加的费用数额,那么这个天然气就会被计算为“花费”,我不会收回。 矿工将停止处理交易,恢复所做的任何更改,但仍将其作为“失败的交易”包含在区块链中,收取费用。 这看起来可能很苛刻,但是当你意识到矿工真正的工作是在执行计算的时候,你可以看到他们永远也不会获得这些资源。 所以,即使你设计糟糕的交易用完了,你付给他们的工作也是公平的。
提供太多的费用也不同于提供太多的ether。 如果你设置了一个非常高的gas price,那么你只需要付出很少的代价,就像在比特币中设置超高的交易费用一样。 你肯定会被排在最前面,但你的钱已经没有了。 但是,如果您提供了正常的gas price,并且只需要支付比您购买gas所需的更多的ether,那么超额部分将退还给您。 矿工只收取你实际工作的费用。 你可以把煤气价格看作矿工的小时工资,把煤气成本看作是工作时间表。
gas还有许多其他的微妙之处,但这应该给你基本的东西! gas是使以太坊中的复杂计算“安全”的关键机制,因为任何失控的程序只会在请求运行的人提供的资金的情况下持续下去。 当资金停止时,矿工们就停止工作。 而你在程序中犯的错误只会影响付费使用它的人 - 网络的其他部分不会因为你的错误而遭受性能问题。 当性能问题消耗掉所有的ether时,他们只会得到一个大的薪水! 如果没有这个关键技术,通用区块链的想法将是完全不可能的。
总结:
- gas是费用的计算方式
- 不过,这些费用仍然以ether支付,不同于gas
- gas成本就是劳动时间之类的工作量,而gas price就像你为完成工作而支付的小时工资。 两者的组合决定了您的总交易费用。
- 如果您的天然气价格太低,没有人会处理您的交易
- 如果你的天然气价格没问题,但是你的交易的天然气成本超过了预算,交易就会失败,但是仍然会进入区块链,你不会为劳动者的工作收回这笔钱。
- 这可以确保没有任何东西可以永远运行,人们会仔细考虑它们运行的代码。 它保持矿工和用户的安全不受恶劣的代码影响!
2
短的说明:
gas是在以太坊进行的每一项操作的执行费用。 其价格用ether表示,由矿工决定,可拒绝低于一定的gas price处理。 为了得到gas,你只需要添加ether到你的帐户。
长的说明:
以太坊在区块链上实施了一个名为以太坊虚拟机(EVM)的执行环境。 当您运行分散式应用程序(dApp)时,每个指令都会在网络的每个节点上执行。 这有一个代价:对于脚本可以执行的每个操作,都有一个指定的成本,用gas单位数表示,您可以在EVM规范中看到。
天然气价格由矿主决定,目前约为5〜21 GWei(1 GWei为10 ^ 9 Wei或10 ^ -9 Ether)。 以太坊使用以太币作为其内部货币/标记。 您的帐户持有以ether表示。 当您部署合同或执行交易时,gas将从您的账户余额中提取。 你可以自由指定一个gas price,或保留建议。
从理论上的PoV来看,每个采矿节点应该选择一个最大化其利润的天然气价格。 由于消耗更多天然气的块体在网络中传播速度较慢,因此它将成为一名叔叔的可能性较高,只能减少奖励。 接受的最低天然气价格应足够高,以应付这种增加的风险。 到目前为止,在真实网络中观察到的情况是,矿业集团接受交易,降低天然气价格,这在经济上是合理的,有助于减少网络拥塞并提高整体网络/代币价值。
3
gas是以太坊“世界电脑”使用的计量单位。 作为比喻,电力按千瓦时计量。 在以太坊使用更多的计算和存储意味着使用更多的气体。 计量的一个根本原因是,它激励人们(矿工)操作世界计算机。 这些矿工获得处理交易的费用,这是由计量方案确定的:gas。
EVM中的每个操作都会消耗gas。 例如,乘法(MUL)消耗5个gas,加法(ADD)消耗3个gas。 以下是以太坊的运行和耗气量的电子表格。 (也可以把它们看作是天然气的成本,但是这可能使得解释更加难以跟随成本,费用,价格飞涨。)
https://docs.google.com/spreadsheets/d/1m89CVujrQe5LAFJ8-YAUCcNK950dUzMQPMJBxRtGCqs/edit
计量是不同的费用和天然气是不同的乙醚。 为了澄清这个问题,把气体看成是燃料的代名词。 交易必须提供足够的燃料或启动燃料来覆盖EVM计算和存储设施的整个使用。 所有剩余的天然气将退还给交易的发起者:发起交易的用户。 耗尽气体的交易已经恢复,但仍然包含在一个区块中,并且相关费用支付给矿工。
从燃料的角度来看,我们来看一下收费的概况。 尽管EVM中的每个操作都消耗了预定义的固定gas量(例如,MUL操作总是消耗5个气体),但是用户可以在每次交易中指定gas price。 目前的天然气价格是0.02μEther,或0.00000002ETH。 发起人支付给矿工的费用是交易的(开始天然气 - 剩余天然气)× gas price。
以下是交易燃料和交易费的影响总结:
简单的例子
在下面的模拟情景中,假设STORE消耗45gas,ADD消耗10gas。 该场景涉及在EVM中存储数字31,总计2个数字,然后存储总和。 假设发起人指定了150startGas的和0.02µETH,下面是由EVM处理交易的图示:
发起人向矿工支付(150 - 50)×0.02μETH=2μETH= 0.000002 ETH的费用。
燃料和费用
发起人提供足够的燃料和提供足够的费用是有区别的。 以下是对交易的可能影响:
[1]太少燃料事务甚至不会达到矿工,无论供给的费用。
[2]如果为交易提供了足够的燃料,但是收费太低,即使交易可能到达矿工,在检查交易时,矿工也不会进行任何计算。
[3]低燃料交易意味着它将使用EVM的很少的计算或存储资源,或者在运行时将会遇到“燃气异常”异常并被还原。
[4,5,6]费用决定交易将包含在区块链中的顺序。
[7]提供高燃料的原因可能导致交易花费较长的时间来开采,这一部分将在高起动燃料的潜在延迟一节中讨论。
在比特币中,计量是通过字节完成的:交易中的字节数。 在以太坊,计算也需要计量,因为少量的代码可能仍然是一个永远运行的程序。 计量计算是gas的原因之一。 但有天然气并不意味着要收费。
例如,在一个私链中,每个账户每天可能有X个gas,或者每个账户可能有每个交易的Y个gas,或者其他一些计划。 另一方面,收费并不意味着需要gas:收费可以基于不同的计量,如字节。 公链中的安全性既要求gas又要求费用,而替代方案则更适用于私有链(例如,每个账户每天有X种气体的计划可能会在公链受到女巫攻击,任何人都可以创建账户)。
计量不需要费用的一个最终例子是当一个合同被调用时与一个调用对交易。 正如谁从合同电话获得费用中所解释的那样,“调用”的调用仍然使用计费,但没有任何费用。
4
gas和ether
gas应该是网络资源/利用的不变成本。您希望发送交易的实际成本总是相同的,所以您不能真正期望gas发行,货币一般是不稳定的。
因此,我们发行价值应该有所不同的以太网,而且以ether方式实施一个gas价格。如果ether的价格上涨,以ether计算的gas价格应该下降,以保持gas的实际成本相同。
gas有多个相关的条款:Gas Prices,Gas Cost,Gas Limit 和Gas Fees。gas的原理是为以太坊网络的交易或计算成本有一个稳定的价值。
Gas Cost是一个静态值,表示气体的计算成本是多少,目的是gas的实际价值永远不会改变,所以这个成本应该始终保持稳定。
Gas Prices是多少天然气成本在另一个货币或像Ether的象征。为了稳定天然气的价值,gas价格是一个浮动价值,如果令牌或货币的成本波动,gas价格变化保持相同的实际价值。gas价格由多少用户愿意花费的均衡价格以及多少处理节点愿意接受来设定。
Gas Limit是指每个区块可以使用的最大的gas数量,它被认为是区块的最大计算负荷,交易量或区块大小,矿工可以随着时间慢慢地改变这个值。
Gas Fees实际上是运行特定交易或计划(称为合同)所需支付的gas量。块的gas费用可以用来暗示块的计算负荷,交易量或大小。gas费用支付给矿工(或PoS保税承包商)。
5
gas基本上是执行交易或合同的内部定价。
每笔交易或合同的天然气价格是为了处理以太坊及其EVM(以太坊虚拟机代码)
所以,交易或者操作越复杂,花费的gas就越多。