NBJL2020论文导读8:hyperledger fabric

许佳佳

论文下载地址https://hyperledger-fabric.readthedocs.io/en/latest/whatis.html#

论文信息:该文章是hyperledger fabric项目的官方文档,学习过程中亦可参考IBM的开源技术微讲堂视频:https://developer.ibm.com/cn/os-academy-hyperledger-fabric/

一、论文摘要

Hyperledger(超级账本)是 Linux基金会旗下的区块链开发平台项目,致力于发展跨行业的商用区块链平台技术 。Hyperledger旗下由面向不同场景的子项目构成:包括FabricSawtoothIrohaBlockChain ExplorerCelloindyComposerBurrow8大顶级项目。其中的Hyperledger Fabric子项目是是一个带有准入机制的企业级联盟链项目,它的前身是IBM贡献的OpenBlockchain。该项目的目标是实现一个通用的许可区块链(Permissioned Chain)的底层基础框架,并克服了比特币等公有链项目的缺陷,如吞吐量低、交易公开无隐私等问题,使得用户能够方便地开发商业应用。

二、论文内容

1fabric网络架构

fabric中,主要有以下几种节点:

1)客户端或者应用程序(Client Application

由最终用户操作的,它必须连接到某一个节点或者排序服务节点上与区块链网络进行通信 。

2Peer节点

在区块链网络中,所有的节点都是记账节点(Committer),负责把一笔交易写入账本,它会在本地存储这个数据库账本(Ledger)。 在这些记账节点中,部分节点会执行客户端提交的交易提案并对执行结果进行签名背书,充当背书节点(Endorser)的角色。背书节点是动态的角色,是与具体链码(Chaincode)绑定的 。

3)排序服务节点(Ordering-Service

排序服务节点接收包含背书签名的交易,对未打包的交易进行排序生成区块,然后把这些区块广播给各个组织的主节点。

2fabric的交易流程

假设现在A要给B转账10块钱:

1Propose这一步是client把一个交易,也就是一个proposal发送到endorsing peer,需要强调在fabric中,每一笔交易都是通过链码也就是智能合约发起的,

2Executeendorsing peer接收到交易的提案后,会把这个proposal放到智能合约里边执行,执行的时候会看你这笔钱是否能转,余额是否够等一些合约的业务逻辑判断,执行出来的结果是个读写集,什么是读写集呢,还是刚刚说的假设AB转账10块钱,那么在发送方,读集就是发送方原本的账户余额,即<key=balance,value=100,version=0>,写集就是把100改成90<key=balancevalue=90version=1>,也就是在写之后会把version1;在接收方,读集就是<key=balance,value=100,version=0>,写集是<key=balancevalue=110version=1>。这个阶段只是个仿真,并不会修改账本。发给哪个背书节点是根据背书策略来的。

3Response之后背书节点就会对读写集进行背书,也就是加密签名,背书之后就会把背书后的结果返回给client端。Client端收集到这些签名的结果后会把这些结果发送到orderer节点,

4Order Transactionorderer节点会把来自各个client端的交易进行全排序,然后把这些交易打包成块,这里它只负责排序,并不会打开这些交易查看验证交易的内容,

5Deliver排序节点把块打包好后就会分发给记账节点,

6Validate记账节点收到这些块后就会把这些块打开,再把里边的交易打开,验证这些交易,验证的就是刚刚背书节点的背书,以及拿到的这些读写集是否依据一定的策略收集到了足够的背书,然后会去验证读写集的版本号,刚刚说读集的version0,写集的version1,记账peer会去验证我现在看到的version状态是否是0,是0,那说明这个version没有更新过,那就这笔交易可以写入账本,也就是这笔交易验证通过了。

7Notify然后这些peer会通知client端,你的这笔交易是否成功


3Fabric账本

Fabric账本由区块链和状态数据库两部分组成:

Blockchain –是一组不可更改的有序的区块,记录着全部交易的日志。

在区块链中,一般初始区块存的是一些配置信息,之后就是历史交易信息了。在区块链中,一个区块分成三部分,区块头,区块内容,和区块的metadataMetadata主要存的就是这个区块的写入时间、写入的人以及签名;区块头存到就是当前区块的区块ID,所有交易的hash值,上一个区块的区块hash值等

World state –记录了账本中所有键值对的当前值,相当于对blockchain做了索引。

因为背书节点执行交易的时候需要读取账本的当前状态,如果去遍历整个区块链中相关的交易的话,效率非常低,因此,fabric维护了一个这样的状态数据库,通过这个状态数据库可以快速定位和访问某个键值的方法从状态数据库可以迅速获取键值的最新状态数据值。

World state存储的格式是上面我们提到的这种读写集,也就是<key value version>格式,如果修改了的话version就会加1。另外,因为状态数据库就是对blockchain的一个索引,所以当状态数据库出现故障的时候,可以通过遍历blockchain重新生成。


4、多链多通道的fabric网络

因为fabric是一个面向企业级的区块链平台,所以为了保护数据隐私,fabric使用channel对数据进行隔离。在fabric启动时就有一个内置的channel,是系统channel,对用户和开发人员是不可见的。创建应用channel是对系统channel发起交易,这个交易里包含了你要创建的channel的一些属性,当这个交易共识之后,就会创建一个新的channel

fabric中,部署智能合约,是在每个channel里部署智能合约,也就是上面讲到的交易流程是针对一个channel来说的。一个channel可以部署多个智能合约,在同一个channel里的智能合约可以互相调用,不同的也可以互相调用,但是跨channel暂时只是可以读数据但是不可以写数据。

在上图中有4organization,每个organization都要安装自己的CAorganization 4提供的是排序服务,然后organization 1提供的节点是P1organization2提供的节点是P2organization3提供的节点是p3P1P2节点在一个channel里,在这个channel里安装的chaincodecc1,安装的智能合约时S5,他俩维护着同一套账本L1p2p3在一个channel里,在这个channel里安装的chaincodecc2,这两个组织维护着同一套账本L1。可以看到P2节点安装在两个通道里,维护着两套账本;组织A1 A2可以访问channel c1的数据,A2A3可以访问channel C2的数据。

三、自己的认识和体会

1这个fabric是面向企业级应用的区块链平台,是个多链多通道的架构,我觉得这个架构特别好,因为他把整个区块链大网络利用通道划分成了不同的子网,每个子网只需要维护子网成员的交易日志就可以;

2fabric每个通道内的账本虽然对通道外的组织是不可见的,但是对通道内的成员是公开的,所以在Fabric通道内部的数据

具有隐私性。