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

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

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

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

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

原文地址:https://www.cnblogs.com/gexin/p/9302315.html

时间: 2024-08-30 18:20:30

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

共识算法POW原理及实现

POW简介 Proof of Work,工作证明.POW共识算法主要是通过计算难度值来决定谁来出块.POW的工作量是指方程式求解,谁先解出来,谁就有权利出块.方程式是通过前一个区块的哈希值和随机值nonce来计算下一个区块的哈希值,谁先找到nonce,谁就能最先计算出下一个区块的哈希值,这种方式之所以被称为计算难度值是因为方程式没有固定解法,只能不断的尝试,这种解方程式的方式称为哈希碰撞,是概率事件,碰撞的次数越多,方程式求解的难度就会越大.比特币就是采用POW共识算法 算法具体实现原理 这里涉

加密、解密的原理及Openssl创建CA和ssh的基础应用

加密.解密的原理及Openssl创建CA和ssh的基础应用 随着互联网的不断发展和技术的不断成熟,在互联网上传输文件不在安全,在需要传送重要的数据时就必须加密处理. 密码算法分为三种:分别是对称加密,公钥加密,单向加密:以及需要对加密算法的认证,叫做认证协议.下面为大家概述对称加密,公钥加密,单向加密及认证协议 对称加密: 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 需要对加密和解密使用相同密钥的加密算法.由于其速度快,对称性

图解java对象的创建过程

前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能真正看明白).经常有人问我为什么这么喜欢钻研底层的东西,首先,因为我以前的做硬件的和嵌入式的,兴趣使然:其次,我个人感觉,如果不把上下打通,心里老是有一堵墙过不去,说白了,这是个人因素,与好坏无关(当然,经常有人说,懂底层原理是成为高手的必经之路). 现在来说一下我当初学习JVM的原因,在学习JAV

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

Python之变量的创建过程

Python之变量的创建过程 一.变量创建过程 首先,当我们定义了一个变量name = 'Kwan'的时候,在内存中其实是做了这样一件事: 程序开辟了一块内存空间,将'Kwan'存储进去,再让变量名name指向'Kwan'所在的内存地址.如下图所示: 我们可以通过id()方法查看这个变量在内存中的地址. name = 'Kwan' print(id(name)) 二.变量的修改 一般我们认为修改一个变量就是用新值把就旧值覆盖掉,可Python真是这么实现的么? name = 'Kwan' pri

PAT 堆——A1098.Insertion or Heap Sort(25)(内涵堆的详细创建过程)

堆的详细创建过程:参考:https://www.jianshu.com/p/21bef3fc3030 明白堆的详细创建过程的前提是要理解Shift Down. 但是这明显不符合最大堆的定义,所以我们需要让该完全二叉树转换成最大堆!怎么转换成一个最大堆呢?   最大堆有一个特点就是其各个子树都是一个最大堆,那么我们就可以从把最小子树转换成一个最大堆,然后依次转换它的父节点对应的子树,直到最后的根节点所在的整个完全二叉树变成最大堆.那么从哪一个子树开始调整? 我们从该完全二叉树中的最后一个非叶子节点

Android4.4 Framework分析——Activity窗口的创建过程(一)

学习android的窗口模块一周多了,感觉自己对这个模块的理解还是比较模糊,先把get的知识点记录一下. 下图是学习过程记录的activity窗口启动过程序列图,没有或者没办法完整的描绘出来,整个过程比较复杂: 整个学习过程中是参照老罗的android之旅博客和<深入理解android内核设计思想>一书来辅助的,非常感谢前辈. Activity的整体启动过程可查看Android4.4 framework分析--Launcher中启动应用程序(startActivity)的过程的序列图,本文关注

一个ActiveX control的创建过程

创建 根据这篇文章的介绍:http://www.cnblogs.com/time-is-life/p/6354152.html 来创建,里面包含了创建的基本过程以及属性事件方法的使用. 使用: 参考文章中建议使用ActiveX Control Pad,这个工具确实很好用,能够自动生成带有Active x控件的网页,而且可以直接设计和配置参数.但是这个工具只在老的32位系统可以使用,我试了Windows server 2008 32位系统,装不上,其他的64位系统也装不上.最后在一台XP的机器上装

Android Context创建过程

    特定的资源或者类构成了Android应用程序的运行上下文环境 PackageManager, ClassLoader, Assert等等 Android应用程序窗口的运行上下文环境是通过ContextImpl类来描述的,即每一个Activity组件都关联有一个ContextImpl对象.ContextImpl类继承了Context类,它与Activity组件的关系如图 这个类图在设计模式里面就可以称为装饰模式 Activity组件以后就可以通过这个ContextImpl对象来执行一些具体