全球最强大的区块链项目,竟然不是比特币?

没什么意义的头图

提到区块链三个字,恐怕如今的小白也能说出来比特币。刚过去的2018年,区块链炙手可热,有人忙着割韭菜,有人忙着伸出头给人割,有人忙着想搭车融资,也有人在摸索区块链除了庞氏骗局和博彩以外,究竟有什么正能量的绝杀应用。

其实,有这么一个区块链应用,早已经深入到每个IT工作者的生活中了。在我自己的工作中就离不开它,但直到看到一期Linus Torvalds 2007年在Google的讲座视频,才恍然意识到它才是最成功的区块链项目。论时间,比Bitcoin早了4年;论用户量,它比Bitcoin多一个数量级。

它就是git。而一个更大胆的推演是: Linus或许就是中本聪本葱。

Linus Torvalds强烈鄙视CVS的用户

先说说什么是区块链。(了解请自行跳过)区块链其实是个无中心的分布式数据库(新近项目则是分布式的计算机,我们暂且不提)。例如,数据库中可以保存着每个人的账户有多少钱。所谓分布式,是指每个参与的用户都保存着部分或者全部的数据,大家对全部数据的内容通过一种机制达成共识。这样一来,就不用担心银行的系统被黑掉,或者数据中心遭到自然灾害而瘫痪,导致的数据丢失。

然而分布式的问题是,假如有一个恶意的用户在自己保存的数据上做了手脚,还宣称自己的数据是真实的,那么大家必须有能力分辨是非。区块链技术正是通过密码学的方法,给大家雪亮的眼睛,保证不可能被个别几个恶意的用户骗到。

Bitcoin区块链示意图1:4笔交易被记录在BLOCK 50中,其中引用了BLOCK 49的哈希值

之所以称为区块链,是因为数据是按照一个个“区块”为单位添加到数据库中的,区块只能添加,不能删除或修改。而每一个区块,都有一个哈希值(签字画押),这个哈希值的计算过程包含了上一个区块的哈希值。而上一个区块的哈希值又包括倒数第三个区块,以此类推,区块就成了个链条。如果有人要改动任何一个区块的内容,势必引起从这个块往后的所有块的哈希值改变(签字画押被破坏),别人一眼就看出来了。

重新画个押行不?行,但每一个画押的过程,都需要全球参与者的计算机共同努力一段时间才能完成(俗称挖矿,学名叫PoW,Proof of work)。靠攻击者一个人的计算资源,大概一辈子也画不出来一个押,更别提重新画押后面被破坏的所有区块,以及重新画押的这段时间中,正常用户在共识的数据库中添加的新的区块。据此,这个机制保证了无人能篡改已经进入数据库中的区块数据。

https://git-scm.com/

Git是什么?Git是目前全世界最受欢迎的版本管理工具,在2005年由Linux内核的作者Linus Torvalds设计开发。Git之于程序员,就如同知网之于博士。但如果一个博士不知道知网,那还可能是个外国博士;但如果一个程序员不知道git,那他只能是外星人了。

但是大家可能不知道,git的数据结构就是区块链。首先,git仓库是个数据库,其中保存的是一个文件夹和其中所有文件的全部更新历史。当git仓库用于保存多人协作的软件代码时,这个数据库需要在所有开发者之间共享,因此就形成了一个分布式的数据库。

Git的数据结构中,有3种相互引用的基本类型,分别是:

  • blob:用于保存文件的内容,不包含文件名
  • tree:用于保存文件夹中的子文件夹和文件的名称及属性列表。其中,子文件夹会引用另一个tree对象,而文件会引用blob对象。
  • commit:整个项目的一个历史状态。包括时间、提交者、一段描述文字、对一个tree对象的引用——即所保存状态的根文件夹。最终要的是,commit中还包含对若干个旧历史状态(父commit对象)的引用。

所有对象都有个唯一的标识符,就是这个对象完整内容(经过压缩后)的SHA1哈希值。

3个commit形成链条,分别引用tree对象。注意tree对象和blob对象是可以重用的,这大大提高了git的存储效率。
图片来自https://git-scm.com/book/en/v2/Git-Internals-Git-Objects

这样一来,如果你想更改一个文件在某个历史时刻的内容,你首先要修改它对应的blob,这会导致它的哈希值改变。为了能让文件夹能找到这个更改后的文件,文件夹tree对象中引用blob的那个标识符就得随之改变,这就引起了tree的哈希值改变。进而,那个历史的commit要引用修改后的tree,其哈希值也会变化,接着会引起这个commit的后续所有commit的哈希值变化。

