当前位置: 首页 > news >正文

比特币代码分析10 比特币中的工作量

比特币网络中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络出的工作量证明的迷题。这道题关键的三个要素是工作量证明函数、区块及难度值。工作量证明函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了这道题的所需要的计算量。
工作量证明函数
SHA是安全散列算法(Secure Hash Algorithm)的缩写,是一个密码散列函数家族。这一组函数是由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST) 发布的,主要适用于数字签名标准。SHA256就是这个函数家族中的一个,是输出值为256位的哈希算法。到目前为止,还没有出现对SHA256算法的有效。
难度值
难度值(difficulty)是矿工们在挖矿时候的重要参考指标,它决定了矿工大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生保持都基本这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论挖矿能力如何,新区块产生速率都保持在10分钟一个。
难度的调整是在每个完整节点中独立自动发生的。每2016个区块,所有节点都会按统一的公式自动调整难度,这个公式是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。
这个公式可以总结为如下形式:
新难度值 = 旧难度值 ( 过去2016个区块花费时长 / 20160 分钟 )
工作量证明需要有一个目标值。比特币工作量证明的目标值(Target)的计算公式如下:
目标值 = 最大目标值
难度值
其中最大目标值为一个恒定值:
0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
目标值的大小与难度值成反比。比特币工作量证明的达成就是矿工计算出来的区块哈希值必须小于目标值。
比特币工作量证明的过程,就是通过不停的变换区块头(即尝试不同的nouce值)作为输入进行SHA256哈希运算,找出一个特定格式哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,代表难度越大。
工作量证明的过程
我们可以把比特币矿工解这道工作量证明迷题的步骤大致归纳如下:
1.生成Coinbase交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash
2.把Merkle Root Hash及其他相关字段组装成区块头,将区块头的80字节数据(Block Header)作为工作量证明的输入
3.不停的变更区块头中的随机数即nonce的数值,并对每次变更后的的区块头做双重SHA256运算(即SHA256(SHA256(Block_Header))),将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。
Pow完成的区块向全网广播,其他节点将验证其是否符合规则,如果验证有效,其他节点将接收此区块,并附加在已有区块链之后。之后将进入下一轮挖矿。

转载于:https://blog.51cto.com/13878196/2330351

相关文章:

  • Python正则表达式里的单行re.S和多行re.M模式
  • DOM: EVENT FLOW
  • 在windows10上利用Anaconda 搭建python3.6 + tensorflow环境
  • 修复win10无法双击打开txt文档.reg
  • JS的运行机制的总结!
  • 从SQL Server CloudDBA 看云数据库智能化
  • 夯实爪哇基础-数据类型,内存
  • Hibernate关联关系注解配置简单理解
  • 五大好用的开源MySQL管理工具推荐
  • day--42 前端基础小结
  • 【python】【基础】mac安装python3及pip
  • Using system view: sys.sysprocesses to check SqlServer's block and deadlock
  • JavaScript中for in 和for of的区别
  • 对于你们驳来驳去的《停止学习框架》,我有话说!
  • Linux下调整ext3分区大小【转】
  • [PHP内核探索]PHP中的哈希表
  • __proto__ 和 prototype的关系
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Bootstrap JS插件Alert源码分析
  • CSS 三角实现
  • es6(二):字符串的扩展
  • Java,console输出实时的转向GUI textbox
  • js正则,这点儿就够用了
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PHP那些事儿
  • Python连接Oracle
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • rabbitmq延迟消息示例
  • spring cloud gateway 源码解析(4)跨域问题处理
  • yii2权限控制rbac之rule详细讲解
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 精彩代码 vue.js
  • 移动端解决方案学习记录
  • 字符串匹配基础上
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (C++20) consteval立即函数
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (多级缓存)多级缓存
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)3D模板阴影原理
  • .cn根服务器被攻击之后
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net 托管代码与非托管代码
  • .Net的C#语言取月份数值对应的MonthName值
  • .net经典笔试题
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /etc/sudoer文件配置简析
  • @Autowired 与@Resource的区别
  • @Transactional类内部访问失效原因详解
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [C# 开发技巧]实现属于自己的截图工具