当前位置:首页 > 区块链新闻 > 正文

Vitalik Buterin:软分叉,硬分叉,默认性和强制性

来源: 互联网时间:2017-03-23 10:43:00

在区块链的相关话题讨论中,有一个非常重要的讨论是关于:在协议升级机制中,是首选软分叉好还是硬分叉好。软分叉和硬分叉的一个基本区别在于,软分叉通过严格地减少有效的交易数目来改变协议的规则,所以遵循旧协议规则的节点们依然可以保留在新的链条上(假定大多数的矿工们/验证器来实现分叉),而硬分叉则是说允许先前无效的交易和区块使他们变得有效,所以用户们必须升级他们的客户端,这样他们才可以留在硬分叉后的新的链条上。在硬分叉中,有两种子类型的硬分叉:1. 完全扩展硬分叉(strictly expanding hard forks),其完全地拓展有效的交易集,并且因此旧规则能够有效地兼容新规则,2. 双向硬分叉(bilateral hard forks),并且其中的两个规则集均不兼容。

这里用一张维恩图来说明分叉的类型:

分叉

通常引用的两个优点如下所示:

  1. 硬分叉会使得开发人员在进行协议升级时会更具有灵活性,因为他们不需要额外考虑这个新的规则是否适合旧的规则。
  2.  软分叉对用户而言更加方便,因为用户们不需要额外的升级就可以继续保持在新的链条上。
  3.  软分叉不太可能会导致链条分裂。
  4.  软分叉在真正意义上来说,只需要得到矿工们/验证器们的同意(即使用户使用的是旧的规则,如果节点使这个链条使用新的规则,那么只有在新规则下有效的事务才可以进入到链条当中,在任何情况下都是这样)。而硬分叉则需要用户选择同意。

除此之外,硬分叉的主要批评点在于,硬分叉都是“强制性”的。这里所指的强制性不是指得物理的力量,相反,她是网络效应的一种强制性。也就是说,如果网络将规则从A改到了B,那么即便你个人更偏向于A,如果大多数用户都喜欢B并且切换成了B,那么即便你个人不喜欢B,也不赞同切换成B,但是为了能够和其他人同步留在同一个网络上,你也必须切换成B。

硬分叉的支持者们通常被嘲笑为:试图对网络产生“恶意接管”的影响,并且“强迫”用户们与他们一起并行。此外,链条分裂的风险通常在于硬分叉是不安全的。

我个人观点是,这些批评指正是错误的。并且在许多情境下,这些情况往往是背道而驰的。这个观点并不是特定针对以太坊,或者是比特币,或者是其他的区块链;它源于这些系统的一般特性,并且适用于它们中的任何一个。此外,下面的论点只适用于有争议的改变,其中至少有一个选区(矿工们/验证器和用户)有大部分不赞成;如果改变这件事情不是非常有争议性的话,那么它可以非常安全地完成,不管这个分叉的形式是怎么样。

首先,让我们讨论强制性的问题。无论是软分叉还是硬分叉,都多多少少改变了协议的方式,使得部分用户不喜欢。尤其是当这个协议得不到100%支持的时候,改变这个协议会让一部分的用户不喜欢。此外,几乎不可避免的是,在任何情况下,异议者们更加重视与大部分人群保持同步的网络效应,这超过了他们对于协议上自己的偏好。因此,在网络效应这个意义上来说,两种分叉都是强制性的。

然而,软分叉和硬分叉之间存在着本质性的区别:硬分叉是选择性加入,而软分叉则让用户无路可选。为了方便一个用户来加入一个硬分叉的链条,他们必须亲自安装软件包来实现分叉规则,并且不同意规则改变的用户群体们的反应,比他们重视的网络效应还要强烈,理论上他们可以停留在旧的链条上-而且,实际上,这样的事情已经发生了。

这在完全扩展硬分叉和双向硬分叉的情况下都是适用的。然而,在软分叉的情况下,如果分叉成功,那么没有分叉的链条就不存在了。因此,软分叉显然在体制上更偏向于强制而非分离,而硬分叉则有相反的倾向。我个人的道德观念使得我更支持分离而不是强制,虽然其他人可能不这么认为(最常见的论据是,网络效应真的是非常非常的重要,对于“一个币规则”,它是必不可少,虽然更温和的版本也存在)。

如果我不得不猜测原因的话,尽管我刚刚说了这些依据,软分叉与硬分叉相比,依旧被列为“更少强制性”的选择,我会认为说,可能硬分叉给用户的感觉是,硬分叉“强制”用户们安装软件更新,而在软分叉的情况下,用户们什么都可以不用干。然而,我不得不说,这种直觉是错误的。重要的并不是个体用户是否必须执行简单的官僚步骤点击“下载”按钮,而在于用户们是否被强制要求接受一个协议的变化,即使他们根本是不想接受的。并且通过这个指标,如上所示,这两种类型的分叉最终都是强制性的,并且硬分叉在给予用户自由的这一方便还是稍微比软分叉要好的。

现在,让我们来看看极具争议的分叉,特别是那些矿工们/验证器喜好和用户喜好相冲突的分叉。这里有三种情况:(i)双向硬分叉(ii)完全扩展硬分叉, (iii)所谓的“用户激活软叉”(UASF),第四类是矿工在没有用户同意的情况下激活软分叉。晚一点我们会在后文提到它。

