区块链的确定性问题

jan   |     |   2135 次阅读

Origin post by Vitalik Buterin on May 9th, 2016

特别感谢Tim Swanson的审阅,以及他关于结算确定性的观点的进一步讨论。

结算的确定性问题是最近公有链与许可链之间的一个主要战场。看起来中心化的系统至少有一个优点,即所谓的“确定性”("finality"):操作一旦完成,就永远完成了,系统永不可能再回退回去撤销这个操作。而去中心化的系统,根据设计的不同,可能有这个性质,也可能只提供在一定激励范围内的概率性确定,甚至没有确定性,在这一点上公有链和许可链是有很大区别的。

确定性的概念在金融业中尤其重要,因为机构们需要以最快的速度确认资产是否已经在法律意义上是“他们的”了。而如果资产是他们的了,那就不能容忍一个随机产生的区块链分叉能撤销这笔转让,使他们又失去对资产的所有权。

Tim Swanson(译注:Director of Market Research at R3)在他最近的一篇文章中写到:

企业家,投资者和区块链的支持者们声称公有链可以作为金融工具的结算层。但是公有链从设计上就无法保证结算的确定性,因此他们目前无法成为金融工具清算和结算的可靠选择。

这样的说法是正确的吗?公有链真的无法提供任何形式的结算确定性?还是说像某些工作量证明神教教徒讲的那样,只有工作量证明才有真正的确定性,许可链的确定性才是幻象?或者真相比这些说法更为微妙复杂?为了彻底理解不同区块链架构所提供的确定性,我们需要数学,计算机科学以及博弈论 - 或者说密码经济学(cryptoeconomics)- 的帮助。

一切确定性都有概率性

首先我们要明确一个重要概念,这个世界上没有一个系统可以提供100%严格意义上的结算确定性。如果我们把共有权利登记在纸上,这个记录可能会被烧掉,或者某天有个坏人闯入登记机构,在每个数字1前都画一笔'c',变成一个9。即使没有坏人捣乱,某天所有知道这个记录保管地点的人同一时间都被雷劈死的事情也是有概率发生的(译注:不代表译者观点...)。因此中心化的登记系统也有同样的问题(译注:指finality),甚至可以认为此时攻击更容易实施 - 也许前不久的孟加拉国央行风波能给我们一些启示。

对于完全在链上的“不记名数字资产”,其所有权完全由区块链本身决定,因而只能靠社区驱动的硬分叉来追索。如果只是将区块链(许可链或者公有链)用作合法所有资产(土地,股票等等)的登记表,那么对资产所有权拥有最终裁决的就是司法系统了。如果这个登记表出了问题,法院会面临两种情况。第一,如果攻击者已经在司法系统反应之前设法将他们的资产转移走了,那么登记表上记录的资产数量和现实世界中的资产数量会产生不一致,因此必然会有某个人,虽然他确定性的拥有数量为x的资产,但是必须面对实际资产只有y and y < x的现实。

法院还有另外一个选择。他们完全可以无视问题登记表,拒绝以它的字面记载为准;法院的需要做的是查清来龙去脉,以一块橡皮作为应对1被改写为9的正确方式,而不是举手赞同问题数据并表示现在所有人都更富有了。此时我们再一次看到,确定性并不确定,只不过这一次我们对确定性的违反是为了社会福祉。这些观点可以如数用到其他所有用于维护和攻击登记表的方式上,包括公有链和联盟链上的51%攻击。

比特币的经验告诉我们“所有的登记表都会出错”这个理论观点可能比想象的更加实际。在比特币的历史中一共出现过三次在足够长的时间之后交易被撤销的事件:

  • 2010年,攻击者利用一个整数溢出缺陷给自己创造了一千八百亿的比特币。这个问题最终被修复,代价是大约半天之内的交易被撤销。
  • 2013年,由于某个只在特定版本中存在的bug,比特币产生了分叉,导致一半网络拒绝接受另一半网络认为正确的链。这次分叉持续了6个小时。
  • 2015年,因为矿池产生了无效区块又不进行验证,大约6个块被撤销。

在这三次事件中,只有导致第三次的根本原因是公有链独有的:这些矿池的非正常行为正是由于经济激励设计的问题导致的(本质上等价于验证者悖论)。在另外两次事件中,罪魁则是软件错误 - 一个同样可以发生在联盟链中的问题。有观点认为类似PBFT这样偏好一致性的共识算法可以避免第二类事件的发生,但即便如此,由所有节点软件自身溢出缺陷导致的第一类事件依然无解。

