学习区块链(十一)--从拜占庭将军问题谈谈为什么pow是最好的共识机制

本文主要是介绍学习区块链(十一)--从拜占庭将军问题谈谈为什么pow是最好的共识机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一节,不再去学习如何写代码,而是想聊聊共识机制,我们知道基于区块链技术现在有很多的共识机制,包括不限于POW,POS,DPOS,PBFT……,我先不说为什么我最认可POW,我们先来看看著名的拜占庭将军问题:

拜占庭帝国即中世纪的土耳其,拥有巨大的财富,周围10个邻邦垂诞已久,但拜占庭高墙耸立,固若金汤,没有一个单独的邻邦能够成功入侵。任何单个邻邦入侵的都会失败,同时也有可能自身被其他9个邻邦入侵。拜占庭帝国防御能力如此之强,至少要有十个邻邦中的一半以上同时进攻,才有可能攻破。

然而,如果其中的一个或者几个邻邦本身答应好一起进攻,但实际过程出现背叛,那么入侵者可能都会被歼灭。

于是每一方都小心行事,不敢轻易相信邻国。这就是拜占庭将军问题。

在拜占庭将军问题里,最重要的事情是如何让所有将军达成一致,如果中间出现了被拜占庭帝国收买的将军导致只有半数以下的将军攻打拜占庭,那么基本上这些国家将会灭亡,所以建立信任是攻打拜占庭帝国最关键的一环!

而这个经典的问题其实在我们现实的生活场景也会经常发生,如果这些将军中出现了叛徒,他们会产生很多坏的作用,如:

  1. 叛徒欺骗忠诚的将军自己采取行动
  2. 叛徒可能怂恿其它将军行动
  3. 叛徒发出干扰指令,迷惑将军使他们感到无所适从

模型假设一:假设只有3个将军A,B,C,假如只有一个人A是叛徒。A告诉B进攻,但告诉C撤退,B告诉C接收A的命令是进攻,而C接收到A的命令是撤退,这时候B和C都会迷惑,B和C都会怀疑对方或者A是叛徒!
模型假设二:假设只有4个将军A,B,C,D,假如只有一个人A是叛徒。A怎么传达消息都会造成有两个人是一样的消息,另一个人是另外对立的消息!假如A告诉B,C进攻,但告诉D撤退,B从C和D接收的是”A发送给他们的一个是进攻一个是撤退“,C从B和D接收和B的情况一样,那么B认为C和A都是进攻命令,C同理B,所以B和C都会发起进攻,而D也接收到B和C从A接收的信息是进攻,少数服从多数的原则,D也会发起进攻,这样总共有三个人发起进攻,就能保证拿下拜占庭了!

所以科学家针对拜占庭问题进行研究得出结论:如果将军总数为m,叛徒数量为n,当m<3n+1的时候(即叛徒数量大于或等于总人数的三分之一),拜占庭问题是不能被解决的!,这个时候信任是不能被建立的。
但实际上,可能是所有忠诚的将军永远不知道会有多少叛徒,即使实际上没有叛徒他们也不敢冒险去相信别的将军,他们永远不会把家国的命运赌在那三分之一上!
到最后这就变成了大家都不进攻的局面!所以如果谁能解决这个信任问题,那么我想十个将军会拿出无数具有异国风情的妹纸来让他拯救一下!

而解决这个问题的方案在2008年让中本聪找到了,就是区块链技术。

假如10个将军每个人都有一台电脑,区块链在一段时间内只允许一个将军发出信息,这在某种程度上防止了各个将军各说各的进攻方案造成混乱,当然由谁来第一个发出又有最后一个发出呢?

这个问题问到点子上了,中本聪巧妙的提出了工作量证明(pow),每个将军都必须完成一个10以内加减法后才能发出消息,当某个节点发出统一进攻的消息后,各个节点收到发起者的消息必须签名盖章,确认各自的身份。而中本聪在这里引用现代加密技术为这个信息签名。

这种加密技术——非对称加密完全可以解决古代难以解决的签名问题:

消息传送的私密性
能够确认身份
签名不可伪造、篡改。

非对称加密算法的加密和解密使用不同的两个密钥.这两个密钥就是我们经常听到的公钥和私钥。

非对称加密的作用有两个,一来保护消息的内容,二来让接收方确认发送方的身份

