POS共识机制竟然漏洞这么多 | 分析POS共识机制的原理带来的思考
序言
上文深入比特币、以太坊源码带你解读POW共识机制我们学习探讨了POW共识机制,看完得童鞋们应该就知道POW是有几大缺点的:出块慢,共识时间长、开销大等等,那么有没有其它的共识机制能够解决这些问题呢?答案当然是:有,它就是POS共识机制。下面我们一起来看看它是怎么做到的。
概念
全称为Proof Of Stake,又叫权益证明。POS是指矿工节点通过自己持有的代币,竞争区块签名机会,持有的代币越多,签名成功出块的概率就越高。出块成功之后,根据各个矿工签名时的代币数量进行奖励分配,简单来说就是付出成本越高,收益越高。
原理
讲原理之前,先给大家普及两个概念:难度值、nonce和币龄
难度值和nonce
难度值和nonce在上文深入比特币、以太坊源码带你解读POW共识机制有对该名词的详细解释,这里就不再赘述了。
币龄(coinage)
币龄,顾名思义,就是代币的年龄。那么它是怎么计算出来的呢?它有什么用呢?我们先看下它是怎么计算出来的:
coinage = 币的个数*持有时间
看到这大家应该就懂了,币龄就是你持有可用币的时间,你的币越多,或者你持有时间越长,你拥有的币龄就越大。你的币龄越大,参与签名出块成功率就越高,因为更容易达到51%嘛。值得一提的是,当你使用币参与签名出块,无论你出块成功还是失败,你此次使用的币龄都将被清空,需要重新从0开始累计。
币龄举例
比如你有10个币,持有了10天未发生签名投票出块,那么产生的币龄就是100;如果这时候你这10个币参与了签名投票出块,那么你拥有的这100个币龄就被花掉了,你的币数量虽然还是10个,但是币龄要被重置,变更为0。币龄在数据链上就可以取到,任何人都可以验证。
币龄/收益转换
收益计算公式:
收益 = 币龄 * 年利率 / 365
打个比方说,你如果拥有3650的币龄,持币利率为1%,那么可获得的收益为 3650*0.01/365 = 0.1。说明该矿工此次挖矿成功可获得0.1的代币奖励。
原理
我们先看下它的有效hash计算方式:
hash (block_header) < target * coinage
其实POS的原理和POW比较类似,系统设定好挖矿目标值target,然后矿工开始工作出块,矿工每次出块都是nonce从1开始递增进行寻找可用的nonce值,直到找到符合规则、可用的hash为止,最先找到的矿工可获得挖矿奖励。
但是,从上面的就可以看出,coinage这个变量会造成每个矿工获得有效hash的集合大小不一样,矿工的币龄越大,也就意味着它获得有效hash越容易。且矿工参与签名的币越多,就越容易满足51%的成功出块条件,更容易获得奖励。
举例
例如当前target是4369,完整的哈希长度假设是16位.
A矿工的币龄是15,那么A矿工的目标值为65535,换算成十六进制就是0x000000000000FFFF。即
hash( block_header ) < 0x000000000000FFFF
而B矿工比较有钱,他的币龄是240,那么B矿工的目标值就是1,048,560,换算成十六进制就是0x00000000000FFFFF。即:
hash( block_header ) < 0x00000000000FFFFF
B矿工的可用hash集合更大,所以B矿工获得记账权的概率肯定要比A高。
优点
破解了51%攻击
如果挖矿者发起51%攻击,就需要拥有全网51%的币或币龄,这几乎不可能办到,即使你成功地实施了51%攻击,那么也意味着作为全网最大的持币大户的你,损失也会最大。
相比POW,效率更高
可用更快的达成共识,出块更快。
能耗低
挖矿不依赖于大量资源的消耗。通过持币利息进行通胀。
安全性
规则上限制了必须持币30天以上才能参与区块签名,加大了作恶成本。
缺点
趋于中心化
POS基于权益证明机制,若代币趋向集中的化,去中心化也变相的趋向于中心化了
效率不高
虽然相比于POW,POS的效率有显著的提升,但是还是无法满足用户的需求。
思考
币发行问题
我们从pos的实现算法公式去看,币龄的计算公式中,假如一开始挖矿,只有创始区块中有币,也就是说其他矿机是没法参与挖矿的,因为币的个数这个值对他们来说永远是零,这也就是pos机制的缺陷之一币无法发行的问题。
币龄积攒问题
同样是从pos的实现算法公式可以分析到,币龄其实就是时间,一旦挖矿者囤积一定的币,很久很久之后发起攻击,这样他也将很容易拿到记账权,所以我们得给每个币设计一个时间上限。
弱流通性
设计时间上限后,虽然解决掉了部分挖矿者囤积币的缺陷,从公式中仍然看到还会面临一个问题,也就是币的数量这个因素还是会影响我们拿到记账权,很多挖矿者还会囤积代币,持币者长期不参与出块,想着长时间持币获得利息,给代币造成流通上的缺陷。目前有些平台引入币龄按时间衰弱的方案来解决这一缺陷(例如:瑞迪币)。
矿工离线攻击
接下来让我们来看看pos共识机制还有哪方面的不足,即使上面的各种缺陷都多少有些解决方案,但例如挖矿者挖一段时间后离线,此时,时间将不纳入币龄减弱计算,这样,挖矿者通过离线时间长来囤积挖矿,同样面临灾难。
Nothing at Stake
Nothing at Stake,又叫无成本利益问题。意思在PoS系统中做任何事几乎没有成本,比如在PoS系统上挖矿几乎没有成本,这也就意味着分叉非常方便。方便到什么程度呢,每个诚实矿工在产生孤块的时候都可以继续挖下去,反正也没什么成本,反正分叉链和主链都可以同时挖,也就是任何持币较少的用户都可以尝试分叉,并且把分叉链广播出去。这个时候如果其他诚实矿工看到了,第一反应也是没有成本,那么咱们也来挖吧,说不定什么时候就值钱了,意思就是说任何逐利的矿工并不会使这个系统变得更强壮稳定,而是更加的混乱,可能会出现分叉链长度超过主链长度。
POS我们就介绍到这里了,大家有什么不同的见解欢迎留言讨论哦
POS共识机制竟然漏洞这么多 | 分析POS共识机制的原理带来的思考相关推荐
- PDF签名系列(1):PDF签名机制的漏洞分析
来源:PDF签名系列(1):PDF签名机制的漏洞分析 - 知乎 研究PDF文件的签名机制有一段时间了,刚开始学习的时候就看到有提到说,被签名的PDF内容的Range gap,会成为这个机制的漏洞,但是 ...
- 股权证明pos记账权是根据不同节点_主流共识机制PoS、PoW与DPoS、PoU对比演变
常见的共识算法有:PoW.PoS.DPoS.PoU.那么,这些共识算法具体是怎么回事呢?今天我们就展开来讲一讲. 在区块链这个虚拟的世界,陌生人之间工作关系的建立.工作进度的推进以及工作内容的完成,都 ...
- Windows 组策略(Group Policy Object)机制的漏洞分析
Windows 组策略(Group Policy Object)机制的漏洞类大约有60个,专门针对策略更新步骤,允许域环境中的标准用户执行文件系统攻击,进而使恶意用户可以逃避反恶意软件解决方案,绕过安 ...
- 【转】cve2014-3153 漏洞之详细分析与利用
背景学习: Linux Futex的设计与实现 使用者角度看bionic pthread_mutex和linux futex实现 By kernux TopSec α-lab 一 漏洞概述 这个漏洞是 ...
- NEO从源码分析看共识协议
2019独角兽企业重金招聘Python工程师标准>>> 0x00 概论 不同于比特币使用的工作量证明(PoW)来实现共识,NEO提出了DBFT共识算法.DBFT改良自股权证明算法(P ...
- algorand共识协议_基于Algorand结合VRF的共识机制介绍
相信大家对于PoS权益证明的概念都不陌生,但是究竟一个PoS的Protocol是如运作的?如何公平的选出下个区块的生产者?如何保证区块生产者不能bias下次自己再次当选的机率?这些实行的细节都是需要经 ...
- fastjson 1.22-1.24 漏洞复现与分析
fastjson 1.22-1.24 漏洞复现与分析 前言 QAQ,感觉自己啥也不会,要好好努力学习了.但是由于本人遗忘度很大,因此要记下来学习QAQ. 概念 RMI(Remote Method In ...
- 【面试必备】透过源码角度一步一步带你分析 ArrayList 扩容机制
该文已加入开源文档:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识).地址:https://github.com/Snailclimb/JavaGuide. 一 先从 Array ...
- quartz集群调度机制调研及源码分析---转载
quartz2.2.1集群调度机制调研及源码分析 引言 quartz集群架构 调度器实例化 调度过程 触发器的获取 触发trigger: Job执行过程: 总结: 附: 引言 quratz是目前最为成 ...
最新文章
- js鼠标略过自动选择当前行
- GT Transceiver的动态重配置端口
- const 常量_软件特攻队|const常量,不一样的新玩法
- 一个词法分析器源码的剖析
- Linux 下搭建 Scala 开发环境
- html:(10):添加空格和hr
- python vector_50行Python代码实现经典游戏,不仅是划水神器,更是学习利器!
- VS2013+OSG3.4.0+Qt5.5.1编译(超详)
- First Bad Version
- 系统篇: fstab 文件详解
- [BZOJ4556][Tjoi2016Heoi2016]字符串(二分+后缀数组+主席树)
- msm8916的OTG接鼠标可以使用,但是接U盘无法识别。
- RAKsmart高防服务器防御形式解析
- 【转】Java中斜杠和反斜杠的替换
- 深度学习数据增强数据扩增方法
- MATLAB点云处理(十四):圆柱体拟合(RANSAC | MSAC)
- CV学习笔记-VGG
- 徒步旅行中的注意事项
- 水の三角(超级卡特兰数/大施罗德数)
- uni-app入门介绍
热门文章
- 软考----多媒体与知识产权
- 关于面试笔试的相关问题通知
- Redhat7/CentOS7 网络配置与管理(nmtui、nmcli、GNOME GUI、ifcfg文件、IP命令)
- ROS-ROS中的坐标系管理系统
- 难得!微软招测试开发了!
- python中的返回值是什么意思_python中函数的返回值是什么
- HPB钱包Xcode集成
- 一位大佬的亲身经历总结:简历和面试的技巧
- 百度松果 小码哥考研小技巧 (概率期望)
- 某城市的出租车计费标准为起步价10元(3公里内含3公里),在3公里到10公里(含10公里)之间每公里2.1元,超过10公里部分每公里3元。编写程序,用Python实现输入行车距离x,输出车费。