ETH Gas, GasPrice, GasLimit

1. 什么是Gas?

以太坊在区块链上的的执行环境的实现称为以太坊虚拟机(EVM)。 参与网络的每个节点都运行EVM作为区块验证协议的一部分。 他们会检查正在验证的块中列出的交易,并运行由EVM中的事务触发的代码。 网络中的每个全节点执行相同的计算并存储相同的值。 显然,以太坊不是要优化计算效率。,因为它的并行处理是冗余的。在不需要可信的第三方,权威或暴力垄断的情况下,以太坊提供一种有效的方式来达成系统状态的共识。但是很明显,这不是最优的计算方式。合约执行是跨节点冗余复制的事实自然会使它们变得昂贵,这通常会产生不使用区块链进行离线计算的动机。

当你运行一个去中心化应用(dapp)时,它会与区块链交互以读取和修改其状态,但是 dapps 通常只会放置对达成共识至关重要的业务逻辑和状态到区块链上。由于消息或事务触发而执行合约时,每个指令都在网络的每个节点上执行。 这具有一定的成本:对于每个执行的操作都有指定的成本,以一定 gas 单位表示。

Gas 是交易发起人需要为以太坊区块链上的每项操作支付的执行费的名称。 gas 这个名称的灵感来源于这种费用可以作为加密燃料,驱动智能合约的运动。 gas可以从执行代码的矿工那里购买。 由于 gas 单位与具有自然成本的计算单元对齐,因此 gas 和 ether 有意地解耦,而 ether(以太)的价格通常是随市场波动的。 这两者是由自由市场调节的:gas 的价格实际上是由矿工决定的,他们可以拒绝处理 gas 价格低于最低限额的交易。 你只需在你的账户中添加一定的以太币就可以获得 gas。 以太坊客户端会自动为你的以太币购买 gas,金额为您指定的金额,作为交易的最大支出。

根据以太坊协议,在合约或交易中执行的每个计算步骤都要收取费用,以防止在以太坊网络上的恶意攻击和滥用。每笔交易都必须包含gas limit和愿意为gas支付的费用。矿工可以选择是否打包交易和收取费用。如果由交易产生的计算步骤所使用的gas总量(gas used ),包括原始消息和可能被触发的任何子消息,小于或等于gas limit,则处理该交易。如果gas总量超过gas limit,那么所有的改变都会回退,除非交易仍然有效并且矿工接受了这个费用。交易执行中未使用的所有多余的gas将以Ether返还给交易发起人。你不必担心超支,因为你只需支付消耗的gas费用。这意味着发送高于估计值gas limit的交易是有用的,也是安全的。

2. 估算交易成本

交易中花费的总共的ether成本取决于2个因素:

  • gasUsed 是交易中消耗的总共的gas
  • gasPrice 在交易中指定一个单位gas的价格(ether)

总费用 = gasUsed * gasPrice

2.1 gasUsed

EVM中的每个操作都指定了要消耗的 gas 量。 gasUsed 是执行所有操作的所有gas的总和。 为了估算gasUsed,这里有一个可以使用的 estimateGas API,但有一些注意事项。

2.2 gasPrice

用户构造并签名交易时,每个用户都可以指定他们希望的任何gasPrice,它甚至可以是零。GasPrice 是一个 Gas 的单价,一般用 Gwei 来形象表示 ( 但注意实际在应用程序中都是使用 Wei ),GasPrice 由用户自己设置,其大小会决定交易被处理的速度。 然而,Frontier推出的以太坊客户端的默认gasPrice为0.05e12 wei。 由于矿工优化了他们的收入,如果大多数交易都是以0.05e12 wei的gas价格提交的,那么很难说服矿工接受指定较低或零的gas价格的交易。

这是一张来自 https://ethgasstation.info/ 的信息,展示了 GasPrice 大小与速度的关系,它是实时变动的。

2.3 GasLimit

GasLimit 是对 Gas 大小的限制,防止一些合约 bug 比如无限循环而消耗掉账户中的所有的 ETH,Gas 消耗超过 GasLimit 时,交易会执行失败。

GasLimit 由用户自己设置,但是必须大于等于 21000 Gas unit。

注意:在 web3 应用程序中,调用合约方法时传递的选项 gas 代表的是 GasLimit,这点容易引起混淆。

交易费用 = 程序消耗的 Gas unit * 用户设置的 GasPrice。( ETH 与 Gas 之间的价格转换关系 与 Ethereum Gas Price Chart )

3. 估算交易成本示例

例如,一个合约只是添加 2 个数字,EVM OPCODE ADD 消耗 3 gas。使用默认gas价格的大致成本为:

3 * 0.05e12 = 1.5e11 wei

注意:gas 的最小单位为 wei,1 ether = 10^18 wei,换算成 Ether 的话,就是 0.00000015 Ether。

Operation Name Gas Cost Remark
step 1 default amount per execution cycle
stop 0 free
suicide 0 free
sha3 20  
sload 20 get from permanent storage
sstore 100 put into permanent storage
balance 20  
create 100 contract creation
call 20 initiating a read-only call
memory 1 every additional word when expanding memory
txdata 5 every byte of data or code for a transaction
transaction 500 base fee transaction
contract creation 53000 changed in homestead from 21000

区块链以太坊 epoch:Epoch用于定义区块链上特定事件发生的时间纪元(era of time),如:激励支付的时间新的验证者组负责验证交易的时间不同的区块链协议,epoch的定义不同。常用于表示在链上完成特定区块数的时间。如 ...