最近以太坊网络经常拥堵,用户为了尽快达成交易,会上调Gas费希望能优先被矿工打包,尤其是在交易有利可图的时候。以太坊网络在2021年之后利用率长期超过97%,资源短缺的局面暂时不会得到缓解,按照这种趋势,短期内以太坊的Gas费不会大幅下降。
图1:以太坊网络利用率
图2:以太坊网络的平均Gas费
以太坊高昂的Gas费深受诟病,严重影响了用户体验,降低以太坊Gas费迫在眉睫。Gas费全部交给负责维护网络执行交易的矿工,代表用户使用网络资源需要付出的费用。Gas费的计算方式为GasPrice*GasUsed,其中GasPrice由用户设置,代表用户为每单位Gas支付的价格,GasUsed是实际中使用的Gas数量。在操作时用户还需要设置GasLimit,代表用户愿意为此交易支付最多的Gas数量,如果在执行过程中发现所需的Gas超过设置的GasLimit,会导致交易失败,此时的GasUsed等于GasLimit,用户仍需缴纳Gas费。如果GasUsed小于GasLimit,交易成功后Gas数量会按照实际执行使用的数量收费。
根据Gas费的计算方式,可以通过降低GasPrice和GasUsed实现降低Gas费,体现在降低网络拥挤程度,将计算转移到二层网络中进行;降低合约复杂度减少计算的执行步骤;改变Gas的收取方式等。本文将从Layer1、Layer2和相关Gas产品这三个角度出发,解析关于降低以太坊Gas费的实践以及优劣。其中Layer1指的是以太坊网络本身,Layer2指的是以太坊主链外的网络。
以太坊Layer1上的实践
提高区块的GasLimit
以太坊对单个区块的大小没有强制规定,但每个区块承载的Gas单位数量是有上限的,也就是区块的GasLimit。提高GasLimit带来最直接的影响是单个区块可以执行更多的操作,因此提高了整个系统的承载量。每个区块可以打包更多交易来缓解网络的拥堵状况,用户就可以降低GasPrice。这是最直接对网络进行扩容的方案,因执行简便经常被用于扩容。2020年7月之后以太坊区块的GasLimit达到了1250万左右,相较于2017年末已经上涨了近两倍。
图3:以太坊区块的GasLimit
可以看出,虽然以太坊区块的GasLimit一直在提高,以太坊还是会出现网络拥堵的情况。这是因为以太坊的用户和使用量是同时上涨的,只要GasLimit的上涨程度没有超过使用量的上涨,提高GasLimit就无法根本解决高Gas费的问题。GasLimit具体数值由矿工投票决定,在目前的网络拥堵程度下,有些矿工建议将GasLimit继续提高到1600万,但遭到了很多阻力。
除了无法根本解决网络拥堵的问题外,提高GasLimit后由于区块容量扩大,区块的验证和同步时间有所延长。因此导致网络更容易分叉,叔块出现的概率升高,节点维护网络的成本也会增加,最终网络可能出现安全性和中心化问题。虽然提高GasLimit是最简单进行网络扩容的方式,但它带来的弊端也是不能忽视的。不过目前网络拥堵情况加剧,出于可用性考虑,加上矿工会受到更多笔Gas费奖励的吸引,未来极有可能仍会提高区块GasLimit来增大承载量。
降低操作的Gas消耗
虽然以太坊区块的GasLimit在增加,区块的承载量远超过去,但数据显示目前的转账数量刚刚与2018年初的转账数量持平,说明了以太坊网络中大部分资源被分配给了更复杂的合约交易。如果在合约编写上能够降低复杂度,减少合约执行所需要的Gas,或者直接降低操作的Gas定价,就可以实现节约Gas费的目标,并且节约网络资源。
图4:以太坊的每日转账数
以太坊的黄皮书规定了Gas的消耗规则,智能合约的编写过程中,同一功能的不同实现方式消耗的Gas会有所不同,为了节约Gas费就需要执行最节约Gas的代码实现方法。例如储存新数据和修改数据都要消耗Gas,所以最好避免重复修改,一次性尽可能多地写入。在下图中,两者在结果上相同,但右边的代码实现消耗Gas会更少。
图5:同一结果的两种代码实现,右边更节约Gas
除此之外,压缩智能合约的数据输入,避免创建智能合约时将其用作数据存储等方式也可以节约Gas。有人提出操作消耗Gas的原始定价没有经过充分分析,存在定价不当的问题。以太坊中的EIP1380、EIP2046等提案就涉及降低某个操作的Gas。但以太坊Gas定价的改变要慎重考虑,因为降低有些操作的Gas定价会降低重入攻击的难度。
EIP1559
EIP1559已经被纳入在以太坊的伦敦硬分叉升级中,它改变了以太坊网络Gas费的定价和分配规则。目前以太坊Gas费定价规则为市场竞价的方式,用户自行设置愿意支付的GasPrice,矿工挑选支付最高GasPrice的交易打包。每个人都希望能尽快完成交易,因此在网络拥堵时Gas费会居高不下。EIP1559提出了一种新的Gas费收取方案,用户支付的Gas费分为基础费和小费,其中基础费直接销毁,小费归矿工收入。
EIP1559方案引入了GasTarget的概念,区块Gas上限是GasTarget的两倍,基础费根据网络使用情况进行动态调节,也就是区块实际包含的Gas与GasTarget的比较。如果区块的Gas超过GasTarget,那么下个区块收取的基础费就会上涨,反之如果低于GasTarget就会下降。上涨和下降的幅度不会超过12.5%,避免了Gas费突然暴涨暴跌。由于基础费一直是动态调节的,如果连续多个区块包含的Gas一直超过GasTarget,基础费就会指数上涨到夸张的价格,让用户不得不暂停交易,等待Gas降低到GasTarget以下,基础费才会下降。基础费是用户必须支付的,矿工的小费可选择支付,在网络使用率不高的情况下,基础费就可以让用户及时完成交易,没有必要支付矿工小费。如果网络拥堵,则需要支付小费优先交易。
目前Gas费收取需要用户设定支付的GasPrice,如果太低需要等待很久,太高则造成浪费。EIP1559的实施会提高用户使用体验,因为基础费是已经被计算好的,理论上支付基础费就能保证完成交易,用户只需要选择给矿工支付的小费,而且在不拥堵的情况下不需要给矿工小费。对于降低Gas费来说,EIP1559中没有很直接的体现,在不拥堵时用户只缴纳基础费于是避免了Gas费浪费。在网络拥堵时持续调高基础费没有让用户花费更少,而是通过不断涨价让人们面对高昂收费时不得不暂缓交易。因此很多人对EIP1559的实施对降低Gas费的有效程度存疑,尤其是短期受到很大损失的矿工群体。但从长远看,销毁本来应该交给矿工的Gas费,能够将交易带来的价值引入到以太坊系统中,提升整个系统的价值也会提高矿工的收入。
以太坊2.0的实现
以太坊升级到2.0阶段的最终目标是实现扩容,解决网络的拥堵问题,除了将共识机制由PoW转变为PoS,以太坊2.0的还要实现分片和部署eWASM虚拟机。分片就是将整个网络分区,节点不需要维护整个系统的交易,只需要负责维护其中一个分区即可。以太坊2.0将有64个分片,将交易分布到各分片中增加网络的承载量。各分片可以与信标链进行交联,信标链不储存以太坊上的账户余额和合约状态等信息,负责管理验证者和记录分片状态。分片要考虑到安全性的问题,因为相对而言攻击单分片的难度会降低。在以太坊2.0的分片上都存在至少128个验证者组成的委员会,他们负责表决分片上的信息,这些人每epoch更换一次,由信标链通过RANDAOVDF的方案分配。作恶者很难保证在同一时间控制同一分片上超过三分之二的节点,因此保证了网络的安全。
eWASM是以太坊2.0阶段部署的虚拟机,相较于目前的EVM虚拟机,eWASM在速度和效率上会大幅提升,配合分片技术,以太坊2.0能够实现大规模扩容,降低Gas费。但由于以太坊分片和eWASM的开发难度比较高,短期内不会上线。
以太坊Layer2上的实践
Rollup
Rollup是目前受到最多关注的以太坊Layer2解决方案,最有可能在短期内解决以太坊网络拥堵的问题来降低Gas费,Vitalik也指出Rollup是以太坊2.0分片技术上线之前最有效的扩容技术。Rollup的运营者通过将计算和完整的状态储存放到链下,压缩交易数据实现主链上的扩容。实际上交易数据是储存在区块链上的,风险源自运行者可能提供错误的数据进而控制用户资产,为了避免风险存在不同的Rollup解决方案。ZKRollup通过有效性证明保证数据安全,使用ZK-SNARK密码学证明,Layer1可以快速完成验证并转账,同时可以保证隐私性,但ZKRollup很难对EVM进行证明,因此难以应用于使用智能合约的场景。OptimisticRollup使用欺诈证明的方式,如果有人发现运营者处理的状态根是错误的,那么可以发布一个证明,证明通过后会回滚交易并对运营者进行惩罚。OptimisticRollup在主网中支持智能合约的部署,更适用于现在的扩容需求。但由于欺诈证明的要求,在退出Rollup时,需要一周的时间检查其他用户是否提交欺诈证明。
以太坊上储存交易的一个字节花费50Gas,以太坊区块的Gas上限为1250万。Rollup可以压缩以太坊上操作的字节数量,除掉Rollup校验所需要的Gas量,可以计算出Rollup在扩容方面的表现。
表1:Rollup带来的扩容空间
总的来说,Rollup在扩容上十分有效,因此可以降低以太坊Gas费。但Rollup会涉及链上应用的迁移,使用不同团队开发的Rollup还会导致互操作性下降的问题。
侧链
侧链是一条区别于主链的区块链,用户可以将主链资产转移到侧链上交易,以节约主链的资源和交易者的成本。严格意义上侧链不算是Layer2解决方案,因为无法完全保证用户的资金安全也不能保证侧链与主链的关联性。侧链只能归为链下解决方案,但由于实现方式和其他Layer2较为相似,这里暂时归为一类讨论。状态通道、Plasma和侧链都是通过链下交易实现扩容的,他们在具体实现方式和安全性上有所不同。侧链的技术实现有多种,重点在于让资产安全地转移到侧链,并让侧链资产安全地转移回主链,也就是能安全地实现双向锚定。
双向锚定体现为主链上锁定代币后到侧链上发行同等数量的代币,以及在侧链上销毁代币后到主链上解锁相同数量的代币。以太坊侧链的概念从比特币侧链衍生而来,有单方或多方的托管方式,SPV模式,中继模式等。由于目前以太坊因生态应用繁荣拥堵,实际中用户对于侧链更偏重易用性和生态问题,也就是资产转移过程要简易无感,侧链上要有与主链相同的生态。因此目前最合格且受众最多的侧链是BSC和Heco,虽然他们使用了托管方式进行资产转移,中心化风险较高,但用户已经足够信任这些交易平台作为托管机构。完全去中心化的托管模式会因用户不了解技术,或者存在黑客攻击的风险而失去竞争力。
BSC和Heco链上的生态发展较为繁荣,和以太坊生态一样出现了借贷、交易等DeFi应用,所以有很多用户将ETH转移到BSC和Heco上来获得低Gas费的使用体验。但对于BSC和Heco来说不是将以太坊侧链作为发展目标,他们同样有独立的生态,以太坊资产转移到侧链上会因此降低以太坊主链的价值。经测算BSC和Heco提高以太坊TPS上限约十倍左右,如果未来侧链中用户使用量过多的话,侧链也会出现拥堵问题。
状态通道和Plasma
状态通道是一种在链下进行交易和状态更新的技术,比特币闪电网络就是一种支付通道。以太坊的状态通道可以让交易双方在链下进行状态的更新和交易,无需占用链上资源。他们通过状态通道进行交易时,需要对双方的行为进行签名并保存副本,每一步的操作是清晰的。如果他们结束了链下交易,就将最终状态签名后返回到主链上来更新主链上的状态。
状态通道在用户撤回资金时有挑战期的要求,是为了防止用户上传过期的交易记录牟利。用户要等待一段时间确认没有人上传更新的副本,等待期结束后会按照最新的副本内容执行。如果其中一个用户在挑战期受到攻击掉线等,他就会因无法回应而受到损失。状态通道需要有一组确定的参与者,因为在通道中的状态改变只限用于通道内的用户,而且部署状态通道需要成本,适合在一段时间内频繁进行状态更新的场景。Plasma也是一种链下交易的方式,它通过在以太坊主链上创建子链实现,交易和状态更新通过子链操作,以太坊不会保存交易副本,因此可以节约以太坊空间实现扩容。Plasma子链上同样存在区块生产者,其中的共识机制可以与以太坊主链不同。他们在以太坊上建立交易的根节点来记录子链状态,作为子链更新的证据。
为了防止Plasma链上的区块生产者作恶,Plasma使用欺诈证明机制,如果有人发现了生产者的作恶,那么可以提交证明让错误的区块回滚并没收生产者的保证金。如果用户要退出Plasma,也需要经历挑战期来证明他的交易为最新交易。但如果Plasma上所有人同时退回资金,那么可能导致以太坊主链没有容量同时处理这么多交易,会导致用户资金丢失。
状态通道和Plasma的共性问题是要求资产具有所有者,这样资产所有者才可以出具证明。但对于智能合约不属于任何人的应用来说很难与状态通道和Plasma兼容,因此这两者只能针对降低转账Gas费时效果明显,但由于易用性和挑战期的问题,技术进展处于停滞状态。
Gas相关产品
GasToken
以太坊的GasPrice不是一直都保持在高位,而是在高低之间不断变化,因此可以利用GasPrice的不断变化进行Gas的储存和套利,例如GasToken的应用。GasToken利用以太坊的定价系统实现,在清理状态和存储插槽以及删除带有自毁操作码的合约时的Gas收费为负值,也就是会收到Gas的退款,最高退款为创造时消耗量的一半。于是在低价时创建状态,在高价时删除会获得Gas,再用于其他交易就可以节约Gas的花费。GST1和GST2是使用不同机制的GasToken,铸造和销毁就完成了一次GasToken的应用,他们分别使用了储存和退款机制、创建和自毁机制来获得Gas退款,其中GST2得到的Gas更多。
1inch实践并创新了一种名为Chi的GasToken。在价格低的时候,Chi会创建来「储存」Gas,未来Gas费上涨后释放来完成交易。就相当于花费Chi退回的Gas来支付应本应花钱购买的Gas。Chi或者任何GasToken都可以集成到其他系统中来节约Gas费,用户可以铸造GasToken,也可以购买GasToken。GasToken的价格会随着GasPrice的涨跌而变化,对于用户或项目方来说,在GasPrice低的时候自行铸造更为划算。
由于以太坊网络交易量增加,账簿容量扩张,GasToken由于占用了空间被认为是不利于网络发展的。除了增加全节点成本的问题,未来对Gas操作的重新定价也会让GasToken失效,因此GasToken不应该作为长期降低Gas费的手段。
Gas衍生品
GasPrice的不断变化会让用户和矿工支出收入随之改变,为了消除这部分的不确定性,GasPrice可以被设计为期货类产品,让投机者和用户之间交易。例如uGas取一个月中以太坊交易GasPrice的中位数来定价,它类似于一种期货产品。频繁花费Gas的人可以通过购买uGas来锁定花费,矿工可以通过铸造并售出来锁定收益。但期货衍生品实用的前提是人们对GasPrice的预期不同,才能保证足够的流动性。目前以太坊网络GasPrice由网络拥挤程度决定,所以很容易出现大部分人会对GasPrice产生相同的预期。如果大家统一看涨或看跌,uGas就会因流动性问题偏离正常的定价范围而很难使用。
其他节省Gas费的方式
一些用户习惯以及相关辅助工具可以帮助用户节约Gas费,例如:
进行同种代币的批量转账;
挑选交易者休息、网络GasPrice低的时间段交易;
利用GasPrice实时监控产品确定准确的GasPrice区间;
查询常见的GasLimit范围再进行设置,避免因交易失败造成Gas费浪费;
开发者可以通过代交Gas费的方式为用户节约费用等。
思考与总结
用户在以太坊网络中支付Gas费进行交易本质上就是为使用以太坊网络资源付费,在网络拥堵资源稀缺的情况下Gas费自然就会上涨。在不减少使用人数的情况下,最好地降低以太坊Gas费的方法就是进行网络扩容,降低用户对网络资源的竞争。以太坊扩容存在多种方案,包括提高GasLimit、分片、Rollup、侧链、状态通道等,他们的优劣进展各不相同,其中分片和Rollup是最有效和最可能实现的扩容方案。简洁的代码实现也很重要,优化智能合约降低用户使用Gas的单位数量是有效降低Gas费的方式,AMM的兴起有这方面的因素。
EIP1559通过改变Gas费收取方式来改善目前的拥堵状况,虽然最终仍是网络闲暇时收费低,网络拥堵时收费高的效果,但这是由系统自动对基础费调整的结果。在网络拥堵时Gas费会呈指数型增长,高收费会抑制人们的使用需求,所以达到缓解拥堵的效果。EIP1559的方案不适合长期用于缓解拥堵的手段,但由于基础费被销毁所以整体对以太坊生态是有利的。除此之外,针对EIP1559,矿工可能会联合起来让区块的容量维持在GasTarget左右,这样想优先交易的用户和现在一样只能交给矿工更多小费。因此这里对EIP1559最终实现降低Gas费的效果存疑。对于其他的Gas产品,都不适合作为长期、大规模降低Gas费的工具使用。下表是对上文中提到的降低以太坊Gas费方式有效性和缺点的总结。
表2:降低以太坊Gas费的方式比较
如果将以太坊比作一条承载了很多汽车的公路,提高GasLimit就是在扩建公路,但过去经验告诉我们扩建公路永远赶不上路上车辆增多的速度。EIP1559是通过改变收费方案,让一些车会因高昂的收费而不愿出门,其实这是与降低Gas费让更多人享受到以太坊服务的理念相悖的。优化智能合约就是将车辆改小,让同一条公路能够承载更多的车,虽然方式可行,但车辆不可能无限制地缩小,而且大部分智能合约在部署前都考虑到了这一点。分片是在原来的基础上建立交桥和快速路,实现更有效率的扩容。Layer2是让开汽车的人放弃这种交通方式,让他们乘坐火车或者飞机达到目的地,将本应该在原链上完成的交易转移到链下进行,减少对原来公路的使用。这个比喻就很清楚地让我们看出哪些对扩容降低Gas费是有帮助的。
撰文:崔晨,就职于HashKeyCapitalResearch审核:邹传伟,万向区块链首席经济学家
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。