2015年这个漫长而炎热的夏季,已经暴露了一些关于比特币社区,令人惊讶的东西:很多人对于区块链算法如何实际运行的技术原理,其实是陌生的。
最终,bitcoin.org及各个论坛的管理者迈克尔·马夸特(Michael Marquardt),禁止了所有关于Bitcoin XT的讨论,并威胁说要从官方比特币网站上删除使用Bitcoin XT的服务。他的理由是,Bitcoin XT是一个山寨币,因为它触发了一个硬分叉。而另一方面,他认为“软分叉”(soft forks)却是完全可以接受的。
这一立场,从技术角度上来说,是根本站不住脚的,在这篇文章中,我将解释下原因。
你在比特币论坛上可能并不会看到这两个词,在我随机地与比特币爱好者们的聊天当中,发现很多人都将这个术语抛在了脑后。我一次又一次地遇到过不明白这些单词意思的人,但我觉得他们应该是要明白的。
这并不奇怪,“软分叉”的概念是相对比较新出现的,并且似乎已经涌现在IRC的交流讨论当中,而不是BIP或者其他类型的标准文件。奇怪的是,甚至连开发者们也会错误地定义这个术语。
硬分叉,是当比特币协议规则发生改变,旧节点拒绝接受由新节点创造的区块的情况。违反规则的区块将被忽视,矿工会按照他们的规则集,在他们最后见证的区块之后创建区块。
软分叉,是当比特币协议规则发生改变,旧的节点并不会意识到规则是不同的,它们将遵循改变后的规则集,继续接受由新节点创造的区块。矿工们可能会在他们完全没有理解,或者验证过的区块上进行工作。
这通常被一些比特币核心开发人员描述为“向后兼容
”,但这其实并不正确,并可能会让别人产生困惑。向后兼容的定义是,新的软件接受由旧软件所产生的数据或者代码,比如说Windows 10可以运行Windows XP的应用,这是向后兼容。两个分叉类型需要向后兼容,否则新节点就无法从头验证区块链。
正确的说法实际上应该是向前兼容
:指旧的软件继续接受由新软件所产生的数据以及代码。当你保存了一份Word 2013文档时,你仍然可以用Word 2011来打开它,这就是向前兼容。
值得一提的是,中本聪本人并没有使用过“硬分叉”这个短语,想必此前他还未曾遇到过分叉的情况,软分叉的概念还没有绕过来么,这就对了,因为这个概念本身就有很大的缺陷:在一个正常的比特币网络中,软分叉永远都不应该发生。
这可能看起来像一个大胆的主张,让我们更进一步地分析下它。
可能会出现旧软件继续处理数据,而无需进行升级的情况 :为什么你会不想要呢?现实情况是,软件工程师们都是喜欢向前和向后兼容的,如果你的新应用程序和旧版本的可以互相操作,通常都会是双赢的。
向前兼容比向后兼容更为罕见,原因是,如果你为自己的文件或者协议添加了一些新的功能,旧版本的软件就无法理解它。有时候,你可以让新的功能是可选的:意思是指旧软件忽视掉新功能是OK的,这就是所谓的功能退化,这是一个流行的技术,特别是当网站使用了新功能后,而有些用户又想使用旧浏览器进行访问时。
向前以及向后兼容在软件工程当中,已经是非常普遍地应用了,那比特币有什么不同么?原因很简单:
向前兼容,会使运行一个节点的全部目标失效。
原因很容易就能解释,XT/Core 两个版本的下载,以及处理每一个区块,都要从创世块开始,做这个过程的目的是为了对比特币区块链进行审计。每添加一个数字,它们都会检查每一个签名。当审计完成的时候,你可以确保你使用的总账将规则应用写入到这个软件当中。
这是比特币去中心化的关键部分:使用你自己的总账副本,通过你的计算机进行计算,然后根据这个总账,仅接受有效的比特币支付,是你在增强比特币的关键经济政策。
情况很简单:没有人,甚至是拥有多数算力的矿工,可以哄骗你去接受违反这些规则的钱。
或者说……他们可以么?
下面就是软分叉的问题所在了。
在软分叉中,协议的改变是经过精心编制过的,本质上是在诱骗旧节点去相信一些东西是有效的,但它实际上可能并非如此。
这里有一个类比,试想一下一家拥有审计师团队以及交易团队的大公司。交易员们希望做一个新型的交易,但公司目前是不允许的:审计人员会执行公司的政策,检查交易员们在做些什么。而更改策略可能会是一项很慢的工作。突然有一天,一个交易员灵机一动,“嘿,伙计们,”他说,“我有一个想法,我要提交一些衍生品交易,我打算把它写在纸上,当你看到它时,它看上去就好像是一笔正常的交易,但其实它不是,审计员们是不会发现的!”
这里的审计员们,正是运行比特币全节点的人以及服务,而交易员就是那些想要改变规则的人,无论这种规则变化是一个好主意与否,其实在这里都不相关:重要的是,它们是如何进行的,审计人员正在交叉检查每一笔交易,但是他们的计算可能会得出错误的答案,因为他们不明白他们所核查的交易的真实性质。
在技术上是如何进行这项工作的? 我们可以看看一个称之为P2SH
的比特币模式,P2SH是一个非常有用的模式,它可以让多重签名更易使用,但是在区块链上会看起来很奇怪:
https://blockchain.info/tx/f837ca5c1a15fa6c2e5c7380386bacba10e936fe8625e12d9fa6c177a8f605c1
OP_HASH160 6af7caf9b09224af8a171318f69d254c1756e54e OP_EQUAL
这是一个比特币脚本,英文的意思是:“anyone who knows the password can spend this money” ,翻译过来就是“任何人知道这个密码,都可以花走这笔钱。”
它的问题就在于它的不安全:因为没有签名,所以当你广播了一笔,提供给任何人“密码”的交易,其他人也是可以进行一笔输出交易的,因为密码现在是公开的嘛,所以最后就存粹地变成了一场竞赛,看谁的交易第一个传递给矿工。
P2SH之所以可行,是因为比特币协议进行了修改,包含了一条新规则:当你看到上述形式的输出脚本,实际上不要将它当作一个脚本看待,而是一直特殊的处理方式:密码实际上才是“真实”运行的脚本。所以说P2SH其实是安全的,不要担心。但是为什么要使用这种迂回而奇怪的方式呢?
你猜对了,软分叉就是问题所在。这种结构的设计,总是被认为是,不了解P2SH规则的旧节点会认为交易是有效的。如果出现一笔交易,所花的币是在旧版本比特币规则下,但并不满足新的 P2SH规则的话,审查员们就无法正确地对此进行核查,并会计算出一个不正确的总账。
但是,防止这种情况的发生,就是你起初要去运行一个全节点的全部理由!哎哟!
让我们想象一下 P2SH以不同的方式进行引入:通过硬分叉,那么脚本就会是这个样子的:
OP_HASH160 6af7caf9b09224af8a171318f69d2... OP_EQUAL OP_RUN
注意最后的OP_RUN
:这是一个并不存在当前比特币指令集的操作码。正确地定义下,脚本会是这个样子的:
OP_HASH160 6af7caf9b09224af8a171318f69d2... OP_EQUAL OP_???
当他们到达OP _ ???
位时,他们会停止并拒绝交易以及区块,因为他们会意识到,他们不知道这笔交易意味着什么。
我应该指出一点,当前实际有一个P2SH的相对提案,其名为OP_EVAL
,关于它的讨论,是非常激动人心的,我不记得那场辩论的细节,也不想在这里进行重复,这也只是一个例证而已。
好了,所以你的节点已经拒绝了一个区块,因为它看不懂。怎么办呢?在我们想象的公司中,审计员会召唤CEO(也就是你),来作出一个决定,你就是决策者。而在比特币的情况下:你会因为某种方式被惊动,比如说短信或者电子邮件,然后你要做出决定该怎么做。你可以…
最后的选择是有风险的,但是你会发现,软分叉发生了! 所不同的是,你是明确要求的它,你的选择不会影响其他人。只有你在冒险进行一个不正确的分类帐。 Bitcoin Core和Bitcoin XT 今天并不支持第三个选项,但是如果任何人想要,给它增加一个开关来让它启动是一件很容易的事情。
我的观点?了解就是力量。当你知道 规则已经改变时,你可以使用这些信息来采取更好的决策。而软分叉,你将不会知道规则已经改变,这就好像是在盲目地飞行。
最近,bitcoin.org采取了一项新的政策,它说:
争议硬分叉对比特币是一件坏事。最好的情况下,一个有争议的硬分叉会让选择失败方链的人,感到选择权被剥夺。而最糟糕的情况是,它将使得比特币永远失去它的价值。
这是一个非常奇怪的说法,因为这就意味着改造比特币,而无需引起所谓的“选择权被剥夺”是可能的。
任何比特币的改变,都是由大多数人接受了规则的改变,正是这些人“剥夺”了那些不想要进行改变的人的权力。硬分叉也好,软分叉也罢,无论哪种技术被使用,如果交易使用了新的规则,那么就会进入广泛的传播,那么迟早你会收到支付的币,并追溯到一个新规则的交易。然后你就有两种选择,你可以验证新规则,或者不进行验证。而不进行验证的问题就是降低了自己的安全性:这就好比是将你脸上的鼻子切了下来。因此,在实践中,所有人总是会选择升级。多数人不同意软分叉,和多数人不同意硬分叉并没有什么不同,如果你不喜欢新的规则……那就坚定地选择就是了。
我们可以看到 P2SH本身就证明了这一点,这个竞争提案得到过一些矿工和开发人员的支持,但最终大家却接受了我们当前的这个版本。他们在这个问题上,没有选择,或者说,他们选择接受了改变,并继续使用比特币,而一个软分叉也没有什么区别。
因此,关于硬分叉 vs 软分叉的问题,说成是对个人权利的伟大斗争,在技术上是说不通的。它们之间是完全不相干的。
这篇文章有点长,所以下面我会尽量简单地进行描述。如果你是矿工或者商人,你应该会更喜欢硬分叉的更改方式,原因如下。
商人: 对于支付给你的钱,你的想法是这笔交易是尽可能多地被验证,并且你想要的是更快的验证。这就意味着,你的节点需要运行主要的规则集,如果你被甩在了后面,你是可以被欺骗的。如果你所在的链并不是主数,你需要尽快地知道,然后你要忽略掉你无法核实的交易。
请注意,在我提出关于比特币核心开发者们的一些问题之后,他们调整了代码,使得一些软分叉实际上更接近于硬分叉:Core会忽略掉那些似乎使用未知操作码的交易(也就是我们想要的!)…直到它们出现在区块当中。因此,这个调整是否有助于你,在很大程度上取决于时机。
矿工:如果你是一名矿工,并落后于多数人选择的规则,你将因为自己所使用的分叉链而失去经济回报。然而,硬分叉还是较好的。首先,它是可检测的,因此一个正确配置的节点,通过电子邮件/短信/电话的方式,可以让你知道自己的节点已经过时了。它也可以自动地关闭挖矿作业,那么你就不会浪费资源去挖取无效块。其次,如果你认为对方链是错的,然后你认为他们会同意你的观点,你可以继续尝试挖取弱链碰碰运气。然后在某个时候,每个人又回到了你的这条链,那么你就会得到所有其他矿工所没有的,可爱的coinbase。当然,这种策略是非常危险的,我是不会推荐的。但在技术上来说,是存在可能性的。
软分叉情况下,你会挖取你认为是有效的块,但实际上是其他矿工所忽略的块。然后,当他们孤立你的块时,你会认为这只是普通的运气不好罢了,并尝试建立另一个无效块……然后将再次获得孤块。如果你只是一个不常产生块的小矿工,你要弄清楚这件事情,可能需要花费你相当长的时间。然而你的口袋,还只是一个洞而已。
不是的,如果说有这种情况的话,那么从字面上来说,任何人都可以通过不同的规则来挖一个或者两个区块,来杀死比特币。区块链算法的根本目的是确保它不会发生任何破坏性的事情。
认为“有争议”的硬分叉会导致比特币永久性地失去价值,这个想法出自 bitcoin.org的政策。要求任何比特币的更改都需要100%(或者99%)的人同意,或者说至少有一个比特币核心开发者的认同,这就意味着,任何人都可以保持整个社区不变,他们都可通过拒绝同意进行赎回,除非他们得到他们自己想要的东西,没有哪一种基础设施是这样干的。如果比特币就是这样子,那它永远都不可能发展,最终将变得一文不值。
----
原文:https://medium.com/@octskyward/on-consensus-and-forks-c6a050c792e7