旷工费:除了转账金额需要额外支付给以太坊网络旷工的费用 gas cost交易旷工费用 ( 也是也是以太坊的交易费用 ) =gas used数量 * gas price ( gas 单价,以太币计价)
Gas:以太坊每一步操作都需要消耗Gas,执行总量就是Gas
Gas Price:每一步操作的单价,一般用GWei作为单位,乘以Gas就是需要支付的矿工费。Gas Price是运行一个特别的交易或程序(被称作合约)所需的gas。 一个区块的gas费用可以用来暗示计算工作量,交易量和区块大小。gas费用支付给矿工(或PoS中的担保承包人)。Gas价格的设定是根据多少用户愿意花费和多少进程节点愿意接受的平衡价格。
Gas Limit:gas Limit为每个区块所能承载的最多gas消耗,是一种区块交易数量限制,被视为计算工作量,交易量和区块大小的最大值。以太坊为防止某些错误或者恶意的智能合约(比如一个死循环)消耗掉用户大量手续费,所以对默认Gas上限做了限制,但是有些合约(比如复杂的众筹合约)的确会消耗大量的Gas,所以需要手动设置上限。
Gwei单位:以太坊有很多单位,Gwei最容易记,因为以太坊一共支持18位小数,Gwei正好是一半,9位小数的那个单位。
gas背后遵循的原则是使以太坊网络上每个交易或计算成本保持稳定的价值。希望通过这个体系将使用价值与投资价值分离,避免因为ETH价格波动,造成系统手续费的波动。使每一次交易的gas cost 不是随着ETH价格的波动而波动,小V就设计了gas price这个变量。
gas的目的是限制执行交易所需的工作量,同时为执行支付费用。gas 用来衡量你的这笔交易(或者合约代码调用)所消耗的资源(包括计算量,存储,带宽等),一笔交易所产生的转账费用会奖励给打包包含这笔交易的区块的矿工。区块不是哪个矿工产生的,所有的矿工都会竞争下一个区块的打包权,胜出者可以打包下一个区块。交易不一定会存在一个区块,它交易被广播出去后,在数秒内全网所有的节点都会接收到这笔交易,但是它不一定会被打包,如它的 gas price 非常低。
GAS与以太坊网络拥堵: 太坊网络又堵了,所谓堵,表现为默认的Gas设置,转账一直在等待打包,一直不能到账,而且还无法判断是否会到账。结果就是,你买个币,等待打包一上午,你还不能重新设置Gas,因为你不知道那笔等待打包的会不会成功,只能眼睁睁的看着价格上去。 拥堵的核心问题其实就是以太坊每秒的打包笔数限制。
相当于不给矿工钱,然后想让别人替你干活?Pengding吧。。。
当然你非要取消掉Gas费,让发送交易的真实成本保持一致。在私有链是可以实现的,将默认的gas Price改成0。
环境准备: Mac OS 10.12.6 Go Version: go1.10 Node v9.5.0 go-ethereum Version :v1.8.2 Geth Version: 1.8.2-unstable
1,git clone https://github.com/ethereum/go-ethereum.git
2, 命令行输入:geth -h
--gasprice "18000000000" Minimal gas price to accept for mining a transactions
这是系统默认的最小挖矿交易的gasPrice交易费。
3,在go-ethereum里面的找到相关代码:
屏幕快照 2018-03-09 下午1.53.24.png
GasPrice: big.NewInt(18 * params.Shannon),
尝试设置:GasPrice: big.NewInt(0 * params.Shannon),
编译代码: make geth make all
4,再次命令行输入:geth -h
屏幕快照 2018-03-09 下午1.59.15.png
5,启动一个以太坊节点,验证的GasPrice geth --datadir "./" --nodiscover console
eth.gasPrice
mmexport1520575399591.jpg
6,其他相关的GasPrice 交易的时候,gasPrice是动态改变的,交易者、智能合约设计者、矿工三方设定,所以系统有个SuggestGasPrice。
Accounts/abi/bind/backend/simulated.go
屏幕快照 2018-03-09 下午3.39.39.png
// SuggestGasPrice implements ContractTransactor.SuggestGasPrice. Since the simulated // chain doens't have miners, we just return a gas price of 1 for any call. func (b SimulatedBackend) SuggestGasPrice(ctx context.Context) (big.Int, error) { return big.NewInt(0), nil }
如果没有矿工因素的影响,SuggestGasPrice默认是1,如果强制将gasPrice默认设置为0,也就说任何交易的gasPrice都会是0,
suggest Price Accounts/abi/bind/base.go
屏幕快照 2018-03-09 下午4.03.07.png
//测试:让 gas allowance直接走c.transactor.SuggestGasPrice的方法。 // Figure out the gas allowance and gas price values gasPrice := opts.GasPrice //if gasPrice == nil { gasPrice, err = c.transactor.SuggestGasPrice(ensureContext(opts.Context)) if err != nil { return nil, fmt.Errorf("failed to suggest gas price: %v", err) } //}
发送一个交易验证一下gasPrice:
mmexport1520575393604.jpg