区块链大致可分为公有链(典型代表为比特币和以太坊)和联盟链(私有链)。联盟链是现有中心化商业团体联盟之间(或团体内部)进行商业活动的手段和渠道。

HyperledgerFabric是由IBM 牵头发起的一个代表性的联盟链项目,于 15 年底移交给Linux 基金会维护,成为开源项目。Hyperledger 基金会的成员包括IBM,Intel,思科等。

Fabric 架构演变

Fabric 的架构目前经历了两个版本的演进,最初的 0.6 版本只能被用来做商业验证,无法被应用于真实场景中。主要原因就是结构简单,基本所有的功能都集中在 peer 节点,在扩展性、安全性和隔离性方面有着天然的不足,如图1所示。在后来推出的 1.0 正式版中,将 peer 节点的功能进行分拆,把共识服务从 peer 节点剥离,独立为 Orderer 节点提供可插拔共识服务。更为重要的一个变化就是加入了多通道(multi-channel)功能,可实现多业务隔离,因此在 0.6 版本的基础上有了质的飞跃。

图1 Fabric v0.6 架构

概念术语

Auditability(审计性):在一定权限和许可下,可以对链上的交易进行审计和检查。

Certificate Authority(CA):负责身份权限管理,又叫 MemberService 或 Identity Service。

Chaincode(链码):区块链上的应用代码,扩展自“智能合约”的概念,支持Go、Node.js 等编程语言,运行在隔离的容器环境中(Docker)。

Orderer(排序节点):Fabric 1.0 架构中的共识服务角色,可以对交易进行排序,批量打包,生成区块,发给Peer节点。一个区块链网络中有多个Orderer节点,它们共同提供排序服务。排序服务可以通过不同的方式实现,从一个中心化的服务(被用于开发和测试,如Solo),到分布式协议(如Kafka)。

Endorser(背书节点):Fabric 1.0 架构中的一类 peer 节点角色,负责检验某个交易是否合法,是否愿意为之签名背书。

Committer(提交节点):Fabric 1.0 架构中的另一类peer 节点角色,负责对 orderer 排序后的交易进行检查,选择合法的交易执行并写入存储。

Enrollment Certificate Authority(ECA,注册 CA):负责成员身份相关证书管理的 CA。

Transaction Certificate Authority(TCA,交易 CA):负责维护交易相关证书管理的 CA。

World State(世界状态):一个键值(K-V)数据库,用于存放链码(Chaincode)执行过程中涉及到的状态变量。

Fabric v1.0 架构

Fabric v1.0 的架构如图2所示。

图2 Fabric v1.0 架构

Fabric联盟链中有两种类型的节点:Peer节点和Orderer节点。Chaincode部署在Peer节点上,它对账本进行读写操作。一个Peer节点可以充当多种角色,如背书者endorser,提交者committer。一个区块链网络中会有多个Peer节点。

Orderer提供了通向客户端和Peer节点的共享通信通道。提供了包含交易的消息广播服务(broadcast和deliver)。客户端可以通过这个通道向所有的节点广播(broadcast)消息。通道可以向连接到该通道的节点投递(deliver)消息。

Orderer服务支持多通道(multi-channel)。客户端和Peer节点可以连接到一个给定的通道,并通过给定的通道发送和接收消息。多通道使得给定的peer集合接收包含相关交易的区块,从而与其他交易完全隔离,实现数据隔离和保密。如图3所示,peer 1, peer 2和peerN订阅红色通道,共同维护红色账本; peer 1和peer N订阅蓝色通道并维护蓝色账本; peer 2和peer 订阅黑色通道上,共同维护黑色账本。

图3 多通道

链码(Chaincode)

链码可以认为是 Fabric 提供的智能合约,是上层应用与底层区块链平台交互的媒介。

所有的链码都继承两个接口,init和 invoke。init 接口用于初始化合约,在整个链码的生命周期里,该接口仅仅执行一次。invoke 接口是编写业务逻辑的唯一入口,虽然只有一个入口,但是可以根据参数传递的不同自由区分不同业务逻辑。合约接口能获得数据分为三类:合约输入参数;与状态数据库和历史数据库交互(区块链底层可以看做一个键值对数据库,合约就是对数据库中键值的增删改查);与其他合约的交互。

Fabric 1.0交易流程

Fabric上的交易(transction)交易分两种:部署交易和调用交易。

部署交易:把Chaincode部署到peer节点上并准备好被调用,当一个部署交易成功执行时,Chaincode就被部署到peer节点上。

调用交易:客户端应用程序通过Fabric提供的API调用先前已部署好的某个chaincode中的函数执行交易,并相应地读取和写入K-V数据库,返回成功或者失败。

