比特币PoW
比特币区块头结构
| 字段 | 大小(Byte) | 说明 |
|---|---|---|
| nVersion | 4 | 区块版本号,表示本区块遵守的验证规则 |
| hashPrevBlock | 32 | 前一区块的哈希值,使用SHA256(SHA256(父区块头))计算 |
| hashMerkleRoot | 32 | 该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算 |
| nTime | 4 | 时间戳 该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块 |
| nBits | 4 | 该区块工作量证明算法的难度目标,已经使用特定算法编码 |
| nNonce | 4 | 为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数 |
比特币PoW算法
比特币挖矿的算法就是不断区块头的哈希值,使得其满足下面的式子:
SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + nNonce)) <= TARGET
所以挖矿就是不断尝试不同的nonce,使得上式成立,由于32位的nonce域太小,这时也可以微调时间戳nTime,还可以调整铸币交易coinbase(铸币交易是交易列表中第一笔交易,用于给矿工比特币奖励)。
TARGET调整
比特币为了维持每10分钟出一个块的稳定,每2016个区块(理论上两周时间的出块量)会重新计算TARGET:
新难度值 = 旧难度值 * (最近2016个区块的真正时间 / 最近2016个区块的预期时间)
同时还有“涨停跌停”限制,新难度值最大不能不过当前难度值的4倍,最小不能小于当前难度值的4分之1。
为什么要判断时间戳是否合法
为了防止有些矿工恶意修改时间戳,比如将时间戳的值设的很大,让系统以为当前难度过高,从而降低挖矿难度
为什么要计算两次哈希值
这是因为SHA1在2017年被攻破,采用的方法是birthday collision attack。社区觉得SHA2被攻破也是时间的问题,而抵御birthday collision attack的有效方法为双重哈希算法
比特币PoW的更多相关文章
- 比特币pow算法介绍
Proof Of Work 工作量证明 借鉴了 哈希现金(Hashcash)-1997年 英国密码学专家亚当.贝克(Adam Back) 用工作量证明系统解决了互联网垃圾邮件问题,它要求计算机在获得发 ...
- [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...
- POW的重力之美
定律一:每一个UTXO都保持其状不变,直到有外力迫使它改变这种状态为止--艾萨克•牛顿,原理2.0 在过去的几年里,关于比特币的工作量证明(PoW)所造成的"巨大的能源浪费"已经被 ...
- Pow共识算法
谈到哈希算法,每个程序员都不陌生,但是谈到比特币共识算法PoW,如果没有接触过的技术人员可能觉得应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单.但其实如果你已掌握哈希算法 ...
- 图解比原链Tensority算法:如何让POW做到人工智能友好
共识算法说起 区块链系统首先是分布式系统,而一致性是分布式系统的基础问题,要保证系统满足不同程度的一致性,则就要用到共识算法. 现在主流的算法有POW.POS.DPOS等等,比特币采用的POW共识算法 ...
- 区块链知识博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
注:这是本人读到的关于共识算法最全和最好的分享博文,系统的介绍了拜占庭容错技术以及共识算法的原理和常用共识算法,原文链接请见后. 目录 一.拜占庭容错技术(Byzantine Fault Tolera ...
- 【探索】无形验证码 —— PoW 算力验证
先来思考一个问题:如何写一个能消耗对方时间的程序? 消耗时间还不简单,休眠一下就可以了: Sleep(1000) 这确实消耗了时间,但并没有消耗 CPU.如果对方开了变速齿轮,这瞬间就能完成. 不过要 ...
- 比特币_Bitcoin 简介
2008-11 Satoshi Nakamoto Bitcoin: A Peer-to-Peer Electronic Cash System http://p2pbucks.com/?p=99 ...
- 比特币区块结构Merkle树及简单支付验证分析
在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...
随机推荐
- leetcode刷题-80.删除排序数组中的重复项 II
题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
- Kubernetes笔记(五):了解Pod(容器组)
Kubernetes 中, 容器总是以 Pod(容器组)的方式进行调度与运行.因此对 Pod 的理解与掌握是学习 Kubernetes 的基础. 理解 Pod Pod(容器组)是 Kubernetes ...
- HTTP 协议类
HTTP 协议的主要特点 简单快速:每个资源的URL是固定的 灵活:在每个 http 协议中都有一个头部分有一个数据类型,通过一个 http 协议就可以完成不同数据类型的传输 无连接:连接一次就好断掉 ...
- 【NOIP2015模拟】终章-剑之魂
背景介绍 古堡,暗鸦,斜阳,和深渊-- 等了三年,我独自一人,终于来到了这里-- "终焉的试炼吗?就在这里吗?"我自言自语道. "终焉的试炼啊!就在这里啊!"我 ...
- [Spark]Spark、Yarn 入门
Spark在集群上的运行模式 链接: http://spark.apache.org/docs/latest/cluster-overview.html Component章节 总结: 1 Each ...
- [SSM项目]二-项目设计和框架搭建
一 10个实体类 选择Integer 而不是int的原因 :当值为空时,int类型会自动为其初始化,这是我们不希望的. 二 配置Maven 目录结构: src/main/java:业务代码 src/m ...
- java 常用类-String-1
一.字符串相关的类 1.1 String 的特性 String类:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String是一个fin ...
- 使用VSCode和CMake构建跨平台的C/C++开发环境
日前在学习制作LearnOpenGL教程的实战项目Breakout游戏时,希望能将这个小游戏开发成跨平台的,支持在多个平台运行.工欲善其事必先利其器,首先需要做的自然是搭建一个舒服的跨平台C/C++开 ...
- 《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递
4.4方法参数及传递 关于这个知识点,我想了很久该不该在这里阐述.因为这个知识点稍微有点晦涩,并且就算不了解也不影响用Java编写代码.不过笔者刚开始工作的时候,就是因为这块内容没有过多的关注,以至于 ...
- ASP.NET Core 基于声明的访问控制到底是什么鬼?
从ASP.NET 4.x到ASP.NET Core,内置身份验证已从基于角色的访问控制(RBAC)转变为基于声明的访问控制(CBAC). 我们常用的HttpContext.User属性ASP.NET ...