全文阅读约7分钟,本篇适合希望对以太坊机制进一步探究的朋友。
如果想知道怎么省点手续费,直接跳到最后一节。
以太坊设计的机制要求所有以太坊的使用必须消耗燃料(手续费),这是出于安全和矿工激励的考虑,其设计的合理性和实用性,我打算后续专门来讨论。先科普下以太坊的手续费是怎么计算的呢?在使用钱包时,我们调节手续费的各个参数会有什么影响?
Gas/Gas Price/Gas Limit之间是什么关系?
我们可以把在以太坊上运行程序比作汽车上路,汽车需要消耗汽油(Gas),汽油有油价(GasPrice),每辆车上路(每次转账)消耗的汽油量是根据每辆车不同的。
汽油费 = 实际汽油消耗量 * 油价
- Gas(汽油):在以太坊上执行代码、存储数据都需要消耗一定量的以太币,实际消耗的多少份Gas是由该笔交易的代码计算量和数据存储量决定的。这里是不同计算需要的Gas量:evm-opcode-gas-costs_EIP-150
- Gas Price(油价):就是每一份Gas多少钱,用以太币ETH度量,但1ETH太大了,用个较小的单位GWei来度量,1Gwei = 10e-9 ETH,ETH的最小单位是Wei(10e-18 ETH),更多单位换算参考:Ether Wei Converter
- Gas Limit(油箱容量):限定每次交易允许消耗最多多少份的Gas数量。若该笔交易实际需要的Gas数量超过了Gas Limit, 则该笔交易失败,转账金额被退回,但Gas就被消耗光了。
以太坊是如何确定每笔实际手续费的?
手续费 = Gas * Gas Price
用户发起每笔转账可以指定Gas Limit和Gas Price, 但实际消耗多少Gas,用户是无法改变的(程序的计算量和存储量已经决定了),也就是说你调整的参数只有Gas Price会影响最终手续费。而如果你调整Gas Limit到太小,可以会导致交易没成功却白花费了Gas。(就像车上路油箱的油不足,耗了油却没到目的地)
image.png
如图是一笔交易的信息,交易指定Gas Limit 139732,实际消耗Gas 93155
实际交易的一些Gas值:
- 转ETH, Gas:21000
- 转Token(执行代币合约), Gas: > 21000, 一般2w~4w
- 执行其他合约,就看合约的计算和存储量了
费用太低时,交易pending太久会不会超时?
如果GasPrice过低(如<2Gwei)可能导致pending时间特别长,目前以太坊上pending是不会超时取消的。
主流以太坊钱包交易手续费怎么样设计?
主流钱包 | 手续费设置 |
---|---|
Mist | 只能调节GasLimit * GasPrice最大手续费, 无法看到具体每项值 |
imToken | 默认调节GasLimit * GasPrice最大手续费,高级选项分别调节参数 |
以imToken为例:
转ETH,可调节范围:0.0000252 ~ 0.00252 ETH(即GasPrice: 1.2 Gwei~120 Gwei)
转Token,可调节范围:0.00006 ~ 0.006 ETH
其调节手续费功能设计存在的问题:
1、用户无感知预计的转账时间。
2、使用ETH作为总单位,用户对费用无感知。
3、若选择高级功能不默认填写Gas Limit,多高级的用户才能知道Gas Limit多少合适啊
钱包该如何为用户更好的节约手续费?
可以考虑根据当前以太网络矿工打包情况来动态调节GasPrice(钱包可以把可行的最低价推荐给用户)。写本篇时看到这个博文,the-safe-low-gas-price 安全低价手续费
其提出计算一个安全的低价手续费准则,基本满足我们的要求。
1、需要至少5%哈希算力可以支持的GasPrice。(以防需要等n个小时)
2、A price that was mined within a reasonable time (< 50 blocks) the last time it was posted to the network as a pending transaction. (防止矿工之前可以接受低价GasPrice, 最近却不再接受打包低价GasPrice)(注:50个块*15s/块=12.5分钟)
原谅我第二点直接贴英文,我一直没理解上来,有理解的同学可以联系我哈。以太坊爱好者有个翻译,如何安全的调低 gas 价格,但两个要点中文翻译的也无法理解。
当然直接使用这个参考的安全低价的手续费是可以的,通过 API获取,每过100个块更新一次。
我是用户,怎么节约手续费?
前提,你的钱包可以设置Gas Price,那么目前设置
转ETH, Gas Price:2 Gwei
转Token, Gas Price:3 Gwei
大概率是几分钟后确认。
若钱包还需要你设置Gas Limit就要小心了,不要设置太小(比如100000),设置多了也不会多用你的。
网友评论