bitcoin PoW原理及区块创建过程
bitcoin PoW原理及区块创建过程
PoW
为了在点对点的基础上实现一个分布式时间戳服务器,我们需要使用PoW(Proof of Work)系统来达成共识。PoW过程就是寻找一个目标值的过程,当对该目标值使用SHA-256之类Hash算法进行Hash运算时,要求得到的哈希值是以一定数目的0位开始的数。随着要求0位数目的增加,PoW过程的工作量是指数级增长的。通过对目标值进行一次哈希运算就可以验证目标是是否符合要求。

在PoW的实现中,我们在block中引入一个Nounce变量,我们通过Nounce的不断增大,来找到一个特定的Nounce值,使得整个block的哈希值以特定数目的0位开始。一旦CPU通过运算满足了PoW的要求,该block就不可以再被更改了,除非我们对该block及其后面的block都重新进行PoW过程。
// 要求hash值以5个0位开始
// 假设hash值都是8bit
func PoW (Nounce uint32) {
for SHA256.Hash(prevHash | Nounce | Tx) > 0b00000111 {
Nounce++
}
}
一旦区块创建完成,该节点就会向全网广播该区块,收到该区块的节点验证区块内容,通过验证的话就将该区块添加到当前区块链的最末端,然后开始下一个区块的创建工作。
若要改动某个区块中的信息,则需要修改该区块的内容及其后续所有区块的prevHash,也就是说需要对该区块及后续区块再做一次PoW任务。

PoW还解决了用什么方式表示大多数的问题。如果是基于每个IP一票的原则来获取大多数,这种方式很容易通过一个节点分配多个IP的方式来作弊。而PoW实际上是基于每个CPU一票的原则,大多数决策就用最长的链来表示,最长的链意味着耗费了最多的算力来进行PoW。如果大多数的CPU算力都被诚实的节点所掌握,那么诚实的链就是增长的最快的那个。如果攻击者想要更改某个区块,那么需要修改这个区块及其后续所有区块的内容,也就是需要对该区块及其后的所有区块都再次进行PoW过程,这超过了诚实节点的工作量。随着某个区块后面的区块链不断增长,改动该区块的可能性也就越低。
硬件计算能力是不断提高的,而且参与到网络中的节点也是越来越多(即贡献的算力越来越多),为了达到平衡,PoW的难度会相应的提高,我们通过控制平均每小时产生区块的数量来实现这种平衡。当区块产生的速度过快时,就通过提高难度来降低其速度。
区块链网络是按照如下的步骤运作的:
- 生成新的交易并将交易广播给所有节点
- 每个节点都收集这些交易,并将其打包成区块。
- 每个节点都进行PoW过程,致力于找到满足要求的Nounce
- 当一个节点完成PoW过程时,就将该区块广播到全网。
- 只要区块中所有的交易都合法有效,节点就会接收该区块
- 节点如果接收区块,就会开始创建下一个区块,用已接收区块的Hash值作为新区块的prevHash,进行新的一轮PoW的过程。
节点总是认为最长的链是正确的链,并致力于在最长的链上进行扩展。如果两个节点同时完成PoW过程并广播了不一样的区块,有的节点收到其中一个,而有的节点先会收到另一个。这种情况下,首先收到的区块会被节点作为下一个区块添加到链上,同时也会保存后到的区块。当下一个区块来临时,就会知道哪一个区块是比较长的,然后切换到较长的区块链上。
新交易的广播不一定要到达每一个节点,只要到达足够多的节点,这些节点就会在一定时间内将交易打包到区块中。区块的广播也是允许丢包的,如果节点没有收到某一个区块,当下一个区块到来时,该节点发现新区块的prevHash不是目前的最后一个区块,就会去请求丢失的区块。

bitcoin PoW原理及区块创建过程的更多相关文章
- Web APi之过滤器创建过程原理解析【一】(十)
前言 Web API的简单流程就是从请求到执行到Action并最终作出响应,但是在这个过程有一把[筛子],那就是过滤器Filter,在从请求到Action这整个流程中使用Filter来进行相应的处理从 ...
- 套接字socket 的地址族和类型、工作原理、创建过程
注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...
- Spring MVC 原理探秘 - 容器的创建过程
1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...
- .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- 图解JAVA对象的创建过程
前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...
- windows进程/线程创建过程 --- windows操作系统学习
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...
- IController控制器的创建过程
.NET/ASP.NET MVC Controller 控制器(二:IController控制器的创建过程) 阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactor ...
- 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- 类和对象的创建过程(元类,__new__,__init__,__call__)
一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() pri ...
随机推荐
- mongodb的学习-5-概念解析
http://www.runoob.com/mongodb/mongodb-databases-documents-collections.html mongodb中基本的概念是文档.集合.数据库 S ...
- JDBC通过配置文件(properites)读取数据库配置信息
扫盲: Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM( ...
- PAT乙级1007
1007 素数对猜想 (20 分) 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数.“素数对猜想 ...
- break,continue,return和exit的区别
1.break break语句的使用场合主要是switch语句和循环结构. 在循环结构中使用break语句,就退出循环,接着执行循环结构下面的第一条语句. 如果在多重嵌套循环中使用break语句,当执 ...
- UVA - 11927 Games Are Important (SG)
Description Games Are Important One of the primary hobbies (and research topics!) among Computing ...
- C++反汇编代码分析–函数调用
转载:http://shitouer.cn/2010/06/method-called/ 代码如下:#include “stdlib.h” int sum(int a,int b,int m,int ...
- 苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置
苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置,首先要做好如下的准备: 第一:数据的备份:第二:保证正常的wifi连接:第三:有线的鼠标键盘连接: 具体恢复操作步骤: 步骤一:电脑 ...
- 二、用Delphi10.3 创建一条JSON数据的第二种方法,并格式化输出
一.用Delphi10.3构造一个JSON数据的第二种方法,并格式化输出,代码如下: uses //System.JSON, System.JSON.Types, System.JSON.Writer ...
- 运行第一个ruby程序
0x00 安装 首先需要安装一个ruby的环境,ruby分为win.linux.macOS版本.不用系统安装方法略有差异,不在这进行讲解. 0x01 运行第一个ruby程序 我这里是win环境,打开命 ...
- ExcelVBA实现一键生成word文字报告及批量操作[原创]
在很多工作中,经常需要写一些类似的报告,使用同一个模板,只是里面的数据不同,人工操作工程量大且容易出错,如果能用程序直接实现可以省去不少麻烦. 本文使用ExcelVBA实现,主要思路是使用word邮件 ...