朋友圈看到一篇名为《区块链开发技术综述》的文章被广泛转载,我有一些技术与理念上的不同意见,写在这里。
第一是按照节点准入规则,划分为公有链、私有链和联盟链。公有链的代表自然是比特币和以太坊,私有链则以R3 Corda声名最盛,联盟链的代表作品是Hyperledger名下的Fabric。
私有链和联盟链的区别仅仅在于部署方式,而不在这个区块链项目本身,这也是为什么私有链和联盟链可以被统称为许可链(Permissioned Ledger)或者是分布式账本(Distributed Ledger)的原因。
私有链被部署在单一机构内部,是为“私有”,而联盟链则部署在行业或者某种小团体内部,是为“联盟”。无论是Corda还是Fabric,既能作为私有链用,也能作为联盟链用。被强行扣上私有链的小帽,Corda实在是冤。
公有链注重匿名性与去中心化,而私有链及联盟链注重高效率,而且还往往设置了准入门槛。
公有链、私有链与联盟链之间的这些不同都在技术中有所体现,比如私有链和联盟链假设节点数目不大,可以采用PBFT算法来形成共识。
共识节点准入机制是联盟/私有链(下文以许可链统称之)的本质特征,不是“往往设置”的配件。相反,“节点数”不大不是许可链的必须假设。
第二是按照共享目标,划分为共享账本和共享状态机两派。比特币是典型的共享账本,而Chain和BigchainDB也应属此类,这几个区块链系统在各个节点之间共享一本总账,因此对接金融应用比较方便。另一大类区块链系统中,各个节点所共享的是可完成图灵完备计算的状态机,如以太坊、Fabric,它们都通过执行智能合约而改变共享状态机状态,进而达成种种复杂功能。
状态机和账本不是不同的两派,而是不同层次的概念。账本是业务层的概念,与金融场景密切相关。而无论是以太坊还是Fabric中的状态机,都是计算机科学意义上的状态机,也即是分布式系统常用模型Replicated State Machine的组成部分,这是一个更加底层,更加抽象的概念,不涉及具体业务。目前你能看到的“共享账本”,实际上都是基于”共享状态机“实现的。
因此无论是在以太坊和Fabric上,我们都可以实现“共享账本”。相应的,比特币同样是通过执行交易中的Bitcoin Script改变整个系统的状态(UTXO Pool)。比特币不仅仅是一个账本,如果只是要实现账本的功能Satoshi没必要设计Bitcoin Script,比特币同样是一个智能合约平台。
第三是按照梅兰妮 · 斯旺所描述的代际演进,将区块链系统分为1.0、2.0和3.0三代。其中1.0支撑去中心化交易和支付系统,2.0通过智能合约支撑行业应用,3.0支撑去中心化的社会体系。比特币和Chain应属于区块链1.0系统,而以太坊和Fabric是区块链2.0系统,目前尚无成功的区块链3.0系统出现,不成功的尝试倒是有那么一个,就是著名的The DAO。
如果硬要按照这个标准划分,以太坊是具有3.0潜力的目前处于2.0阶段的平台。
第四是按照核心数据结构,分为区块链和分布式总账两派。区块链这一派在系统中真的实现了一个区块的链作为核心数据结构,而分布式总账这一派,只是吸取了区块链的精神,并没有真用一条区块链作为核心数据结构,或者虽然暂时用了,但声明说吾项庄舞区块链,意在分布式总账耳,若假以时日,因缘际会,未尝不可取而代之也。
区块+链是“区块链”的核心数据结构是一个普遍的误解,这就好像说老婆饼=老婆+饼。区块链这个词确实源自区块+链的意思,但在技术的发展中早已摆脱了这个定式。在我看来,区块链和分布式账本是不同层级的概念。分布式总帐可以用或不用区块链技术实现,区块链技术可以实现分布式账本以及其它许多应用。
首先当然是比特币。比特币作为区块链的第一个也是目前为止最成功、最重要的样板工程,已经上线运行了八年多,本身没有发生任何严重的安全和运维事故,其稳定与强悍堪称当代软件系统典范。
比特币网络的稳定性确实堪称典范,在充满恶意的野外从未停机的运行了8年,这个成就无论怎么称赞都不为过。不过要说有没有发生什么严重的事故,就看你如何定义“严重”了。另一个常被忽略的事实是比特币网络已经拥堵不堪,这就好像支付宝规定自己每天只处理10万笔转账一样,虽然系统稳定,但是并没有满足用户需求,解决该解决的问题。真心希望比特币扩容之争快些结束。
比特币Bitcoin Core是一个代码质量高、文档良好的开源软件,从学习区块链原理、掌握核心技术的角度来说,Bitcoin Core是最佳切入点,能够学到原汁原味的区块链技术。当然,Bitcoin Core是用C++写的,而且用了一些C++11和Boost库的机制,对学习者的C++水平提出了较高的要求。
学习原理我向大家推荐《Mastering Bitcoin》,讲解透彻,开源而且免费。Bitcoin也有Go实现的版本,也许会比充满历史遗留的C++版本更适合你。要知道,比特币是一种协议,不是特定的某个客户端,无论看哪种语言的实现,只要它实现了必要的功能,就可以作为参考。
学习比特币平台开发还有一个优势,就是可以对接繁荣的比特币技术社区。目前围绕比特币进行改进和提升的人很多,人多力量就大,诸如隔离验证、闪电网络、侧链等比较新的想法和技术,都率先在比特币社区里落地。
闪电网络在哪个社区先落地难说,Bitcoin本身的限制给闪电网络的实现造成了很大障碍。
比如侧链技术的主要领导者Blockstream是由密码学货币元老Adam Back领衔的,而Blockstream是Bitcoin Core最大的贡献者之一,所以一些有关侧链的技术在比特币社区里讨论最充分。
注意侧链(Sidechain)不是一个统称,只是Blockstream推出的一种技术的名字,关于这个名字的吐槽可见Vitalik给R3写的跨链设计文档。
当前以太坊项目的开发进展并不顺利。一个比较突出的问题是项目过多,力量分散,导致项目质量参差不齐。
以太坊的开发进度确实比预计慢了不少,主要原因是2016下半年为处理连续两次攻击事件(TheDAO & DoS)花费了很多时间,导致Metropolis开发工作在2017春节前才正式展开。从项目多就得出力量分散的结论有些想当然,仅仅拿ethereum/go-ethereum一种客户端来说,contributor数量是110, fork数量1022;相比之下hyperledger/fabric的contributor数量是72,fork数量706,由此可反见以太坊生态的繁荣。
这与以太坊革命无罪、造反有理的形象形成鲜明对比。
不知道为什么以太坊在作者心中是这种形象...
第二类开发者是开发智能合约的。这类开发者使用类似Solidity这样的智能合约语言,或者直接用Go、Java、Python等语言开发。开发智能合约所要求的语言和算法技术水平不高,什么并发、多线程之类的东西一般用不到,普通开发者均可胜任。但是智能合约的难点在于业务与安全。本质上智能合约就是以代码写成的商业合同,必须对于业务有非常清晰的认识,对于安全有着深刻的理解,才能够写出正确的智能合约。因此,我认为未来智能合约的开发者,可能反而是具体应用领域的行业专家出身居多,因为让他们掌握Python语言,远比让程序员去理解进出口贸易规则或者商业票据业务要容易得多。
程序员要理解业务规则自然是需要努力学习,但是行业专家要写出安全的Python程序就要更容易?难以苟同。如果你承认写程序是一个行业,程序员就是这个行业的专家,程序语言与安全知识就是这个行业的领域知识,没必要把程序员特殊化对待。