PBFT协议在超过100个节点的时候性能会下降
作者:maxdeath
链接:https://www.zhihu.com/question/60058591/answer/173970031

首先要搞清为什么PBFT,乃至所有的BFT都没法应用于超过100个节点。原因的关键在于O(N^2)的消息复杂度。这是什么意思呢?点对点的消息传输需要发一个消息就够了,这是O(1)的消息复杂度,要是广播一个消息,需要把消息发给网络里所有人一人一份,就是O(N)的消息复杂度,而想要可靠地,在有拜占庭节点(恶意节点)存在的网络里广播一条消息的话,至少需要O(N^2)的消息复杂度,也就是说,如果网络有100个节点,如果你想让确认网络里的其他人都确实地收到你的消息,你至少要发10000条消息。这性能一看就好不了。于是才有了比特币,它把可靠的那部分用奖励,挖矿和最长链解决了,于是再大的网络也只是O(N)的消息复杂度,这就scalable了。但是另一个问题就出现了——大网络里传输效率和延迟有瓶颈,而这种瓶颈会制约可靠性。也就是说你广播的东西太大的话,比特币的那套奖励,挖矿和最长链的东西就不是那么好使了。于是,目前所有的提高scalability的方法基本上就是结合两者,也就是分层。无论是叫分层也好,委员会选举也好,差不多想法就是我们把某一部分的可靠性用比特币的方法解决,剩下的部分用BFT。这其实和代议制民主很像——所有人一起讨论事情太难了,那么我们让所有人选代表,然后选出来几个代表讨论事情就高效多了。但接下来的问题是这两部分怎么对接?两个方法对于恶意节点的数量要求不一样(BFT必须严格少于1/3,比特币的话是算力小于1/4),要不要奖励(自私挖矿算不算恶意呢?),共识类型不一样(BFT是最终共识,比特币是最长链共识,也就是允许分叉),是许可还是非许可。这些都是处理起来很让人头疼的问题,基本上,所有的分层算法都得要给出这些东西。而我目前为止还没有看到一个完全找不出漏洞的算法。就拿你说的sharding的那篇文章说吧。这个Elastico,或者叫SCP,我很惊讶这个竟然能发表,他们对于无穷小量的处理太随意了。我不是说他们结果一定不对,但是他们的证明是有问题的。他们分层非常的幼稚,他的方法就是简单的随机选,而随机选的时候,他们就是简单的说如果我们的随机方法是公平的,那么当这个小组的人数很大的时候,这个小组恶意节点超过1/3的可能无穷小。

异步拜占庭容错(aBFT),以加快实现不可逆转性。 aBFT算法在1秒内提供100%的不可逆性确认。

POW
POW机制是依赖机器算力进行数学运算来获取记账权,资源消耗相比其他共识机制高、可监管性弱,同时每次达成共识需要全网共同参与运算,性能效率比较低,容错性方面允许全网50%节点出错。POW机制最早出现在比特币中,这也是区块链里出现的较早的共识机制。
缺点:
浪费能源;
区块的确认时间难以缩短;
新的区块链必须找到一种不同的散列算法,否则就会面临算力攻击;
容易产生分叉,需要等待多个确认;
永远没有最终性,需要检查点机制来弥补最终性;

POS( Proof of Stake)权益证明

DPOS(Delegated Proof of Stake)股份授权证明机制
DPOS与POS原理相同,只是选了一些“人大代表”。BTS社区最先提出了DPOS机制。最近较热的EOS也是采用了DPOS机制。
核心思想:百分之五十一的矿工具有不可逆转的权利。
优点:该模式可以每30秒产生一个新区块,并且在正常的网络条件下区块链分叉的可能性极其小,即使发生也可以在几分钟内得到解决。
缺点:整个共识机制还是依赖于token,很多商业应用是不需要token存在的。

POOL验证池
一句话介绍:基于传统的分布式一致性技术,加上数据验证机制。
优点:
不需要token也可以工作,在成熟的分布式一致性算法(Pasox、Raft)基础上,实现秒级共识验证。
缺点:
去中心化程度不如Bitcoin;
更适合多方参与的多中心商业模式。

一致性算法(BFT-DPOS)
EOS.IO软件能够精确的每0.5秒生成一个块,并且只有一个生产者有权在任何给定的时间点生成一个块。如果在预定时间没有生成块,则跳过该时间段的块。当跳过一个或多个块时,区块链中会出现0.5秒或更多秒的间隔。

