超级账本Fabric项目自诞生之日起就吸引了全球众多企业的密切关注,已经先后发布了两个大的版本,0.6实验版本(2016年9月)和1.0正式版本(2017年7月)。
目前,超级账本Fabric架构上核心特性主要包括:
超级账本Fabric的整体架构如下图所示。
Fabric为应用提供了gRPC API,以及封装API的SDK供应用调用。应用可以通过SDK访问Fabric网络中的多种资源,包括账本、交易、链码、事件、权限管理等。应用开发者只需要跟这些资源打交道即可,无需关心如何实现。其中,账本是最核心的结构,记录应用信息,应用则通过发起交易来向账本中记录数据。交易执行的逻辑通过链码来承载。整个网络运行中发生的事件可以被应用访问,以触发外部流程甚至其他系统。权限管理则负责整个过程中的访问控制。账本和交易进一步地依赖核心的区块链结构、数据库、共识机制等技术;链码则依赖容器、状态机等技术;权限管理利用了已有的PKI体系、数字证书、加解密算法等诸多安全技术。底层由多个节点组成P2P网络,通过gRPC通道进行交互,利用Gossip协议进行同步。
层次化结构提高了架构的可扩展和可插拔性,方便开发者以模块为单位进行开发。
超级账本Fabric根据交易过程中不同环节的功能,在逻辑上将节点角色解耦为Endorser和Committer,让不同类型节点可以关注处理不同类型的工作负载。典型的交易处理过程如下图所示。
在整个交易过程中,各个组件的功能主要为:
超级账本Fabric采用了模块化功能设计,整体的功能模块结构如下图所示。
超级账本Fabric面向不同的开发人员提供了不同层面的功能,自下而上可以分为三层:
下面介绍网络层相关组件的功能和作用。
网络层相关组件
网络层通过软、硬件设备,实现了对分布式账本结构的连通支持,包括节点、排序者、客户端等参与角色,还包括成员身份管理、Gossip协议等支持组件。
节点(Peer)的概念最早来自P2P分布式网络,意味着在网络中担任一定职能的服务或软件。节点功能可能是对等一致的,也可能是分工合作的。在超级账本Fabric网络中,Peer意味着在网络中负责接受交易请求、维护一致账本的各个fabric-peer实例。这些实例可能运行在裸机、虚拟机甚至容器中。节点之间彼此通过gRPC消息进行通信。按照功能角色划分,Peer可以包括三种类型:
Peer节点相关的主要数据结构包括PeerEndpoint和endorserClient。前者代表一个Peer节点在网络中的接入端点;后者实现EndorserClient接口,代表连接到Peer节点的客户端句柄,提供对Endorser角色实现的ProcessProposal(ctx context.Context,signedProp *pb.SignedProposal)(*pb.ProposalResponse, error)方法的访问。如下图所示。
排序者(Orderer),或称为排序节点,负责对所收到的交易在网络中进行全局排序。Orderer主要提供了Broadcast(srv ab.AtomicBroadcast_BroadcastServer) error和Deliver(srv ab.AtomicBroadcast_DeliverServer) error两个接口。前者代表客户端将数据(交易)发给Orderer,后者代表从Orderer获取到排序后构造的区块结构。客户端可以使用atomicBroadcastClient结构访问这两个接口。atomicBroadcastClient结构如下图所示,维持了一个gRPC的双向通道。
Orderer可以支持多通道。不同通道之间彼此隔离,通道内交易相关信息将仅发往加入到通道内的Peer(同样基于gRPC消息),从而提高隐私性和安全性。在目前的设计中,所有的交易信息都会从Orderer经过,因此,Orderer节点在网络中必须处于可靠、可信的地位。
从功能上看,Orderer的目的是对网络中的交易分配全局唯一的序号,实际上并不需要交易相关的具体数据内容。因此为了进一步提高隐私性,发往Orderer的可以不是完整的交易数据,而是部分信息,比如交易加密处理后的结果,或者仅仅是交易的Hash值、Id信息等。这些改进设计会降低对Orderer节点可靠性和安全性的需求。社区目前也已经有了一些类似的设计讨论(参考FAB-1151:Side DB-Private Channel Data)。
客户端是用户和应用跟区块链网络打交道的桥梁。客户端主要包括两大职能:
这些操作需要跟Peer节点和Orderer节点打交道。特别是链码实例化、交易等涉及到共识的操作,需要跟Orderer交互,因此,客户端往往也需要具备Submitter的能力。网络中的Peer和Orderer等节点则对应提供了gRPC远程服务访问接口,供客户端进行调用。目前,除了基于命令行的客户端之外,超级账本Fabric已经拥有了多种语言的SDK。这些SDK封装了对底层gRPC接口的调用,可以提供更完善的客户端和开发支持,包括Node.Js、Python、Java、Go等多种实现。
CA节点(Fabric-CA)负责对Fabric网络中的成员身份进行管理。Fabric网络目前采用数字证书机制来实现对身份的鉴别和权限控制,CA节点则实现了PKI服务,主要负责对身份证书进行管理,包括生成、撤销等。需要注意的是,CA节点可以提前签发身份证书,发送给对应的成员实体,这些实体在部署证书后即可访问网络中的各项资源。后续访问过程中,实体无须再次向CA节点进行请求。因此,CA节点的处理过程跟网络中交易的处理过程是完全解耦开的,不会造成性能瓶颈。
Fabric网络中的节点之间通过Gossip协议来进行状态同步和数据分发。Gossip协议是P2P领域的常见协议,用于进行网络内多个节点之间的数据分发或信息交换。由于其设计简单,容易实现,同时容错性比较高,而被广泛应用到了许多分布式系统,例如Cassandra采用它来实现集群失败检测和负载均衡。Gossip协议的基本思想十分简单,数据发送方从网络中随机选取若干节点,将数据发送过去;接收方重复这一过程(往往只选择发送方之外节点进行传播)。这一过程持续下去,网络中所有节点最终(时间复杂度为节点总个数的对数)都会达到一致。数据传输的方向可以是发送方发送或获取方拉取。
在Fabric网络中,节点会定期地利用Gossip协议发送它看到的账本的最新的数据,并对发送消息进行签名认证。通过使用该协议,主要实现如下功能:
推荐阅读:
《区块链原理、设计与应用》
ISBN:978-7-111-57782-9
作者:杨宝华
定价:89.00元
本书由超级账本核心设计和开发者撰写,区块链开发落地专业指南。Apache基金会创始人Brian Behlendorf倾情推荐,清华大学五道口金融学院常务副院长廖理博士作序。由浅入深,详细讲解超级账本Fabric架构设计精华与应用开发,是区块链开发落地专业指南。
作者介绍:
杨保华,博士,毕业于清华大学。超级账本(Hyperledger)大中华区技术工作组主席,IBM大中华区Blockchain技术社区首席顾问,资深研究员。曾主持多个大规模系统平台的架构设计和研发实施,是区块链、云计算、大数据等技术的早期研究者和实践者。他热爱开源技术,曾贡献OpenStack、OpenDaylight等开源项目,是超级账本Fabric项目核心设计和开发者,也是Cello和Fabric-SDK-Py项目的发起人。个人主页为https://yeasy.github.com。