如下图所示,开发者创建客户端应用和Chaincode,Chaincode被部署到区块链网络的Peer节点上面。通过Chaincode来操作账本,当调用一个交易时,实际上是在调用Chaincode中的一个函数方法,令它实现业务逻辑,并对账本进行get, put,delete操作。客户端应用提供用户交互界面,并提交交易到区块链网络上。Fabric 1.0交易流程如下图所示:

图4 交易流程

(1)客户端构造交易提案

客户端应用程序利用任意SDK构造交易提案propose。该提案是一个调用智能合约功能函数的请求,用来确认哪些数据可以读取或写入账本。客户端把交易提案发送给一个或多个Peer节点,交易提案中包含本次交易要调用的合约标识、合约方法和参数信息以及客户端签名等。

(2)背书节点(Endorser)模拟执行交易

背书节点endorser收到交易提案后,验证签名并确定提交者是否有权执行操作。背书节点将交易提案的参数作为输入,在当前状态K-V数据库上执行交易,生成包含执行返回值、读操作集合和写操作集合的交易结果(此时不会更新账本),这些值的集合、背书节点的签名和背书结果(YES / NO)作为提案的结果返回给客户端SDK,SDK解析这些信息判断是否应用于后续的交易。

(3)客户端把交易发送到共识服务节点(Orderers)

应用程序(SDK)验证背书节点签名,并比较各节点返回的提案结果,判断提案结果是否一致以及是否参照指定的背书策略执行。客户端收到各个背书节点的应答后,打包到一起组成一个交易并签名,发送给Orderers。

(4)共识排序,生成新区块,提交交易

Orderers对接收到的交易进行共识排序,然后按照区块生成策略,将一批交易打包到一起,生成新的区块,调用deliver API投递消息,发送给提交节点(Committer)。Committer收到区块后,会对区块中的每笔交易进行校验,检查交易依赖的输入输出是否符合当前区块链的状态,完成后将区块追加到本地的区块链,并修改K-V状态数据库。

补充说明

超级账本V1.0将执行链码(chaincode,即智能合约)的节点(这些节点称作peers)与决定出块顺序(即consensus)的节点(这些节点称作orderers)相分离。每个peer维护分布式账本的一个copy,orderers则仅提供共识排序服务,而不必维护账本的copy。

clients首先要将交易提交给peers的一个子集(称为背书者,endorsers)执行chaincode。必须有足够多(sufficient)的endorsers背书一致后(比如N个endorsers必须有K个一致),clients才将更新后的状态以及背书签名等提交给orderers。orderers通过共识协议输出block的排序。最后,所有的peers再对背书进行验证(主要是验证交易状态的更新的确已经得 到足够多的endorsers背书)。从而:(1)链码的执行可以在共识排序前完成(好处是peers的多个子集可以并行处理多笔交易,提高效率);(2)不需要所有的peers都执行所有的链码(不同链码可以指定不同的endorsers,从而允许平行执行;作为对比,公有链比如以太坊,交易是串行执行sequentialexecution的)。

clients判断提案结果是否一致主要是为了消除非确定性的影响(eliminate the effects of non-determinism)。这主要是因为交易的执行可能因为种种原因而分叉,如果client发现大 多数endorsers的执行结果不一致时,它就会认为该交易的结果是非确定性的,这笔交易也就作废了。

Fabric的优势

Fabric采用模块化架构把交易处理划分为3个阶段:通过Chaincode进行分布式业务逻辑处理和协商(endorsers);交易排序(orderders);交易的验证和提交(committers)。这样划分带来的好处:不同的阶段由不同的节点(角色endorsers, orderders, committers)参与,不需要全网的节点都参与。网络的性能和扩展性得到优化。Peer节点和Orderder节点可以独立扩展,并可以动态增加。此外,Fabric提供可插拔架构,其共识机制和加密算法均是可插拔的,可以根据实际情况选择替换。

参考:

1.    HyperledgerFabric 1.0架构及原理https://blog.csdn.net/xcjing/article/details/78883642

2.    HyperledgerFabric 架构设计整理 https://www.jianshu.com/p/ac3362c97eaa

3.    http://www.infoq.com/cn/articles/hyperledger-fabric-architecture-trap

4.    https://github.com/hyperledger/fabric

5.    https://blog.csdn.net/q48S71bCzBeYLOu9T0n/article/details/77988161

作者简介

王帅,中国科学院自动化研究所复杂系统管理与控制国家重点实验室,平行区块链特邀作者,研究方向为社会计算与平行管理,区块链。

