简介

POW是proof-of-work的缩写,中译为:工作量证明,是比特币中采用的共识机制,也被许多公有区块链系统所采用(比如以太坊)。工作量证明机制基础是哈希运算,因此要理解pow首先要明白哈希函数(比特币大量采用了sha256,以及rimped160)。

本篇文章重点介绍pow共识算法的原理,不具体介绍比特币的相关细节。

什么是哈希函数?

哈希运算是密码学的重要组成部分,一般用来保护数据的完整性。给定一段消息,通过哈希函数可以将消息映射为固定长度的哈希值(比如sha256,将任意长度的消息映射为256位的哈希值)。哈希函数具有两个重要的特点:“无碰撞“和”不可逆“。

1. 所谓不可逆,就是当你知道x的HASH值,无法求出x;因此哈希函数在数学上是一种单向函数。
2. 所谓无冲突,就是当你知道x,无法求出一个y, 使x与y的HASH值相同。简单来说就是,无法找到一个不同的消息y,使得y的哈希值与x的哈希值相同。(当然,因为消息的比特空间 << 所求哈希值的比特空间,因此其实这样的y是存在的,只是这样的y很难找,只是一个概率上的不可能)

哈希函数的应用

从哈希函数的特性我们可以看出,当x被改变时,x所对应的哈希值也会发生改变,因此可以通过一段消息的哈希值是否改变来间接反应消息是否被修改,也就是我们说的数据完整性验证。(当然这个一般还要也公钥密码体制相结合来使用,这里不解释公钥密码体制,自行google)。

### 在比特币中的使用

比特币主要使用了sha256哈希函数,有三个用途:

1. 比特币地址是公钥的两次sha256运算结果

2. 保证每笔交易的完整性

3. pow工作量证明机制的基础

比特币共识算法

pow工作量证明机制,我们从“工作量”和“证明”两个概念上来理解pow。

1. 什么是工作量?

比特币一直被人诟病做了大量无意义的运算,耗费了巨量的电能。这里的运算就是比特币共识机制中的工作量,而这个运算就是哈希运算。具体是下面的运算:

 SHA256(SHA256(Block_Header))

这里的Block_Header可以简单理解为:一堆比特币交易txs + 一个随机数数nonce。在生成比特币区块的时候,我们可以认为txs是固定的,因此pow可以简化为:选取随机数nonce,然后求SHA256(SHA256(txs || nonce)),我们下面把这个计算叫做POWHash。

这个不断重复选取随机数nonce,计算POWHash的过程什么时候结束呢?在比特币中POWHash的前n位为0的时候,我们认为找到了一个有效的nonce,然后就可以生成比特币区块并广播给其他的矿工。这里的n是一个可调节的数,比特币中没生成2016个块,会重新调整n,n越大有效的POWHash越难计算,相反越容易。

2. 怎么证明?

pow中的证明值得是验证nonce是否有效,同样是计算SHA256(SHA256(txs || nonce)),不过这里的txs和nonce都是已知的,我们把运算结果记为POWHash‘,我们只需要验证POWHash’是否满足前n为0,就可以证明这个区块是不是一个有效的比特币区块。

通过分析我们发现,如果要伪造交易(修改txs),需要重新找到一个nonce,因此对于非法修改区块,需要重新进行大量哈希运算来找到一个有效的nonce。由于每个区块都包含前一个区块的hash值,因此后面所有的区块都需要重新进行调整。因此修改比特币中的交易信息是计算上不可能的。

--------------------------------Talk is cheap, show me your code-------------------------------

下面是简单的pow实现,仅供参考

var (

 target, _ = new(big.Int).SetString("ffffffffffffffff", ) //64bits

)

func pow(merkelRootHash, previousHash []byte, difficulty int, h hash.Hash) {

 target = target.Rsh(target, uint(difficulty))

 //variable to computed. 1. from the beginning 0, 2. random a nounce. Here we choose 1.

 nounce := new(big.Int).SetInt64()

 for {

  //time stamp

  now := fmt.Sprintf("%v", time.Now())

  var header []byte

  header = append(header, []byte(now)...)

  header = append(header, previousHash...)

  header = append(header, merkelRootHash...)

  header = append(header, nounce.Bytes()...)

  h.Write(header)

  res := new(big.Int).SetBytes(h.Sum(nil)[:]) //substract first 8*8 bits from sha256

  if res.Cmp(target) <  {

     fmt.Printf("%b\n", nounce) //found a valid nonce, print it.

     break

  }

  nounce.Add(nounce, new(big.Int).SetUint64())

 }

}

----------------------------------End Line-------------------------------------------------


