Jameson Lopp:谁在控制比特币?
Jameson Lopp|比特币安全平台BitGo首席开发工程师
我曾通过制作这样一份M1指数排行榜,计算出国家的货币供应量,包括了纸币、硬币等实体货币及活期账户。我发现,比特币在其中的排名非常靠前,表现活跃甚至超过了不少国家的主权货币。
截至2018年7月,总共有600万比特币无法使用并且在比特币区块链上永久丢失。BTC的最大供应量不会超过1500万枚,截至到目前,看似1700万枚BTC在流通,实际上能使用、发送、接收和交易的只有1100万枚。
关于谁有能力将代码更改写入Bitcoin Core的问题,时常会被提起。这些年来,各方都把此视作比特币协议的“中心控制点”。对于外行人来说,其中的原因当然不是显而易见的,因此我来解释Bitcoin Core的运作方式,以及更高层次上的,关于比特币协议的发展方式。
1.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密钥的检查,每个合并提交都必须要有签名。虽然这些密钥与已知身份相关联,但仍然不能安全地认为它总是如此,密钥可能会受到损害,除非原始密钥所有者通知其他维护者,否则我们就不会知道。因此,提交密钥也不能提供完美的安全性,它们只会使攻击者更难以注入任意代码。
2.有很多安全层来提供深度防御
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代码的眼睛越多,恶意或有缺陷代码进入发布版客户端的可能性就越小。
3.代码覆盖率
Bitcoin Core有很多测试代码,有一个针对每个PR运行的集成测试套件,以及一个每天晚上在master上运行的扩展测试套件。
你可以通过以下方式自行检查测试的代码覆盖率:
1. 克隆Bitcoin Core GitHub存储库;
2. 安装从源构建所需的依赖项;
3. 运行这些命令;
4. 在./total_coverage/index.html查看报告;
或者,你可以在此处查看Marco Falke主持的覆盖报告。
具有如此高的测试覆盖率,意味着代码按照预期工作具有更高的确定性。
当涉及到共识关键软件时,测试是一件大事。而对于特别复杂的更改,开发人员有时会执行艰苦的突变测试,也就是说,他们通过故意破坏代码并查看测试是否如预期那样失败来进行测试。
Greg Maxwell在讨论0.15发行版时对这个过程给出了一些见解:“测试是针对软件的测试,那测试的测试又是什么呢?要进行测试的测试,你必须去破坏软件。”
4.自由市场竞争
BitMEX写了一篇关于比特币实现生态系统的优秀文章。当前有十多种不同的比特币兼容实现,甚至还有更多的“竞争网络”实现。这是开源的自由,任何对Bitcoin Core项目不满意的人,都可以自由地运行自己的软件。他们可以从零开始,也可以选择去分叉 Core软件。
在编写本文时,96%的比特币节点是运行Bitcoin Core软件的。为什么会是这样?如果切换到另一个软件实现所需的工作量最小,那么Bitcoin Core如何在节点网络上拥有近乎垄断的地位?毕竟,很多其他实现提供了与Bitcoin Core兼容或至少高度相似的RPC API。
我相信这是Bitcoin Core成为发展重点的结果,它拥有数量级更多的开发人才和开发时间的支持,这意味着Bitcoin Core 项目的代码往往是最具性能、最安全的。在资金管理方面,节点运营商不想要运行次好的软件。
此外,考虑到这是一种共识软件,并且比特币协议不具有正式的规范,所以使用焦点实现会更为安全(因为假设你运行的是其他版本的软件,对于网络的大多数节点而言,你的节点可能就是一个bug)。
从这个意义上来讲,开发焦点的代码与现有的规范是最接近的。
5.谁是Core开发者?
不熟悉 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
Fork代码很简单,但转移比特币开发的聚焦点很难,你必须要说服开发者,让他们把时间投入到另外一个项目上做贡献。
说服很多人用户并不是盲目遵循Bitcoin Core的更改也是很难的。这可能是个自我强化的信念,因为如果用户不通过了解他们的选择参与共识过程,他们就是让渡了部分权力给开发者。但是2017年,用户在UASF(用户激活软分叉)期间行使了他们的权力。有一位比特币开发者shaolinfry(假名)提出了BIP148,这个提案会迫使矿工激活隔离见证。但是BIP148争议太大,并未被Bitcoin Core采纳,于是shaolinfry 从Core上分叉,创建了Bitcoin UASF。
在我看来,最好的Core贡献者是那些充分行使主权的人。我们都是中本聪。
6.谁控制着Bitcoin Core?
把比特币当作是一个系统来理解是完全不可行的。对比特币的定义(控制)就像是对一个语言的定义。语言是自然产生的,对于词语含义的共识也是逐渐演化,而不是字典定义的。就像字典只是描述一个语言现象而不是定义它一样,比特币实现用代码描述比特币的语言。没有人被迫同意字典里给出的释义,同样也没有人被强制运行某个比特币实现,并认同某个比特币实现里的代码。
语言并不受民主支配,比特币也是;虽然你可能听到人们谈到矿工、节点、开发者或用户进行“投票”,但是没有任何机制可以让任何形式的多数票迫使少数反对者接受他们不同意的变更。比特币是无政府状态,没有统治者,但是并不是没有规则。规则是由各个网络参与者制定和实施的。
虽然改变比特币协议本身通常是通过提交比特币改进协议进行,但是即使这是个推荐的最佳实践,也不会强迫所有人都遵循。这只是一个更正式的方式,通过同行审议和建立共识来引导变更。
尽管这难以解释和理解,但这是比特币抗脆弱性的一个重要方面,如果存在一个控制点,那么也将会有一个的单点故障,会被强大实体利用。最终,每个节点运行者都通过确保没有人会破坏他们达成一致的规则,进行自主管理。这种安全模式是比特币自下而上治理的基础。
没有人控制着比特币。没有人控制着比特币开发上的聚焦点。、