本文节选翻译自《以太坊中的账号、交易、gas和区块gas limits》
作者:Hudson Jameson
https://hudsonjameson.com/2017-06-27-accounts-transactions-gas-ethereum/
1
gas是什么?
以太坊在区块链上部署了一个被称为以太坊虚拟机(EVM)的运行环境。每个参与到网络的节点都会运行EVM以作为区块验证协议的一部分。他们会检查所验证区块中包含的每笔交易并在EVM中运行交易所触发的代码。每个网络中的全节点都会进行相同的计算并储存相同的值。合约执行会在节点间多次重复,这一事实使得合约执行的消耗变得昂贵,因而通常会促使大家不使用区块链来执行可于链下进行的运算。对于每个被执行的命令都会产生一个特定的消耗,该消耗使用单位gas来计数。每个合约可以利用的命令都会有一个相应的gas值。
2
gas和交易消耗的gas
每笔交易都被要求包括一个gas limit(有的时候被称为startGas)和愿意为每gas支付的费用。矿工可以选择是否为交易打包并收取费用。事实上,如今所有的交易最终都会被矿工选择,但是用户选择支付的交易费用将影响到该笔交易被打包所需等待的时长。如果该交易由于计算,包括原始信息和可能被触发的其他子信息,需要使用的gas数量小于或等于所设置的gas limit,那么该笔交易会被处理。如果Gas总消耗超过gas limit,那么所有的操作都会被取消,但交易是成立的并且交易费仍可以被矿工收取。区块链会显示这笔交易曾经尝试,但由于未提供足够的gas导致所有的合约命令都被取消。交易里未被使用的超额gas都会以以太币的形式退回交易发起者。由于gas消耗一般只是一个大致估算,所以很多用户会超额支付gas以保证他们的交易会被接受。这当然没问题,因为多余的gas是会被退回的。
3
交易费用计算
估算交易消耗
一笔个完整的交易费用基于两部分:
gasUsed:该交易消耗的总gas数量
gasPrice:该交易中单位gas的价格(用以太币计算)
交易费 = gasUsed * gasPrice
gasUsed
每个EVM中的命令都被设置了相应的gas消耗值。gasUsed是所有被执行的命令的gas消耗值总和。
gasPrice
一个用户可以创建并签署一笔交易,并且每个用户都可以设置自己希望的gasPrice,这个数值可以是0。不过,以太坊客户端的Frontier版本有一个默认的gasPrice,即0.05e12 wei。矿工要最大化他们的收益,如果大多数交易都是使用默认gasPrice即0.05e12 wei,那么基本上就很难让矿工去接受一个更低gasPrice交易,更别说0 gasPrice交易了。
交易费示例
你可以将gasLimit理解为汽车油箱的总量。同时将gasPrice理解为油价。
对于汽车,油价可能是 $2.5(价格)每升(单位)。在以太坊中,就是20 GWei(价格)每gas(单位)。为了填满你的"油箱",需要 10升单价$2.5的油 = $25。同样的,21000个20 GWei的gas = 0.00042 ETH。
因此,总交易费将会是0.00042以太币。
发送代币通常需要消耗大约5万至10万的gas,所以总交易费会上升0.001至0.002个ETH。
4
什么是“区块gas limit”?
区块gas limit是单个区块允许的最多gas总量,以此可以用来决定单个区块中能打包多少笔交易。例如,我们有5笔交易的gas limit分别是10、20、30、40和50。如果区块gas limit是100,那么前4笔交易就能被成功打包进入这个区块。矿工有权决定将哪些交易打包入区块。所以,另一个矿工可以选择打包最后两笔交易进入这个区块(50+40),然后再将第一笔交易打包(10)。如果你尝试将一个会超过当前区块gas limit的交易打包,这个交易会被网络拒绝,你的以太坊客户端会反馈错误"交易超过区块gas limit"。
以下例子是来自于以太坊StackExhcange的帖子
https://ethereum.stackexchange.com/questions/7359/are-gas-limit-in-transaction-and-block-gas-limit-different
目前区块的gas limit是 4,712,357 gas,数据来自于ethstats.net,这代表着大约224笔转账交易(gas limit为21000)可以被塞进一个区块(区块时间大约在15-20秒间波动)。该协议允许每个区块的矿工调整区块gas limit,任意加减 1/2024(0.0976%)。
谁来决定
区块的gas limit是由在网络上的矿工决定的。与可调整的区块gas limit协议不同的是一个默认的挖矿策略,即大多数客户端默认最小区块gas limit为4,712,388。
区块gas limit如何更改
以太坊上的矿工需要用一个挖矿软件,例如ethminer。它会连接到一个geth或者Parity以太坊客户端。Geth和Pairty都有可供矿工更改配置的选项。
长按加小编微信交流
领取专属 10元无门槛券
私享最新 技术干货