简介

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. 谷歌发布了 T2T(Tensor2Tensor)深度学习开源系统

    谷歌开源T2T模型库,深度学习系统进入模块化时代! 谷歌大脑颠覆深度学习混乱现状,要用单一模型学会多项任务 https://github.com/tensorflow/models https://g ...

  2. xpath获取一个标签下的多个同级标签

    一.问题: 我在使用xpath获取文章内容的时候会遇到,多个相同的标签在同一级下面,但是我们只需要获取一部分的内容.比如我不想需要原标题这些内容. 二.解决: Xpath中有一个position()的 ...

  3. python基本数据类型之列表和元组

    python基本数据类型之列表与元组 python中list与tuple都是可以遍历类型.不同的是,list是可以修改的,而元组属于不可变类型,不能修改. 列表和元组中的元素可以是任意类型,并且同一个 ...

  4. TensorFlow 运行模型--会话(Session)

    会话模式一: 需要明确调用会话生成函数和关闭函数 # 创建一个会话 sess = tf.Session() # 使用创建好的会话进行运算 sess.run("要运算的对象") # ...

  5. [solution] JZOJ-5795 词典

    [solution]JZOJ-5795 词典 题面 Description 小C有$n$个字符串$T_1 T_n$,给出$m$个询问 第$i$个询问给出一个字符串$S_i$,对于每个询问,我们可以得到 ...

  6. Word中的段落

    Word文档中的块级内容的最基本单位是段落,段落用<p>元素进行存储.段落定义在新行中开始,段落可以包含三方面的信息:可选的段落属性.内嵌的内容(通常为文本)和用于比较两个文档的内容的一组 ...

  7. 过滤器和拦截器filter和Interceptor的区别

    1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...

  8. 561.数组拆分I

    题目:给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. ...

  9. unigui结合JS方法记录

    在js中界面上所有组件都当成html里来控制 .控制按钮事件  document.getElementById(MainForm.UniButton4.getId()).click(); 这个方法让J ...

  10. ASP.NET MVC下使用AngularJs语言(五):ng-selected

    这次学习ng-selected语法,这个是为DropDownList下拉列表显示默认选项. 演示从下面步骤开始 1,新建一个model: 上面#14行代码的property,数据类型为bool.即是存 ...