超级账本(Hyperledger Fabric):基本架构及运作机制相关推荐

  1. 超级账本Hyperledger Fabric的使用

    原文地址:超级账本Hyperledger Fabric的使用 说明 网易云课堂:HyperLedger Fabric手动部署教程的视频讲解 超级账本HyperLedger Fabric手动部署教程的文 ...

  2. 区块链超级账本Hyperledger Fabric架构说明

    翻译自:http://hyperledger-fabric.readthedocs.io/en/latest/arch-deep-dive.html 边学习边翻译,很多地方还不明白,请对照原文学习,转 ...

  3. 区块链相关论文研读3- 关于超级账本Hyperledger Fabric的性能优化

    这是2019年6月发表在顶会Sigmod上面的论文,论文题目为<Blurring the Lines between Blockchains and Database Systems: the ...

  4. 超级账本(Hyperledger Fabric)源码分析之一:总览

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 一.编译 1.环境准备 需要提前在linux或者mac机器上安装如下软件 1)Go,注意设置好gopath(笔者安装的是 ...

  5. 超级账本hyperledger fabric第五集:共识排序及源码阅读

    一.共识机制 达成共识需要3个阶段,交易背书,交易排序,交易验证 交易背书:模拟的 交易排序:确定交易顺序,最终将排序好的交易打包区块分发 交易验证:区块存储前要进行一下交易验证 二.orderer节 ...

  6. 超级账本HyperLedger的cello项目的部署和使用

    原文地址:超级账本HyperLedger的cello项目的部署和使用 说明 应用场景 源码 master安装 workder安装(docker) 参考 说明 cello是一个用来部署.管理fabric ...

  7. 超级账本(Hyperledger)

    摘要 超级账本(Hyperledger)是linux基金会下的众多项目中的一个.是由IBM.因特尔,还有金融公司,GP摩根以及其他联合机构于2015年提出来的区块链项目,超级账本还包括5个框架项目:S ...

  8. 区块链必知 -- 超级账本Hyperledger

    比特币.以太坊的成功,推动了区块链行业的飞速发展,从区块链的分类来看,它们都属于公链项目,区块链除了有公链之外.还有私有链和联盟链.公链的完全去中心化是一个美好的未来,但是又和现实存在着很大的冲突,难 ...

  9. 基于区块链技术的超级账本(Hyperledger) - 从理论到实战

    什么是区块链?简单来说区块链就是一个分布式的记账本,或者分布式的数据库. 区块链的数据结构是一个链表,交易数据被存储到链表的区块中,区块链的第一个区块叫创世区块,除了创世块以外,每个区块还包含前一个区 ...

  10. 超级账本HyperLedger初体验

    本文要点: 不久前,OpenGift团队探索了在生产环境中部署基于超级账本(HyperLedger)的区块链.本文呈现了我们集成它的尝试过程和所遇到的问题,以及帮助我们解决问题的技巧. 我们认为,与私 ...

最新文章

  1. AndroidStudio EventBus报错解决方法its super classes have no public methods with the @Subscribe
  2. Nginx+Tomcat集群与负载均衡
  3. 什么是物联网的信息服务器,物联网介绍 | 5分钟看懂什么是IoT物联网
  4. 阿里云开源PolarDB数据库,与社区共建云原生分布式数据库生态
  5. [LNMP]——LNMP环境配置
  6. LintCode 1917. 切割剩余金属
  7. php php_strip_whitespace,php strip_whitespace函数怎么用
  8. Golang实现Server和Client的TCP通讯
  9. 对check list理解
  10. Oracle 数据库升级
  11. 为什么tcp不采用停等协议_为什么 TCP 协议有粘包问题
  12. 性能测试学习09_场景设计(一)
  13. Mac 链接达梦数据库 DmJdbcDriver18.jar下载
  14. MaxDOS V7 PXE网刻教程
  15. rfc3315_DHCPv6-RFC3315(中文).pdf
  16. 【找工作必读】来自IT公司速查手册的各大IT公司薪资
  17. Redis中的数据类型及其应用场景
  18. 认识异或运算的本质与基本规律,0^x=x,x异或x=0,有交换律,结合律,与顺序无关
  19. 手机浏览器查看网页源码
  20. 利用威胁建模防范金融和互联网风险

热门文章

  1. 手机照片导入电脑步骤_手机录屏及电脑录屏操作步骤
  2. 三年程序员之后的思考
  3. 【c++】28.虚析构函数、纯虚函数
  4. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
  5. Spring MVC 和 Spring 总结
  6. 如何提高创作型任务的效率?
  7. Latex:图片及子图排版
  8. 使用HttpClient实现一个简单爬虫,抓取煎蛋妹子图
  9. 程序员必知必会之blog篇
  10. 编程之美-从无头单链表中删除节点方法整理