POW工作量证明(英文全称为Proof of Work)在比特币之前就已经出现,中本聪在设计区块链的共识机制的时候就是借鉴了POW工作量证明。常见的是利用HASH运算的复杂度进行CPU运算实现工作量确定。
工作量证明(Proof-of-Work,PoW)是一种对应服务与资源滥用、或是阻断服务攻击的经济对策。一般是要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备与能源做为担保成本,以确保服务与资源是被真正的需求所使用。
在一个PoW系统中, 一定会有两个角色, 一个是工作者, 一个是验证者
对于工作者
对于验证者
区块链的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共识,而且借鉴了很多的HashCash的处理方法, 下面我们就来说说区块链如何进行PoW共识的。
由上图可知区块分为区块头和区块体, 其中区块之间的联系是通过存储父区块哈希联系在一起的。
区块头的各个组成要素:
父区块头哈希值: 前一区块的哈希值,使用**SHA256(SHA256(父区块头))**计算。占32字节
时间戳:该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块。占4字节
难度:该区块工作量证明算法的难度目标,已经使用特定算法编码。占4字节
随机数(Nonce):为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数。占4字节
Merkle根:该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算。占32字节
这也就是俗称的挖矿过程, 找到合适的哈希值
这里不详细说明区块打包过程, 区块通过一定的算法被生成, 当然生成是需要一定的代价的。
区块头里的各个值并不是随机的, 而是由固定的算法得出, Merkle根哈希值就是把交易打包变成一颗Merkle树, 最后得出根的哈希值, 难度值是根据算法不断调整, 要维持出块速率是10分钟出一个块。
下面将给出挖矿过程
首先我们把所有交易打包 生成Merkle树, 计算Merkle根的哈希值, 然后组装区块头, 把区块头不断进行SHA256(SHA256(区块头))操作, 然后判断是否小于网络目标值, 这里其实就是把它变成2进制, 二进制前面有多少位是没有0的, 因为有1的话, 这个十进制的值肯定是很大的, 就不会符合条件。 如果大于这个目标值, 说明前面的位数 没有满足 前多少位为0的条件 哈希不成功, 那么就改变随机数值,组成新的区块头,继续哈希。
这是就是是挖到旷了,其他节点验证的话也简单 只要做一次SHA256(SHA256(验证区块头))来判断。
这是区块链的PoW证明。
优点:
去中心化,将记账权公平的分派到其他节点
记账权是通过看节点的PoW, 谁挖矿最快, 谁就能拿到这个矿
安全性高,破坏系统需要投入极大的成本
因为获得正确哈希值的概率和算力成正比, 如果没有掌握51%的算力就不能作弊。这样代价要高于诚实挖矿,所以安全性高
缺点
会造成资源浪费
因为挖矿需要大量的哈希运算,需要电力和各种算力资源,而且找到合适的哈希值实际上并没有其他的作用
网络性能太低
因为比特币出块的时间是10分钟, 所以交易确认至少需要10分钟,而且目前支持支持每秒7笔交易的速度,不适合商业用处。
PoW共识算法算力集中化。
目前挖矿矿池是主力, 算力高的矿池有选择权, 持本人么有参与决定的权利
参考网址
http://baijiahao.baidu.com/s?id=1596184609683656426&wfr=spider&for=pc
一个根据用户持有货币的多少和时间(币龄),发放利息的一个制度。现实中最典型的例子就是股票,或者是银行存款。如果用户想获得更多的货币,那么就打开客户端,让它保持在线,就能通过获得“利息”获益,同时保证网络的安全。
无人控制的公司发行股份,产生利润,并将利润分配给股东。实现这一切不需要信任任何人,因为每件事都是被硬编码到软件中的。通俗点讲就是:公司股份制,股东持有这些公司的股份,公司为股东产生回报,无需挖矿。
拜占庭共识算法(Practical Byzantine Fault Tolerance- PBFT)也是一种常见的共识证明。它与之前两种都不相同,PBFT以计算为基础,也没有代币奖励。由链上所有人参与投票,少于(N-1)/3个节点反对时就获得公示信息的权利。
PoI(Proof of Importance)重要度证明共识算法引了账户重要程度的概念,使用账户重要性评分来分配记账权的概率。
这是标准链(CZR)的创新,基于账户参与度的 PoP(ProofofParticipation)算法,POP 将 POI 和DPOS 的思想结合,既能确保对设备的公平性,又拥有社区的共识。
在传统的区块链技术里面, 共识需要计算哈希值没有什么意义,核心想法就是把计算没有意义的哈希,变成有价值的计算, 其实数学上有一些问题需要大算力才能得到结果, 有一个听过的方案就是不求哈希, 而是把问题变成求最大的素数,或者想很多模拟问题需要大量的计算而且对科学发展有帮助,比如模拟黑洞,模拟银河系,模拟宇宙早期形态,把这些问题当做挖矿指标。
或者其他大算力的问题
大素数分解, 密集线性代数。
或者通过竞标, 向区块链发出问题,以解决此问题当做工作量证明,然后用其算力解决问题,这也是有帮助的。
以上都是单考虑如何让这些算力不浪费这个方面, 还有其他类似于POS等不用大量算力的方法值得去发现。