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 ...
随机推荐
- 基于PHP的cURL快速入门教程 (小偷采集程序)
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.很多小偷程序都是使用这个函数. 最爽的是,PHP也支持 cURL 库.本文将介绍 c ...
- 20155314 2016-2017-2 《Java程序设计》实验四 Android程序设计
20155314 2016-2017-2 <Java程序设计>实验四 Android程序设计 实验任务 基于Android Studio开发简单的Android应用并部署测试 了解Andr ...
- 20145203盖泽双 《Java程序设计》第五周学习总结
20145203盖泽双 <Java程序设计>第五周学习总结 教材学习内容总结 1.Java中所有错误都会被打包为对象,运用try.catch,可以在错误发生时显示友好的错误信息,还可以在捕 ...
- Redis的Pub/Sub客户端实现
前言 在学习T-io框架,从写一个Redis客户端开始一文中,已经简单介绍了Redis客户端的实现思路,并且基础架构已经搭建完成,只不过支持的命令不全,不过后期在加命令就会很简单了.本篇就要实现P ...
- virtualbox+vagrant学习-2(command cli)-19-vagrant box命令
Status 格式: vagrant status [name|id] options只有 -h, --help 这将告诉你vagrant正在管理的机器的状态. 很容易就会忘记你的vagrant机器是 ...
- VMware虚拟机更换根用户( su: Authentication failure问题)
su命令不能切换root,提示su: Authentication failure,只要你sudo passwd root过一次之后,下次再su的时候只要输入密码就可以成功登录了.
- kubernetes 日志定制查阅 - 排错 -- 好用的命令
You can use kubectl logs to retrieve logs from a previous instantiation of a container with --previo ...
- zabbix 模板 创建逻辑 + 主动模式-被动模式
模板通常包含了item.trigger.graph(图形).application以及low-level discovery rule:模板可以直接链接至某个主机: 模板包含一系列的item,trig ...
- Linux基础命令之文件过滤及内容编辑处理(一)
. cat 功能是连接多个文件并且打印到屏幕输出,或重定向到指定的文件 五大功能: 1.查看文件内容 cat file.txt 2.合并文件内容 cat file1 file2>newfile3 ...
- 根据location地址,在导航栏高亮显示当前页面
获取当前页面的地址栏.与导航栏中所有<a> 标签的href属性 进行比较.如果相等则高亮显示 此<a>标签. 注意点:a 标签的href 属性在浏览器解析时 是绝对路径. a ...