因此我们有理由相信,如果你真的希望减少系统故障率,那么一个比“从公有链转向联盟链”更有价值的建议是:运行多个版本的共识协议实现,当且仅当一个交易被所有实现都接受的时候才认为它被最终确定了(这正是我们给交易所以及其他以太坊上项目的建议)。公有链/联盟链是一个错误的对立:如果你想要真正的健壮性,而且认同联盟链支持者所说的联盟信任模型更安全的观点,那你应该两者都用。

工作量证明中的确定性

从技术的观点看,工作量证明区块链上的交易永远也不会最终确定,对于任何一个区块,随时都存在着冒出一条更长的始于它的父块又不包含它的分叉的可能。然而在现实中,公有链上的金融服务已经演化出了一种非常实用的方法来判断一个交易是否足够近似确定:等6个确认。

这里的概率计算很简单:如果攻击者拥有的算力不到25%,我们便可以用随机漫步来描述双花攻击,随机漫步从-6开始(意味着攻击者的链比原来的链短了6个区块)。通过公式(0.25 / 0.75)^6 ~= 0.00137,我们可以计算出这个随机过程达到0的概率(即攻击者的链超过原来的链的概率),小于几乎所有交易所的手续费率(译注:攻击成本)。如果你想要更高的确定性,可以等待13个确认让攻击者只有百万分之一的成功机会,或者等待162个确认使得攻击者的机会比直接猜出你的私钥还低。因此,即使在基于工作量证明的区块链上也存在一定程度的确定性。

问题是,我们的计算假设了75%的节点是靠谱的(对于更低的比例,例如60%,会有近似的结论但是需要更多的确认数)。这个前提能在我们的激励模型中成立吗?攻击者可以贿赂矿工都选择攻击者的链(一个比较实际的贿赂方式是运行一个负费率的矿池,或者名义上零费率另外补贴收益率来避免招人怀疑),P + epsilon attack就是一个思路。攻击者还可以尝试黑进矿池或者破坏矿池基础设施,这在对工作量证明的安全保护缺少激励的环境下实施成功的概率不小(如果矿工被黑,他们只会损失一段时间内的奖励,本金是安全的)。最后还有Swanson说的所谓的“马其诺防线”攻击:投入巨量的金钱制造出比全网更高的算力进行简单碾压。

Casper中的确定性

Casper尝试提供比工作量证明更高的确定性保证。首先Casper对“经济上完全确定”(total economic finality)有标准定义:当大于等于2/3的验证人以最大概率投注一个区块或者说状态会最终确定的时候。在这个定义下验证人有非常强的激励不去合谋推翻这个区块:一旦验证人作出了最大概率的投注,在任何一个不包含这个区块的分叉中验证人都会失去他们全部的保证金。正如Vlad Zamfir指出的,你可以把Casper想象成一个参与51%的攻击会导致你的矿机被烧毁的工作量证明变种。

其次,由于成为验证人需要事先申请,这意味着不可能存在另外的验证人在悄悄的制造另一条更长的链。如果你看到2/3的验证人将他们的全部本钱压倒了某个块上,然后又发现有2/3的验证人对另一个矛盾的块做了相同的事,那么这只能说明这两组验证人的交集(即至少1/3的验证人)将失去他们的全部保证金。这便是所谓的“经济上的确定性”:我们无法保证“X永远不会被撤销”,但我们可以保证的是一个稍弱的说法,“X要么永远不被撤销,要么有一大群验证人自愿的销毁他们自己价值数百万美元的本金”。

最后,即使双重确定(double-finality)的事件真的发生了,用户也无需被迫接受有更多投注支持的分叉。相反,用户可以自行决定追随哪个分叉,一个完全可行的简单策略是接受“先来的那个”。Casper中的一次成功攻击更像是一次硬分叉而不是回退,而持有链上资产的用户社区可以自由的基于常识选择那条不是攻击者制造的,而是包含真正应该被确定的交易的分叉。

法律与经济

可惜这些强有力的保证依然是经济上的。正如Swanson在他的下一个观点中说到的:

因而,如果原生代币(例如比特币或是以太币)的市场价值上涨或下跌,矿工为竞争铸币权和手续费而产生的工作量以及合约的成本价值也会随之变动。这就留下了一种可能,在特定的经济环境下,恶意节点可以成功的促成链上区块的重组。

这个观点有两个版本。一种来自“极端法律主义者”,他们认为“区区经济保证”没什么价值,只有理论意义,法律保障才是唯一有效力的保证。这样的观点显然不对:在很多情况下,法律能对不法行为给予的主要或者唯一惩罚便是罚款,而罚款正是一种“区区经济激励”。如果区区经济激励能被法律所用,那么至少在某些场合,它们也能被结算系统所用。

