POW共识机制原理及优缺点
PoW共识机制
POW工作量证明(英文全称为Proof of Work)在比特币之前就已经出现,中本聪在设计区块链的共识机制的时候就是借鉴了POW工作量证明。常见的是利用HASH运算的复杂度进行CPU运算实现工作量确定。
定义
工作量证明(Proof-of-Work,PoW)是一种对应服务与资源滥用、或是阻断服务攻击的经济对策。一般是要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用。
在一个PoW系统中, 一定会有两个角色, 一个是工作者, 一个是验证者
对于工作者
- 需要完成的工作必须有一定的量,这个量由工作验证者给出。
- 工作者无法自己"创造工作",必须由验证者发布工作。
- 无法找到很快完成工作的办法。
对于验证者
- 可以迅速的检验工作量是否达标。
HashCash
区块链的PoW共识机制, 借鉴了很多HashCash方面的东西, 所以先讲HashCash。
简述
HashCash 最早是用来处理垃圾邮件的,一个垃圾邮件的发送者发一个邮件出去不能花费很多时间, 如果花太多时间,那么和人发邮件就没什么区别, 而要屏蔽这些垃圾邮件, 一个核心的想法就是正确的发送方发的邮件一定要经过一段时间的处理, 而且这个处理是不能很快, 也不能找到捷径, 也就是要有一定的工作量,这样垃圾邮件没有工作量,所以会被抛弃。
那么问题又来了
首先如何产生工作量的方法是什么?, 发送方如何在邮件里添加我已经完成很多工作(也就是工作量证明),第三个就是接收方如何验证工作量?
垃圾邮件处理例子
下面以一个垃圾邮件处理的例子来回答三个问题
在HashCash系统中,发件方向邮箱服务器发送的邮件信息中必须包含一段邮件签名,邮件签名中包含有收件人地址、发件时间和一个数字counter,counter需要使邮件签名满足条件:
利用SHA-1散列算法对邮件签名生成一个160-bit长度的哈希值,该哈希值前20位全为0 。此算法利用了散列算法的不可预测性,SHA-1的碰撞概率决定了算法的安全性。
在目前的认知中,发件方除了穷举尝试,无法很快的找到满足条件的签名串。于是发件方在发送邮件之前的工作就是不断地counter++生成新的邮件签名,然后获取SHA-1哈希值,判断前20位是否全为0,如果不是的话重新生成。而对于邮件服务器而言,只需要做一次SHA-1判断生成的签名是否满足条件即可,完全符合POW易于验证的定义。
算法简介
发送方签名
counter = 0;
while(1) {
//time为时间戳
result = SHA1(mailAdress + time + counter);
if (result.substring(0, 20) == "00000000000000000000") {
break;
}
counter++;
}
sig = mailAdress + time + counter;
服务端验签
if (SHA1(sig).substring(0, 20) == "00000000000000000000") {
return true;
}
由于散列函数的随机性, 每一次hash得到的160位中的每一位是0 或1 的概率相同, 那么要得到这样一个正确的hash值每次哈希成功的概率为1/2^20次方
当哈希成功后把哈希前的值 当做sig 放到邮件里, 接收方通过对sig再做SHA-1哈希,如果前20位为0, 说明是有工作量证明的。
那么上面的问题就能回答了
- 产生工作量的方法是什么?
不断哈希不同的值, 直到哈希值符合一定的条件 - 如何添加工作量证明?
得到符合要求哈希值 的哈希前的值是证明 - 如何验证?
接收方对证明进行哈希, 看是否符合上述条件
区块链如何运用PoW共识机制
刚才说区块链的共识机制就是PoW共识,而且借鉴了很多的HashCash的处理方法, 下面我们就来说说区块链如何进行PoW共识的。
区块的构成
在此之前需要先了解一下区块的构成,

由上图可知区块分为区块头和区块体, 其中区块之间的联系是通过存储父区块哈希联系在一起的。
区块头的各个组成要素:
父区块头哈希值: 前一区块的哈希值,使用**SHA256(SHA256(父区块头))**计算。占32字节
时间戳:该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块。占4字节
难度:该区块工作量证明算法的难度目标,已经使用特定算法编码。占4字节
随机数(Nonce):为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数。占4字节
Merkle根:该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算。占32字节
PoW证明过程
这也就是俗称的挖矿过程, 找到合适的哈希值
这里不详细说明区块打包过程, 区块通过一定的算法被生成, 当然生成是需要一定的代价的。
区块头里的各个值并不是随机的, 而是由固定的算法得出, Merkle根哈希值就是把交易打包变成一颗Merkle树, 最后得出根的哈希值, 难度值是根据算法不断调整, 要维持出块速率是10分钟出一个块。
下面将给出挖矿过程

