叔伯率(uncle rate)在交易的gas消耗的改变下如何变化是我们用来鉴定以太坊区块链能安全得承受多大压力的一个重要因素。在所有的中本聪式PoW中,任意一个被广播的区块都有变成陈腐块(stale block)的风险,即因为另一个矿工在这个区块被抵达之前广播了一个竞争区块(competing block)而不被包括在主链中,这会导致两个区块之间开始“赛跑”并两个区块中最终会有一个被抛弃。
一个重要的事实是,一个区块中包含越多的交易(或者说使用了越多的gas)会导致它需要更多的时间被扩散至整个网络。在比特币网络中,曾有一个早期的研究Decker and Wattenhofer (2013),研究表明区块的平均扩散时间约等于2秒钟加0.08秒每区块内千字节(即,一个1兆大小的区块需要约82秒)。一个近期的比特币无限研究表明,因为交易扩散技术的提升,现在的扩散时间已经降低到约0.008秒每千字节。我们也可以这样理解:如果一个区块需要更长的时间来扩散,那么它变成陈腐块的机率也越高;在区块时间是600秒的时,每提升1秒的扩散时间会相应得增加1/600的区块落后(成为陈腐块)概率。
在以太坊中,我们可以做类似的分析,当然我们要感谢以太坊的“叔伯块”机制,使得我们有了更可靠的数据来进行分析。陈腐块在以太坊中可以通过“叔伯块”的形式被包含在链中,并且他们最多可以获得75%的最初区块回报。这种机制最初为了降低中心化压力而被加入,为了降低那些高链接矿工对于低链接矿工的优势,但这种机制也存在一些其他好处,其中之一就是陈腐块永远会被记录在一个便于搜索的数据库中——即区块链。我们可以用区块1-2283415(在2016九月攻击之前)中的数据来进行分析。
这是用来生成一些源数据的脚本:
http://github.com/ethereum/research/tree/master/uncle_regressions/block_datadump_generator.py
这是生成的源数据:
http://github.com/ethereum/research/tree/master/uncle_regressions/block_datadump.csv
这些纵列分别表示:区块号,区块中的叔伯块数目,总叔伯块回报,总叔伯块gas消耗,区块中的交易数,区块所消耗的gas量,比特区块长度,除去0比特后的区块长度。
我们可以用这个脚本来分析它:
http://github.com/ethereum/research/tree/master/uncle_regressions/base_regression.py
以下是分析结果。总的来说,叔伯率稳定在0.06至0.08之间,平均区块gas消耗在100000至300000之间。因为我们分别记录了区块和叔伯块所消耗的gas,我们可以用线性回归来估算1个单位的gas所增加的区块变成叔伯块的机率。以下为我们计算出来的系数:
区块 0 to 200k: 3.81984698029e-08
区块 200k to 400k: 5.35265798406e-08
区块 400k to 600k: 2.33638832951e-08
区块 600k to 800k: 2.12445242166e-08
区块 800k to 1000k: 2.7023102773e-08
区块 1000k to 1200k: 2.86409050022e-08
区块 1200k to 1400k: 3.2448993833e-08
区块 1400k to 1600k: 3.12258208662e-08
区块 1600k to 1800k: 3.18276549008e-08
区块 1800k to 2000k: 2.41107348445e-08
区块 2000k to 2200k: 1.99205804032e-08
区块 2200k to 2285k: 1.86635688756e-08
因此,现在每100万gas价值的交易被包含在一个区块中会增加约1.86%的机率使得该区块变成叔伯块,虽然在Frontier版本中这个数字更接近于3-5%。“基数”(0-gas区块的叔伯率)一直稳定在6.7%左右。现在,我们先把这个结果放在一边,不做任何结论;之后我还会对另一个更深入的问题,即这个系数对gas limit条例的影响,进行探讨。
Gas定价
另一个会影响叔伯率和交易扩散速度的因素是gas的定价。在比特币开发讨论中,一个普遍的观点是区块大小限制是没有意义的,因为矿工有天然的驱动力来限制他们的区块大小,因为区块大小的上升会提高陈腐块机率,即威胁到他们的区块回报。鉴于比特币无限的研究,每兆区块大小会提高8秒扩散时间,且每秒扩散时间会增加1/600的机率失去12.5比特币的区块回报,可以得出每兆的交易应被收取0.000167比特币(约0.79元)的交易费,当然是在没有区块大小限制的前提下。
在比特币环境下,我们有理由长期质疑这种无限驱动经济模型,因为最终会出现无区块回报,而且因为矿工们由于包含太多交易会丧失的东西仅为其他交易生成的交易费,那么我们可以从经济学的角度推测出最终平衡的陈腐率会高达50%。当然,我们可以通过一些协议上的更改来限制这个系数。
在以太坊现在的环境中,区块回报是5个以太币,并在算法更改之前不会改变。接受1百万的gas表示1.86%的机率该区块会变成叔伯块。幸运的是,以太坊的叔伯块机制在这里有一个不错的副作用:最近的平均叔伯块回报在大约3.2以太币,所以1百万的gas仅表示1.86%的机率会丧失1.8以太币,即叔伯块机制将原来0.093以太币的期望损失降低到0.033以太币。因此,现在的gas价格,即约21 shannon,其实十分接近“经济理性”的gas价格,即33 shannon。(这是在DoS攻击之前,优化也是从那里开始,现在的价格甚至更低)。
最简单的更多降低平衡gas价格的方法是优化叔伯融入机制,并且尝试快速将叔伯块融入区块(可以通过将每个区块分别理解为“潜在叔伯块的header”来分别扩散);最终,如果每个叔伯块都被快速融入,那最终的平衡gas价格会降低至约11 shannon。
Data是不是被价格低估了?
第二个线性回归分析可以通过以下的源代码被分析:
http://github.com/ethereum/research/tree/master/uncle_regressions/tx_and_bytes_regression.py
这里的目的是为了,在考虑了以上被计算出的gas系数后,发现交易数或剩下的比特区块大小与gas价格是否有任何线性关系。不幸的是,对于叔伯块我们并没有区块大小或者交易数目的统计,所以我们不得不是使用一个间接的方式——通过观察50个一组的区块与叔伯块。这个分析所发现的gas系数比之前分析所得出的系数高:大约0.04叔伯率每百万gas。一个可能的解释是如果一个独立的区块拥有较高的扩散时间,那么它更有变为叔伯块的机率,存在50%的机率那个叔伯块确实是那个高扩散时间的区块,但是还是有50%的机率叔伯块是另一个与其竞争的区块。这个理论符合0.04每百万的“社会叔伯率(Social Uncle Rate)”以及约0.02每百万的“私有叔伯率(Private Uncle Rate)”发现;因此我们认为这是最合理的解释。
线性回归分析发现,在加上了社会叔伯率后,每比特增加了额外的约0.000002叔伯率。单个交易中的比特最多68的gas,其中61的gas用来支付带宽(其余7用来膨胀历史数据库)。如果我们gas表中的带宽系数和计算系数可以反应扩散时间,那么这表明如果我们希望真正优化gas价格,我们必须增加gas消耗50每比特(至138).这也会导致每笔交易的基础gas消耗提升5500(注意:这样的再平衡不表示所有的交易都变得更昂贵,因为gas limit也会同时提升约10%,所以一个普通的交易价格会保持不变)。同时,最差情况下的DoS攻击的风险对于运行来说比数据更高了,所以运行要求更大安全因素。因此,理论上来说不存在特别有效的证据来支持现在再次更改gas价格。
从长期协议更改的角度来说,我们可能可以为EVM内的运行和交易数据来分别建立独立的gas定价机制;因为交易数据容易被独立分离所以把这两块分开计价不是特别难,所以最佳的方法可能是想办法用市场来平衡他们;然而,具体的实施机制还需要时间来研究和开发。
Gas Limit机制
对于单独矿工独立决定他们的gas价格来说,0.02每百万gas的“私有叔伯率”是需要关注的统计数据。从系统全局的角度上来说,0.04每百万的“社会叔伯率”是最相关的数据。如果我们不考虑安全因素,同时对于0.5叔伯块每个区块的情况也无所谓(即,51%攻击只需40%的算力就能成功,其实没听起来那么糟),那么至少这个分析表示gas limit理论上来说可以被提升到约1千1百万(在现在的情况下,就是20笔平均3万9千gas的交易每秒,或者37笔最简单的发送交易每秒)。随着最新的优化,这个数字可以被提升至更高。然而,因为我们不可能对安全无所谓同时我们希望拥有一个较低的叔伯率来避免中心化风险,5百5十万的gas limit看起来更加合适一些,虽然中期来说一个关注于区块处理时间的“动态gas limit”公式可能更合适,因为它会快速得自动为了抵抗攻击和风险来自动调整。
请注意,对于中心化的风险和对于安全性的需求不会互相叠加。主要原因是在一个运行中的DoS攻击中,对于区块链来说最重要的是能存活下来,而不需要在意经济学上的抗中心化性;因为如果攻击者的最终目标是鼓励经济学上的中性化,那么攻击者可以直接花钱贿赂最大的矿池来鼓励所有的矿工都加入单一矿池。
未来,我们可以指望通过优化虚拟机来更多的降低叔伯率,当然最终也需要优化网络构架。可扩展性确实也是有限的,目前主要的瓶颈是硬盘的读写速度,所以在某个时间(约1-4千万gas)分片(sharding)将会成为处理更多交易的唯一方法。如果我们只是希望降低平衡gas价格,那么Casper会很有帮助,因为它在某个点会使得叔伯率和gas消耗的比例降低至接近于0。