0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

超级账本Fabric的架构与设计

C语言专家集中营 来源:未知 作者:邓佳佳 2018-03-21 15:02 次阅读

超级账本Fabric项目自诞生之日起就吸引了全球众多企业的密切关注,已经先后发布了两个大的版本,0.6实验版本(2016年9月)和1.0正式版本(2017年7月)。

目前,超级账本Fabric架构上核心特性主要包括:

  • 解耦了原子排序环节与其他复杂处理环节,消除了网络处理瓶颈,提高可扩展性;

  • 解耦交易处理节点的逻辑角色为背书节点(Endorser)、确认节点(Committer),可以根据负载进行灵活部署;

  • 加强了身份证书管理服务,作为单独的Fabric CA项目,提供更多功能;

  • 支持多通道特性,不同通道之间的数据彼此隔离,提高隔离安全性;

  • 支持可拔插的架构,包括共识、权限管理、加解密、账本机制都模块,支持多种类型;

  • 引入系统链码来实现区块链系统的处理,支持可编程和第三方实现。

超级账本Fabric的整体架构如下图所示。

Fabric整体架构

Fabric为应用提供了gRPC API,以及封装API的SDK供应用调用。应用可以通过SDK访问Fabric网络中的多种资源,包括账本、交易、链码、事件、权限管理等。应用开发者只需要跟这些资源打交道即可,无需关心如何实现。其中,账本是最核心的结构,记录应用信息,应用则通过发起交易来向账本中记录数据。交易执行的逻辑通过链码来承载。整个网络运行中发生的事件可以被应用访问,以触发外部流程甚至其他系统。权限管理则负责整个过程中的访问控制。账本和交易进一步地依赖核心的区块链结构、数据库、共识机制等技术;链码则依赖容器、状态机等技术;权限管理利用了已有的PKI体系、数字证书、加解密算法等诸多安全技术。底层由多个节点组成P2P网络,通过gRPC通道进行交互,利用Gossip协议进行同步。

层次化结构提高了架构的可扩展和可插拔性,方便开发者以模块为单位进行开发。

超级账本Fabric根据交易过程中不同环节的功能,在逻辑上将节点角色解耦为Endorser和Committer,让不同类型节点可以关注处理不同类型的工作负载。典型的交易处理过程如下图所示。

示例交易处理过程

在整个交易过程中,各个组件的功能主要为:

  • 客户端(App):客户端应用使用SDK来跟Fabric网络打交道。首先,客户端从CA获取合法的身份证书来加入到网络内的应用通道。发起正式交易前,需要先构造交易提案(Proposal)提交给Endorser进行背书(通过EndorserClient提供的ProcessProposal(ctx context.Context, signedProp *pb.SignedProposal)(*pb.ProposalResponse,error)接口);客户端收集到足够(背书策略决定)的背书支持后可以利用背书构造一个合法的交易请求,发给Orderer进行排序(通过BroadcastClient提供的Send(env *cb.Envelope)error接口)处理。客户端还可以通过事件机制来监听网络中消息,来获知交易是否被成功接收。命令行客户端的主要实现代码在peer/chaincode目录下。

  • Endorser节点:主要提供ProcessProposal(ctx context.Context,signedProp *pb.SignedProposal)(*pb.ProposalResponse,error)方法(代码在core/endorser/endorser.go文件)供客户端调用,完成对交易提案的背书(目前主要是签名)处理。收到来自客户端的交易提案后,首先进行合法性和ACL权限检查,检查通过则模拟运行交易,对交易导致的状态变化(以读写集形式记录,包括所读状态的键和版本,所写状态的键值)进行背书并返回结果给客户端。注意网络中可以只有部分节点担任Endorser角色。主要代码在core/endorser目录下;

  • Committer节点:负责维护区块链和账本结构(包括状态DB、历史DB、索引DB等)。该节点会定期地从Orderer获取排序后的批量交易区块结构,对这些交易进行落盘前的最终检查(包括交易消息结构、签名完整性、是否重复、读写集合版本是否匹配等)。检查通过后执行合法的交易,将结果写入账本,同时构造新的区块,更新区块中BlockMetadata[2](TRANSACTIONS_FILTER)记录交易是否合法等信息。同一个物理节点可以仅作为Committer角色运行,也可以同时担任Endorser和Committer这两种角色。主要实现代码在core/committer目录下;

  • Orderer:仅负责排序。为网络中所有合法交易进行全局排序,并将一批排序后的交易组合生成区块结构。Orderer一般不需要跟账本和交易内容直接打交道。主要实现代码在orderer目录下。对外主要提供Broadcast(srv ab.AtomicBroadcast_BroadcastServer)error和Deliver(srv ab.AtomicBroadcast_DeliverServer)error两个RPC方法(代码在orderer/server.go文件);

  • CA:负责网络中所有证书的管理(分发、撤销等),实现标准的PKI架构。主要代码在单独的fabric-ca项目中。CA在签发证书后,自身不参与到网络中的交易过程。

