自从2008年中本聪发明了比特币以来,区块链行业被越来越多的人所关注。区块链具有分布式对等、数据块链式、不可伪造和防篡改、透明可信、高可靠性等关键特征。到目前为止,根据不同的应用场景和设计体系,区块链可以采用对应的开放共享节点权限方案,包括如下三种区块链部署模型:
本节实验将带大家一起开启联盟链Hyperledger Fabric的学习,通过本节内容,大家会学习并理解联盟链Fabric中的组织、成员、channel、链码、数据、msp、共识等重要的概念。
2015年12月, 由Linux基金会牵头, IBM、Intel、Cisco等共同宣布了HyperLedger联合项目成立。超级账本项目为透明、公开、去中心化的企业级分布式账本技术提供开源参考实现。超级账本首次将区块链技术引入到分布式联盟账本的应用场景中,为未来基于区块链技术打造高效率的商业网络打下基础。目前,超级账本由面向不同目的和场景的八大顶级子项目构成。而Fabric是最早加入到超级账本项目中的顶级项目,面向企业的分布式账本平台,,引入了权限管理,支持可插拔、可扩展,由IBM、DIH等企业于2015年底提交到社区,是首个面向联盟链场景的开源项目,Fabric基于golang语言实现,目前已发布2.2版本。
它的github地址是:https://github.com/hyperledger/fabric
Fabric可以面向企业内部或多个企业之间的商业区块链应用场景,将区块链的维护节点和可见性限制在联盟内部,并用智能合约(链码)重点解决联盟成员间的信任或信息不对等问题,以提高经济活动效率。Fabric主要应用的场景有如下几个方面:
金融服务:Fabric可以有效降低交易成本和管控风险、减少跨组织的交易风险,其在金融领域的应用受到了不少银行和金融交易机构的主要推动。
征信和资产权属管理:Fabric可以促进数据的交易和流动;提供安全可靠的支持。特别是资产权属的管理,利用区块链平台建立的多方信任机制可以有效降低资产交易成本和违约风险。
国际自动化贸易和供应链管理:Fabric可以简化管理流程中繁琐的手续。利用智能合约,贸易中销售和法律合同可以数字化、可以实现货物监控和实时支付,大大降低了公司的运营成本。
通俗一点的来说,Fabric就是由少数的几个企业之间组成的一个弱分布式网络,每个企业定义为一个组织。企业与企业之间,也就是组织与组织之间,通过创建或者加入channel的方式,共享channel上的链码权限,所谓链码,也就是链上代码,是组织之间共同确认的业务代码,也通常被称为智能合约。因为链码一旦部署,不需要人为干预,只需要执行调用指定的方法,链码就会自动进行逻辑处理,将数据上传到联盟链中或者查询联盟链上的数据。
Fabric具有以下几个显著的特点:
Fabric网络中的最大单元是组织,组织中可以包含peer、orderer两种节点,每种节点可以包含一个或多个,每个节点都可以看做一个正在运行的服务。它们的职责如下:
Fabric组织中的peer、orderer都有成员的概念。orderer节点中的成员只有一个,因为orderer集群中的节点可能是由不同的组织共同组成的,所以orderer节点创建的成员的目的就是标志一个唯一身份,Fabric会为这个orderer节点的唯一成员生成公私钥证书,如果开启了TLS通信方式,那么还会生成TLS证书。
在Fabric的组织的peer节点中,成员个数是通过配置文件制定的,一般来说,会包含一个Admin成员和多个User成员。某些操作的权限只有Admin成员才能执行,比如创建链码、部署链码等等;
channel创建的目的是隔离组织、隔离数据。
链上代码,简称链码,又称智能合约。一般是指由开发人员使用Go语言(也支持Java等语言)编写的应用程序代码,提供分布式账本的状态处理逻辑。链码被部署在Fabric的网络节点中,能够独立运行在具有安全特性的受保护的Docker 容器中,以 gRPC 协议与相应的 peer 节点进行通信,以操作(初始化或管理)分布式账本中的数据。可以根据不同的需求开发出不同的复杂的应用。
链码的部署需要指定组织、该组织加入的channel、该组织中加入了该channel的peer节点这三个最基本的条件。除此之外,链码需要定义链码名称和链码版本。
链码的部署大致分为两步:安装和实例化。
另外,链码属于业务逻辑代码,因此可能会需要修改。Fabric提供了链码升级的功能,不过因为链码在实例化的时候指定了背书策略,如果在多个组织共同部署了同一个链码的情况下,某个组织单独修改链码项目,升级链码,会出现调用该链码的时候因为与其他组织背书结果不相同而调用失败;所以,在链码需要升级的时候,需要部署了该链码的所有组织都同步升级。
Fabric数据存储在peer节点和orderer节点中。一次链码调用会产生一个提案,该提案由背书节点验证,发到orderer集群中,由orderer集群存储该提案信息。orderer集群会对所有提案进行排序、打包,最后广播给相关的peer节点,peer节点会根据提案的信息,修改本地存储的状态数据。
因此,我们可以总结一下:peer节点负责存储状态数据,orderer集群负责存储提案,如果用传统型数据库mysql来类比的话,peer存的数据就是我们能够通过select查到的表数据,orderer集群存储的就是我们进行insert、update、delete时的记录;
在Fabric中,MSP是Membership Service Provider的缩写,直译为成员关系服务提供者。我们可以简单的理解为,MSP就是提供了一组用来维护我们上述所说的组织和成员身份信息的生成、验证的接口。除了在Fabric内部基于MSP接口实现的一套msp服务,hyperledger组织另外还开发了一个Fabric-CA项目,不管使用哪一种,它们都是实现了MSP的接口,都是用来管理Fabric的组织、成员之间的身份信息的生成和验证的。
Fabric的身份信息的生成使用了基于标准的x.509标准生成证书的方式。Fabric会创建一个私有的CA根证书,多个组织都由这个根证书颁发中间证书。组织中的成员证书则是由组织的中间证书生成的下一级证书。证书生成的算法目前默认指定了SW,也就是SHA256方式。
Fabric的orderer集群负责接收提案、排序、打包、广播等工作。orderer集群的orderer既属于某个组织,也属于该集群,每个orderer节点都需要参与orderer集群的共识。目前Fabric支持的共识方式有两种: