以太坊 gas费
gas是什么?
gas是指在以太坊上执行操作所需的“燃料”。
以太坊提供了虚拟机(EVM,Ethereum Virtual Machine),开发者可以在其上开发各种应用。EVM相对BTC的好处是“图灵完备”,但这带来一个潜在风险,就是一个程序可能无休止的运行下去,对EVM而言,这是不能容忍的。
所以,运行程序要花gas。就好比开车要花油费或电费,油或电用完了,车自然会停下来。
gas、gas价格、gas费是一个东西吗?
你使用EVM执行一个交易,需要若干个gas,这被称为gas数。类似于油的升数、电的度数。
而每一个gas都是需要花钱的,gas有价格,称为gasprice。这类似于一升汽油的价格、一度电的价格。
gas费就是gas数乘以gas价格。
比如,你想部署一个合约,需要3,000,000个gas,gasprice是200gwei。那么你要花的钱是:
3* 10^6 * 200 gwei = 3* 10^6 * 200 * 10^(-9) = 0.6 ETH
gasprice的计量单位为:gwei,一个gwei为是1g个wei,即10^9 wei。
由于1 wei = 10^(-18) ETH,所以: 1 gwei = 10^9 wei = 10^(-9) ETH。
wei是ETH的最小单位,以b-money的创造者Wei Dai的名字命名。
gwei的发音为ge wei (音:各位,念快一点:贵)。
gasprice由谁来定?
gas的价格不像我们所想象的,由政府统一定价,No!
也不是由矿工定价。
gas的价格由交易的发送者来指定,在伦敦升级之前,发送者在交易中要指定两个值,一个是gaslimit
,一个是gasprice
。
为什么以太坊的gasprice这么贵?
因为以太坊流行,很多人都想在上面执行交易,谁出的价格高,谁的交易就更可能被矿工执行并打入(include)区块,矿工显然喜欢更高的gas费。
所以,这更像是一个拍卖,想交易的人给出各种gasprice,矿工优先选择那些出价高的上链。
那么,gaslimit是什么?
越复杂的运算,需要消耗的gas越多。交易发送者有时候也搞不清自己需要花多少gas费来执行操作,所以需要加上一个消耗gas的上限,避免自己的钱一不小心被花光了。(如果没有这个机制就可能发生这事)
发送者设置一个gaslimit,如果没有花到这个数,会打回剩余的值。
如果gaslimit耗尽还未执行完交易,EVM会抛出异常,结束代码执行,回退发生的变更。不过,但由于矿工们已经干了活,花费了成本,所以,已经花掉的gas是不退的。
所以,gaslimit要宁可高一点,也不要太低,因为高了没关系,没花完的会退回来,低了,一旦out of gas,不仅你想要的操作没有完成,而且消耗的gas也不会退你,可谓鸡飞蛋打一场空。
gas数到底是怎么算的?
具体的计算有点复杂,但有标准可以查。你可以在GitHub上的evm-opcodes1和DynamicgasCosts2查看。
在EVM里面,每个运算、操作、存储都需要gas的,比如:
ADD:加法操作 3gas
MUL:乘法操作 5gas
SUB:减法操作 3gas
DIV:除法操作 5gas
JUMP:跳转操作 8gas
MSTORE:内容存储操作 3gas
MLOAD:内容读取操作 3gas
CREATE:创建合约 32000gas (if tx.to == null)
SSTORE:存入存储区 20000gas (从0设为非0值)
SHA3:Keccak256哈希 30gas + 6gas * (size of input in words) + mem_expansion_cost
交易基本费用:21000gas (比如Transfer就要这么多)
有没有什么方便的方法让我计算gaslimit?
1、你的钱包会帮你算,你的开发工具会帮你算。
2、Web3有两个内置的函数可以用,web3.eth.getgasprice可以提供gasprice的设置建议,estimategas可以估算一个函数(带参数)需要花的gas。
3、如果你想看看一个合约的函数调用花了多少gas,你可以去etherscan.io这种网站看看已经发生的这样的交易实际花了多少gas(gas Used by Transaction)。
具体交易时,我该如何指定这两个值?
一般而言,钱包或者开发工具,会帮你做好这两件事。(不需要劳动您亲自去设)
比如,在小狐狸中,供用户选择的有三个选项:高、中、低。
你不需要亲自指定gaslimit和gasprice,你顶多只需要选择高、中、低就好了。