首先,我来讲讲双向硬分叉。在最为理想的情况下,这个情景就非常简单了。两个币在市场上进行交易,交易者决定两个币的相对价值。从ETH/ETC的案例中,我们有着绝大多数的证据表明,矿工们绝大多数都喜欢根据价格的比率来分配他们的算力给到币,以最大化他们的利润和收益,而不会考虑他们的历史形态观点来决定他们的算力分配问题。

p1

即使一些矿工将意识形态偏好倾向于一方或另一方,那么极有可能会有足够的矿工愿意在价格比率和哈希算力之间的不匹配来套利,并且使价格比率和哈希算力形成一致。如果一系列矿工想要联合起来在这个链条上不进行挖矿,那么这个激励就会存在过度缺陷的问题。

这里有两个边缘位置的情况。第一个可能性是:由于低效的难度调整算法,挖矿的价值下降因为币的价值下降,但是挖矿的难度却并不会因此下降。这就会使得挖矿非常的不赚钱也不划算。没有一个矿工会在亏算不盈利的情况下继续推动链条往前走,直到它的困难恢复平衡。这不是以太坊的情况,但这及其可能是比特币的情况。因此,少数算力链很可能永远不会离开地面,因而它会死亡。请注意,这是不是一件好事,答案取决于你对强制和分裂的看法。从我上面写的个人观点来看,我认为这样的少数算力链敌对难度调整算法不是一件好事。

第二种边缘情况是,如果差异非常巨大,大算力的链条可以对小算力的链条发动51%的攻击。但即使是ETH/ETC分流比例在10:1,这种攻击情况也没有发生。所以这肯定不是一个确定的答案。然而,如果矿工在主导的链条上更喜欢强制性并且允许偏离分裂,那么这些矿工们总会有办法达到的。

接下来,我们来看看完全扩展硬分叉(SEHF)。 在SEHF中,存在非分叉链条在分叉规则下有效的属性,因此如果分叉链具有比非分叉链更低的价格,那么分叉链的算力值会比非分叉链的算力值要更低,正因如此,非分叉链条最终会被原始客户端和分叉客户端所接受成为最长链。那么渐渐的,分叉链会被“淹没”。

有一个论点是这样认为的,这样的分叉成功是有强烈的故有偏见的,因为分叉链会被淹没被抛在价格中,使得币的价格更低,这使得分叉链被淹没的可能性更大。这个论点对我来说还是非常有道理的,所以这是一个很好的理由来进行双向硬分叉而不是一味地扩展。

比特币非常多的开发者们建议,在硬分叉发生后来手动进行双向硬分叉来解决这个问题。但是更好的选择是,使用内置的双向硬分叉。例如,在比特币的情况下来举例,你可以添加一些规则来禁止一些未使用的操作码,然后在没有分叉的链上进行包含了这个操作码的交易,所以在分叉的规则下,没有分叉的链在这个时候起,会永远的无效。在以太坊的案例中,关于计算状态如何工作的各种细节来看,几乎所有双向硬分叉都是自动的。根据不同基础架构,其他链条也会有不同的属性。

上面提到的最后一种类型的分叉是用户激活软分叉。在UASF中,用户可直接激活软分叉规则,而无需考虑是不是得到矿工们的共识;矿工们可能会被排挤在经济利益之外。如果有非常多的用户不跟随这个UASF,那么这个币就会被分割开,这将导致一个与完全扩展硬分叉情景相同的情况。 即使UASF是选择性的,它也使用了经济的不对称性来使自己更偏向于成功(虽然这种偏向并不是绝对的,如果这个UASF被认为是不受欢迎的,那么它也不会成功,这样做只会导致区块链分裂)。

然而,用户激活软分叉是一个危险的游戏。例如,我们来假设一个项目的开发人员想要创建一个UASF补丁,该补丁将以前接受所有交易的未使用操作码转换为只接受符合一些新功能的规则的交易操作码,这无论在政治上还是技术上都会有所争议,矿工都不太会会喜欢这个功能。矿工们有一个聪明又狡猾的方式来对抗这种情况:他们可以单方面地实施一个矿工激活软分叉(miner-activated soft fork),能够让使用了软分叉创建的功能总是会失败。

现在,我们有三种规则:

  1. 操作码X始终有效的原始规则。
  2. 操作码X只有在其他交易符合新规则时才有效。
  3. 操作码X始终无效的规则。

请注意,第2点是关于第1点的软分叉,第3点是关于第2点的软分叉。现在,第3点上有强烈的经济压力,因此软分叉并不能实现它的目标。

因此,我的结论是这样的:软分叉是一个危险的游戏,尤其是在它们是有争议的情况下,矿工们开始进行反击,这个游戏将会越来越危险。完全扩展硬分叉也是一个危险的游戏。矿工激活软分叉是强制性的,用户激活软分叉就没有那么的强制性了,但是由于经济上的压力的形成,用户自己选择激活软分叉多多少少还是有强制性在里面,这也具有一定的危险性。如果你真的想进行一个具有争议性的改变,并且坚持认为自己这样做付出的社会代价是值得的,那么你就做一个干净纯粹的双向硬分叉吧,花些时间添加一些重放攻击保护,然后让市场这个无形的手帮助你理清楚。

免责声明:

1.本文内容综合整理自互联网,观点仅代表作者本人,不代表本站立场。

2.资讯内容不构成投资建议,投资者应独立决策并自行承担风险。