共识算法之POW的更多相关文章

  1. [转帖][区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得

    [区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得 置顶 2017-03-12 18:31:19 乐扣老师lekkoliu 阅读数 127953  收藏 更多 分类专栏: 技术管理 区 ...

  2. Bystack的高TPS共识算法

    共识算法是分布式系统保证节点数据状态一致性的方法,在区块链的共识算法分POW(工作量证明)和POS(权益证明)两大类.第一类POW模式是在公链项目中运用的最广泛应用的共识算法,比特币长达10年的运行已 ...

  3. [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...

  4. Pow共识算法

    谈到哈希算法,每个程序员都不陌生,但是谈到比特币共识算法PoW,如果没有接触过的技术人员可能觉得应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单.但其实如果你已掌握哈希算法 ...

  5. 区块链知识博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    注:这是本人读到的关于共识算法最全和最好的分享博文,系统的介绍了拜占庭容错技术以及共识算法的原理和常用共识算法,原文链接请见后. 目录 一.拜占庭容错技术(Byzantine Fault Tolera ...

  6. 区块链共识机制(POW、POS、DPOS等)的优缺点

    一.POW:工作量证明机制 基本原理: 第一代共识机制,比特币的基础.理解起来,很简单,就是“按劳取酬”,你付出多少工作量,就会获得多少报酬(比特币等加密货币).在网络世界里,这里的劳动就是你为网络提 ...

  7. go-ethereum源码分析 PartII 共识算法

    首先从共识引擎-Engine开始记录 Engine是一个独立于具体算法的共识引擎接口 Author(header) (common.Address, error) 返回打包header对应的区块的矿工 ...

  8. (二)区块链的共识算法:PoS 及其 例子 代码 实现

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  9. 区块链共识机制:POW、POS、DPOS、PBFT、POOL

    共识机制作为区块链的关键技术之一,在业务吞吐量.交易速度.不可篡改性.准入门槛等等方面发挥重要的作用. 区块链是去中心化的,没有中心记账节点,所以需要全网对账本达成共识.目前有POW.POS.DPOS ...

随机推荐

  1. font-smoothing使用后字体看起来会更清晰舒服

    CSS3里面加入了一个“-webkit-font-smoothing”属性. 这个属性可以使页面上的字体抗锯齿,使用后字体看起来会更清晰舒服. 加上之后就顿时感觉页面小清晰了. 淘宝也在用哦! 它有三 ...

  2. sas通过IMPORT过程读取外部文件数据

    SAS通过IMPORT过程读取外部文件数据 使用IMPORT过程导入带分隔符的文件外,Microsoft Access数据库文件.Miscrosft Excel工作簿. dBase文件.JMP文件.S ...

  3. bug的一些事

    Bug级别:(由高到低) 1.critical:系统直接崩溃,瘫痪.无法正常打开使用产品 2.Block:逻辑出现严重问题,流程卡住,无法进行下一步 3.Major:部分功能出现闪退,功能没有实现,但 ...

  4. php循环

    while 例子: /* example 1 */ $a = 0; while (true) { $a++; echo $a.'<br>'; if($a >= 10){ break; ...

  5. Exception、Error、运行时异常与一般异常有何异同

    转自博客  https://blog.csdn.net/m0_37531231/article/details/79502778 一.开场白 对于程序运行过程中的可能出现异常情况,java语言使用一种 ...

  6. 项目Alpha冲刺(团队3/10)

    项目Alpha冲刺(团队3/10) 团队名称: 云打印 作业要求: 项目Alpha冲刺(团队) 作业目标: 完成项目Alpha版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 ...

  7. Windows 系统 IP 和端口的相关检测命令

    查看本机IP地址 查看自己电脑的ip,使用 ipconfig 命令 ipconfig 检测指定IP是否联通 检测某个ip是否可以连通,直接使用 ping 命令 ping 219.148.111.212 ...

  8. 如何使用react-redux——傻瓜版

    概述 之前看redux官方文档真是看得一脸懵逼,现在自认为会用了,于是来总结一下用法,供以后开发时参考,相信对其他人也有用. 不得不说,用了redux之后感觉挺爽的,有如下优点: 组件大多是函数组件非 ...

  9. 如何在 SCSS 使用 JavaScript 变量/scss全局变量

    Update2019/3/6:发现一个更好的方法,预处理器加载一个全局设置文件 官方github给出了详细的配置. 在 SCSS 中使用变量很方便,创建一个 variables.scss 文件,里面声 ...

  10. Java中的引用传递和值传递

    Java中的引用传递和值传递 关于Java的引用传递和值传递,在听了老师讲解后,还是没有弄清楚是怎么一回事,于是查了资料,所以在这里与大家分享,有不对的地方,欢迎大家留言. java中是没有指针的,j ...