目录:https://blog.csdn.net/qq_40452317/article/details/89646633

比特币的去中心化共识由所有网络节点的 4 种独立过程相互作用而产生:

  • 每个全节点依据综合标准对每个交易进行独立验证
  • 通过完成工作量证明算法的验算,挖矿节点将交易记录独立打包进新区块
  • 每个节点独立的对新区块进行校验并组装进区块链
  • 每个节点对区块链进行独立选择,在工作量证明机制下选择累计工作量最大的区块链。

按照上面四个过程,现在时第二步,在前面已经将交易打包到区块中和构造好区块头。节点已经构建了一个候选区块,那么就轮到矿机对这个新区块进行“挖掘”,求解工作量证明算法以使这个区块有效。我们已经学习了比特币系统中不同地方用到的哈希加密函数。比特币挖矿过程使用的是SHA256哈希函数。

哈希函数输入一个任意长度的数据,输出一个长度固定且绝不雷同的值,可将其视为输入的数字指纹。对于特定输入,哈希的结果每次都一样,任何人都可以用相同的哈希函数,计算和验证哈希结果。一个加密哈希函数的主要特征就是不同的输入几乎不可能出现相同的数字指纹。因此,有意的选择一个输入去生成一 个想要的哈希值值是几乎不可能的,更别提用随机的方式生成想要的哈希值了。

无论输入的大小是多少,SHA256函数的输出的长度总是256bit。我们将使用Python解释器来计算语句 "I am Satoshi Nakamoto" 的SHA256的哈希值。

import hashlibtext = "I am Satoshi Nakamoto"print hashlib.sha256(text).hexdigest()
5d7c7ba21cbbcd75d14800b100252d5b428e5b1213d27c385bc141ca6b47989e

5d7c7ba21cbbcd75d14800b100252d5b428e5b1213d27c385bc141ca6b47989e是"I am Satoshi Nakamoto"的哈希值。改变原句中的任何一个字母、标点、或增加字母都会产生不同的哈希值。

如果改变原句,得到的应该是完全不同的哈希值。例如,在句子末尾加上一个数字,通过反复修改nonce来生成不同哈希值的脚本(SHA256)。

import hashlibtext = "I am Satoshi Nakamoto"for nonce in xrange(20):input = text + str(nonce)hash = hashlib.sha256(input).hexdigest()print input,'=>',hash
======================== RESTART: D:\python2\test.py ========================
I am Satoshi Nakamoto0 => a80a81401765c8eddee25df36728d732acb6d135bcdee6c2f87a3784279cfaed
I am Satoshi Nakamoto1 => f7bc9a6304a4647bb41241a677b5345fe3cd30db882c8281cf24fbb7645b6240
I am Satoshi Nakamoto2 => ea758a8134b115298a1583ffb80ae62939a2d086273ef5a7b14fbfe7fb8a799e
I am Satoshi Nakamoto3 => bfa9779618ff072c903d773de30c99bd6e2fd70bb8f2cbb929400e0976a5c6f4
I am Satoshi Nakamoto4 => bce8564de9a83c18c31944a66bde992ff1a77513f888e91c185bd08ab9c831d5
I am Satoshi Nakamoto5 => eb362c3cf3479be0a97a20163589038e4dbead49f915e96e8f983f99efa3ef0a
I am Satoshi Nakamoto6 => 4a2fd48e3be420d0d28e202360cfbaba410beddeebb8ec07a669cd8928a8ba0e
I am Satoshi Nakamoto7 => 790b5a1349a5f2b909bf74d0d166b17a333c7fd80c0f0eeabf29c4564ada8351
I am Satoshi Nakamoto8 => 702c45e5b15aa54b625d68dd947f1597b1fa571d00ac6c3dedfa499f425e7369
I am Satoshi Nakamoto9 => 7007cf7dd40f5e933cd89fff5b791ff0614d9c6017fbe831d63d392583564f74
I am Satoshi Nakamoto10 => c2f38c81992f4614206a21537bd634af717896430ff1de6fc1ee44a949737705
I am Satoshi Nakamoto11 => 7045da6ed8a914690f087690e1e8d662cf9e56f76b445d9dc99c68354c83c102
I am Satoshi Nakamoto12 => 60f01db30c1a0d4cbce2b4b22e88b9b93f58f10555a8f0f4f5da97c3926981c0
I am Satoshi Nakamoto13 => 0ebc56d59a34f5082aaef3d66b37a661696c2b618e62432727216ba9531041a5
I am Satoshi Nakamoto14 => 27ead1ca85da66981fd9da01a8c6816f54cfa0d4834e68a3e2a5477e865164c4
I am Satoshi Nakamoto15 => 394809fb809c5f83ce97ab554a2812cd901d3b164ae93492d5718e15006b1db2
I am Satoshi Nakamoto16 => 8fa4992219df33f50834465d30474298a7d5ec7c7418e642ba6eae6a7b3785b7
I am Satoshi Nakamoto17 => dca9b8b4f8d8e1521fa4eaa46f4f0cdf9ae0e6939477e1c6d89442b121b8a58e
I am Satoshi Nakamoto18 => 9989a401b2a3a318b01e9ca9a22b0f39d82e48bb51e0d324aaa44ecaba836252
I am Satoshi Nakamoto19 => cda56022ecb5b67b2bc93a2d764e75fc6ec6e6e79ff6c39e21d03b45aa5b303a