假如将军A想给将军B发送消息,为防止消息泄露,将军A只需要使用B的公钥对信息加密,而B的公钥是公开的,B只需要用只有他自己只的私钥解密即可。

将军B想要在信件上声明自己的身份,他可以自己写一段”签名文本“,并用私钥签名,并广播出去,所有人可以根据B的公钥来验证该签名,确定的B的身份。

由此,一个不可信的分布式网络变成了一个可信的网络,所有的参与者可以在某件事在达成一致。

好,那么网络信任的问题解决了,那么如果10个将军都做出了第一个算术题,谁来第一个发送呢?

所以中本聪又巧妙的设计了时间戳,每个将军解题的时间盖上了时间戳,第一个解题的人就拥有本轮的发送消息的权利,对应到区块链上就是第一个完成有效计算的矿工的区块是有效的。

那么问题又来了,将军第一个发消息和最后一个发没什么区别,为什么要第一个发呢去做加减法呢?
中本聪就用比特币来奖励完成计算挖出区块的矿工来激励有人不断的打包区块。同样对将军来说,第一个发消息的人可以获得更多的战利品,可以拯救更多的失足少女。

到这里,我们应该明白了区块链建立信任是可行的,但是必须有激励机制来保证它的稳健运行!所以工作量证明在此时显得非常有意义,挖矿在某种程度上是信任建立的基础,因为建立信任的成本永远不可能是0,除非有天实现了大同社会,否则消耗那些能源来进行挖矿来建立信任完全是不用计较的。

但是有人会说比特币是每四年减半的,代表着以后每个区块挖出来比特币奖励会很少,这可能会导致矿工打包交易的手续费会变高,否则矿工不会有动力去挖区块,参与的人减少,算力减少,区块链的安全不安全了,会承受51%攻击。实际上矿工如果不是诚实挖矿来伪造交易的话,比特币持有人将会对比特币失去信心,只有第一批伪造交易的人会受益,后面伪造交易的矿工获得再多的比特币也没有意义!实际上由于比特币的先发优势,全球的算力已经很分算了,就算是传说掌握了70%算力的中国除非是几大矿池联合才能伪造交易,但是如此劳神费力去让他们已经挖出的很多比特币变得没有意义他们会做吗?而且我们可以等到六个确认之后才确认交易完成,因为六个确认表示伪造者必须成功连续计算出六个区块才能伪造成功!

所以在我看来pow是目前最合适的共识机制,而在权益证明机制POS中,权益越大的人获得记录权利的概率越高,而记录的人就会有奖励token ,这样一来这些人就会越来越富有,贫富差距就会越来越大。持有token少的人几乎都没有话语权了。
权利掌握在少数人手中,这有违区块链去中心化理念,而在PBFT中,由所有人投票,如果一个没有任何token余额的人想要捣乱,那他几乎是完全没有利益损失。

一直被鼓吹的EOS就是由十几个超级节点来进行公示信息,所以才能达到那么高的tps,那么个人愚见这和中心化的支付宝有何区别,当然支付宝tps可能更高。所以我们不得不承认比pow效率高的去中心化必然没有它高。

安全、去中心化、效率在现在看来是不可能三角,三者只能取其二,而且我们不难发现区块链在某种程度上和互联网互为镜像,我们更不能用互联网思维来看区块链,所以我们也不能说中心化就一定不好,去中心化就一定要吹上天,尺有所长,寸有所短,我们应该辩证且理性的看来这两个领域,让时间说话,二者都必然会在自己适合的领域更好的服务经济、服务整个社会!

这篇关于学习区块链(十一)--从拜占庭将军问题谈谈为什么pow是最好的共识机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750808

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

Redis 热 key 和大 key 问题小结

《Redis热key和大key问题小结》:本文主要介绍Redis热key和大key问题小结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、什么是 Redis 热 key?热 key(Hot Key)定义: 热 key 常见表现:热 key 的风险:二、

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

SpringBoot项目中报错The field screenShot exceeds its maximum permitted size of 1048576 bytes.的问题及解决

《SpringBoot项目中报错ThefieldscreenShotexceedsitsmaximumpermittedsizeof1048576bytes.的问题及解决》这篇文章... 目录项目场景问题描述原因分析解决方案总结项目场景javascript提示:项目相关背景:项目场景:基于Spring

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基