本着“以教带学,Learning by Doing”的想法,我于上周加入了Bob组织的HiBlock区块链技术布道群。这个群可不太好混,群规要求每一个成员必需每周有输出,连续两次交白卷就要被踢出群。html
在这样的压力之下,我决定开一个新坑:区块链周周记,记录下每周区块链的学习成果和爬坑经验。做为系列的新篇章,我选择从超级帐本的Fabric开始。java
我在以前的文章中曾说过会从超级帐本入手开始区块链的学习和实践,同时也给出了我的的理由。但做为一篇布道类文章,单单我的喜爱是没有说服力的。node
在Fabric的文档中,它强调了本身面向企业应用而生的理由:git
能够看得出,相比起公链激进的作法,以Fabric为表明的联盟链要温和的多,而且也容易为企业所接受。加上其给出的若干限制,技术上的落地也相对容易不少。github
关于区块链自己的理论和介绍,目前已经烂大街了,在此也就是再也不赘述。在本节,让咱们来看看Fabric是如何经过主要组件完成技术落地的。数据库
从大的方面讲,Fabric的主要组件大体可划分红这几个部分:编程
Fabric的分布式帐本状态由两部分组成:世界状态(World State)和区块链。前者表明帐本的当前状态,变动和查询频繁,每每以数据库形式实现;后者则用来捕获前者的每次变动,做为交易的变动记录,没法修改且极少查询,经常实现为文件形式。网络
对于世界状态的DB载体,当前版本有两个选择:内置的LevelDB和外置的CouchDB,若是想要得到更灵活的查询能力,选择后者。由此你们应该能够猜出:世界状态中保存的数据是以KV对的形式存在。composer
对于区块链来说,它以Block的hash链组成,每一个Block包含一组有序的交易。这个顺序是交易顺序,很是关键。框架
除了这两个组件,Fabric还引入了一个独特的设计:Channel,用来解决不一样组织间的帐本共享问题。假如组织A同时与组织B和组织C作生意,而且组织B和组织C是竞争对手,那么经过创建不一样的Channel能够实现A和B,A和C分别共享各自的帐本。利用Channel,很好地解决了常见的B2B场景。
Channel抽象出了业务参与方的沟通,可视为业务网络的子网,实现了交易的相互隔离和业务私密性。
Fabric的智能合约以“链码(Chaincode)”的形式存在,外部客户端利用它来完成对世界状态的更改。与以太坊不一样,链码支持使用通用编程语言来书写,当前版本支持Go和Node.js,但从Fabric Java SDK的源码中能够看出,离支持Java应该也不远了:
public enum Type { JAVA, GO_LANG, NODE }
对于初学者须要注意的是:链码 != Fabric SDK。前者运行于Fabric环境,执行业务逻辑。后者则由被客户端程序用来与链码完成交互。打个相似的比方:
由此可知,链码自己其实是一个应用,其生命周期可分为:package、install、instantiate、upgrade。一样,链码能够绑定任意任意数量的Channel,并独立运行。
关于链码的教程,文档已经给出了详细的说明,在此就再也不啰嗦。
Fabric中有三类节点:
整个事务流程在文档中有介绍:
从上面的流程能够看出,Fabric的共识机制创建在endorsement policy之上,它能够经过命令行参数进行配置,并不须要Channel的全部Peer参与。
成员服务负责参与方的身份许可和验证,它创建于数字证书和信任链基础之上。所谓成员,既能够是组织(Org),也能够是组织部门(OU)。Fabric的成员服务配置能够出如今两处:Local(节点)和Channel(Channel级)。
从开发角度来说,引入成员服务带来的做用就是:若是应用(Client和Chaincode)要参与到区块链网络中,则须要相应签名和证书。
老实讲,从上面的简单介绍已经看出,Fabric的开发并不简单,它至少涉及:
这还不算完,如何测试也是一个大麻烦,相比起简单的CRUD应用,光搭建Fabric的环境就让人生畏。假如你对本身的要求更高点,想要实现一个持续集成环境,该怎么办?
此外,开发以后的运维成本也不会低,除了Fabric自己的基础设施,链码的平滑升级也对开发和运维提出了高标准。
鉴于这些麻烦的事情,假如你没有办法说服业务合做方也一样部署一套Fabric,我以为彻底没有必要去基于它来开发应用。单组织内的区块链应用,我我的认为是一个伪命题,没有存在的价值。
关于示例教程,Fabric的文档已经给出了范例,各位能够仔细阅读。
为了下降区块链应用的开发难度,超级帐本项目又引入了Composer。其目的在于加速应用的开发和部署,目前已经支持Fabric,当前处于孵化阶段。它创建在诸多框架和工具之上:
看起来很不错!
对于一个初学者来说,写这篇文章真不容易!如文章存在错误,不要客气,只管指出,:)。关于下一周的周记,我会去写一个实际的Fabric应用的例子,同时给出Composer的例子,请保持关注。
附注:在写此文的过程当中,我还找到了一篇吐槽Fabric的文章,这里一并给出连接,方便你们客观评定。