核心概念与组件

超级账本Fabric采用了模块化功能设计,整体的功能模块结构如下图所示。

Fabric核心组件

超级账本Fabric面向不同的开发人员提供了不同层面的功能,自下而上可以分为三层:

  • 网络层:面向系统管理人员。实现P2P网络,提供底层构建区块链网络的基本能力,包括代表不同角色的节点和服务;

  • 共识机制和权限管理:面向联盟和组织的管理人员。基于网络层的连通,实现共识机制和权限管理,提供分布式账本的基础;

  • 业务层:面向业务应用开发人员。基于分布式账本,支持链码、交易等跟业务相关的功能模块,提供更高一层的应用开发支持。

下面介绍网络层相关组件的功能和作用。

网络层相关组件

网络层通过软、硬件设备,实现了对分布式账本结构的连通支持,包括节点、排序者、客户端等参与角色,还包括成员身份管理、Gossip协议等支持组件。

节点(Peer)的概念最早来自P2P分布式网络,意味着在网络中担任一定职能的服务或软件。节点功能可能是对等一致的,也可能是分工合作的。在超级账本Fabric网络中,Peer意味着在网络中负责接受交易请求、维护一致账本的各个fabric-peer实例。这些实例可能运行在裸机、虚拟机甚至容器中。节点之间彼此通过gRPC消息进行通信。按照功能角色划分,Peer可以包括三种类型:

  • Endorser(背书节点):负责对来自客户端的交易提案进行检查和背书;

  • Committer(确认节点):负责检查交易请求,执行交易并维护区块链和账本结构;

  • Submitter(提交节点):负责接收交易,转发给排序者,目前未单独出现。

这些角色是功能上的划分,彼此并不相互排斥。一般情况下,网络中所有节点都具备Committer功能;部分节点具有Endorser功能;Submitter功能则往往集成在客户端(SDK)进行实现。

Peer节点相关的主要数据结构包括PeerEndpoint和endorserClient。前者代表一个Peer节点在网络中的接入端点;后者实现EndorserClient接口,代表连接到Peer节点的客户端句柄,提供对Endorser角色实现的ProcessProposal(ctx context.Context,signedProp *pb.SignedProposal)(*pb.ProposalResponse, error)方法的访问。如下图所示。

Peer节点相关数据结构

排序者(Orderer),或称为排序节点,负责对所收到的交易在网络中进行全局排序。Orderer主要提供了Broadcast(srv ab.AtomicBroadcast_BroadcastServer) error和Deliver(srv ab.AtomicBroadcast_DeliverServer) error两个接口。前者代表客户端将数据(交易)发给Orderer,后者代表从Orderer获取到排序后构造的区块结构。客户端可以使用atomicBroadcastClient结构访问这两个接口。atomicBroadcastClient结构如下图所示,维持了一个gRPC的双向通道。

atomicBroadcastClient结构

Orderer可以支持多通道。不同通道之间彼此隔离,通道内交易相关信息将仅发往加入到通道内的Peer(同样基于gRPC消息),从而提高隐私性和安全性。在目前的设计中,所有的交易信息都会从Orderer经过,因此,Orderer节点在网络中必须处于可靠、可信的地位。

