区块链扩容方案之Gas值限制
区块链扩容一直是区块链团队的重点研究方向。因为比特币对区块大小的设定是固定的,而且中本聪将最初大小值限定为1M,但随着交易量的增加,网络拥堵情况也愈渐严重,最终也导致了比特币的分叉。
区别于比特币固定区块大小的设定,以太坊则引入了燃料(gas)的概念,并采取了区块燃料限制(Block Gas Limit)动态调整机制,即根据交易量大小来调节Block Gas Limit。通常我们以TPS来衡量区块链的交易处理能力, Block Gas Limit值越大则意味着允许区块打包的交易量也就越多,也就是说网络拥有越高的TPS。所以,以太坊的扩容方案之一就是提高Gas值限制,以此来缓解网络拥堵的情况。
Gas Limit动态调整机制
以太坊主要通过矿工投票机制来决定目标燃料限制(TGL,Target Gas Limit),同时不能小于最小燃料限制(MGL,Min Gas Limit)。而其动态调整机制主要是在区块gas使用量超过父区块Block Gas Limit的2/3时,全网对当前区块的Block Gas Limit进行适当提升,但不允许超过TGL。
然而,通过提升Block Gas Limit的扩容方案在实现上也有弊端。若Block Gas Limit无上限,那么区块在进行广播的时候必定会有时延问题。越高的TGL也就意味着Block Gas Limit值越大,被允许打包到区块之中的交易越多,消耗的gas也就越多,其同步到整个区块链网络所需的时间也就越长,那么该区块也很有可能因为时延问题而竞争失败,最终被抛弃而成为叔块(Uncle Block)。根据Vitalik Buterin的脚本实验分析,被打包的区块每增加1,000,000 gas价值的交易,其变为叔块的概率就会增加约1.86%。一方面,因为数块只能获得75%的区块奖励,所以矿工因为利益问题也不愿意选择提升TGL。另一方面,在提升TGL的同时也需要面临算力中心化的问题。就目前来说,尚未找到合适的数学算法来对TGL进行设定,其决定权依然归属于矿工,所以区块燃料限制动态调整机制仍需完善。
Gas相关的计算
Gas主要用来支付交易的手续费,其计算也相对简单。当我们在进行交易时,gas的最大消耗限制需要由交易者自行设置,即gas limit。那么我们可以得到交易的最大gas费用计算公式,如下所示
其中,表示允许消耗的gas最大值,表示单位gas的价值,两者相乘即为最大的交易手续费。举例来说,若Gas Limit=50,000,Gas Price=20Gwei,那么所需最高手续费(以最大消耗量来算)为0.001ETH。其中
然而在整个交易执行过程中,还可能涉及其他费用,如合约创建费用等。那么实际消耗的gas计算公式,如下所示
其中,Predifined Gas Fee表示执行交易预定费用,Storage Fee表示随交易发送的数据的gas费用(零字节和非零字节会根据对应的设定值消耗一定的gas量),Contract Creation表示合约创建交易还需额外的费用。
那么,交易完成后剩余的gas即为交易最大gas费用减去使用的Intrinsic Gas
其中,Gas Limit≧Intrinsic Gas,待交易执行完毕,剩余的gas也会退还给交易者。
在费用估算上,对交易者而言,前期gas费用可以取最大gas费用与传送总值的总和。
其中,Upfront Cost表示交易执行的前期费用,Gas Limit表示gas消耗的最大量,Gas Price表示gas单价,Value表示发送方传送给接收方的总值。
对于以太坊网络来说,“网络又堵了”常常被拿出来讨论。从2017年的加密猫堵死网络事件到近期的交易所刷单大拥堵事件,或者是面对黑客的DDOS攻击,以太坊也尝试通过调整Gas值限制来解决网络堵塞问题,虽然可以见到暂时性的成效,但问题并没有完全解决,仍需通过其他扩容方案来优化网络性能,从而有效解决网络大拥堵问题。
区块链扩容方案之Gas值限制的更多相关文章
- 正本清源区块链——Caoz
正本清源区块链 说明:以下内容整理自Caoz的<正本清源区块链>,如有不妥,请联系我修改或删除. 简介 不讨论炒币!不讨论炒币!不讨论炒币! 本课程内容分为两部分: 第一部分,烧脑篇,介绍 ...
- 用JavaScript写一个区块链
几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之 ...
- ZT-----用javascrip写一个区块链
几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之 ...
- 信息摘要算法之七:SHA在区块链中的应用
最近几年比特币的火爆带动了人们对区块链技术的研究.当然我们在这里并不讨论区块链技术本身,而是讨论一下区块链中的SHA算法的应用.对于SHA系列算法我们已经在前面作了说明,在这里也不再重复. 1.区块链 ...
- 给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识
给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识 共识是区块链的核心机制,在一系列的区块链的发展历史当中,PoW/PoS/BFT等系列的共识算法都在各自的应用场景发挥了不同作用.在本体的第 ...
- NGK公链如何构建区块链数字经济商业帝国?
2020年对于区块链市场来说,重大的利好消息莫过于NGK公链的上线了.NGK公链其广泛的市场前景.顶尖的技术,一直备受众多大型机构以及投资者所看好.同时,NGK公链也不负众望,在上线以后,就开始落地到 ...
- 区块链公链分片技术(sharding)方案,配思维导图
区块链公链分片技术(sharding)方案,配思维导图 分片技术(sharding)方案 以太坊分片思路 其基本思想是,将网络中的节点分成不同的碎片,各分片可以并行处理不同交易,这样可以并行处理相互之 ...
- 破除区块链支付壁垒,NGK支付架构方案浮出水面
什么叫做区块链支付?区块链支付系统与传统支付系统有哪些不同?简要地说,原来传统的支付系统是有一个类似于银行的中间平台存在的,用户们的支付交易第一时间是寄存在平台,由平台核实验证交易行为之后,方才放行交 ...
- Datahero inc:区块链方案如何在现有食品溯源系统里实现落地?
在食品行业,区块链溯源平台的应用,主要是指围绕"从农田到餐桌"的安全管理理念,综合运用区块链技术.大数据技术和二维码技术等前沿技术,具有产品生产企业管理. 产品生产档案 (农药/防 ...
随机推荐
- 一段刚刚出炉的CSV文件转换为DataTable对象的代码
CSV是以文本形式保存的表格数据,具体是每列数据使用逗号分割,每行数据使用CRLF(\r\n)来结尾,如果数据值包含逗号或CRLF则使用双引号将数值包裹,如果数据值包含双引号则使用两个双引号做为转义. ...
- 2018.09.01 09:08 Genesis
Nothing to think about, I don't know where to start, the mastery of learning is not an easy task, yo ...
- beta冲刺————第一天(1/5)
人员的再次分配: 调走人员:陈裕鹏(原来在本队伍主要进行文章推荐算法的设计) 调入人员:陈邡(原Dipper团队,负责游戏内容的策划案,以及做一些后端的探索工作.) 现队员工作划分: 王国华,吴君毅, ...
- Java多线程学习笔记之二缓存
1.高速缓存 由来:处理器处理能力原因大于主内存(DRAM)访问速率,为了弥补这个差距,引入了高速缓存. 高速缓存是一种存取速率远比主内存大而容量远比主内存小的存储部件,每一个处理器都有其高速缓存.在 ...
- 1.Solr介绍
转载请出自出处:http://www.cnblogs.com/hd3013779515/ Solr是一个基于Lucene的全文搜索引擎,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,实现 ...
- CSS3的新增选择器
一.兄弟选择器:选择E元素所有兄弟元素F. <style> p~p{ color:#f00;} </style> </head> <body> < ...
- VC++环境下单文档SDI与OpenGL多视图分割窗口的实现-类似3DMAX的主界面
本文主要讲述如何在VC++环境下实现单文档SDI与OpenGL多视图分割窗口,最终的界面类似3DMAX的主界面.首先给出我实现的效果图: 整个实现过程网络上有很多零散的博文,请各位自行搜索,在基于对话 ...
- Ubuntu下搭建Ruby On Rails
Ruby on Rails是一个非常高效的Web应用程序框架由David Heinemeier Hansson使用Ruby语言编写. 这是一个开源 Ruby 框架,用于开发数据库支持的Web应用程序. ...
- 前尘浮华一场梦 NOI2018 游记
前尘浮华一场梦 NOI2018 哦?我摆弄着手中的键盘,看起来,是要我离开吗?好吧,对于每一个OIer的年,都是以NOI开始,以NOI结束的啊…这个年过的,可不是那么让人舒服呢… 你想听那个人的故事? ...
- [SDOI2011]工作安排 BZOJ2245
分析: 费用流裸题,按照题面要求建边就可以了,语文题,我读了10多分钟才知道这题干啥...特别是注意一个细节a[j+1]-a[j]... 附上代码: #include <cstdio> # ...