Hyperledger Fabric共识算法

区块链系统是一个分布式架构,交易账本信息由各个节点管理,组成一个庞大的分布式账本。在分布式系统中,各个节点收到的交易信息的顺序可能存在差异(例如,网络延迟、主机处理性能),这会导致账本信息的状态不一致,例如,小王账户只有10元,但是他同时转账给小李和小张各10元,并且将这两条交易信息分别发送到两个分布式节点上,如果不对这两条交易进行排序校验,那么,小王实际消费了20元(所谓的双花问题)。所以,在区块链系统中,我们需要一套机制,来保证交易的先后顺序,这套机制就是人们常说的“共识算法”。

在比特币中,采用POW算法来解决上述双花问题,例如,小王还是将两条转账交易分别发给两组节点,这两组节点分别对其中一条交易打包后写入区块链,然后整个系统中产生了两条区块链,一条包含了小王转10元给小李的交易信息,另外一条包含了小王转10元给小张的交易信息(所谓的分叉)。随后,两组节点继续分别打包并生成各自的区块链,两条区块链继续增长。但是,这两组节点的算力各有差异,最后总会出现一组节点的区块链更长一些,那么,另一组节点就会将更长的区块链同步到本地,作为有效链。最终,小王的其中一笔重复的交易被丢弃。

Hyperledger Fabric的共识算法和比特币有很大不同,首先,前者是由permissioned节点组成的分布式系统,所有记账节点都是可信的(不会恶意伪造交易信息),所以,不需要POW算力证明。同时,Hyperledger Fabric的各个节点的交易信息统一由排序服务节点(orderer service node)处理,保证每个节点上的交易顺序一致,天然避免了分叉问题。目前,Hyperledger Fabric提供两种排序算法,SOLO和Kafka,其中SOLO模式只有一个order服务节点负责接收交易信息并排序,这是最简单的一种排序算法,不适合大规模的实际生产环境,一般用在实验室测试环境中。下面重点介绍Kafka算法。

排序服务原理

排序服务是由一组orderer节点(Ordering Service Node,简称OSN)组成,OSN在网络中的角色是代理节点,多个OSN会对接到Kafka集群,利用Kafka完成共识功能。

客户端APP通过SDK将验证后的交易信息发送给OSN,然后,OSN对消息做初步校验后,封装成Kafka消息格式,发送到Kafka集群,对交易信息统一排序。

什么是kafka

Hyperledger Fabric的核心共识算法通过Kafka集群实现,简单来说,就是通过Kafka对所有交易信息进行排序(如果系统存在多个channel,则对每个channel分别排序)。Kafka最初由Linkedin公司开发,后来成为Apache的一个开源项目。

Kafka是一个分布式的流式信息处理平台,目标是为实时数据提供统一的、高吞吐、低延迟的性能。Kafka由以下几类角色构成:

Broker:消息处理节点,主要任务是接收producers发送的消息,然后写入对应的topic的partition中,并将排序后的消息发送给订阅该topic的consumers。 大量的Broker节点提高了数据吞吐量,并互相对partition数据做冗余备份(类似RAID技术)。

Zookeeper:为Brokers提供集群管理服务和共识算法服务(paxos算法),例如,选举leader节点处理消息并将结果同步给其它followers节点,移除故障节点以及加入新节点并将最新的网络拓扑图同步发送给所有Brokers。

Producer:消息生产者,应用程序通过调用Producer API将消息发送给Brokers。

Consumer:消息消费者,应用程序通过Consumer API订阅topic并接收处理后的消息。

Broker上的消息布局

Kafka将消息分类保存为多个topic,每个topic中包含多个partition,消息被连续追加写入partition中,形成目录式的结构。一个topic可以被多个consumers订阅。简单来说,partition就是一个FIFO的消息管道,一端由producer写入消息,另一端由consumer取走消息(注意,这里的取走并不会移除消息,而是移动consumer的位置指针)。

Hyperledger Fabric中的每个channel对应一个topic(topic名称就是channelID),每个topic只有一个partition(0号分区),没有利用到多分区的负载均衡特性。每条交易信息对应partition中的一个record消息记录,形成一条有序的交易信息链,最后,经过分割打包后,形成区块链,写入committing peer节点。

总结

Hyperledger Fabric作为企业级的区块链项目,更加注重TPS吞吐量和部署成本,所以,采用的Kafka共识算法。相比于POW共识算法,Kafka更加高效,节能环保,而且提供容错机制,保证系统稳定运行。