每个语句都生成了一个完全不同的哈希值。它们看起来是完全随机的,但你在任何计算机上用Python执行上面的脚本都 能重现这些完全相同的哈希值。

类似这样在语句末尾的变化的数字叫做nonce(随机数)。Nonce 是用来改变加密函数输出的,在这个示例中改变了这个语句的SHA256指纹。

为了使这个哈希算法变得富有挑战,我们来设定一个具有任意性的目标:找到一个语句,使之哈希值的十六进制表示以0开头。幸运的是,这很容易!在前面 "I am Satoshi Nakamoto13" 的哈希值是

0ebc56d59a34f5082aaef3d66b37a661696c2b618e62432727216ba9531041a5

刚好满足条件。我们得到它用了13次。用概率的角度 来看,如果哈希函数的输出是平均分布的,我们可以期望每16次得到一个以0开头的哈希值(十六进制个位数字为0到F)。从数字的角度来看,我们要找的是小于 0x1000000000000000000000000000000000000000000000000000000000000000的哈希值。

我们称这个为Target目标阈值,我们的目的是找到一个小于这个目标的哈希值。 如果我们减小这个目标值,那找到一个小于它的哈希值会越来越难。

简单打个比方,想象人们不断扔一对骰子以得到小于一个特定点数的游戏。第一局,目标是12。只要你不扔出两个6, 你就会赢。

然后下一局目标为11。玩家只能扔10或更小的点数才能赢,不过也很简单。假如几局之后目标降低为了5。现在有一半机率以上扔出来的骰子加起来点数会超过5,因此无效。

随着目标越来越小,要想赢的话,扔骰子的次数会指数级的上升。最终当目标为2时(最小可能点数),只有一个人平均扔36次或2%扔的次数中,他才能赢。

从一个知道骰子游戏目标为2的观察者的角度来看,如果有人要成功中奖,假设他平均尝试了36次。换句话说,可以估计从实现目标难度取得成功所需的工作量。

当算法是基于诸如SHA256的确定性函数时,输入本身就成为证据,必须要一定的工作量才能产生低于目标的结果。 因此,称之为工作量证明。

尽管每次尝试产生一个随机的结果,但是任何可能的结果的概率可以预先计算。 因此,指定特定难度的结果构成了具体的工作量证明。

在前面代码中的nonce为13,且这个结果能被所有人独立确认。任何人将13加到语句 "I am Satoshi Nakamoto" 后面再计算哈希值都能确认它比目标值要小。这个正确的结果同时也是工作量证明(ProofofWork),因为它证明我们的确花时间找到了这个 nonce。

验证这个哈希值只需要一次计算,而我们找到它却花了13次。如果目标值更小(难度更大),那我们需要多得多的哈希计算才能找到合适的nonce,但其他人验证它时只需要一次哈希计算。此外,知道目标值后,任何人都可以用统计学来估算其难度,因此就能知道找到这个nonce需要多少工作。

