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的难度会相应的提高,我们通过控制平均每小时产生区块的数量来实现这种平衡。当区块产生的速度过快时,就通过提高难度来降低其速度。

区块链网络是按照如下的步骤运作的:

    1. 生成新的交易并将交易广播给所有节点
    1. 每个节点都收集这些交易,并将其打包成区块。
    1. 每个节点都进行PoW过程,致力于找到满足要求的Nounce
    1. 当一个节点完成PoW过程时,就将该区块广播到全网。
    1. 只要区块中所有的交易都合法有效,节点就会接收该区块
    1. 节点如果接收区块,就会开始创建下一个区块,用已接收区块的Hash值作为新区块的prevHash,进行新的一轮PoW的过程。

节点总是认为最长的链是正确的链,并致力于在最长的链上进行扩展。如果两个节点同时完成PoW过程并广播了不一样的区块,有的节点收到其中一个,而有的节点先会收到另一个。这种情况下,首先收到的区块会被节点作为下一个区块添加到链上,同时也会保存后到的区块。当下一个区块来临时,就会知道哪一个区块是比较长的,然后切换到较长的区块链上。

新交易的广播不一定要到达每一个节点,只要到达足够多的节点,这些节点就会在一定时间内将交易打包到区块中。区块的广播也是允许丢包的,如果节点没有收到某一个区块,当下一个区块到来时,该节点发现新区块的prevHash不是目前的最后一个区块,就会去请求丢失的区块。

bitcoin PoW原理及区块创建过程的更多相关文章

  1. Web APi之过滤器创建过程原理解析【一】(十)

    前言 Web API的简单流程就是从请求到执行到Action并最终作出响应,但是在这个过程有一把[筛子],那就是过滤器Filter,在从请求到Action这整个流程中使用Filter来进行相应的处理从 ...

  2. 套接字socket 的地址族和类型、工作原理、创建过程

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  3. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  4. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  5. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  6. windows进程/线程创建过程 --- windows操作系统学习

    有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. ...

  7. IController控制器的创建过程

    .NET/ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)   阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactor ...

  8. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  9. 类和对象的创建过程(元类,__new__,__init__,__call__)

    一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() pri ...

随机推荐

  1. mongodb的学习-5-概念解析

    http://www.runoob.com/mongodb/mongodb-databases-documents-collections.html mongodb中基本的概念是文档.集合.数据库 S ...

  2. JDBC通过配置文件(properites)读取数据库配置信息

    扫盲: Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM( ...

  3. PAT乙级1007

    1007 素数对猜想 (20 分) 让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数.显然有d​1​​=1,且对于n>1有d​n​​是偶数.“素数对猜想 ...

  4. break,continue,return和exit的区别

    1.break break语句的使用场合主要是switch语句和循环结构. 在循环结构中使用break语句,就退出循环,接着执行循环结构下面的第一条语句. 如果在多重嵌套循环中使用break语句,当执 ...

  5. UVA - 11927 Games Are Important (SG)

    Description  Games Are Important  One of the primary hobbies (and research topics!) among Computing ...

  6. C++反汇编代码分析–函数调用

    转载:http://shitouer.cn/2010/06/method-called/ 代码如下:#include “stdlib.h” int sum(int a,int b,int m,int ...

  7. 苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置

    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置,首先要做好如下的准备: 第一:数据的备份:第二:保证正常的wifi连接:第三:有线的鼠标键盘连接: 具体恢复操作步骤: 步骤一:电脑 ...

  8. 二、用Delphi10.3 创建一条JSON数据的第二种方法,并格式化输出

    一.用Delphi10.3构造一个JSON数据的第二种方法,并格式化输出,代码如下: uses //System.JSON, System.JSON.Types, System.JSON.Writer ...

  9. 运行第一个ruby程序

    0x00 安装 首先需要安装一个ruby的环境,ruby分为win.linux.macOS版本.不用系统安装方法略有差异,不在这进行讲解. 0x01 运行第一个ruby程序 我这里是win环境,打开命 ...

  10. ExcelVBA实现一键生成word文字报告及批量操作[原创]

    在很多工作中,经常需要写一些类似的报告,使用同一个模板,只是里面的数据不同,人工操作工程量大且容易出错,如果能用程序直接实现可以省去不少麻烦. 本文使用ExcelVBA实现,主要思路是使用word邮件 ...