区块链资源定价(上)
为想创建项目的朋友搭建创业平台,请感兴趣的朋友加乐乐微信:sensus113
NervosFans 微信公号:Nervosfans
谢谢!
Vitalik Buterin
摘要
区块链协议设计中最具挑战性的问题之一就是如何对提交的入链交易进行限制与定价。交易会为发送人带来某种私人利益的同时,由于交易必须被网络中所有的节点处理,因此也会为网络整体带来社会成本。这也导致了典型的“公地悲剧”问题。此种情况下,资源的定价通常由经济理论定夺,将价格设定为与消耗各种资源的行为对网络施加的社会成本相等。然而,有鉴于涉及的计算、带宽与存储资源的异构本质,大部分的社会成本都以一种无形且危害难以估量的形式存在(譬如集中风险),所以亟需创建出一种不需人为干预也能在未来各广泛场景下自动设置价格的算法,种种这些都使得设置出最佳的限制方案极为困难。本文对各种改善边际现状的方案与策略的利弊进行了深入讨论。[后期兴许会改改]
1. 简介及模型
区块链是一个去中心化的网络,由大量计算机组成,交易发送人传到链上的各种交易必须由这些计算机处理。因此,发布到区块链的交易为发送人带来部分私利的同时,也会为网络参与者带来一种外部社会成本。想要清楚解释这种社会成本,同时防止区块链沦为公共资源库,需要有经济机制对哪些交易可以上链做出一定的限制。有鉴于能用来解决此类资源定价问题的经济机制有多种,需要对涉及的社会成本的本质与类型有更为深入的理解,才能从中选出最优方案。
社会成本可以通过两种方式分解。首先,可以根据资源支出的基本类型进行分类:
带宽成本:全部节点下载(每笔)提交交易、打包入块并将其作为区块的一部分重新广播的成本。
计算成本:节点验证交易的成本。
历史存储成本:(存储区块链历史的)全部节点存储交易的成本,存储时间可能是永恒。
状态存储成本:交易影响状态大小(如合约代码、帐户余额)的边际成本。节点为了能够处理以后的交易,必须存储状态。
注意,前两个成本由交易被包含时恰好在线的节点承担,第三个成本由当时在线或即将上线的节点承担,而第四个成本须由全部节点永久承担,除非后边引入个什么方案能让所有状态条目变成临时的。
其次,也可以通过不同类型的一阶、二阶效应进行分类。 我们可以这么理解,将区块链看作是有n个(C1、C2、 ... Cn)计算机的网络,其中任何被包含到区块链的交易必须由网络中在线的全部节点处理。 有的交易简单有的交易复杂;每笔交易都有某个“重量”W,这个W表示处理该交易所需的资源数量。
每名用户Ui都有个能直接资源成本的函数Ri(W),代表处理给定重量所产生的(由用户承担的)成本。 这个成本可能包括电力与带宽成本、边际硬盘损耗、用户的其他应用运行速度较慢带来的不便以及电池寿命缩短等等。W足够高时,成本会在某一时刻超出用户的承受范围,此时用户离线(我们假设该点之上Ri(W)保持不变)。 设NodeCount(W)为W重量时仍在线的用户数量。注意,出于以下两个原因(之一),不同用户可能在不同时间点离线:(i)某些用户的资源成本低于其他人,以及(ii)某些用户比较重视与区块链相连。
存在某个效用函数D(k),能够反映出去根据在线节点数量产生的不同去中心化水平中的社会价值,而该价值可被转换为总交易负荷的函数D(W)。 还可能存在某个成本函数A(W),能够反映出随更多交易被包含而增加的攻击网络。 我们可以把所有这些成本概括成一个组合成本函数:
C(W) = ∑iRi(W) + (A(W) – A(0)) – (D(W) – D(0))
上述内容已构成本文旨在描述的区块链模型;除了那些能够影响NodeCount、A以及C的共识算法和区块链设计模式等的细节,并不需要关注其他PoW、PoS、区块结构等。
2. 过往研究
比特币、以太坊中,在资源定价方面采用了简单的“限额交易”方案。方案为交易消耗的资源数量定义了一个尺度(“重量”或“gas”),同时协议还规定了区块中包含交易能够消耗资源的最大值。区块的总重量低于该限制时,验证人可以自由选择(要打包的)交易。 如此,建立起了一种均衡态,用户为自己的交易附上交易费,交易费最终流向交易打包进区块的验证人;验证人则选择每单位重量支付费用最高的交易(进行打包)。 譬如,比特币中,重量上限为静态的4*10^6,重量的定义如下[1]:
其中len(x)返回x中的字节数。出于尝试为历史及状态存储成本定价的技术原因,交易签名中的字节在价格上比交易中的非签名数据更便宜。 以太坊中,度量的方法叫‘gas’,就是把区块的大小、验证交易的计算成本以及执行智能合约代码的成本都放在一起(算)。简单起见,算法大概是个样子的(Gas函数远比这复杂。):
每个区块设gas上限,验证人可以对此gas上限进行投票,意思是创建区块时,矿工通过投票的方式“提”或“降”这个上限,但是增减不超过0.1%,撰写本文时,绝大多数验证人投票支持的gas上限在800万左右。
这种方法有个主要的问题是难以先验地确定合理的重量限制,而且就此时常出现争议。文的目的旨在试图超越“限制必须得有,所以看看怎么定合适”的一维设计空间,并对能够解决‘资源消耗外部性问题’的更为广阔的政策空间进行探索,同时尝试制定出一种既适合当前情形又能稳健应对远期经济环境变化的政策,以减少对硬分叉等“协议干预”的依赖。
3. 不确定情形下的资源定价
区块链资源定价与环境污染监管响应存在众多相似之处。比方说,尽管区块的验证人会因为发布交易收到奖励,但是发布区块的成本则需要由所有全节点共同承担,有点类似一家工厂排污整个村子跟着遭殃(至少周边的村子要跟着遭殃的,对吧)。 这个全节点们必须背负的成本就是我们想要限制的负外部性。 区块链和环境监管机构都采用了经济干预手段来限制具有负外部性的活动,这些负外部性中既有可测量的部分也有高奈特式不确定性(Knightian uncertainty,未知的未知)的部分[2]。所幸,环境经济学[3]中的许多研究结果恰好直接适用于区块链领域。
Weitzman在1974年发表的论文“价格vs.数量”[4]中,概述了价格监管(如碳税)与数量监管(如发行一定数量的许可,让其在市场上交易)间的tradeoffs。 Weitzman引用到的一个非常重要的见解是,‘政策制定者掌握了有关社会成本函数以及资源消费需求曲线(也叫“效益函数”)的完整信息时,两种方法是等价的’:对于任何期望的价格,人们都可以选择基于数量的等价政策,意思是发行的(许可)数量等于以此价格购买(许可)的均衡数量。 然而,当成本效益曲线的位置和形状存在不确定性时,这两种方法就出现了实质性的差异。
假设消耗某个资源的边际社会成本(负外部性)是固定的,但边际效益函数迅速下降。政策制定者设定的数量限制过低时,该数量限制会在成本收益显著高于社会成本时与效益函数曲线相交,此时消费者从非消费中遭受非常大的机会成本。相反,政策制定者制定了价格上限时,误算造成的损害就要低得多。
另一方面,弃权的私有成本固定,消费的边际社会成本迅速增加时,设定价格的风险则会变得更高。譬如,假设消费的社会成本小于1000个资源单位时没问题,但是超过1000就有可能带来灾难性的后果(类似全球变暖中“临界点”[5])。假设已经消耗了1050个资源单位,这时候再消耗掉1个资源单位的边际社会成本显然是远远高于只消耗掉900个资源单位时的时候。这种情况下,若政策制定者料到消耗会是900的水平,然后把税收定在900这个水平的边际社会成本,那么该政策会大大低估多余的资源消耗所造成的额外的社会损害。另一方面,只发行900份许可并允许其在市场上交易的政策制定者就就没这么大的风险。
图(a)-(b)显示了第一种场景,即价格限制优于数量限制。图(c)-(d)显示了第二种场景,即数量限制优于价格限制。总而言之,消费者的边际私有成本随数量增长增速大于边际社会成本的时候,
限价比限量好,反之限量好。注意,我们之所以用到了二阶导数是因为这里在专门讨论边际成本的变化率。
上述论点仅适用于成本与效益独立分布的情形。成本、效益曲线的变更相互关联时,必须在选择规则中添加一个条款,从而增加数量限制的相对吸引力。为了直观地看待这一点,考虑下成本效益中的不确定性完全相关的极端情形;这种情况下,对成本效益的原始估计不正确时,两条曲线将同步向上或向下移动,所以新均衡态会直接高于或低于原始估计值;因此,限量政策全面碾压限价政策。本文仅分析了两种可能的策略,但可选的方案远不止于此。政策空间可以被看作是给定资源供给曲线的可能空间,其中定价政策代表水平供给曲线,限额交易方案代表垂直供给曲线。各种形式的对角线供应曲线也是可能的,而且在多数情况下,某种非严格水平或垂直供应曲线才是最佳的。
所以,究竟哪一种才是最优选?是区块链的块大小限制,还是块大小不设限但是规定每消耗一个资源单位要收取固定费用,亦或是介于中二者之间的什么策略,好比,用包含在区块中的重量的函数F(w)这种方式收取费用,其中F’(w)增加且可能达到渐近线。为了估算出价格vs.数量框架下的最优政策,我们可以首先尝试估算下社会成本函数。
康奈尔大学[6]的一项研究中提供了不同区块链重量负荷下的节点数量估值。 该研究是在比特币的重量公式仅为每字节一个重量单位,重量限制为106的情况下进行的。研究发现,W = 4*10^6时,90%的节点保持在线;W = 3.8*10^7时,50%的节点保持在线状态。
作为第一个量化拥有更多节点数为去中心化带来的价值的近似值,我们可以使用对数效用D(W) = log(NodeCount(W))。我们发现NodeCount(W)大致与1/W成正比,也就是说D(W) = −log(W),也就是说D’(W) = 1/W,意思是说:边际社会成本函数正在减少。
但是,此模型未考虑到大块更长的传播时间会导致的其他危害。根据2013年Decker和Wattenhofer进行的一项研究,区块在网络中的传播时间与块大小大致呈线性关系。 Zohar和Sompolinsky [7]表明,网络延迟时间为t、出块时间为T的情况下,诚实区块的创建速度从1/T减慢到1/(T+t),因此降低了1/2到q的“51%攻击”抵抗力,其中q/1-q * 1/T = 1/(T+t),即q = T/(2T+t)。将成本函数定义成A(x) = 1/MinAttack(x)看似合理,其中MinAttack(x)指攻击成功的最低大小;由于MinAttack(x) = T/(2T+t),那么A(x) = 2 + t/T。t是W的函数;W中的t呈线性时,就意味着对于某个常数k,A(W) =2 +k*W,因此社会成本函数呈线性。
我们可以看看以太坊中区块gas使用与“叔伯率”之间的相关性,“叔伯率”用来衡量未能进入规范链的出块占比,此种处块对链的安全无任何贡献。
区块gas上限与叔伯率之间的关系图中的非线性部分是数据中的人为因素;2017年年末期间,交易的构成从智能合约用例转向ERC20通证转移,后者对叔伯率的影响大于智能合约的使用,原因是前者的gas消耗主要来自带宽与计算成本,而非代码及存储。 左上角的点代表2016年的DoS攻击。 下图是2017年年末开始重新调整过的图表,删除了2016年的DoS攻击:
2016 年12月- 2017年9月区块gas上限与叔伯率之间的关系但是,超线性成本也是有的。客户端既要处理主链也要处理未能进入规范链的叔伯块;因此,规范链吞吐水平x导致了叔伯率p时,实际的计算负担水平为x/1−p,其中分母随规范链吞吐量的增加而逐渐减小至零。此外,随叔伯率变高,自私挖矿攻击变得更加容易[8],而且节点数降低定会导致挖矿合并,进一步增加自私挖矿的可能。因此可能出现的一种情形就是,不断增加W直至t = T 时的社会成本是W被设成t = T *0.1时的十倍。
即使成本函数在极端情况下是超线性的,分布的靠下侧仍呈线性,且康奈尔大学的研究还表明函数甚至有可能是次线性的。块大小从10kb增至1000kb时,产生巨大的社会成本,原因是物联网设备、智能手机、Raspberry Pis等想要保持连接困难重重,但是块大小从1000kb增至1990kb时,成本便没这么高了,原因是该时间间隔内从可用变成不可用的用例范围要低得多。因此,可以认为社会成本曲线是U形的:
区块链认可交易的总社会成本曲线3.1 私有效益曲线估算
私有效益曲线,即发送交易的需求,估算起来要困难的多。 我们通过比特币和以太坊区块链中的某些“自然实验”,试着估算下“需求弹性”(即价格降低1%时需求增加的百分比)这个变量。
有种自然实验是在区块链容量由于某些外在因素突然改变时,查看日常交易费的变化;最简单的就是以太坊的gas上限变动还有比特币的区块时间因为比特币跟比特币现金的交互所以不稳定这两种。 图表显示了由于区块时间临时增加而导致比特币区块链容量减少与交易费水平高峰之间的相关性:
根据其他对类似数据进行的更为全面的分析[9],比特币的弹性为0.4-0.7,以太坊为1-2。
此外,需要注意,这只是衡量短期需求的曲线,考虑的是几日到几个月内采取的行动,并未考虑到几年后市场上可能出现的长期调整;譬如,现实世界中,汽油的长期需求弹性高于短期弹性是个既定事实[10];就比特币交易费与以太坊gas而言,情况也是如此。
目前为止,该模型提出了斜率在-0.4和-2之间的效益曲线(重新缩放使得当前供需交叉点在(1,1)时),则难以确定社会成本曲线(缩放后的)的斜率,但是目前来讲各种区块链的边际应该不会很高,正负都有可能。这表明平均每单位重量(社会成本曲线)的协议内交易费+在边际社会成本开始快速增加时设置硬上限的(组合)方式,优于纯粹的基于重量限制的制度。
未完待续。