工作证明必须产生小于目标的哈希值。 更高的目标意味着找到低于目标的哈希是不太困难的。 较低的目标意味着在目标下方找到哈希更难。 目标和难度是成反比。

比特币的工作量证明和前面例子的挑战非常类似。矿工用一些交易构建一个候选区块。

接下来,这个矿工计算这个区块头信息的哈希值,看其是否小于当前目标值。如果这个哈希值不小于目标值,矿工就会修改这个nonce(通常将之加1) 然后再试一次。按当前比特币系统的难度,矿工得试10^15次(10 的15 次方) 才能找到一个合适的nonce使区块头信息哈希值足够小。

可以看出,随着难度位一位一位地增加,查找正确结果的时间会呈指数级增长。如果你考虑整个256bit 数字空间,每次要求多一个0,你就把哈希查找空间缩减了一半。在前面例子中为寻找一个nonce 使得哈希值开头的26位值为 0,一共尝试了 8 千多万次。即使家用笔记本每秒可以达270,000 多次哈希计算,这个查找依然需要10分钟。

import hashlib
import timemax_nonce = 2 ** 32def proof_of_work(header,difficulty_bits):target = 2**(256-difficulty_bits)for nonce in xrange(max_nonce):hash_result = hashlib.sha256(str(header)+str(nonce)).hexdigest()if long(hash_result,16) < target:print "Success with nonce %d" % nonceprint "Hsah is %s" % hash_resultreturn (hash_result,nonce)print "Failed after %d(max_nonce) tries" % noncereturn " ",nonceif __name__ == '__main__':nonce =0hash_result =""for difficulty_bits in xrange(32):difficulty =2 ** difficulty_bitsprint "Difficulty:%ld(%d bits)"%(difficulty,difficulty_bits)print"Starubg searching....."start_time = time.time()new_block = "test block with transaction" + hash_result(hash_result,nonce) = (proof_of_work(new_block,difficulty_bits))end_time = time.time()elapsed_time = end_time - start_timeprint "Elapsed_time is %.4f seconds" % elapsed_timeif elapsed_time > 0 :hash_power= float(long(nonce)/elapsed_time)print "Hashing pwer:%ld hashes per second" % hash_power
Difficulty:1(0 bits)
Starubg searching.....
Success with nonce 0
Hsah is 2cb12b088e5e457a57058c53080443eba3976d0fd6b0a8631c72248c9079421a
Elapsed_time is 0.0070 seconds
Hashing pwer:0 hashes per second
Difficulty:2(1 bits)
Starubg searching.....
Success with nonce 0
Hsah is 5b7e6eccd667a6b83e9b88a5fb470a45f3b7a28252630354271ad81cbff64e01
Elapsed_time is 0.0050 seconds
Hashing pwer:0 hashes per second....Difficulty:16384(14 bits)
Starubg searching.....
Success with nonce 12264
Hsah is 000233e915fdd434d0acf10238caa75a4058e02edb9a26f9e4aa8eab7db6e6d0
Elapsed_time is 0.0360 seconds
Hashing pwer:340666 hashes per second...Difficulty: 67108864 (26 bits)
Starting search...
Success with nonce 84561291
Hash is 0000001f0ea21e676b6dde5ad429b9d131a9f2b000802ab2f169cbca22b1e21a
Elapsed Time: 665.0949seconds
Hashing Power: 127141 hashes per second