从功能上看,Orderer的目的是对网络中的交易分配全局唯一的序号,实际上并不需要交易相关的具体数据内容。因此为了进一步提高隐私性,发往Orderer的可以不是完整的交易数据,而是部分信息,比如交易加密处理后的结果,或者仅仅是交易的Hash值、Id信息等。这些改进设计会降低对Orderer节点可靠性和安全性的需求。社区目前也已经有了一些类似的设计讨论(参考FAB-1151:Side DB-Private Channel Data)。

客户端是用户和应用跟区块链网络打交道的桥梁。客户端主要包括两大职能:

  • 操作Fabric网络:包括更新网络配置、启停节点等;

  • 操作运行在网络中的链码:包括安装、实例化、发起交易调用链码等。

这些操作需要跟Peer节点和Orderer节点打交道。特别是链码实例化、交易等涉及到共识的操作,需要跟Orderer交互,因此,客户端往往也需要具备Submitter的能力。网络中的Peer和Orderer等节点则对应提供了gRPC远程服务访问接口,供客户端进行调用。目前,除了基于命令行的客户端之外,超级账本Fabric已经拥有了多种语言的SDK。这些SDK封装了对底层gRPC接口的调用,可以提供更完善的客户端和开发支持,包括Node.JsPythonJava、Go等多种实现。

CA节点(Fabric-CA)负责对Fabric网络中的成员身份进行管理。Fabric网络目前采用数字证书机制来实现对身份的鉴别和权限控制,CA节点则实现了PKI服务,主要负责对身份证书进行管理,包括生成、撤销等。需要注意的是,CA节点可以提前签发身份证书,发送给对应的成员实体,这些实体在部署证书后即可访问网络中的各项资源。后续访问过程中,实体无须再次向CA节点进行请求。因此,CA节点的处理过程跟网络中交易的处理过程是完全解耦开的,不会造成性能瓶颈。

Fabric网络中的节点之间通过Gossip协议来进行状态同步和数据分发。Gossip协议是P2P领域的常见协议,用于进行网络内多个节点之间的数据分发或信息交换。由于其设计简单,容易实现,同时容错性比较高,而被广泛应用到了许多分布式系统,例如Cassandra采用它来实现集群失败检测和负载均衡。Gossip协议的基本思想十分简单,数据发送方从网络中随机选取若干节点,将数据发送过去;接收方重复这一过程(往往只选择发送方之外节点进行传播)。这一过程持续下去,网络中所有节点最终(时间复杂度为节点总个数的对数)都会达到一致。数据传输的方向可以是发送方发送或获取方拉取。

在Fabric网络中,节点会定期地利用Gossip协议发送它看到的账本的最新的数据,并对发送消息进行签名认证。通过使用该协议,主要实现如下功能:

  • 通道内成员的探测:新加入通道的节点可以获知其他节点的信息,并发送Alive信息宣布在线;离线节点经过一段时间后可以被其他节点感知。

  • 节点之间同步数据:多个节点之间彼此同步数据,保持一致性。另外,Leader节点从Orderer拉取区块数据后,也可以通过Gossip传播给通道内其他、节点。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网络
    +关注

    关注

    14

    文章

    7251

    浏览量

    87447
  • 设计
    +关注

    关注

    4

    文章

    814

    浏览量

    69707
  • Fabric
    +关注

    关注

    0

    文章

    43

    浏览量

    7210
  • 架构
    +关注

    关注

    1

    文章

    485

    浏览量

    25200

原文标题:超级账本Fabric的架构与设计