PBFT性能会下降? 各种算法的对比。的更多相关文章

  1. react性能调谐与diff算法

    一个页面其实就相当于是一颗dom树,里面有很多它的子节点,然后你每次去操作一个事件,它都会生成一个虚拟dom,它会跟上一个虚拟dom进行比对,这里运用的算法叫做diff算法,当它找到需要改变的组件的时 ...

  2. paip.提升性能----硬盘不同转速不同缓存对比转

    paip.提升性能----硬盘不同转速不同缓存对比转 西数 WDC WD2500BEVT-08A23T1 ( 250 GB / 5400 转/分 ) 5400转 8M缓存 单碟250 GB      ...

  3. 梯度下降优化算法综述与PyTorch实现源码剖析

    现代的机器学习系统均利用大量的数据,利用梯度下降算法或者相关的变体进行训练.传统上,最早出现的优化算法是SGD,之后又陆续出现了AdaGrad.RMSprop.ADAM等变体,那么这些算法之间又有哪些 ...

  4. MySQL 偶尔抽风,性能突然下降

    有时会碰到这样的情况,一条 SQL 在平时执行没问题,很快.但是突然某个时间执行的就会很慢,而且这种场景并不能复现,只能随机发送的. SQL 执行突然变慢的原因 在之前讲解 MySQL Redo lo ...

  5. 在PYTHON中使用StringIO的性能提升实测(更新list-join对比)

    刚开始学习PYTHON,感觉到这个语言真的是很好用,可以快速完成功能实现. 最近试着用它完成工作中的一个任务:在Linux服务器中完成对.xml.gz文件的解析,生成.csv文件,以供SqlServe ...

  6. Memcached 笔记与总结(8)Memcached 的普通哈希分布算法和一致性哈希分布算法命中率对比

    准备工作: ① 配置文件 config.php ② 封装 Memcached 类 hash.class.php,包含普通哈希算法(取模)和一致性哈希算法 ③ 初始化 Memcached 节点信息 in ...

  7. Python和C#基本算法实现对比

    最近在学习python,很多入门的例子又写了一遍,基本上是C#和Python都写了一遍,对比发现语言真是相通啊,只是语法不同而已. python开发也是用的VS,很好用,特别是代码段运行,选中一段py ...

  8. **测试某系统切换成docker部署之后性能的下降情况**

    ###分析 * 对比:某系统/docker* A:某系统性能情况* B:dockers部署的性能情况* 求出A&B两者之间的差异* 确定性能指标(tps)* 测试报告里体现:tps的变化 ## ...

  9. [转]nginx折腾记(HTTP性能能测试,与Apache对比)

      话说nginx在大压力的环境中比apache的表现要好,于是下载了一个来折腾一下. 下载并编译安装,我的编译过程有点特别: 1.去除调试信息,修改$nginx_setup_path/auto/cc ...

随机推荐

  1. 剑指offer49 把字符串转换成整数

    这个代码会报错 class Solution { public: ,kinvalid}; int now_status = kvalid; int StrToInt(string str) { now ...

  2. 友盟分享小结 - iOS

    因之前都写在了 AppDelegate 类中,看起来过于臃肿,此次基于友盟分享重新进行了一次优化,此次分享内容基于已经成功集成 SDK 后 code 层级部分.注:此次分享基于 SDK 6.9.3,若 ...

  3. WPF与Silverlight对比

    1.WPF中控件的肤色可以直接:telerik:StyleManager.Theme=”XXXXX”,不用再导入肤色的dll包.可Silverlight使用系统肤色时,要导入肤色的dll包. WPF引 ...

  4. ORM初级实战简单的数据库交互

    setting.py中: """ Django settings for untitled3 project. Generated by 'django-admin st ...

  5. ubuntu中使用apt命令安装ipython失败解决方案

    在最近使用ubuntu安装ipython时,出现如下报错: 出现这个问题,主要是因为apt还在运行,故解决方案为: 1.找到并且杀掉所有的apt-get 和apt进程 运行下面的命令来生成所有含有 a ...

  6. PLC状态机编程第三篇-RS信号处理

    我们今天简要介绍RS指令在状态机中怎么处理的.有些设备按下停止按钮后,没有马上停止,而是到原点后才停止,那么这种情况在状态机中如何表示呢?我们以案例说明之,下面是我们的控制描述. 控制描述 小车从左位 ...

  7. 学习python第十三天,函数5 装饰器decorator

    定义:装饰器本质是函数,(装饰其他函数)就是为其他函数添加附加功能原则:1.不能修改被装饰的函数的源代码 2.不能修改装饰的函数的调用方式 实现装饰器知识储备1函数即变量2.高阶函数,满足2个条件之一 ...

  8. c语言可变参数函数

    c语言支持可变参数函数.这里的可变指,函数的参数个数可变. 其原理是,一般情况下,函数参数传递时,其压栈顺序是从右向左,栈在虚拟内存中的增长方向是从上往下.所以,对于一个函数调用 func(int a ...

  9. filter() 函数的使用

    Python3 filter() 函数 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换. 该接收两个参数,第一个 ...

  10. C# 中的正则简单例子

    public static void Main() { Regex rgx = new Regex(@"[S|s]et-[C|c]ookie: (?<cookieName>\w+ ...