第二个版本要简单和务实的多。假设现在所有以太币的价值加起来是7亿美元,你发现进行一次成功的51%攻击需要价值3千万美元的算力,而一旦Casper上线你预计资本参与率将是30%,因此要撤销一个确定交易需要的最低成本是 7亿美元 * 30% * 1/3 = 7千万美元(如果你愿意把对验证人在线率的容忍度降低到1/4,则可以换来3/4的确定性阈值,从而把作恶资本的交集增加到1/2,使攻击的最低成本上升为1亿500万美元)。如果你要交易价值为1亿美元的证券,期限是两个月,那么不会有什么大问题;公有链的经济激励设计可以很好的防止恶意行为,任何的攻击都不会划算。

现在假设你同样交易价值1亿美元的证券,但是会在5年的时间内用以太坊公有链作为底层。此时你拥有的确定性要少得多。以太币的价格可能不变,更高,或者归零。Casper共识的资本参与率可能上升到50%,也可能掉到10%。因此,发动一次51%攻击所需的成本完全可能下降到,例如,一百万美元以下。在那个时刻,通过51%攻击配合一些市场操纵来盈利是完全可行的。

还有一种情况更简单:如果你要交易价值1千亿美元的证券呢?此时攻击公有链的成本想对于市场操纵可获得的收益来说可以忽略不计,因此此时公有链完全不适用。

需要指出的是实际上攻击成本的计算比上面的例子要更复杂。如果你要通过贿赂现有的验证人来发动攻击,这些计算没问题。现实中更可能发生的是,你需要购买代币来发动攻击,根据确定性的阈值不同这会使成本变为1亿500万或是2亿1千万美元。购买代币这个操作本身又会影响代币价格。攻击本身,如果计划得有瑕疵,必然会使实际处罚比例大于理论上的最小值1/3或1/2,导致攻击所能获得的收益要远小于预期。但基本的原理依然是成立的。

于是我们可以说,这个观点的弱化版本,也就是说公有链的经济安全边界对于高价值的资产来说太低了,是完全正确的,金融机构探索在特定场景中使用私有链和联盟链是完全合理的。

防审查以及其他考量

对公有链的另一担心是其防审查的性质,即任何人都可以发起交易,而金融机构总是有需要去限制系统中的参与者或是参与形式。这也是完全正确的。对此有一种针对性的观点是公有链尤其是类似以太坊这样高度通用化的区块链,可以作为实现这些限制的系统的底层:例如,你可以创建一个只允许白名单内的账户参与或是只有代表某机构的账户才有管理权限的代币合约。对此观点的反驳是这样的设计完全是没有必要的复杂,相较于直接在许可链上实现这些机制,你需要承担公有链为做到防审查和独立于传统司法体系而付出的成本,同时放弃其好处。这样的观点是合理的,但是需要指出的是这个关于效率的反驳,而不是关于可能性的。所以如果除了防审查之外的好处(例如,更低的协调成本,网络效应)足够大,这个理由会变得需要商榷。

除此之外还有另外的效率考量。由于公有链必须保持高度的去中心化,节点软件必须能够在标准的消费级电脑上运行。这就给交易吞吐量设置了一个在许可链中不存在的限制,在许可链中我们可以轻松要求所有节点都运行在64核相互之间以高速网络连接的服务器上。在未来,我们需要通过诸如分片的创新来缓解公有链的这个问题,如果进行顺利的话在5年左右的时间内公有链的吞吐量将可以无限扩充,只要并行程度足够高,网络中有足够多的节点。但即使这样公有链和许可链之间依然不可避免的会存在一些效率和成本的差异。

最后一个技术考量是时延。公有链运行于成千上万的通过公开网络连接的消费级电脑之上,而许可链则运行在通过高速网络相连的数量少得多的一组节点上,这些节点甚至可能物理上非常接近。因此许可链的交易时延,也就是最终确定所需要的时间,必然低于公有链。与效率问题不同,这是一个永远无法通过技术进步解决的问题:与我们希望的相悖,摩尔定律无法让光速每隔两年翻倍。无论我们做多少优化,一个节点位置任意的网络和节点相邻的网络之间终究会有差异,而且这个差异基本上是肉眼可见。

与此同时,公有链当然有它自己的优点,也许在很多场景下运行联盟链所需的法律,商务和信任成本会高到让人选择公有链。而公有链的很大一块价值在于任何人,无论拥有什么样的社会资源,都能在上面构建应用:一个14岁的孩子也可以实现一个去中心化的交易所部署到区块链上,其他人可以评估这个应用并根据自己的需求使用。许多开发者不具备发起一个联盟的能力,而公有链对于这一类开发者来说非常关键。公有链的另一个重要优点是可以轻松实现的跨应用的协同。最终,我们将看到这两种体系随着时间进化,服务于不同的人群,而它们也面临着包括扩展性,安全性和隐私保护在内的共有挑战,因此双方都可以从合作中获益。

译者: jan