文章出处:【微信号:C_Expert,微信公众号:C语言专家集中营】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1

    解决方案第一时间同步升级,在v1.1新功能的基础上,提供了弹性裸金属服务器(神龙)、内置容器化Explorer、集成阿里云日志服务等方面的增强。作为全球开源区块链领域影响最为广泛的项目之一,超级账本近日
    发表于 04-03 15:07

    Imagination 宣布与 NetSpeed 合作开发新的 Fabric 架构技术

    Imagination Technologies 宣布,将与片上网络 (on-chip network) 技术和工具 供应商NetSpeed Systems合作,为最先进的SoC (系统单芯片) 设计提供下一代的 Fabric 架构解决方案。
    发表于 01-11 14:25 2737次阅读

    超级账本架构分析

    Fabric整体架构 Fabric为应用提供了gRPC API,以及封装API的SDK供应用调用。应用可以通过SDK访问Fabric网络中的多种资源,包括
    发表于 09-28 14:20 0次下载
    <b class='flag-5'>超级</b><b class='flag-5'>账本架构</b>分析

    Julian Gordon:2018年是超级账本和区块链进入全盛时期的一年

    Hyperledger超级账本为Linux基金会协作的开源项目,旨在推进跨行业区块链技术。
    发表于 07-03 16:40 1404次阅读

    什么是超级账本,其发展进展又如何

    超级账本(Hyperledger)项目,将尝试在商业世界中标准化和民主化区块链。超级账本不是让公司们自己解决问题,而是结合跨行业的知识,允许企业构建可满足特定需求的定制区块链。
    发表于 10-23 11:13 2219次阅读

    阿里云成为Hyperledger超级账本全球会员,发力区块链生态建设

    2018年12月12日在瑞士巴塞尔的2018Hyperledger全球峰会上,阿里云正式加入Hyperledger超级账本项目并成为标准会员。阿里云将会与Hyperledger社区共同推进全球区块
    发表于 12-24 16:59 202次阅读

    超级账本在区块链行业中扮演着怎样的角色

    超级账本(Hyperledger)将解决企业空间的需求。这是一个基于linux技术的开源式区块链,IBM提供了大量支持,公司对这个技术前景非常看好,非常希望采用该项区块链技术。Gouran看来
    发表于 12-29 14:02 1289次阅读

    超级账本Hyperledger对区块链的应用

    Hyperledger对传统区块链模型进行了革新,其中包括管理参与者的访问许可权。换句话说,Hyperledger 是有权限的共享账本。Hyperledger为身份识别、审核及隐私提供了一个安全、健康的模型,从而缩短运算周期,实现有效扩展,应对业内各种运用要求。
    发表于 01-02 10:30 1202次阅读
    <b class='flag-5'>超级</b><b class='flag-5'>账本</b>Hyperledger对区块链的应用

    基于区块链技术的智能商务平台ElamaChain介绍

    超级账本是在Linux基金主导下,为了推进产业间区块链技术的发展组织的全球性开源项目。金融、银行、物联网、供应链、制造和技术领域的130多名成员正参与超级账本
    发表于 05-10 11:51 1054次阅读
    基于区块链技术的智能商务平台ElamaChain介绍

    如何利用超级账本的功能来构建一个应用程序

    如果您一直在研究超级账本,那么您可能已经接触过利用了线上超级账本网络的教程,比如carauction-network(可以在超级
    发表于 06-19 10:58 1002次阅读

    Linux基金会主导的超级账本项目发布了首个区块链代码

    Linux基金会(Linux Foundation)主导的超级账本项目(Hyperledger Project)发布了大型企业可以用来搭建软件的首个区块链代码。 包括IBM、思科(Cisco
    发表于 07-03 14:52 1173次阅读

    什么是超级账本

    Hyperledger(超级账本)是 Linux 基金会 2015 年发起的推进区块链数字技术和交易验证的开源项目,其创建的目的是为了支持多种商业环境的应用。
    发表于 12-05 10:49 5036次阅读

    基于区块链技术的开源公链项目Hyperledger基金会介绍

    IBM是企业区块链领域的重要参与者,其区块链平台以 Hyperledger Fabric 超级账本为基础,为很多大企业比如沃尔玛和安泰保险都开发过区块链试点产品。
    发表于 02-03 12:40 1335次阅读

    基于超级账本的DNS协同防御体系

    链整合多方资源共同对抗网络攻击,并利用超级账本的通道架构和背书策略实现隐私保护,促进网络信息共享。分析结果表明,该协同防御体系在数据层面和业务层面均具有较强的安全性,为解决域名行业安全问题提供了借鉴作用。
    发表于 05-28 11:15 12次下载

    Hyperledger Fabric开源区块链分布式账本

    fabric.zip
    发表于 04-22 09:17 1次下载
    Hyperledger <b class='flag-5'>Fabric</b>开源区块链分布式<b class='flag-5'>账本</b>