浅析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更加高效,节能环保,而且提供容错机制,保证系统稳定运行。
相关文章:

python 获取用户ip_Python爬虫教程:你还在苦苦拉票吗?刷票小程序案例原理剖析!...
你还在苦苦拉票吗?前言剖析投票原理处理思路具体实战主要流程具体细节python代码实例python具体细节java代码实现java总结点击此处,获取海量Python学习资料!前言现在生活中离不开各类的比赛,然而,各个比赛离不开投票&a…
下拉菜单被挡住了,DIV置于最底层的方法
网站常会用到一些 下拉菜单,,幻灯片,,,飘浮广告等。但经常会发现。幻灯片会挡住下拉菜单或者飘浮广告等。解决办法有下第一,可将幻灯片所在DIV 置于最底层。添加CSS如下style"z-index:-100;position: …

github的删除
github项目删除 首先找到你要删除的项目,点击开 复制项目名称然后找到Settings 将滚动条滑至底部,找到 Danger Zone 下的 Delete this repository 这里会弹出一个警告对话框 将该项目名称重新输一遍即可 这里会弹出账号重新确认,将密码在输入…

区块链的去中心化VS传统互联网的去中心化:技术与治理的双重困境
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链的去中心化VS传统互联网的去中心化:技术与治理的双重困境11 主要观点: 1、传统互联网经典的去中心化项目BitTorrent…

第三章| 3.1文件处理
1、三元运算 简单条件语句: if 条件成立:val 1 else: val 2 改成三元运算: val 1 if 条件成立 else 2 2、文件处理 (用python对硬盘上的文件操作) 读 读取文件的三个方法:read()、readline()、readlines() 三个方法…

LR常见的报错处理方法
1.LR录制时不弹出IE浏览器 当一台主机上装有多个浏览器,LR录制脚本时,经常遇到打不开浏览器的情况,可以用下面的方法来解决 启动浏览器,打开Internet 选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展…

均匀分布取某一点概率_概率和概率分布
概率与概率分布是统计学中的基础概念,在我们的高中的课本中就接触过了,如果有遗忘,一起来回顾一下吧!知识点:概率概率分布一、概率说到概率,需要先了解一个概念,叫做随机试验。随机试验是指在相…

EOS共识机制——DPoS代理权益证明
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 区块链共识机制与它的演进,是由于区块链式去中心化而且分布式的系统,必须要有一套放诸四海皆准类似宪法的规则,来…

active mq topic消费后删除_Spring cloud stream 整合mq
说明:本案例win10环境测试scs(spring cloud stream)整合kfk(kafka)/rbt(rabbitmq)消息生产消费场景流程一、准备中间件环境(kfk/rbt)后续内容提供kfk与rbt的环境准备流程二、导入scs的依赖项目spring boot 版本:2.1.3.RELEASE引入spring cloud 版本&…

翻译的艺术 —— 无能为力的翻译,搞笑的音译
0. 无能为力的翻译 至尊宝:best sonny,乌龙:own goal,的粤语发音;1. 取其发音 word ⇒ 我的,word 妈呀, Need just word,word has word,你的就是我的,我的还是我的&#…

经常可能会用到的【函数节流和函数防抖】记录下,做下区分
今天突然被人问到,函数节流和函数防抖的区别是什么,结果我脑子一热直接举了个滚动条的粟子说是优化高频率执行的手段,就记得自己是用setTimeout来实现的。完了区别是什么??哪个是哪个都蒙B了回家想想,有些东…

智能合约和区块链技术:入门指南
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 智能合约和区块链技术:入门指南 多年前,在没有数字合约和区块链技术存在的情况下,双方的合约往往以传统的方式进…

2. 尾部的零
题目 设计一个算法,计算出n阶乘中尾部零的个数 样例 11! 39916800,因此应该返回 2 题解 一开始就用最简单对1-n找出5的个数,然后超时了。虽然都直到是要找5,因为2肯定比5多,所以5的个数就是0的个数,只是计…

