令人困惑的以太坊GAS机制暨曌链MIT全新智能合约代码消耗解决方案区块链
如果gas总消耗超过gaslimit,那么所有的操作都会被复原,但交易是成立的并且交易费任会被矿工收取。

什么是以太坊的 GAS?
以太坊在区块链上实现了一个运行环境,被称为以太坊虚拟机(EVM)。每个参与到网络的节点都会运行都会运行EVM作为区块验证协议的一部分。他们会验证区块中涵盖的每个交易并在EVM中运行交易所触发的代码。每个网络中的全节点都会进行相同的计算并储存相同的值。合约执行会在所有节点中被多次重复,这个事实得使得合约执行的消耗变得昂贵,所以这也促使大家将能在链下进行的运算都不放到区块链上进行。对于每个被执行的命令都会有一个特定的消耗,用单位gas计数。每个合约可以利用的命令都会有一个相应的gas值。这里列了一些命令的gas消耗。
以太坊虚拟机(EVM)中运行的所有智能合约都使用 solidity进行编码(以太坊计划未来将从Solidity转移到Viper。)每一行代码都需要一定量的gas来计算,就好比汽车要用汽油。
下面图片来自以太坊黄皮书(Yellow Paper),我们可以大致地了解以太坊代码的成本。

图1: 以太坊代码行为和应付GAS数量
gas和交易消耗的gas
每笔交易都被要求包括一个gas limit(有的时候被称为startGas)和一个交易愿为单位gas支付的费用。矿工可以有选择的打包这些交易并收取这些费用。在现实中,今天所有的交易最终都是由矿工选择的,但是用户所选择支付的交易费用多少会影响到该交易被打包所需等待的时长。如果该交易由于计算,包括原始消息和一些触发的其他消息,需要使用的gas数量小于或等于所设置的gas limit,那么这个交易会被处理。如果gas总消耗超过gas limit,那么所有的操作都会被复原,但交易是成立的并且交易费任会被矿工收取。区块链会显示这笔交易完成尝试,但因为没有提供足够的gas导致所有的合约命令都被复原。所以交易里没有被使用的超量gas都会以以太币的形式打回给交易发起者。因为gas消耗一般只是一个大致估算,所以许多用户会超额支付gas来保证他们的交易会被接受。这没什么问题,因为多余的gas会被退回给你的账户。
估算交易消耗
一个交易的交易费由两个因素组成:
· gasUsed:该交易消耗的总gas数量
· gasPrice:该交易中单位gas的价格(用以太币计算)
交易费 = gasUsed * gasPrice
gasUsed
每个EVM中的命令都被设置了相应的gas消耗值。gasUsed是所有被执行的命令的gas消耗值总和。如果希望估算gasUsed,可以使用这个estimateGas的API
gasPrice
一个用户可以构建和签名一笔交易,但每个用户都可以各自设置自己希望使用的gasPrice,甚至可以是0。然而,以太坊客户端的Frontier版本有一个默认的gasPrice,即0.05e12 wei。矿工为了最大化他们的收益,如果大量的交易都是使用默认gasPrice即0.05e12 wei,那么基本上就很难又矿工去接受一个低gasPrice交易,更别说0 gasPrice交易了。

图2: 以太坊代码gas消耗模式
gas limit
区块gas limit是单个区块允许的最多gas总量,以此可以用来决定单个区块中能打包多少笔交易。例如,我们有5笔交易的gas limit分别是10、20、30、40和50.如果区块gas limit是100,那么前4笔交易就能被成功打包进入这个区块。矿工有权决定将哪些交易打包入区块。所以,另一个矿工可以选择打包最后两笔交易进入这个区块(50 40),然后再将第一笔交易打包(10)。如果你尝试将一个会使用超过当前区块gas limit的交易打包,这个交易会被网络拒绝,你的以太坊客户端会反馈错误"交易超过区块gas limit"。以下例子是来自于以太坊StackExhcange的帖子。目前区块的gas limit是 4,712,357 gas,数据来自于ethstats.net,这表示着大约224笔转账交易(gas limit为21000)可以被塞进一个区块(区块时间大约在15-20秒间波动)。这个协议允许每个区块的矿工调整区块gas limit,任意加减 1/2024(0.0976%)。

表1: 以太坊智能合约指令GAS价格

