Gas是维持整个以太坊网络运行的血液,在后面的state transition中,我们会看到每个步骤都是围绕Gas在做文章。
Gas是整个Ethereum网络里对所有活动进行消耗资源计量的单位,包括但不限于:转帐,合约的创建,合约指令的执行,执行中内存的扩展,读写数据库,发送消息。 由以太坊网络上的交易而产生的每一次计算,都会产生费用。Ether是以太坊网络中的数字货币,也就是以太币,除了转账以外,以太坊网络中每次支付交易所消耗的Gas,都可以通过Gas与Ether之间的转换来计量,所以Ether充当了一般等价物,也就是货币的性质。
gas是用来衡量在一个具体计算中要求的费用单位,gas price就是在每个gas上花费Ether的数量。
“Wei”是Ether的最小单位,1Ether表示10^18 Wei 。
除了Wei以外, 在 go-ethereum源码的 internal/jsre/deps/web3.js
文件中,还定义了以下单位:
var unitMap = {
'noether': '0',
'wei': '1',
'kwei': '1000',
'mwei': '1000000',
'gwei': '1000000000',
'szabo': '1000000000000',
'finney': '1000000000000000',
'ether': '1000000000000000000',
'kether': '1000000000000000000000',
'mether': '1000000000000000000000000',
'gether': '1000000000000000000000000000',
'tether': '1000000000000000000000000000000'
};
在使用以太坊钱包的时候,比方在 myetherwallet钱包中添加新的代币,会让我们填写小数点位数,这个地方填写的18,就是Ether和Wei之间的转换关系。
在转账的时候,我们还经常让我们设置Gas Limit, 这个Gas Limit是我们执行交易愿意花费的最大Gas值。Gas Price是我们愿意花费在每个Gas上的Ether数量。 那么,Gas Price和Gas Limit的乘积就表示交易者愿意花费的最大Ether数量。
例如,假设发送者设置gas limit为50,000,gas price为20gwei。这就表示发送者愿意最多支付50000 * 20gwei = 1,000,000,000,000,000 Wei = 0.001 Ether来执行此交易。
如果账户中有足够的Ether来支付费用,就没有任何问题,并且未使用的Gas会退回给发送者。
但是,如果账户中的Ether不足以支付费用,交易处理会恢复到原始状态,但是不会有任何Gas退回,因为以太坊网络在耗尽Gas之前还是做了计算,这也是为什么我们转账未成功,但是依然扣了手续费的原因。并且,这些Ether都是奖励给了以太坊网络上的矿工。
发送者愿意支付更高的gas price,矿工从这笔交易总就能获得更多的价值。因此,矿工也就更加愿意选择打包这笔交易。这就是为什么我们支付的费用越多,转账速度越快, 这也是市场经济的体现。
更通俗的理解,我们可以将Gas看做是人民币中的元、角、分,GasPrice看做是一件商品的价格,GasLimit就是我们最多愿意出多少钱来买这件商品。
-
对于任何交易,都将收取21000gas的基本费用。这些费用可用于支付运行椭圆曲线算法所需的费用。该算法旨在从签名中恢复发送者的地址以及存储交易所花费的硬盘和带宽空间。
-
虚拟机中的某些操作码,可以让合约允许交易对这些数据的访问。数据的固定消耗计算是:每个零字节4gas,非零字节68gas。
-
用于设置账户存储器的操作码SSTORE的消耗是:1.将零值改为非零值时,消耗20000gas;2.将零值变成零值,或非零值变非零值,消耗5000gas;3.将非零值变成零值,消耗5000gas,加上交易执行成功后退回的20000gas。退款金额上限是交易消耗gas总额的50%。