1. 什么是gas?

  • gas是“燃料”的意思。在以太坊区块链上实现了一个EVM(以太坊虚拟机)的代码运行环境,在链上执行写入操作时,网络中的每个全节点都会进行相同的计算并存储相同的值。
  • 这种执行的消耗是昂贵的,为了促使大家将能在链下进行的运算都不放到链上进行,也为了奖励矿工,在链上每执行一个写入操作时,都需要支付一定的费用,用gas为单位来计数。
  • 每个在链上可以执行的命令都设置了一个消耗的gas值,例:PUSH操作需要消耗3个gas一次转账一般要消耗21000 gas,gas使用ether来支付。
  • 1 ether = 1 x 10^18 wei = 1 x 10^9 Gwei 。

注意:无论您执行的命令是成功还是失败,都需要支付计算费用,即使失败,节点也验证并执行了您的交易(计算),因此必须和成功执行支付一样的费用。

2. 什么是gasPrice?

  • Gas Price就是你愿意为一个单位的Gas出多少ether,一般用Gwei作单位。
  • Gas Price 越高,就表示交易中每运算一步,会支付更多的ether
  • 通过gas price可以节省矿工费用,但也会减慢矿工打包的速度。因为,矿工会优先打包gas price设置高的交易,如果您想加快转账,您可以把gas price设置得更高,这样您就可以插队靠前。
  • 以太坊的交易手续费为:TxFee = gas * gas Price,单位Gwei
  • 一次转账一般要消耗21000 gas,如果你设置的gas Price = 1000000000wei = 1Gwei,则此次转账的交易手续费为:TxFee = 21000 Gwei = 0.000021 ether
  • A账户欲向B账户转账4 ether,则要求A账户至少要有 4 + 0.000021 = 4. 000021 ethrer

最后值得一提的是Gas Price 越高,你提交的交易会越快被矿工接纳。 但通常人们都不愿多支付手续费, 那么究竟应该将Gas Price设置为多少,才可以保证在能接受的时间内,让交易被确认到区域链上呢?
我们可以为交易定义gas price,具体的值可以参考 ETH gas station 。这里能看到以太坊区块链上最近完成的交易对应的消耗单价、记录时间、等待时间、手续费均价等。根据自身交易需求,我们可以参考右下Safelow/Standard/Fast三个速度对应的gasPrice

3. 如何设置gas和gasPrice?

  • 为了能让交易更快地被执行,我们可以在发起交易时设置gas和gasPrice,还可以设置noce,设置方法如下:
<span style="color:#000000"><code class="language-javascript">eth<span style="color:#999999">.</span><span style="color:#61aeee">sendTransaction</span><span style="color:#999999">(</span><span style="color:#999999">{</span><span style="color:#c678dd">from</span><span style="color:#999999">:</span> <span style="color:#98c379">0x4fd9555dd1309e7a2a356ea7e92c1b41cb7bb144</span><span style="color:#999999">,</span>to<span style="color:#999999">:</span> <span style="color:#98c379">0xf7deba629960e4f31f1aba61927f6f1e966c4462</span><span style="color:#999999">,</span> value<span style="color:#999999">:</span> web3<span style="color:#999999">.</span><span style="color:#61aeee">toWei</span><span style="color:#999999">(</span><span style="color:#98c379">1</span><span style="color:#999999">,</span> <span style="color:#669900">"ether"</span><span style="color:#999999">)</span><span style="color:#999999">,</span> gas<span style="color:#999999">:</span> <span style="color:#98c379">60000</span><span style="color:#999999">,</span>gasPrice<span style="color:#999999">:</span> web3<span style="color:#999999">.</span><span style="color:#61aeee">toWei</span><span style="color:#999999">(</span><span style="color:#98c379">40</span><span style="color:#999999">,</span><span style="color:#669900">'gwei'</span><span style="color:#999999">)</span><span style="color:#999999">,</span>nonce<span style="color:#999999">:</span> <span style="color:#98c379">30</span>
<span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span>
  • 参考链接:
    以太坊转账 gas 费用太低,一直 pending 怎么办

4. 什么是gasLimit?

  • Gas Limit就是一次交易中gas的可用上限,也就是你的交易中最多会执行多少步运算。 由于交易复杂程度各有不同,
    确切的Gas消耗量是在完成交易后才会知道,因此在你提交交易之前,需要为交易设定一个Gas用量的上限。
  • 每个区块有gas limit,即单个区块允许的最多gas总量,可以用来决定单个区块中能打包多少笔交易。
  • 我们每一次交易或合约调用都要设置一个gas limit,如果该次操作所使用的gas数量小于或等于您所设置的gas limit,则会被执行。但如果gas总消耗量超过gas limit,所有的操作都会被重置,但费用依旧会被收取——因为要奖励已经付出劳动的矿工。
  • 在执行中实际消耗的gas值总和叫gas usedgas used未达到gas Limit, 那么只会按实际gas used 收取交易服务费,没有使用完的gas会退还到原账号。根据我查找的资料来看,这里所说的gas Limit就是指chapter 3中的gas属性
  • 如果您尝试将一个会使用超过当前区块gas limit的交易打包,则会被网络拒绝,会反馈below gas limit

5. 手续费不足异常(insufficient funds)的解决

  • 在多主机多节点的转账过程中,自己本来想从节点01的A账户(里面有4 ether)向节点02的B账户(里面0 ether)转账1 ether,粗心的将节点03搞成了节点01。节点03的A账户里面0 ether,因此报出了insufficient funds异常。
<span style="color:#000000"><code class="language-javascript"><span style="color:#669900">></span> eth<span style="color:#999999">.</span><span style="color:#61aeee">sendTransaction</span><span style="color:#999999">(</span><span style="color:#999999">{</span><span style="color:#c678dd">from</span><span style="color:#999999">:</span>eth<span style="color:#999999">.</span>accounts<span style="color:#999999">[</span><span style="color:#98c379">1</span><span style="color:#999999">]</span><span style="color:#999999">,</span>to<span style="color:#999999">:</span><span style="color:#669900">"0x4161514855682c94e3cbcb4808eb8766cf889e17"</span><span style="color:#999999">,</span>value<span style="color:#999999">:</span>web3<span style="color:#999999">.</span><span style="color:#61aeee">toWei</span><span style="color:#999999">(</span><span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"ether"</span><span style="color:#999999">)</span><span style="color:#999999">}</span><span style="color:#999999">)</span>
Error<span style="color:#999999">:</span> insufficient funds <span style="color:#c678dd">for</span> gas <span style="color:#669900">*</span> price <span style="color:#669900">+</span> valueat web3<span style="color:#999999">.</span>js<span style="color:#999999">:</span><span style="color:#98c379">3143</span><span style="color:#999999">:</span><span style="color:#98c379">20</span>at web3<span style="color:#999999">.</span>js<span style="color:#999999">:</span><span style="color:#98c379">6347</span><span style="color:#999999">:</span><span style="color:#98c379">15</span>at web3<span style="color:#999999">.</span>js<span style="color:#999999">:</span><span style="color:#98c379">5081</span><span style="color:#999999">:</span><span style="color:#98c379">36</span>at <span style="color:#669900"><</span>anonymous<span style="color:#669900">></span><span style="color:#999999">:</span><span style="color:#98c379">1</span><span style="color:#999999">:</span><span style="color:#98c379">1</span>
</code></span>
  • 因此查询了insufficient funds异常的解决办法,汇总如下:
    ① 创世区块的配置问题:关于以太坊私有链中进行交易时余额不足的问题处理,更改了chainId,估计很难遇到由chainId引起的异常。
    ② 更靠谱的方法是,计算一下gas*gasPrice + value 是不是大于当前账户的值,这里的value是指交易金额。参考链接:https://liankexing.com/question/question_page/id/757.html。

  • 自己就是属于上面的第二种情况,而且是一种很极端的情况,对没有任何余额的账户进行转账操作!傻逼了~

  • 如何计算gas*gasPrice + value 是不是大于当前账户的值?

<span style="color:#000000"><code class="language-javascript"><span style="color:#5c6370">//使用eth.estimateGas()方法来估计gas消耗量</span>
<span style="color:#669900">></span> gas <span style="color:#669900">=</span> eth<span style="color:#999999">.</span><span style="color:#61aeee">estimateGas</span><span style="color:#999999">(</span><span style="color:#999999">{</span><span style="color:#c678dd">from</span><span style="color:#999999">:</span><span style="color:#c678dd">from</span><span style="color:#999999">,</span> to<span style="color:#999999">:</span> to<span style="color:#999999">,</span> value<span style="color:#999999">:</span> web3<span style="color:#999999">.</span><span style="color:#61aeee">toWei</span><span style="color:#999999">(</span><span style="color:#98c379">2</span><span style="color:#999999">,</span><span style="color:#669900">"ether"</span><span style="color:#999999">)</span><span style="color:#999999">}</span><span style="color:#999999">)</span>
<span style="color:#98c379">21000</span>
<span style="color:#5c6370">//获取gasPrice,单位为 wei</span>
<span style="color:#669900">></span> eth<span style="color:#999999">.</span>gasPrice
<span style="color:#98c379">1000000000</span>
<span style="color:#5c6370">//计算交易手续费TxFee</span>
<span style="color:#669900">></span> fee <span style="color:#669900">=</span> gas<span style="color:#669900">*</span>eth<span style="color:#999999">.</span>gasPrice
<span style="color:#98c379">21000000000000</span>
<span style="color:#5c6370">//计算gas*gasPrice + 2 ether</span>
<span style="color:#669900">></span> <span style="color:#61aeee">parseInt</span><span style="color:#999999">(</span>fee<span style="color:#999999">)</span> <span style="color:#669900">+</span> <span style="color:#61aeee">parseInt</span><span style="color:#999999">(</span>web3<span style="color:#999999">.</span><span style="color:#61aeee">toWei</span><span style="color:#999999">(</span><span style="color:#98c379">2</span><span style="color:#999999">,</span><span style="color:#669900">"ether"</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
<span style="color:#98c379">2000021000000000000</span>
<span style="color:#5c6370">//查看账户余额</span>
<span style="color:#669900">></span> eth<span style="color:#999999">.</span><span style="color:#61aeee">getBalance</span><span style="color:#999999">(</span>eth<span style="color:#999999">.</span>accounts<span style="color:#999999">[</span><span style="color:#98c379">0</span><span style="color:#999999">]</span><span style="color:#999999">)</span>
<span style="color:#98c379">201000042000000000000</span>
<span style="color:#5c6370">//账户余额远大于gas*gasPrice + value,可以执行转账</span>
<span style="color:#669900">></span> eth<span style="color:#999999">.</span><span style="color:#61aeee">sendTransaction</span><span style="color:#999999">(</span><span style="color:#999999">{</span><span style="color:#c678dd">from</span><span style="color:#999999">:</span>eth<span style="color:#999999">.</span>accounts<span style="color:#999999">[</span><span style="color:#98c379">1</span><span style="color:#999999">]</span><span style="color:#999999">,</span>to<span style="color:#999999">:</span><span style="color:#669900">"0x4161514855682c94e3cbcb4808eb8766cf889e17"</span><span style="color:#999999">,</span>value<span style="color:#999999">:</span>web3<span style="color:#999999">.</span><span style="color:#61aeee">toWei</span><span style="color:#999999">(</span><span style="color:#98c379">1</span><span style="color:#999999">,</span><span style="color:#669900">"ether"</span><span style="color:#999999">)</span><span style="color:#999999">}</span><span style="color:#999999">)</span>
<span style="color:#98c379">INFO</span> <span style="color:#999999">[</span><span style="color:#98c379">03</span><span style="color:#669900">-</span><span style="color:#98c379">24</span><span style="color:#669900">|</span><span style="color:#98c379">11</span><span style="color:#999999">:</span><span style="color:#98c379">49</span><span style="color:#999999">:</span><span style="color:#98c379">52.745</span><span style="color:#999999">]</span> Setting <span style="color:#c678dd">new</span> local account                address<span style="color:#669900">=</span><span style="color:#98c379">0x74f3141E22E415dD9eDAae9CD1EF26E4EF704984</span>
<span style="color:#98c379">INFO</span> <span style="color:#999999">[</span><span style="color:#98c379">03</span><span style="color:#669900">-</span><span style="color:#98c379">24</span><span style="color:#669900">|</span><span style="color:#98c379">11</span><span style="color:#999999">:</span><span style="color:#98c379">49</span><span style="color:#999999">:</span><span style="color:#98c379">52.746</span><span style="color:#999999">]</span> Submitted transaction                    fullhash<span style="color:#669900">=</span><span style="color:#98c379">0x6c82be3da7181b7d2c44398f35453e2d21e16a2cb376b29556d1fb30c4addb51</span> recipient<span style="color:#669900">=</span><span style="color:#98c379">0x4161514855682C94e3CBcb4808eb8766cf889e17</span>
<span style="color:#669900">"0x6c82be3da7181b7d2c44398f35453e2d21e16a2cb376b29556d1fb30c4addb51"</span>
</code></span>

计算方法的参考链接:
以太坊估算交易gas消耗量
以太坊中以太币及代币计量单位
以太坊手续费不足异常(insufficient funds)

参考链接:
以太坊中的gas、gas price、gas limit到底是什么
以太坊中的Gas、GasPrice和GasLimit是什么?
以太坊中的交易及交易费用

以太坊中gas、gasPrice、gasLimit是什么?相关推荐

  1. 以太坊中的账户、交易、Gas和区块Gas Limit等基本概念

    本篇文章作为科普文章,汇总整理了以太坊中的账户.交易.Gas和区块Gas Limit等相关概念,以便大家在实践中更好的与具体业务相结合. 什么是账户 以太坊账户与我们所知的账户概念有一定相似之处,却又 ...

  2. 区块链开发(十五)以太坊中的Events和Logs解析及用途

    以太坊中的事件(Events)和日志(Logs)是个特别让人困惑的概念,本文帮大家梳理. 因为上篇文章,我们讨论过以太坊go-ethereum客户端查询交易列表的一些办法,这篇文章,我们具体实现一种f ...

  3. [以太坊源代码分析] IV. 椭圆曲线密码学和以太坊中的椭圆曲线数字签名算法应用

    数字签名算法在Ethereum中的应用不少,目前已知至少有两处:一是在生成每个交易(Transaction, tx)对象时,对整个tx对象进行数字签名:二是在共识算法的Clique算法实现中,在针对新 ...

  4. ftl有三种映射地址_浅谈以太坊中的三种“树”

    无论是比特币还是以太坊,它们都是完全由代码创造出来的,它们的几乎所有一切都是程序执行的结果.对计算机程序有些了解的朋友应该都知道,计算机程序离不开数据结构和算法. 顺便提一下,有部分人不认为比特币和以 ...

  5. 以太坊中metamask、imtoken等钱包签名的php验证

    以太坊中metamask.imtoken等钱包签名的php验证 之前开发Dapp,需要用到以太坊钱包登陆dapp,找了很久没有这方面的库,加密算法倒是有很多,直接重新写了一个库,https://git ...

  6. 以太坊中的nonce

    以太坊创建每个账户时初始nonce=0,以后每次交易nonce+1,防止以太坊中的replay attack. 参考:https://www.bilibili.com/video/BV1Vt411X7 ...

  7. 区块链学习笔记16——以太坊中的交易树和收据树

    十六.以太坊中的交易树和收据树 每次发布一个交易的时候,那些交易会组织成一个交易树,也是一颗Merkle tree跟比特币中的情况是类似的,同时以太坊还增加了一个收据树,每个交易执行完之后会形成一个收 ...

  8. Paradigm 介绍 Goldfish:PoS 以太坊中 LMD GHOST 分叉规则的安全替代品

    合并:从工作量证明到权益证明 以太坊即将从工作量证明 (PoW) 过渡到权益证明 (PoS) ,这是多年研究和开发的结晶.虽然 PoS 带来了许多潜在的优势,但这也意味着以太坊正在放弃中本聪最&quo ...

  9. 04.区块链的那些事儿-以太坊中的 Patricia Tree

    本节主要讨论以太坊中存储的 Patricia Tree 比特币只有1棵Merkle树,而以太坊的每一个区块头,并非只包含1棵Merkle Tree,而是包含了3棵Merkle Tree,分别对应了三种 ...

最新文章

  1. 零基础参加java培训的系统学习路线
  2. 简单介绍一下umask 命令使用方法
  3. Python xml ElementTree 缩进(autoindent) 换行
  4. 科学计算机求角度数,科学计算器算角度
  5. CSS3学习笔记1:结构性伪类选择器
  6. LINK : fatal error LNK1104: cannot open file mfc42d.lib
  7. 第三十三章 机械化印刷
  8. SQL Server Log Shipping学习总结
  9. 云播 Android,云播放(Air Playit)android版
  10. 简述sqlite数据库的特点_sqlite数据库特点
  11. 分享几个搜图,图标,图片网站
  12. 柴静《看见》读书笔记
  13. 技术分享杂七杂八技术
  14. 苹果计算机恢复计算器,苹果自带计算器删除怎么恢復
  15. html书写表单laber,laber(labelhood是什么意思)
  16. 台式计算机怎么强制关机,电脑怎么强制关机(关机方法都在这)
  17. Kettle Carte集群关闭问题
  18. CSDN问答——精选问答Vol.7
  19. JS内置对象及其用法总结
  20. tbr tbn tbc

热门文章

  1. pyqtgraph基础入门(二):使用pyqtgraph绘制折线图(同一坐标轴包含多条折线)
  2. 走管理路线之前,你应该了解的几件事情
  3. Qt - QSettings实现用户偏好保存
  4. c#与mysql教程 pdf_C#代码怎么将数据库中的数据导成DOC和PDF格式
  5. 台达DVP-20PM的追剪程序,同步运动,是用在卷纸管机上的
  6. 【教程】使用jsDelivr加速GitHub的静态资源
  7. 在淘宝我学到了什么?
  8. yolov5 老友记
  9. Express的详细教程
  10. Js 设置css属性