ETH转账收Gas费用,竟然不是为了钱?

在《在区块链上运行程序,到底是啥意思?DAPP到底是什么?》里我们谈到,BTC脚本语言不具备图灵完备性,ETH使用的语言,比如Solidity具备图灵完备性。
具备图灵完备性的语言,可以使用循环语句,可以一遍又一遍地执行一组指令。这个特性可能会造成网络堵塞。
ETH如何解决这个问题?
用Gas。简单地说,你必须为你的程序执行的每一条指令——付费。
昨天我们说到,Solidity语言编写的代码,会被编译为字节码。这组字节码,就是一组EVM可执行的指令。

而执行每条指令,都有相关的Gas成本。参考下表:

ETH转账收Gas费用,竟然不是为了钱?

这张表中,EVM可以执行的每条指令,在Gas Used这一列,都有相应的Gas价格。
这样,如果你想在ETH网络里,跑一百万次循环语句堵塞网络,你需要花费的Gas,会是个天文数字哦!你会放弃的!
你可能会问,这个Gas,是我们转账eth时设定的Gas吗?
每次ETH转账,Gas,Gas Price,Gas Limit,感觉一脸懵逼,傻傻分不清楚啊!
Gas (燃料)
如前表,Gas的多少,对应于交易中EVM实际执行的运算复杂度。
运算越简单所需Gas就越低。反之,如果转账过程中,需要用到其它复杂指令,Gas就会高。
比如 BALANCE指令,Gas高达400.
Gas Price(燃料价格) 
是指你愿意为每个Gas,花费多少ETH。Gas Price由交易者设定。一般用Gwei作单位。 
1 Gwei = 0.000000001 Eth。 Gas Price越高,付出的Eth也就越多。
当你设定Gas price = 30 Gwei,表示,愿意为每个Gas付出:0.00000003 Eth。
Gas 由你主动出价。如果价格太低,矿工们就会拒绝帮你打包,帮你转发交易。
但是如果设置太高,就会增加交易成本。
转账手续费(Tx Fee)
它等于——实际花费燃料(Gas Used)x 单价(Gas Price)
比如,一次交易运算量,需要50Gas,而Gas Price设为3 Gwei。整个交易的手续费= 50 * 3 = 150 Gwei  = 0.00000015 Eth。
Gas Limit (燃料供给上限) 
交易中Gas上限值。是指:交易中最多花费多少Gas。
由于交易复杂度各不相同,ETH网络需要完成交易后,才能计算出一共要花费多少Gas。
所以,ETH网络,要求交易者在发出交易之前,为交易设定一个Gas上限。 
如果交易还没完成,而消耗的Gas,已经超过交易者设定的Gas Limit,那么交易就会被取消。
转账的ETH会退回,但燃料费还是要扣除,用作奖励矿工。
而如果交易已经完成,而消耗的Gas没要达到Gas Limit,则只花费实际消耗的Gas,不会多算。
强调
设置Gas的主要目的,不是为了金钱!
而是为了每条指令都有价!阻止恶意的循环语句和其它恶意语句,阻止恶意代码的运行。