事实上,由于密码学哈希算法SHA1的使用,只要给定任何一个commit的哈希值(仅仅20个字节),就可以唯一确定一个git项目某一对应时刻的完整状态,以及其完整的历史沿革。

这就是一个区块链。每个commit都是一个区块,commit之间的引用关系构成链条。由于每个commit可能引用若干个更老的commit,因此这不仅仅是个链,而是个有向无环图(DAG,directed acyclic graph)。

有人认为,仅仅是数据结构符合区块链特性,并不能足够说明git的区块链属性。而git的设计思想和使用方式,让git仓库成为了真正意义上的区块链应用。

在git仓库里怎么挖矿?当然是通过写代码、提交代码。这实在是太妙了,我只要在Linux kernel里面提交两行注释说:“幻腾智能招聘golang工程师”,就可以被所有内核程序员看到,就可以在家坐收英才简历了?

想得美!

软件开发中的共识机制是:谁的提交功能好、bug少,就能被大家认可,加入到共识的版本中去。因此,虽然人人都能在git上提交新的修改,但一个招聘广告显然对Linux内核没有价值,不会得到社区的认可。只有那些真正有价值的提交,才会被pull到大家都认可的仓库中。 这是一种真正意义上的proof of work,这里的work是真正意义上的工作、成果。

与比特币的“验证哈希值足够小”相比,这种对于代码提交质量的判断,完全是主观的。为了保持分布式的git仓库的一致,就要求一个项目的每个参与者,都有能力review所有人提交的代码,并以相同的标准接收高质量的提交。这在现实中几乎是不可能的。因此,人们就组织起来,在小范围内统一接收标准,形成了软件的维护者团队。而维护者以外的开发者或使用者,则完全根据自己个人的偏好,选择一个自己信任的维护团队。这就类似于有人维护比特币全节点,有人使用轻钱包。

bitcoin v.s. git

回到Linux内核,作为世界上最重要的开源项目,它由Linux基金会组织,由Linus和一群小伙伴们一起维护。全世界的开发者都信任Linus的团队,从而请求他们合并自己的提交,并仅仅信任被他们接受的提交。试想,假若有一天Linus黑化了(Linus自己的原话是,假若某天某个小伙伴忘了吃药了),在内核中真的发布了幻腾智能的招聘广告,那么一旦有人发现,就不会再信任Linus维护的版本。而另一个有信誉有技术的人,比如Minus,就会扛起大旗,继续内核的维护工作。于是Linux大旗不会倒,但可能会改名叫Minux吧。

这就是git中的硬分叉。在数字货币领域,分叉已经成了家常便饭(菜谱包括猪肉韭菜包,韭菜炒鸡蛋等)。在git管理的开源项目中,分叉也很常见,原因多种多样。

最主要的原因之一,是原先的维护团队“黑化”。当然,通常不是指在代码中夹带广告或者恶意代码,而是改变了软件的License授权协议,开始收费或者增加使用条款。这时,几乎一定会有人揭竿而起,基于原License的版本继续开发,从而形成分叉。例如,大家现在都在用的OpenSSH,就是从早期的SSH项目分叉而来,因为后者成为了商业软件。又比如CentOS从RHEL分叉而来,为社区提供免费的企业级Linux发行版。而LibreOffice从OpenOffice分叉而来,更是暴力地干掉了原本的OpenOffice项目——大部分OpenOffice的维护者都加入了LibreOffice,从而没有人再维护OpenOffice了。

LibreOffice的发展(分叉)历程

另一些分叉比较温和,可能仅仅是因为团队对于产品定位和方向的理解不同。比如Ubuntu从Debian分叉而来。可能Ubuntu看不惯Debian的产品和设计,但仍然依赖Debian的技术,两者还是好基友,代码补丁共享。

这些都是开源软件社区中活生生的分叉的例子,而git给了大家发起和维护分叉的工具。可见,git不仅仅在数据结构上使用了区块链技术,而且在使用思想上,也涵盖了区块链中的关键概念:分布式、共识机制、分叉等。你是否曾经怀疑,为什么在开源软件这样一个需要无中心的信任机制的领域,没有看到区块链的应用呢?答案是,大家早在2005年,就在Linus大神的带领下,走进了区块链的殿堂,那时候比特币还没诞生呢!

说到这里,我们甚至可以抱着吃瓜不嫌事大的态度揣测,以Linus的设计能力和技术实力,加上他早在2005年就把区块链玩得如此透彻,就差用在数字货币领域了。他难道不是发明比特币的不二人选吗?事实上,他在2007年的演讲中就说,“现在我只需要想明白第三步:怎么赚钱”。