图3: 以太坊GAS和ETH之间价格汇率
奇葩的ETH和GAS双重机制
在同一个系统中为何要维持两套token机制,这本身就很令人困惑,对于一些初学者常看到以下错误:
“您的交易中出现的gas与您的交易之间存在差异,没有足够高的费用来支持交易(out of gas)”。
gas和ETH是以太坊中两种不同的计量单位,把它分开的目的是为了避免以太币的价格波动进而影响gas价格的变化。从比特币简单明了的手续费浮动机制看,以太坊的gas交易费机制简直就是在做无用功。
从经济学的角度看,稀缺是价值的另一种说法。公有链的区块空间是稀缺资源,使用必须付费。如果区块链交易不付手续费,就会很快地被垃圾交易填满。比特币区块空间满了,手续费上升,满而不堵。而ETH涨价,而让交易者、矿工和智能合约设计者共同决定gas price,以达到稳定gas cost的价格,这种多余的设计似乎并不能改变用的人多了,要么拥堵要么交易费涨价的必然趋势。
稳定gas cost的目的并没达到,多余的设计倒是带来了副作用。Gas price的价格可以由交易者、智能合约设计者、矿工三方分别设定,相对于比特币手续费由交易者设定,矿工选择高价打包的简单模式。过于复杂,而使gas price的市场调节机制失灵。Status ICO的火爆,引爆了以太区块链的一个漏洞。status的智能交易设定了手续费限制,大于50Gwei就会被弹回(rejected),因此,大量的投资者设定固定手续费不停的刷,18.1ETH,18.9ETH,18.8ETH这样不停的投注,使以太网络中充满了大量的无效交易。造成了以太坊网络堵而不满的现象,正常交易无法被打包。就类似现在的房地产,政府限制开发商的备案价,不走关系根本抢不到房。智障合约的设计者充当了政府限价的角色。
另外,status设定了ICO开始和结束的区块高度,由于投资者时间不可能准确到毫秒级,很多提前和滞后的交易也被弹回,也制造了不少垃圾交易。
从这个案例可以看出,智能合约设定者,作为市场的规则设定方。搅乱了交易费市场供给和需求的自动调节机制,这是以太类可编程区块链的固有缺陷。你不知道下一个智能合约会设计出什么规则,又搅乱支付层的稳定性。越火爆参与的人越多,以太区块链越脆弱。
还有去年可笑的漏洞事件,以太坊区块链居然会被DDOS攻击,去中心化的比特币从来和DDOS攻击没有交集。最近,ETH暴涨掩盖了以太去年出过的致命漏洞。2016年10月,黑客运行了一个智能合约DOS,调用了EXTCODESIZE 操作码,使gas price的价格极低,攻击交易调用此操作码的频率大约是50000次每区块,使以太网络的确认时间变长。为了防止硬分叉,以太坊采用了限制gas limited数量的临时措施。一种治标不治本的措施。
以太坊纯粹是将一个简单地事情复杂化!

曌链MIT的全新智能合约代币消耗机制
不同于以太坊智能合约中使用消耗GAS的复杂计算机制,MIT区块链采用一种全新的解决方案,即锚定一个基本稳定的参照物比如USDT作为计算智能合约中代码执行成本计算的方式,即定义每个指令的执行成本以法币计,消耗代币的数量=指令成本 ×指令数量 ×代币市场价格,避免了的以太坊设计两套ETH和GAS机制的复杂方案。
例如执行一个指令成本定义为0.00001个USDT,一个简单智能合约代码脚本中含有1000条指令,当前市场MIT对汇率价格是1个MIT对10个USDT,那么整个智能合约执行共需要:0.00001×1000×10=0.1USDT,约合0.01MIT,如果市场波动剧烈变为1个MIT对0.001USDT,执行同样的智能合约对应的USDT币成本不变,但是需要支付的MIT数量变为100个MIT(在实际执行中系统会给出当前脚本所需MIT数量,而且我们按1.2倍来建议用户填写代码消耗成本防止token不够而被强制终止运行)。

表2: MIT区块链智能合约指令价格
对于想提升智能合约优先级的用户,我们直接提供另外的一个变量transPriority,缺省值是0,可以填入任意正整数的MIT代币来提高该合约的优先级。
联系方式:
网址: mit.club
曌链MIT公众号QR码:

1.TMT观察网遵循行业规范,任何转载的稿件都会明确标注作者和来源;
2.TMT观察网的原创文章,请转载时务必注明文章作者和"来源:TMT观察网",不尊重原创的行为TMT观察网或将追究责任;
3.作者投稿可能会经TMT观察网编辑修改或补充。