生成下一个区块需要网络每秒计算 1.8septa-hashes((thousandbillionbillion 次哈希)。现在比特币网络已经拥有3EH/sec 的处理能力,平均每10分钟就可以 找到一个新区块。

区块链-工作量证明算法相关推荐

  1. 动手学区块链学习笔记(二):区块链以及工作量证明算法

    引言 紧接上文,在介绍完区块链中的加密解密以及公钥私钥等算法后,本篇开始正式进入区块链概念与一个简单区块链系统的实现过程介绍. 区块链技术介绍 什么是区块链? 区块链,就是一个又一个区块组成的链条.每 ...

  2. [区块链研究实验室]区块链之工作量证明(POW)

    比特币网络是公开的,因此共识协议的稳定性和防攻击性十分关键. 比特币区块链采用了 Proof of Work(PoW)的机制来实现共识,该机制于 1998 年在 B-money 设计中提出. 目前,P ...

  3. 区块链笔记-Hash算法

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链笔记-Hash算法 区块链技术是一系列技术的结合,建立新的技术架构,hash算法是很重要的一块,如果理解不当的地方 ...

  4. 第十一课 区块链常用共识算法介绍

    上一节课我们学习了共识算法理论基础,今天我们继续深入学习区块链共识算法,通过这节课我们将了解工作量证明.权威证明.权威授权证明.实用拜占庭容错等相关内容. 在学习课程的时候,你也可以领取BaaS平台为 ...

  5. 兄弟连区块链入门教程分享区块链POW证明代码实现demo

    区块链入门教程分享区块链POW证明代码实现demo 这里强调一下区块链的协议分层 应用层 合约层 激励机制 共识层 网络层 数据层 上 一篇主要实现了区块链的 数据层,数据层主要使用的技术 ...

  6. 共识算法之Pow工作量证明算法go语言实现

    pow算法的简介 pow算法的代表性应用就是比特币系统,pow算法的原义是工作量证明算法,故名思意就是干多少活的证明.其实就是暴力求值,通过暴力循环 找到一个合适的哈希值, 这篇文中由详细的介绍 pa ...

  7. 区块链存储证明和时空证明

    proof of storage email:1650727278@qq.com 画笔 科学的本质是哲学.哲学的追求有一个极:永恒.有两个底:变和不变.这两个哲学思想,就好比九阳神功和太极剑.学会之后 ...

  8. 区块链零知识证明能否破解《三体》的黑暗森林法?

    摘要:在刘慈欣<三体>书中的黑暗森林法则中,区块链零知识证明能否在一片黑暗中,在没有共同故事的文明之间提供一种信任方法? 在刘慈欣<三体>宇宙社会学中有一条重要法则--黑暗森林 ...

  9. CSDN日报191105:2019年11月全国程序员工资统计,区块链工程师比算法工资高

    CSDN日报来啦!给大家奉上当日最新鲜的技术干货! 2019年11月全国程序员工资统计,区块链工程师比算法工资高 作者:有数可据 我每个月第一天(也许是第二天,第三天),会爬招聘网站,并在CSDN发布 ...

最新文章

  1. 计算机二级ms office excel,计算机二级Msoffice考试excel答案.docx
  2. 智能车竞赛技术报告 | 智能车视觉 - 南京邮电大学 - 栅库砸车跑路队
  3. python3对urllib和urllib2进行了重构
  4. PHP:第五章——字符串输出函数
  5. 【渝粤题库】陕西师范大学163201 旅游科学引论作业(专升本)
  6. Navicat Premium创建MySQL存储过程
  7. C# 全角半角相互转换
  8. c# imager让图片有圆角unity_Unity纹理-引题和单张纹理
  9. linux 如何避免进程killed_Linux 内核 / 进程管理 / 如何描述一个进程?
  10. KVM虚拟机在线扩展磁盘空间
  11. 网易云音乐歌词下载器
  12. 极客时间-算法训练营 3.2
  13. 运动计步app开发的功能分析
  14. 图像拼接算法总结(一)
  15. vi/vim保存报错:E37: No write since last change E162: No write since last change for buffer “[文件名称]“
  16. RuntimeError: ‘lengths’ argument should be a 1D CPU int64 tensor, but got 1D cuda:0 Long tensor
  17. 旅行comf HYSBZ - 1050
  18. python 发送匿名邮件或无发件人
  19. 2021年中国奶油行业上市企业对比分析:海融科技VS 立高食品[图]
  20. IBM MQ认证探讨

热门文章

  1. ROS之游戏手柄控制小乌龟移动
  2. 用spring.data的API,ElasticsearchRestTemplate来简单操作Elasticsearch的增删改查等功能~
  3. 雷达原理---脉冲雷达和连续波雷达
  4. window.onunload和window.onbeforeunload事件
  5. 中国计算机科学期刊,计算机科学杂志是核心期刊吗?
  6. 获取B站评论抽奖实现
  7. CSDN Markdown:换行问题
  8. 我听到过对初心最好的见解
  9. Leetcode 部分题解
  10. Hermit 音乐播放器 2.4.1