开发者Jameson Lopp:谁在控制着Bitcoin Core?
第0章 引言
BitcoinCore在扩容之战期间一直被诟病过于中心化,甚至是垄断独裁,最近开发者Jameson Lopp发了一篇文章《谁在控制Bitocin Core》想为Bitcoin Core正名。
文章篇幅很长,先上他的结论: 没有人控制着比特币。没人控制着比特币在开发上的聚焦点 (focal point,博弈论中人们在没有沟通的情况下的选择倾向)。
第1章 开发者Jameson Lopp:谁在控制着Bitcoin Core?
把代码合并到Bitcoin Core GitHub仓库的权力控制在谁手中这个问题反复出现。比特币协议聚焦点的控制权多年来一直是掌握在各个不同团体手中,但我认为这个问题本身是在扰乱视听,
所以本文试图解释Bitcoin Core是如何运作以及比特币协议是如何演化
。
Bitcoin Core
的历史
BitcoinCore是比特币协议开发的聚焦点,并不是一个指挥和控制点。一个聚焦点消失,又会出现一个新的聚焦点。Bitcoin Core所依托的技术交流平台(目前是Github仓库)只是出于便利。实际上,我们见证了比特币开发的聚焦点在平台甚至是名字上发生的转移。
-
2009年初,比特币项目的源代码只是一个托管在SourceForge上的RAR文件。早期的开发者通过邮件与中本聪交换代码补丁。
-
2009年10月30日,早期的比特币开发者Sirius (Martti Malmi)在SourceForge上为了比特币创建了一个Subversion仓库。
-
2011年,比特币项目从SourceForge迁移到GitHub。
-
2014年,比特币项目改名为Bitcoin Core。
谁也不信任
虽然有几个GitHub维护者的账户有权把代码合并到主分支,但是这更像是一个防御功能,而不是权力地位。如果所有人都可以把代码合并入主分支,很快就会变成“人多手杂”的局面。Bitcoin Core遵循
最小特权原则
(principles of least privilege),任何人想要滥用权力,都会被轻易推翻。
从对立的角度来看,GitHub是无法信任的。GitHub员工可能会在未经同意的情况下往仓库注入恶意的代码。但是,GitHub的攻击者却不太可能破解Bitcoin Core维护者的PGP私钥。
所有的合并提交都必须有可信任PGP密钥的签名,Bitcoin Core有一个持续集成的系统,检查每个提交的PGP密钥。虽然我们知道这些密钥掌握在谁的手里,但这也不是绝对安全的,因为密钥可能会被偷或破解。因此,提交(commit)需要用密钥进行签名也不是个完美的安全方案,他们只是加大攻击者随意添加代码的难度。
比特币王国的钥匙
截至撰写本文的时间,这些可信任的PGP公钥有:
71A3B16735405025D447E8F274810B012346C9A6
133EAC179436F14A5CF1B794860FEB804E669320
32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC
B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B
CA03882CB1FC067B5D3ACFE4D300116E1C875A3D
这些密钥对应的五个人是:
WladimirJ. van der Laan <laanwj@protonmail.com>
PieterWuille <pieter.wuille@gmail.com>
JonasSchnelli <dev@jonasschnelli.ch>
MarcoFalke <marco.falke@tum.de>
SamuelDobson dobsonsa68@gmail.com
这是不是意味着我们可以信任这五个人?并不完全是。密钥不是身份证明,这些密钥可能会落入他人之手。运行verify-commits python脚本你可以确认的是:
python3contrib/verify-commits/verify-commits.py
Usingverify-commits data from bitcoin/contrib/verify-commits
AllTree-SHA512s matched up to 309bf16257b2395ce502017be627186b749ee749
Thereis a valid path from “HEAD” to 82bcf405f6db1d55b684a1f63a4aabad376cdad7 whereall commits are signed!
任何开发者都可以用verify-commits脚本进行检验。
这个脚本会检验从20015年12月82bcf405提交之后所有提交的PGP签名。这个脚本会告诉你,从那时起到现在每一行改过的代码以及谁签过名。虽然维护者的密钥可能被偷或者做出流氓行为,但是这大大减小了攻击面。
那么这些维护者是谁,以及他们是如何成为维护者的呢?
多层防御
BitcoinCore代码的完整性并不只是依靠于少数几个加密密钥,还有多层安全防护措施,提供深度的防御:
Pull Request
的安全性
1-任何人都可以通过Pull Request(简称PR,提交合并代码的请求)提出代码更改意见,以完善软件。
2-开发者审查所有PR,确保它们是无害的,任何人都可以随意审查PR并提供反馈。为比特币代码做贡献,没有任何门槛或是入门测试。如果一个PR没有人提出合理的反对意见,维护者就会进行合并。
3-Core维护者会设置 pre-push hook,保证没有压入未经签名的提交(commit)到仓库。
4-合并提交可选择通过OpenTimestamps加盖时间戳。
5-TravisContinuous Integration系统通常会运行此脚本检查git tree(历史)的完整性并验证主分支里的所有提交都由可信任密钥进行过签名。
6-所有人都可以运行这个脚本验证2015年12月之后所有合并提交的PGP签名。我在写下这篇文章的时候在笔记本电脑上运行过一次,共花了25分钟。
版本的安全性
1-Gitian确定性构建系统由多个开发者独立运行,目标都是创建相同的二进制文件,如果有人编译了一个与其他开发者不匹配的编译版本,说明引入了不确定性,那么就不会直接发布最终版本。开发者会查看出错的地方,进行修复,然后构建一个候选版本。成功编译出确定性的版本后,开发者会对生成的二进制文件进行签名,保证二进制文件和工具链不会被篡改且使用的是相同的源代码。这个方法移除了构建和贡献过程中的单点故障。任何懂技术的人都可以运行自己的构建系统,这是指导说明:
https://github.com/bitcoin-core/docs/blob/master/gitian-building.md
2-一旦成功完成了Gitian编译版本并且得到构建者的签名,Bitcoin Core维护者就用PGP签一个包含各个编译版本SHA256哈希值的信息。如果你决定运行预编的二进制,你可以下载并查看其哈希值,然后用签名版本信息的哈希值验证其真实性。这是指导说明:
https://bitcoincore.org/en/download/
3-以上所有信息都是开源的和可审查的,任何懂技术的人都可以查。
4-最后,即使通过了以上所有的质量和完整性检查,提交到Bitcoin Core并最终合并到一个版本里的代码也不是由任何中心化的实体部署到网络节点。相反,每个节点的运行者都必须有意识地决定是否更新他们运行的代码。
Bitcoin Core特意没有添加自动更新的功能,因为这样可能会使用户运行到他们没有明确选择过的代码
。
尽管Bitcoin Core项目有这么多的安全措施,这些也都不是完美的,理论上都有可能会被攻破。Bitcoin Core代码完整性的最后一道防线和其他开源项目一样:时刻保持警惕。越多双眼睛盯着Bitcoin Core的代码,恶意或有缺陷的代码写入比特币版本软件的可能性越低。
代码覆盖率
BitcoinCore有大量的测试代码。有一个针对每一个PR运行的集成测试套件和一个每晚都在主分支上运行的扩展测试套件。
你可以以下方式自己查验代码的覆盖率:
1- 克隆Bitcoin Core的Github仓库。
2- 从源代码安装构建所需的依赖项
3- 运行这些命令
4- 审查./total_coverage/index.html的报告
另外,你还可以查看LCOV生成的代码覆盖率报告(如下图)。
代码覆盖率越高,说明代码按预期运行的确定性越高。
测试非常重要,尤其是在进行复杂更改的时候,开发者有时候需要进行变异测试(注:一种在细节方面改进程序源代码的软件测试方法)。Greg Maxwell曾在讨论0.15版本的时候对此发表过评论:
“测试是测试软件,但是什么是测试的测试?要进行测试的测试,你就必须破坏软件。——Greg Maxwell”
自由市场竞争
BitMEX曾发表过一篇文章《Competing withBitcoin Core》概述了比特币实现的生态。目前有十几个比特币实现,甚至还会更多“相互竞争的网络”实现。这就是开源的自由之处,如果你不满意Bitcoin Core项目,你可以随意启动自己的项目。你可以从头开始搭建或者fork 比特币Core的软件。
目前有96%的比特币节点在运行某个版本的Core软件。为什么会出现这样的情况?如果转换到其他软件实现所需的工作量这么小,为什么会出现Bitcoin Core几乎垄断的局面?毕竟,其他很多实现都提供了与BitcoinCore可兼容的或者至少是非常相似的RPC API。
我相信这是Bitcoin Core成为开发聚焦点的结果。它背后有开发人才和开发时间作为支撑,也就是说Bitcoin Core项目产生代码往往拥有最好的性能、最稳健,以及最安全。涉及到钱的管理,节点运行者不会想要运行排名第二的软件。另外,考虑到这是个共识软件,比特币协议不具有,也可以说无法有,一个正式的规范,因为没有人有权威写出这样的规范,使用聚焦点实现会更安全,因为你与网络其他大部分节点会拥有更好的错误兼容性。
谁是Core开发者?
不熟悉Core开发程序的人从外部看可能会认为Core是一个单一的实体。实际远非如此。Core贡献者之间经常会产生分歧,即使是最多产的贡献者,也有很多代码没有合并到比特币代码库。如果你读过Core贡献指南,你就知道他们是相当松散的,
这个程序最恰当的说法是“大致共识”
。
维护者会考虑一个补丁是否符合一般原则;是否符合最低的纳入标准;以及会判断贡献者们的普遍共识。
谁是比特币Core的维护者?他们是那些在一段时间内做出高质量的贡献,并在项目里积累了足够多社会资本的人。当现有团队的维护者们认为,某个贡献者在一方面能力突出,可靠且具有积极性,可以胜任维护者的工作,他们可以授予该贡献者的Github账户提交(commit)的权限。而首席维护者负责监督项目的方方面面,并负责协调发布新的版本。这么多年来,共有三位首席维护者,他们分别是:
-
中本聪(Satoshi Nakamoto):2009/01/03-2011/02/23
-
加文·安德烈森(Gavin Andresen):2011/02/23-2014/04/07
-
Wladimir van der Laan:2014/04/07-至今
比特币Core维护者常被称为清洁工,因为维护者实际上并没有权利做出与贡献者或用户的共识相违背的决策。但是,这个角色因为生态外界的过度关注相当累人。例如,Gregory Maxwell在2017年出于个人原因放弃了维护者的身份,很有可能就是因为他在扩容期间承受的公众压力。Wladimir写了一篇文章谈到了作为Core维护者的压力以及为什么移除加文的提交权限。
同样的,Jeff Garzik也被移出开发组,他已有两年没有为Core做贡献。保留他Github账户的权限对项目没有任何好处,只会构成安全风险,并且违背了Wladimir在他的文章中提到的最小特权原则。
有些人可能会认为Core是个技术官僚组织或是个象牙塔,新人很难加入。但是,如果你与贡献者交谈过就会发现,实际并非如此。虽然,多年来只有十几个人有提交权限,但是,数百位开发者做了贡献。我自己也做了一些小的贡献;虽然我不认为自己是Core的开发者,但是严格来说,我也是一个Core开发者。
没有人可以阻止你做贡献
!
人们最难以理解的事情似乎是:比特币开发的聚焦点并不是简单由Bitcoin Core GitHub账户所能定义的组织结构。虽然比特币Core有一些组织结构(为了协调而使用中心化的交流渠道),但比特币本身并不是由某一个参与者控制的——即使是那些在GitHub仓库上拥有更高的权限的人。虽然技术上来说,维护者内部有可能会发生政变,劫持网络,审查持有异议的开发者,甚至是抢夺“Bitcoin Core”这个名称,但结果将是Bitcoin Core不再是开发的聚焦点。反对维护者行为的开发者可以直接分叉,然后转到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贡献者是那些充分行使主权的人,例如John Newbery,他虽然没有编译有漏洞的代码,但是他认为他有责任经过仔细检查,排除这个漏洞被合并入代码,并应该在测试的时候就发现这个漏洞。
我们都是中本聪。
为Bitcoin Core做贡献
虽然网上有很多资源,但是为Core做贡献可能听起来令人生畏。Jimmy Song写过一份指导说明《A Gentle Introduction to Bitcoin Core Development》,或者你可以在这里查看贡献指南:
https://bitcoincore.org/en/faq/contributing-code/
EricLombrozo则写了一篇关于Core仓库如何进行更改的文章《The Bitcoin Core MergeProcess》。
AlexB.还写了一篇文章阐述了比特币开发背后的理念《The Tao of Bitcoin Deveploment》。
谁控制着Bitcoin Core?
把比特币当作是一个系统来理解是完全不可行的。对比特币的定义(控制)就像是对一个语言的定义。语言是自然产生的,对于词语含义的共识也是逐渐演化,而不是字典定义的。就像字典只是描述一个语言现象而不是定义它一样,比特币实现用代码描述比特币的语言。没有人被迫同意字典里给出的释义,同样也没有人被强制运行某个比特币实现,并认同某个比特币实现里的代码。
语言并不受民主支配,比特币也是;虽然你可能听到人们谈到矿工、节点、开发者或用户进行“投票”,但是没有任何机制可以让任何形式的多数票迫使少数反对者接受他们不同意的变更。比特币是无政府状态,没有统治者,但是并不是没有规则。规则是由各个网络参与者制定和实施的。
虽然改变比特币协议本身通常是通过提交比特币改进协议进行,但是即使这是个推荐的最佳实践,也不会强迫所有人都遵循。这只是一个更正式的方式,通过同行审议和建立共识来引导变更。
尽管这难以解释和理解,但这是比特币抗脆弱性的一个重要方面,如果存在一个控制点,那么也将会有一个的单点故障,会被强大实体利用。最终,每个节点运行者都通过确保没有人会破坏他们达成一致的规则,进行自主管理。这种安全模式是比特币自下而上治理的基础。
没有人控制着比特币。
没有人控制着比特币开发上的聚焦点。
第2章 结束语
Jameson Lopp的论述说服你了吗?
原文链接:
https://medium.com/@lopp/who-controls-bitcoin-core-c55c0af91b8a