首先我们把所有交易打包 生成Merkle树, 计算Merkle根的哈希值, 然后组装区块头, 把区块头不断进行SHA256(SHA256(区块头))操作, 然后判断是否小于网络目标值, 这里其实就是把它变成2进制, 二进制前面有多少位是没有0的, 因为有1的话, 这个十进制的值肯定是很大的, 就不会符合条件。 如果大于这个目标值, 说明前面的位数 没有满足 前多少位为0的条件 哈希不成功, 那么就改变随机数值,组成新的区块头,继续哈希。
这是就是是挖到旷了,其他节点验证的话也简单 只要做一次SHA256(SHA256(验证区块头))来判断。
这是区块链的PoW证明。
PoW优缺点
优点:
去中心化,将记账权公平的分派到其他节点
记账权是通过看节点的PoW, 谁挖矿最快, 谁就能拿到这个矿安全性高,破坏系统需要投入极大的成本
因为获得正确哈希值的概率和算力成正比, 如果没有掌握51%的算力就不能作弊。这样代价要高于诚实挖矿,所以安全性高
缺点
会造成资源浪费
因为挖矿需要大量的哈希运算,需要电力和各种算力资源,而且找到合适的哈希值实际上并没有其他的作用网络性能太低
因为比特币出块的时间是10分钟, 所以交易确认至少需要10分钟,而且目前支持支持每秒7笔交易的速度,不适合商业用处。PoW共识算法算力集中化。
目前挖矿矿池是主力, 算力高的矿池有选择权, 持本人么有参与决定的权利
目前的一些解决方案
参考网址
http://baijiahao.baidu.com/s?id=1596184609683656426&wfr=spider&for=pc
PoS (Proof of Stake)股权证明机制
一个根据用户持有货币的多少和时间(币龄),发放利息的一个制度。现实中最典型的例子就是股票,或者是银行存款。如果用户想获得更多的货币,那么就打开客户端,让它保持在线,就能通过获得“利息”获益,同时保证网络的安全。
DPoS (Delegated Proof of Stake)授权股权证明机制
无人控制的公司发行股份,产生利润,并将利润分配给股东。实现这一切不需要信任任何人,因为每件事都是被硬编码到软件中的。通俗点讲就是:公司股份制,股东持有这些公司的股份,公司为股东产生回报,无需挖矿。
PBFT (Practical Byzantine Fault Tolerance)实用拜占庭容错算法
拜占庭共识算法(Practical Byzantine Fault Tolerance- PBFT)也是一种常见的共识证明。它与之前两种都不相同,PBFT以计算为基础,也没有代币奖励。由链上所有人参与投票,少于(N-1)/3个节点反对时就获得公示信息的权利。
POI (Proof of Importance)
PoI(Proof of Importance)重要度证明共识算法引了账户重要程度的概念,使用账户重要性评分来分配记账权的概率。
POP (Proof of Participation)
这是标准链(CZR)的创新,基于账户参与度的 PoP(ProofofParticipation)算法,POP 将 POI 和DPOS 的思想结合,既能确保对设备的公平性,又拥有社区的共识。
我的解决方案
在传统的区块链技术里面, 共识需要计算哈希值没有什么意义,核心想法就是把计算没有意义的哈希,变成有价值的计算, 其实数学上有一些问题需要大算力才能得到结果, 有一个听过的方案就是不求哈希, 而是把问题变成求最大的素数,或者想很多模拟问题需要大量的计算而且对科学发展有帮助,比如模拟黑洞,模拟银河系,模拟宇宙早期形态,把这些问题当做挖矿指标。
或者其他大算力的问题
大素数分解, 密集线性代数。
或者通过竞标, 向区块链发出问题,以解决此问题当做工作量证明,然后用其算力解决问题,这也是有帮助的。
以上都是单考虑如何让这些算力不浪费这个方面, 还有其他类似于POS等不用大量算力的方法值得去发现。
POW共识机制原理及优缺点的更多相关文章
- 通俗讲解:PoW共识机制与以太坊的关系、Ghost协议 及 PoS共识机制的变种---Casper
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- 区块链共识机制之工作量证明(POW)
像比特币.以太坊.NXT.Bitshares等这些区块链系统,其本质上是一种加密经济组织,它建立在点对点网络上,是去中心化.无管辖的,由密码学.经济学和社会共识来共同维护.这些加密网络因各种原因有着多 ...
- 区块链共识机制(POW、POS、DPOS等)的优缺点
一.POW:工作量证明机制 基本原理: 第一代共识机制,比特币的基础.理解起来,很简单,就是“按劳取酬”,你付出多少工作量,就会获得多少报酬(比特币等加密货币).在网络世界里,这里的劳动就是你为网络提 ...
- (转)区块链共识机制分析——论PoW,PoS,DPos和DAG的优缺点
近期,随着区块链技术在社区中的声音越来越大,业界已经开始从技术角度对区块链进行全方位的解读.作为第一批区块链技术的实现,传统比特币与以太坊在共识机制.存储机制.智能合约机制.跨链通讯机制等领域并没有非 ...
- 区块链共识机制:POW、POS、DPOS、PBFT、POOL
共识机制作为区块链的关键技术之一,在业务吞吐量.交易速度.不可篡改性.准入门槛等等方面发挥重要的作用. 区块链是去中心化的,没有中心记账节点,所以需要全网对账本达成共识.目前有POW.POS.DPOS ...
- (转)从拜占庭将军问题谈谈为什么pow是目前最好的共识机制
我们知道基于区块链技术现在有很多的共识机制,包括不限于POW,POS,DPOS,PBFT……,我先不说为什么我最认可POW,我们先来看看著名的拜占庭将军问题: 拜占庭帝国即中世纪的土耳其,拥有巨大的财 ...
- AJAX工作原理及其优缺点
1.什么是AJAX?AJAX全称为"Asynchronous JavaScript and XML"(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它 ...
- 共识机制:AngelToken技术的根基
共识机制是区块链技术的一个核心问题,它决定了区块链中区块的生成法则,保证了各节点的诚实性.账本的容错性和系统的稳健性. 常用的共识机制主要有 PoW.PoS.DPoS.Paxos.PBFT等. 基于区 ...
- [转帖]LCD与LED的区别之背光原理与优缺点对比介绍
LCD与LED的区别之背光原理与优缺点对比介绍 http://m.elecfans.com/article/620376.html 时下液晶面板与液晶电视技术已经达到炉火纯青的境界,并已经成为大屏幕平 ...
随机推荐
- Python Ethical Hacking - BACKDOORS(4)
REVERSE_BACKDOOR - cd command Access file system: cd command changes current working directory. It h ...
- Redis如何存储和计算一亿用户的活跃度
1 前段时间,在网上看到一道面试题: 如何用redis存储统计1亿用户一年的登陆情况,并快速检索任意时间窗口内的活跃用户数量. 觉得很有意思,就仔细想了下 .并做了一系列实验,自己模拟了下 .还是有点 ...
- vue手脚架中使用jq
下载jq npm install jquery; 找到build文件夹下的webpack.base.config.js 先在开始的地方引入webpack const webpack = require ...
- CAS实现SSO 单点登录
结构 CAS分为两部分,CAS Server和CAS Client CAS Server用来负责用户的认证工作,就像是把第一次登录用户的一个标识存在这里,以便此用户在其他系统登录时验证其需不需要再次登 ...
- 关于ajaxSubmit传递参数 后台接收为"参数,参数”的问题
问题: 用户名密码往后台提交的时候,发现接收到的参数变成了下图 解决办法: 去掉ajaxSubmit的data属性 如下图 解释:因为ajaxSubmit在封装的时候会自动的从被form包裹的表单控件 ...
- 前端学习(十三):CSS盒子模型
进击のpython ***** 前端学习--CSS盒子模型 在前面的时候也说过,包括分析网页结构的时候,提到了,网页就其实就是一个一个盒子叠起来的 那现在就是有装饰的盒子,难度就变得深刻 所以说为了能 ...
- ~~并发编程(十一):GIL全局解释锁~~
进击のpython ***** 并发编程--GIL全局解释锁 这小节就是有些"大神"批判python语言不完美之处的开始 这一节我们要了解一下Cpython的GIL解释器锁的工作机 ...
- 最长不下降代码dp
我看以前写过一个最长不下降,但是感觉可能没有那么好理解emmmm 下面这个是从正序寻找的emmmm 先来一个WA代码,我给写了WA的具体行数,看看其他行其实可以看出它的思路 第二个代码是AC的 #in ...
- vector 赋初始值的问题
这个,输出为1 这个,啥都输不出来. 据说是因为没有初始化. 其实我搜了一下 vector<vector<int> > A;//正确的定义方式 vector<vector ...
- Intellij IDEA 快速查找接口实现类的快捷键
查找接口的实现类: IDEA 风格 ctrl + alt +B 在按F2查看详细文档注解 查看类或接口的继承关系: ctrl + h