浅析Hyperledger Fabric共识算法 摘自http://www.cocoachina.com/blockchain/20180829/24728.html的更多相关文章

  1. hyperledger fabric共识组件分析 --背书策略

    在fabric中,共识过程意味着多个节点对于某一批交易的发生顺序.合法性以及它们对账本状态的更新结构达成一致的观点.满足共识则意味着多个节点可以始终保证相同的状态,对于以同样顺序到达的交易可以进行一致 ...

  2. HyperLedger Fabric Introduction——区块链超级账本介绍

    介绍 HyperLedger Fabric是一个基于模块化架构的分布式账本解决方案平台,它拥有深度加密.便捷扩展.部署灵活及可插拔等特性.它设计之初的目的是支持不同组件的可插拔实现,并适应整个经济生态 ...

  3. Hyperledger Fabric无排序组织以Raft共识算法启动多个Orderer服务、多组织共同运行维护Orderer服务

    前言 在Hyperledger Fabric无系统通道启动及通道的创建和删除中,我们已经完成了以无系统通道的方式启动 Hyperledger Fabric 网络,并将链码安装到指定通道.但目前为止,实 ...

  4. hyperledger fabric各类节点及其故障分析 摘自https://www.cnblogs.com/preminem/p/8729781.html

    hyperledger fabric各类节点及其故障分析   1.Client节点 client代表由最终用户操作的实体,它必须连接到某一个peer节点或者orderer节点上与区块链网络通信.客户端 ...

  5. HyperLedger Fabric基于zookeeper和kafka集群配置解析

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)--Fabric多节点集群 ...

  6. Hyperledger Fabric Model——超级账本组成模型

    超级账本组成模型 本文主要讲述Hyperledger Fabric的关键设计特性,并细述如何实现了一个全面的.可定制的企业级区块链解决方案: 资产定义--资产这里理解为任何具有货币价值的东西,它们都可 ...

  7. [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...

  8. Hyperledger Fabric、Corda和以太坊对比

     Hyperledger Fabric . Corda 和以太坊的对比 三种不同的框架 我们从 Hyperledger Fabric.R3 Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领 ...

  9. 第6章 Hyperledger Fabric模型

    This section outlines the key design features woven into Hyperledger Fabric that fulfill its promise ...

随机推荐

  1. swiper 组件的高度设置问题

    1.swiper组件直接运用时, .content>swiper{height:100%} 是不起作用的. 正确的做法是: swiper{ height: 100vh; } // 或者 < ...

  2. SQL server 存储过程学习

    一.定义变量--简单赋值 declare @a intset @a=5 print @a --使用select语句赋值 declare @user1 nvarchar(50) select @user ...

  3. phpcms 用户修改头像

    做的项目用户的头像是存在ucenter里面,phpcms通过phpsso这个单点登录系统? 具体的我也不清楚,phpcms自带的v9_member表里没有存放用户头像的字段,如果需要修改,就要修改uc ...

  4. sqlite 3基本使用方法

    1.sqlite数据库数据类型 Integer 整型 varchar(10) 字符数组 float 浮点型 double 双精度浮点型 char(10) 字符型 text 文本型 2.sql语法 2. ...

  5. 大数据-04-Hbase入门

    本文主要来自于 http://dblab.xmu.edu.cn/blog/install-hbase/ 谢谢原作者 本指南介绍了HBase,并详细指引读者安装HBase. 前面第二章学习指南已经指导大 ...

  6. 20165228 2017-2018-2 《Java程序设计》第1周学习总结

    20165228 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 JAVA程序的组成:多个书写独立的类组成,class后为类名,类名后的{ }里为类体 JAV ...

  7. jQuery的文件引入、入口函数以及js对象和jquery对象之间的互相转换

    JavaScript与jquery的区别 JavaScript是一门编程语言,用来编写客户端浏览器脚本. jQuery是javascript的一个库,包含多个可重用的函数,用来辅助简化javascri ...

  8. #python str.format 方法被用于字符串的格式化输出。

    #python str.format 方法被用于字符串的格式化输出. #''.format() print('{0}+{1}={2}'.format(1,2,3)) #1+2=3 可见字符串中大括号内 ...

  9. 逆序对__归并排序__树状数组 Inversions SGU - 180

    There are N integers (1<=N<=65537) A1, A2,.. AN (0<=Ai<=10^9). You need to find amount o ...

  10. 【转】visualSFM生成的bundle.rd.out文件的格式

    1.bundle.out 文件包含了一些经过估算得到的场景和相机几何信息.文件的格式如下: //---------------------------------------------------- ...