关于比特币Core软件,很多人因扩容之争便片面地认为其开发是中心化的,而Jameson Lopp作为BitcoinCore开发者、比特币安全平台BitGo首席开发工程师则想通过本文来解释Bitcoin Core的运作方式,并澄清比特币是没有控制者的。
我曾通过制作这样一份M1指数排行榜,计算出国家的货币供应量,包括了纸币、硬币等实体货币及活期账户。我发现,比特币在其中的排名非常靠前,表现活跃甚至超过了不少国家的主权货币。
2018年比特币M1货币供应量排名从19跌至49位,截至2018年7月,总共有600万比特币无法使用并且在比特币区块链上永久丢失。BTC的最大供应量不会超过1500万枚,截至到目前,看似1700万枚BTC在流通,实际上能使用、发送、接收和交易的只有1100万枚。
关于谁有能力将代码更改写入Bitcoin Core的问题,时常会被提起。这些年来,各方都把此视作比特币协议的“中心控制点”。对于外行人来说,其中的原因当然不是显而易见的,因此本文的目的就是解释Bitcoin Core的运作方式,以及更高层次上的,关于比特币协议的发展方式。
Bitcoin Core的历史:Bitcoin Core是比特币协议开发的焦点,它并不是命令和控制点。如果它因为任何原因而消失,那么将会有新的焦点出现,它基于的技术通信平台(当前为GitHub存储库)是源于方便的考虑,而不是定义/项目完整性的问题。事实上,我们已看到比特币的开发曾发生过平台转移,甚至是名字的更改:
1、在2009年初,比特币项目的源代码只是一个托管在SourceForge上的.rar文件。 早期开发人员实际上会通过电子邮件与中本聪交流代码补丁;
2、2009年10月30日,Sirius(Martti Malmi)在SourceForge上为比特币项目创建了一个Subversion存储库;
3、2011年,比特币项目从SourceForge迁移到GitHub;
4、2014年,比特币项目被更名为Bitcoin Core。
注:焦点为博弈论中的概念,是指人们在缺乏沟通时倾向于使用的解决方案。
虽然这个组织存在一些GitHub“维护者”帐户,它们能够将代码合并到主分支中,但这更像是一种维护功能,而不是意味着权力地位。如果任何人都可以把代码合并到主分支当中,那么很快比特币代码库就会沦为“太多厨师涌入厨房”的场景。Bitcoin Core遵循的是最小特权原则,即如果被滥用,任何赋予个人的权力都很容易被颠覆。
从对抗的角度来看,GitHub是不可去信任的。任何数量的GitHub员工都可以使用他们的管理权限将代码注入比特币存储库,而无需维护人员的同意。但GitHub攻击者也不太可能破坏Bitcoin Core维护者的PGP密钥。Bitcoin Core没有将代码的完整性建立在GitHub帐户之外,而是具有一个连续的集成系统,它执行对可信PGP密钥的检查,每个合并提交都必须要有签名。虽然这些密钥与已知身份相关联,但仍然不能安全地认为它总是如此,密钥可能会受到损害,除非原始密钥所有者通知其他维护者,否则我们就不会知道。因此,提交密钥也不能提供完美的安全性,它们只会使攻击者更难以注入任意代码。
Bitcoin Core代码的完整性不能仅仅依赖于少数几个密码密钥,这就是为什么存在很多其他检查的原因。这里有很多安全层来提供深度防御:
一、Pull请求安全性
1、任何人都可以通过在Bitcoin/Bitcoin上打开针对主分支的Pull请求,并自由地提出代码更改请求。
2、开发人员审核Pull请求,以确保它们无害。任何人都可自由地审查Pull请求并提供反馈。在为Bitcoin Core做出贡献时,是没人监督或门槛的。如果一个Pull请求,它的确是有用的,并且对其没有合理的反对意见,那么维护者就会将其合并到Core软件。
3、Core维护者设置此预Push,以确保他们不会将未签名的提交推送到存储库中。
4、可选择通过OpenTimestamps对合并提交安全地添加时间戳;
5、Travis CONTinuous Integration系统定期运行此脚本以检查Git树(历史)的完整性,并验证Master分支中的所有提交是否都使用其中一个可信PGP密钥进行签名;
6、任何想要运行此脚本以验证所有合并提交PGP签名的人,都可以追溯到2015年12月,这个过程大约需要25分钟。
二、发布安全性
1、Gitian确定性构建系统是由多个开发人员独立运行的,其目标是创建相同的二进制文件。如果有人设法创建与其他开发人员的构建不匹配的构建,则表明引入了非确定性,因此最终版本不会发生。如果存在非确定性,开发人员会找出出错的地方,修复它,然后构建另一个候选版本。一旦确定性构建成功,那么开发人员就会对生成的二进制文件进行签名,从而保证二进制文件和工具链不被篡改且使用了相同的源。此方法删除了构建和分发过程中的单点故障,任何具有技术技能的人都可以运行自己的构建系统。
2、一旦Gitian构建完成,并得到了构建者签署,一位 Bitcoin Core 的维护者将PGP签署一个消息,其中包含每个构建的SHA256哈希值。如果您决定运行预先构建的二进制文件,则可以在下载后检查其哈希值,然后使用哈希值验证签名版本消息的真实性。
3、以上所有内容都是开源的,并且任何具有技能的人都可对其进行审核。
4、最后,即使在完成上述所有质量和完整性检查之后,提交到Bitcoin Core并最终进入版本的代码也不会被任何中心化的组织部署到节点网络上。相反,每个节点操作员必须有意识地决定更新他们运行的代码。Bitcoin Core故意没有设置自动更新功能,因此用户可自行决定需要运行什么版本的代码。
尽管Bitcoin Core项目实施了以上所有技术安全措施,但它们并不是完美的,理论上它们中的任何一个都可能受到损害。Bitcoin Core代码完整性的最后一道防线与任何其他开源项目相同,即开发者需时刻保持警惕,审查Bitcoin Core代码的眼睛越多,恶意或有缺陷代码进入发布版客户端的可能性就越小。
Bitcoin Core有很多测试代码,有一个针对每个PR(Pull Request,可简单理解为,代码贡献者向管理员发起代码合并请求)运行的集成测试套件,以及一个每天晚上在Master上运行的扩展测试套件。可以通过以下方式自行检查测试的代码覆盖率:
1、克隆Bitcoin Core GitHub存储库;
2、安装从源构建所需的依赖项;
3、运行这些命令;
4、在./total_coverage/index.html查看报告;或者,可以在此处查看Marco Falke主持的覆盖报告。
具有如此高的测试覆盖率,意味着代码按照预期工作具有更高的确定性。当涉及到共识关键软件时,测试是一件大事。而对于特别复杂的更改,开发人员有时会执行艰苦的突变测试,也就是说,他们通过故意破坏代码并查看测试结果是否如预期的那样失败。Greg Maxwell(曾经的比特币的核心开发人员)在讨论0.15发行版时对这个过程给出了一些见解:“测试是针对软件的测试,那测试的测试又是什么呢?要进行测试的测试,你必须去破坏软件。”
BitMEX写了一篇关于比特币实现生态系统的优秀文章。当前有十多种不同的比特币兼容实现,甚至还有更多的“竞争网络”实现。这是开源的自由,任何对Bitcoin Core项目不满意的人,都可以自由地运行自己的软件。他们可以从零开始,也可以选择去分叉 Core软件。在编写本文时,96%的比特币节点是运行Bitcoin Core软件的。为什么会是这样?如果切换到另一个软件实现所需的工作量最小,那么Bitcoin Core如何在节点网络上拥有近乎垄断的地位?毕竟,很多其他软件提供了与Bitcoin Core兼容或至少高度相似的RPC API。
96%的比特币节点是运行Bitcoin Core软件的,我相信这是Bitcoin Core成为发展重点的结果,它拥有数量级更多的开发人才和开发时间的支持,这意味着Bitcoin Core 项目的代码往往是最具性能、最安全的。在资金管理方面,节点运营商不想要运行次好的软件。此外,考虑到这是一种共识软件,并且比特币协议不具有正式的规范,所以使用焦点实现会更为安全(因为假设你运行的是其他版本的软件,对于网络的大多数节点而言,你的节点可能就是一个Bug)。从这个意义上来讲,开发焦点的代码与现有的规范是最接近的。
不熟悉 Bitcoin Core 开发过程的人,可能会从外部查看项目,并将Core视为一个整体实体。情况远非如此!Core贡献者之间经常存在着分歧,甚至最多产的贡献者也编写了大量从未被合并到项目中的代码。如果你阅读了关于贡献的指导方针,你可能会注意到它们相当宽松,这个过程最好被描述为“粗略的共识”。“维护人员将考虑补丁是否符合项目的一般原则;是否满足包含的最低标准;以及将判断贡献者的一般共识。”
那Bitcoin Core的维护者是谁呢?他们是那些通过在一段时间内提供高质量贡献,并且在项目中建立了足够社会资本的贡献者。当现有的维护人员组认为,某个贡献者表现出的能力、可靠性和动机足以胜任,他们可授予该贡献者GitHub帐户的提交访问权。而首席维护者的角色是负责监督项目的所有方面,并负责协调发布的人。这些年来,一共有三位首席维护者,他们分别是:
1、中本聪(Satoshi Nakamoto) 2009.1.3 – 2011.2.23
2、加文·安德烈斯(Gavin Andresen) 2011.2.23 – 2014.4.7
3、Wladimir van der Laan 2014.4.7 至今
充当Bitcoin Core维护者通常被称为看门人,因为维护者实际上没有权力做出违背贡献者或用户共识的决策。然而,由于整个生态系统的额外关注,这个角色担负的压力可能非常繁重。例如,Gregory Maxwell在2017年由于其个人原因放弃了他的维护者角色,这很可能是因为他在扩容争论中经历的公众压力。
Wladimir撰写了一篇的文章,讲述了作为Core维护者的压力,以及为什么应该删除Gavin的提交访问权限,这让很多人感到不安。类似地,当Jeff Garzik的维护者权限也被删除时,他和其他人对此也感到了不适,但实际上Garzik已经有两年没有为 Core提供贡献了。给他的GitHub帐户保留Core的维护权不会给项目带来任何好处,这只会造成安全风险,并且违反了Wladimir在他的帖子中提到的最低特权原则。
其他人可能看到Core所发生的一些事,便认为这是一个技术官僚主义组织或象牙塔,这使得新进入者很难加入。但如果你与贡献者交谈,你会发现情况并非如此。虽然在过去的几年当中,只有十几个人拥有提交访问权,但有数百名开发人员为比特币做出了贡献。我自己也做了一些小的贡献,当然我自认为自己不是一名“核心开发者”,但我的确是一名Core软件开发者。没有人能阻止你为比特币做贡献!
虽然Bitcoin Core 具有一些结构(它使用中心化的通信通道来协调),但是项目本身不受任何参与者的控制(甚至是那些升级了GitHub存储库特权的人)。即使维护者组织的政变在技术上可能劫持GitHub存储库,审查持不同意见的开发人员,甚至可能争抢“Bitcoin Core”的品牌,但其结果是Bitcoin Core将不再是开发的焦点。不同意维护人员操作的开发人员只需分叉代码,并将他们的工作转移到不同的存储库,那么Bitcoin Core维护者就没有管理特权。
即使没有“政变”,如果有争议的更改确实以某种方式合并到Core的软件里,部分开发者可以进行分叉,然后移除有争议的更改,再向用户发布新版本。例如,Amaury Sechet当时从Bitcoin Core上分叉出来,移除了隔离见证,创建了比特币ABC。而相反,如果Core驳回了部分人提出的某项更改,开发者也可以分叉,然后再添加这些特性。这样的事情已经发生过很多次:
• MikeHearn从Core上分叉,创建了Bitcoin XT
• AndrewSTOne从Core上分叉,创建了Bitcoin Unlimited
• JeffGarzik从Core上分叉,创建了BTC1
分叉代码很简单,但转移比特币开发的焦点很难,你必须要说服开发者,让他们把时间投入到另外一个项目上做贡献。
也很难去说服很多不盲目遵循Bitcoin Core变化的用户,这可能是个自我强化的信念,因为如果用户不通过了解他们的选择参与共识的过程,他们就把部分权力让给开发人员了。但是2017年,在UASF(用户激活软分叉)期间,用户的权力得到了行使。有一位匿名比特币开发者shaolinfry提出了BIP148协议,这个提案会迫使矿工激活隔离见证。但是BIP148争议太大,并未被Bitcoin Core采纳,于是shaolinfry 从Core上分叉,创建了Bitcoin UASF。在我看来,最好的Core贡献者是那些充分行使主权的人。我们都是中本聪。
完全将比特币当作是一个系统来理解几乎是不可行的。对比特币的定义(控制)就像是对一个语言的定义。语言是自然产生的,对于词语含义的共识也是逐渐演化,而不是字典定义的。就像字典只是描述一个语言现象而不是定义它一样,比特币实现也用代码描述比特币的语言。没有人被迫同意字典里给出的释义,同样也没有人通过运行比特币而被强制同意给定比特币实现中的代码。
语言并不受民主支配,比特币也是;虽然你可能听到人们谈到矿工、节点、开发者或用户“投票”,但是没有机制可使任何形式的多数投票能够强迫少数反对者接受他们不同意的变更。比特币是没有统治者的,但是并不是没有规则。规则是由各个网络参与者制定和实施的。虽然改变比特币协议本身通常是通过提交比特币改进协议进行,但是即使这是个推荐的最佳实践,也不会强迫所有人都遵循。这只是一个更正式的方式,通过同行审议和建立共识来引导变更。
尽管这难以解释和理解,但这是比特币抗脆弱性的一个重要方面,如果存在一个控制点,那么它也将是一个的单一的失败点,会被受比特币威胁的强大实体所利用。最终,每个节点运行者都通过确保没有人会破坏他们达成一致的规则,进行自主管理。这种安全模式是比特币自下而上治理的基础。没有人控制着比特币。也没有人控制着比特币开发上的焦点。