case when then else end
1、根据数据库表中特定的值进行排序显示 select * from tablename where order by case when columname then 1 wnen columname when 2 else 3 end 2、根据数据库中存的值根据情况对其进行赋值CASE sexWHEN 1 THEN 男WHEN 2 THEN 女 ELSE 其他 END --Ca…

python replace函数_Python3 replace()函数使用方法
描述 replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。 语法replace()方法语法: str.replace(old, new[, max]) 参数 old -- 将被替换的子字符串。 new -…

EOS技术知识介绍
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 EOS 简介 EOS:EOS可以理解为Enterprise Operation System,即为商用分布式应用设计的一款区块链操作系统。EOS是EOS软件引入…

团体程序设计天梯赛-练习集-L1-044. 稳赢
L1-044. 稳赢 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每…

currenttimemillis 毫秒还是秒_Elasticsearch(ES)如何做到亿级数据查询毫秒级返回
前言:这个问题其实是更面向原理及实操方面的内容。换个问法,可以是这样来问:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率?为了精简,如下内容将Elasticsearch简称为ES如果你仅仅是用过ES,对于这个…

分布式系统的时间顺序
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 分布式系统的时间顺序 区块链被认为是分布式的系统,分布式系统中由于多节点,通讯、物理位置等的问题,各节点间时…

JVM 老年代对象来源
一般情况是四种,但是尤其以第一种来源最多1.新生代对象每经历依次minor gc,年龄会加一,当达到年龄阀值会直接进入老年代。阀值大小一般为152.Survivor空间中年龄所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的…

[心跳] 使用心跳机制实现CS架构下多客户端的在线状态实时更新以及掉线自动重连...
此文讲述的内容是一个实际项目开发中的一部分内容,笔者将亲身经历写成文章。 【背景】 现 需要实现这样的功能:有多个客户端连着同一个服务器。服务器和客户端之间需要“互相”知道彼此的连接状态。比如在某一时刻,服务器需要知道当前有多少个…

python绝对值编程_Python-abs vs fabs
编辑:正如aix所建议的,比较速度差异的更好(更公平)方法是:In [1]: %timeit abs(5) 10000000 loops, best of 3: 86.5 ns per loop In [2]: from math import fabs In [3]: %timeit fabs(5) 10000000 loops, best of 3:…

如何搭建以太坊私有链
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 如何搭建以太坊私有链1 今天讲一下如何搭建以太坊私有连,当然了在你阅读这篇文章的时候,最好是有一定基础,比如…

Autocomplete 自动补全(Webform实战篇)
开篇语 因为项目中需要用到一个自动补全的功能,功能描述: 需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式) 需求二:选中一…

前端开发基础7(Bootstrap框架)
Bootstrap介绍 Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。 它是为实现快速开发Web应用程序而设计的一套前端工具包。 它支持响应式布局,并且在V3版本之后坚持移动设备优先。 为什么要使用Bootstrap? 在Bootstrap出现之前࿱…

python自动化测试难不难_Python测试自动化好学还是Pythonweb开发好学?
还是测试吧。。。 用动态语言搞开发,项目大了根本没法维护,而且还会bug层出不穷,任谁也Hold不住。真想搞开发,要么玩Java,要么玩C#。 下面举个例子。 比如一个游戏项目,是这样的(伪代码):角色 l…

以太坊智能合约开发第二篇:理解以太坊相关概念
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 很多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成…

【python之旅】python的基础二
一、集合的操作 1、什么是集合? 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重:把一个列表变成集合,就自动去重关系测试:测试两组数据之前的交集,差集,并集…

hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?
前言大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗?今天带大家来了解一下equals和hashcode重写的实现。set是如何去重的?…

LazyT 延迟加载
namespace ConsoleAppTest {class Program{static void Main(string[] args){Lazy<Student> student new Lazy<Student>();//默认未初始化Console.WriteLine(student);//在第一次使用时才实例化Console.WriteLine(student.Value);Console.ReadLine();}public clas…