精华内容
下载资源
问答
  • 共识机制——工作量证明POW

    千次阅读 2018-10-19 16:00:39
    区块链有多种共识机制,常见的有工作量证明PoW)、权益证明(PoS)、委托权益证明(DPoS)、实用拜占庭容错算法(PBFT)、Raft、Paxos等多种共识机制。 1. 工作量证明POW工作量证明可以简单理解为一份...

    区块链的底层有四部分构成,一个分布式的数据库用来存储以往和将来的交易数据,密码学的公私密钥体系用来确认交易双方的身份,P2P网络用来广播和蔓延各类消息(如节点加入消息,节点失效消息,得到挖矿数据的消息)和 用来决定节点记账权利的共识机制。

    在去中心化的系统中,不相关的节点之间如何建立信任进而对区块链的一致性达成共识,是一个十分重要的问题,解决这个问题的方法就是利用共识机制。共识机制,就是在分布式系统中,多个节点之间对某个状态达成一致结果所依赖的机制。正是有了共识机制,区块链网络才会被全世界不同国家不同职业的人所接受,它让网络上陌生人之间在没有第三方中心化机构作为信用背书的情况下,轻松达成信任和共识。区块链有多种共识机制,常见的有工作量证明(PoW)、权益证明(PoS)、委托权益证明(DPoS)、实用拜占庭容错算法(PBFT)、Raft、Paxos等多种共识机制。


    1.工作量证明(POW)

    工作量证明可以简单理解为一份证明,用来确认你做了一定量的工作。工作量证明机制是比特币、莱特币等所采用的共识机制,矿工通过付出算力来挖矿进而获得相应的区块奖励。

    在数字货币系统中,工作量证明主要通过计算来猜测一个随机数(nonce),使它拼凑交易数据后的内容的Hash值满足一个规定的上限。由于Hash值在数学上主要采用群举法碰撞所得,需要进行大量的计算,只要能提出满足要求的随机数的矿工就被认为付出了一定的工作量,可以获得这个区块的奖励。

    哈希运算是一种最常见的工作量证明机制。该机制主要利用哈希运算的复杂度,通过给定的初始值,进行简单的值递增运算,利用哈希算法求解,直到找到满足条件的碰撞值。不同的哈希算法求得的碰撞值长度不同,所需工作量和安全性能也不同。碰撞值的长度越长,则所需的工作量越大。对于同一个哈希算法,可以设定哈希值前N位为0的个数来调节运算难度,比特币就是根据这一原理调节挖矿难度的。

    优点:完全去中心化,安全性高,所有节点可参与挖矿,节点自由进出,每个节点是公平的,被攻击成功的可能性小。

    缺点:先确认后共识,需要耗费大量的算力,造成能源浪费,交易吞吐量有限,确认时间长。

    典型应用项目:比特币,莱特币,以太坊(前两阶段Frontier前言、Homestead家园为POW;第三阶段Metropolis大都会为casper,类似POW+POS;第四阶段Serenity为POS)

    注意:中心化和去中心化各有优劣,考虑到比特币的诞生就是反对中心化的,这里我把中心化看做缺点,去中心化看做优点。

    1. 比特币区块的结构

    区块包含具体信息

    挖矿过程:打包区块时,矿工需要难度来给出随机数,使hash(区块数据+随机数)的结果满足难度需求,此处难度是指经过哈希后的数据前N位为0,N越大,则难度越大,同样的硬件设备下哈希计算所需要的时间就越长。而矿工就是通过大量的猜测随机数并对区块数据+随机数进行哈希,得到的结果满足难度值设定的前N位均为0则获得记账权,进而向全网广播自己猜对了随机数,矿工经过哈希验证后承认该区块有效并开始挖下一个区块。

    POW共识过程:

    主要经历三步:

    (1)生成Merkle根哈希

    先选择要打包的交易数据,一旦筛选好交易数据,按照时间排序,两两哈希,层层约减,通过这些交易就可以计算出一棵Merkle树,可以确定一个唯一的摘要,这就是默克尔树的根。

    生成的Merkle根哈希,即头部需要的默克尔根哈希。

    (2)组装区块头

       按照信息顺序生成区块头,将被作为计算出工作量证明输出的一个输入参数,因此第一步计算出来的Merkle根哈希和区块头的其他组成部分组装成区块头。区块头的存储顺序从前到后如图所示,共占80字节。

    (3).计算出工作量证明的输出

    下面我们直接通过公式和一些伪代码去理解工作量证明的输出:

      (A). 计算每次猜测随机数的工作量证明的输出=SHA256(SHA256(区块头))(区块头=其他数据+随机数)

      (B). if(工作量证明的输出<目标值),说明结果符合难度值要求,证明工作量完成

      (C).if(工作量证明的输出>=目标值),变更随机数,递归i的逻辑,继续与目标值比对。

     下面的流程图及解析即pow工作量证明的整个过程。

    Pow共识和交易过程梳理:

    首先,客户端产生新的交易,向全网广播

    第二,每个节点收到请求,将交易纳入自己的区块中。

    第三,每个节点通过上述描述的pow工作量证明进行寻找满足难度条件的随机数的工作。

    第四,当某个节点找到了随机数,向全网广播

    第五,哈希验证随机数是否有效,有效则认可,只有区块中仅含有之前区块不存在的交易信息,区块才会被认可。

    第六,接受该区块,方法是在该区块的末尾制造新的区块。

    第七,当存在多个区块确认时,交易就被确认并永久写于区块链中。


    参考引用

    【1】http://www.ehcoo.com/blockchain_confirmation_mechanism.html

    【2】https://www.jianshu.com/p/1026fb3c566f

    【3】https://blog.csdn.net/HiBlock/article/details/80287469

     

     

    展开全文
  • 详解POW工作量证明原理

    千次阅读 2018-10-27 15:53:49
    POW工作量证明(英文全称为Proof of Work)早在比特币出现之前就已经有人探索,常见的是利用HASH运算的复杂度进行CPU运算实现工作量确定,当然你也可以利用卷积求导、大质数分解这些复杂的运算来达到工作量证明的...

    原文地址  来自 微信公众号 区块链大师

         POW工作量证明(英文全称为Proof of Work)早在比特币出现之前就已经有人探索,常见的是利用HASH运算的复杂度进行CPU运算实现工作量确定,当然你也可以利用卷积求导、大质数分解这些复杂的运算来达到工作量证明的目的(HASH只是pow采用一种算法而已,你可以使用大部分需要迭代运算的算法实现POW,其实稍微改一下pow算法就有可能诞生一种山寨币,然后大肆宣传欺骗小白,了解原理后就知道这并没有什么卵用),随着比特币成功后,POW为人们熟知,基于HASH的pow算法常被人误解为是pow的代名词,为了便于解释pow原理本文还是采用HASH算法作为举例。

    定义

    (Proof-of-work,工作量证明)最早是一个经济学名词,它是指系统为达到某一目标而设置的度量方法。简单理解就是一份证明,用来确认你做过一定量的工作。监测工作的整个过程通常是极为低效的,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式


    在1999年,Markus Jakobsson and Ari Juels两人将pow概念引入计算机体系,设计系统用以抵挡拒绝服务攻击和网络爬虫,后来在反垃圾邮件中被广泛使用。其设计理念是一个正常用户写一封邮件是需要一定的时间,而发送垃圾邮件者是无法接受这个等待的时间,如果pow系统能够使垃圾邮件发送者需要更多的时间来发送邮件,就可以增大他们的成本,起到抵挡攻击的作用。


    pow系统中一定有两个角色,工作者和验证者,他们需要具有以下特点:


    • 工作者需要完成的工作必须有一定的量,这个量由工作验证者给出。

    • 验证者可以迅速的检验工作量是否达标。

    • 工作者无法自己"创造工作",必须由验证者发布工作。

    • 工作者无法找到很快完成工作的办法。


    pow历史

    工作量证明,是一种应对拒绝服务攻击和其他服务滥用的经济对策。它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。这个概念由Cynthia Dwork 和Moni Naor 1993年在学术论文中首次提出。而工作量证明(POW)这个名词,则是在1999年 Markus Jakobsson 和Ari Juels的文章中才被真正提出。


    哈希运算是一种最常见的工作量证明机制,它是亚当·贝克(Adam Back)在1997年发明的,用于抵抗邮件的拒绝服务攻击及垃圾邮件网关滥用。在比特币之前,哈希现金被用于垃圾邮件的过滤,也被微软用于hotmail/exchange/outlook等产品中(微软使用一种与哈希现金不兼容的格式并将之命名为电子邮戳)。


    该机制主要利用HASH运算的复杂度,通过给定的初始值,通过简单的值递增规律,利用HASH碰撞原理,直到找到特定的碰值,可以通过调节碰撞值得长度,实现对于工作量的调节(碰撞值越长,所需要的运算量越大)


    哈希现金也被哈尔·芬尼以可重复使用的工作量证明(RPOW)的形式用于一种比特币之前的加密货币实验中。另外,戴伟的B-money、尼克·萨博的比特金(Bit-Gold)这些比特币的先行者,都是在哈希现金的框架下进行挖矿的。


    哈希现金扫盲

    哈希现金HashCash是最典型的Solution-verification实现,HashCash也是目前应用最为广泛的反垃圾邮件的pow系统。


    在HashCash系统中,发件方向邮箱服务器发送的邮件信息中必须包含一段邮件签名,邮件签名中包含有收件人地址、发件时间和一个数字counter,counter需要使邮件签名满足条件:


    利用SHA-1散列算法对邮件签名生成一个160-bit长度的哈希值,该哈希值前20位全为0 。此算法利用了散列算法的不可预测性,SHA-1的碰撞概率决定了算法的安全性。


    在目前的认知中,发件方除了穷举尝试,无法很快的找到满足条件的签名串。于是发件方在发送邮件之前的工作就是不断地counter++生成新的邮件签名,然后获取SHA-1哈希值,判断前20位是否全为0,如果不是的话重新生成。而对于邮件服务器而言,只需要做一次SHA-1判断生成的签名是否满足条件即可,完全符合POW易于验证的定义。


    算法简介

    发送方签名:
    counter = 0;
    
    while(1) {   
    	result = SHA1(mailAdress + time + counter);   
    	if (result.substring(0, 20) == "00000000000000000000") { 
    	    break;   
    	}   
    	counter++; 
    }
    sig = mailAdress + time + counter;
    
    服务端验签:
    if (SHA1(sig).substring(0, 20) == "00000000000000000000") {
       return true;
    }
    

    散列函数如SHA-1是基本均匀分布的,对于我们生成的每一个邮件签名来说,对应的的哈希值在每一位上出现0和1的概率应该是相同的,SHA-1生成的160-bit哈希结果,其所有的可能是 2^160 种,而前20位固定为0的情况有 2^140 种,所以每次生成的邮件签名符合条件的概率为: 2^140 / 2^160 = 1/2^20

    问题一,解空间必然存在,解空间的大小为2^140。

    问题二,每一次生成邮件签名命中的概率为 1/2^20 ,客户端平均需要运算 2^20 次就能找到正确答案,运算时间为: PerSHA1Time*2^20 。

    问题三,服务器端需要丢弃掉已经出现过的答案,同时需要对收件人地址和时间戳做合法性校验即可。

    HASH POW原理

    工作量证明系统主要特征是客户端需要做一定难度的工作得出一个结果,验证方却很容易通过结果来检查出客户端是不是做了相应的工作。这种方案的一个核心特征是不对称性:工作对于请求方是适中的,对于验证方则是易于验证的。它与验证码不同,验证码的设计出发点是易于被人类解决而不易被计算机解决。

    下图表示的是工作量证明的流程:

    举个例子,给定的一个基本的字符串"Hello, world!",我们给出的工作量要求是,可以在这个字符串后面添加一个叫做nonce的整数值,对变更后(添加nonce)的字符串进行SHA256哈希运算,如果得到的哈希结果(以16进制的形式表示)是以"0000"开头的,则验证通过。为了达到这个工作量证明的目标。我们需要不停的递增nonce值,对得到的新字符串进行SHA256哈希运算。按照这个规则,我们需要经过4251次计算才能找到恰好前4位为0的哈希散列。

    "Hello, world!0" => 1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
    
    "Hello, world!1" => e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
    
    "Hello, world!2" => ae37343a357a8297591625e7134cbea22f5928be8ca2a32aa475cf05fd4266b7
    ...
    "Hello, world!4248" => 6e110d98b388e77e9c6f042ac6b497cec46660deef75a55ebc7cfdf65cc0b965
    
    "Hello, world!4249" => c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
    
    "Hello, world!4250" => 0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9
    
    

    通过这个示例我们对工作量证明机制有了一个初步的理解。有的人会认为如果工作量证明只是这样的一个过程,那是不是只需要记住nonce为4521计算能通过验证就行了?当然不是的,这只是一个个例。


    下面,我们将输入简单的变更为"Hello, world+整数值",整数值取1到1000,也就是说,将输入变成一个由1000个值组成的数组:“Hello, world!1、Hello, world!2……Hello, world!1000”。然后对数组中的每一个输入依次进行上面例子中要求的工作量证明——找到前导为4个0的哈希散列。


    容易算出,预期大概要进行216次尝试(哈希值的伪随机特性使得我们可以做概率估算),才能得到4个前导0的哈希散列。而统计一下刚才进行的1000次计算的实际计算结果,我们会发现,进行计算的平均次数为66958次,十分接近216(65536)。在这个例子中,数学期望的计算次数,就是我们要求的“工作量”,重复多次进行的工作量证明会是一个符合统计学规律的概率事件。


    统计输入的字符串与对应得到目标结果实际使用的计算次数列表如下:

    
    
    Hello, world!1 => 42153
    Hello, world!2 => 2643
    Hello, world!3 => 32825
    Hello, world!4 => 250
    Hello, world!5 => 7300
    ...
    Hello, world!995 => 164819
    Hello, world!996 => 178486
    Hello, world!997 => 22798
    Hello, world!998 => 68868
    Hello, world!999 => 46821
    


    比特币体系里的工作量证明机制与上述示例类似,但要比它更复杂一些,以后会另起文章说明

    展开全文
  • MiniBC区块链V004 - 工作量证明POW 共识算法 在整个区块链工作过程中,会有很多的机器加入其中,每一台机器成为一个节点,它们互相协作,来共同维护区块链的安全和数据的一致。其中,生成新的区块就是一项很重要的...

    MiniBC区块链V004 - 工作量证明POW

    共识算法

    在整个区块链工作过程中,会有很多的机器加入其中,每一台机器成为一个节点,它们互相协作,来共同维护区块链的安全和数据的一致。其中,生成新的区块就是一项很重要的工作。因为新的区块里面包含很多新产生的重要数据,比如交易信息等。为了让这项工作有序和可控,通常会在所有节点上通过竞争选出一个节点,由这个胜出的节点负责打包新产生的数据,并通知和传播给其它节点。

    通过竞争选择优胜者的机制称为共识算法,目前主流加密货币引入了很多共识算法,比如pow, pos, dpos, pbft等等。象比特币就是采用了pow算法,也就是工作量证明。

    工作量证明

    工作量证明 (Proof Of Work,简称POW),就是用来确认你做过一定量的工作的一份证明。通常,监测工作过程是极为低效的,而通过对工作的结果的认证来证明完成了相应的工作量,则是一种非常高效的方式。比如现实生活中的毕业证、驾驶证等,也是通过检验结果的方式(通过相关的考试)所取得的证明。

    区块链的工作量证明,就是由系统给出一个难题,让节点们各自通过计算来解决这个难题。凡是声称解决难题的节点,都要把自己的答案交由其它节点进行验证,最终选出优胜者,由它来负责生成新的区块。为什么节点有动力耗费自己的资源去解决难题呢?因为新区块的生成者有一定的奖励,这就是比特币中所说的挖矿。在区块链中,网络的一些参与者(矿工)努力维持网络,向其添加新区块,并获得对其工作的奖励。正是由于他们的工作,区块以安全和及时的方式被整合到区块链中,保持了整个区块链数据库的稳定性和连续性。

    另外,工作量证明算法必须满足要求:完成工作很难,但验证证明很容易。证明通常会交给其他人,因此对他们来说,验证它不应该花费太多时间。

    我们要实现的工作量证明算法与比特币的算法相同,就是给定一个256位的大数字target(称为难度目标),节点们通过变化新区块Block中成员Nonce的数值,使得Block的hash值小于或者等于难度目标target。

    Pow表示一个工作量算法结构(以下为golang代码):

    type Pow struct {
    
    	//要进行工作量计算的区块
    	block *Block
    
    	//工作量难度目标
    	bits int32
    }
    

    里面包含一个新创建的区块block和难度目标bits。我们这里做了简化,真正的难度目标应该是256位的大数,我们先用一个32位的整数替代,由bits通过简单的变换生成256位的难度目标,下面有具体的变换算法。

    我们通过不断变换nonce值来计算区块的hash,找到符合给定难度目标的nonce值

    func (pow *Pow) Run() {
    
    	//将0x1左移pow.bits位生成一个256位的大整数target,这是真正的难度目标值
    	target := big.NewInt(1)
    	target.Lsh(target, uint(pow.bits))
    
    	//通过不断变换nonce值来计算区块的hash,直至找到小于或等于target的nonce值
    	var hashInt big.Int
    	for nonce := int32(0); nonce < math.MaxInt32; nonce++ {
    		hashInt.SetBytes(pow.getHash(pow.bits, nonce))
    		if hashInt.Cmp(target) <= 0 {
    			//找到合适的nonce值,将其写入block中
    			pow.block.Nonce = nonce
    			pow.block.Bits = pow.bits
    			break
    		}
    	}
    }
    

    另外,修改一下BlockBrowser的显示,能够打印出找到随机数nonce:

    	content = content + "当前区块哈希值:" + BytesToHex(block.GetHash()) + "<br>"
    	content = content + "当前区块内容为:" +  string(block.Data) + "<br>"
    	content = content + "当前区块Nonce为:" +  strconv.Itoa(int(block.Nonce)) + "<br>"
    	content = content + "前一区块哈希值:" +  BytesToHex(block.HashPrevBlock) + "<br>"
    	content = content + "=============================================" + "<br>"
    

    运行后输出:

    	当前MiniBC区块链高度:10
    
    	当前区块哈希值:6068fa9b758532a182be2552e0e532c99e2c5717f6696558d008eec5f5c7cb87
    	当前区块内容为:MiniBC Block 9
    	当前区块Nonce为:7746
    	前一区块哈希值:97100d2c4efe4f11ac4508d5da17816b738d99795021de5676aebf90868990e0
    	=============================================
    	当前区块哈希值:97100d2c4efe4f11ac4508d5da17816b738d99795021de5676aebf90868990e0
    	当前区块内容为:MiniBC Block 8
    	当前区块Nonce为:2311874
    	前一区块哈希值:5bc776166df69054ed1490670ee7ad38cefea49ba3799749a9c47381c6e152ad
    	=============================================
    	当前区块哈希值:5bc776166df69054ed1490670ee7ad38cefea49ba3799749a9c47381c6e152ad
    	当前区块内容为:MiniBC Block 7
    	当前区块Nonce为:9428
    	前一区块哈希值:9d2afa19dfbf840387f71bbabebd7dd4358999151bcf5a496a838eeb2afebd79
    	=============================================
    

    当前区块Nonce显示内容是我们通过计算找到的随机数。

    一切正常~~~~~~~

    我们实现的和将要实现的

    我们已经构建了一个简单的区块链,并且实现了一个KV数据库、区块链浏览器和工作量证明,下一步来实现交易Transaction。

    交流和疑问

    大家可以从v001开始逐步深入的研究学习,每个源码文件均有完整的说明和注释。如果有疑问、建议和不明白的问题,尽可以与我联系。

    github addr: https://github.com/wangshizebin/minibc

    本文时候用的开发工具为:goland 来自 编程宝库

    展开全文
  • 使用浏览器内工作量证明 (PoW) 防止表单垃圾邮件 WebPoW 页面是使用 Web Workers 计算所谓的“工作量证明”的概念证明。 工作量证明是对只能通过试错法解决的数学问题的解决方案; 表明您已经找到了解决方案证明您...
  • 四、POW共识记账 前面三部分中讲解的是单节点工作量证明流程,有了这个计算流程,我们就得将其使用起来,在比特币平台中,中本聪就是运用的pow工作量证明来使全网节点达到51%及以上的共识记账,以下将介绍pow工作量...

    什么是共识机制

    所谓“共识机制”,是通过特殊节点的投票,在很短的时间内完成对交易的验证和确认;对一笔交易,如果利益不相干的若干个节点能够达成共识,我们就可以认为全网对此也能够达成共识。

    区块链作为一个去中心化的分布式账本系统,然而在实际运行中,怎么解决因为去中心化后,保证整个系统能有效运行,各个节点诚实记账,在没有所谓的中心的情况下,互相不信任的个体之间就交易的合法性达成共识的共识机制。

    共识机制的目标

    区块链作为一种按时间顺序存储数据的数据结构,可支持不同的共识机制。共识机制是区块链技术的重要组件。区块链共识机制的目标是使所有的诚实节点保存一致的区块链视图,同时满足两个性质:
    1)一致性。所有诚实节点保存的区块链的前缀部分完全相同。
    2)有效性。由某诚实节点发布的信息终将被其他所有诚实节点记录在自己的区块链中。

    为什么需要共识机制?

    在分布式系统中,各个不同的主机通过异步通信方式组成网络集群。为了保证每个主机达成一致的状态共识,就需要在主机之间进行状态复制。异步系统中,可能会出现各样的问题,例如主机出现故障无法通信,或者新能下降,而网络也可能发生拥堵延迟,类似的种种故障有可能会发生错误信息在系统内传播。因此需要在默认不可靠的异步网络中定义容错协议,以确保各主机达成安全可靠的状态共识。所以,利用区块链构造基于互联网的去中心化账本,需要解决的首要问题是如何实现不同账本节点上的账本数据的一致性和正确性。

    这就需要借鉴已有的在分布式系统中实现状态共识的算法,确定网络中选择记账节点的机制,以及如何保障账本数据在全网中形成正确、一致的共识。

    如何评价一个共识机制的优劣:

    1. 安全性:能否有效防止二次支付,私自挖矿
    2. 扩展性:当系统成员和待确认交易数量增加时,所带来的系统负载和网络通信量的变化,通常以网络吞吐量来衡量
    3. 性能效率:每秒可以处理的交易数量
    4. 资源消耗:达成共识过程中,所要消耗的CPU、内存等计算资源

    区块链分类

    在开始进行共识机制梳理前,首先需要对目前的区块链进行一个简单的了解。目前市面上根据共识算法及应用场景把区块链分为三类:公有链、联盟链和私有链。

    公有链,是一个完全开放的分布式系统。公有链中的节点可以很自由的加入或者退出,不需要严格的验证和审核,比如比特币、以太坊、EOS等。共识机制在公有链中不仅需要考虑网络中存在故障节点,还需要考虑作恶节点,并确保最终一致性。

    联盟链,是一个相对开放的分布式系统。对于联盟链,每个新加入的节点都是需要验证和审核的,比如Fabric、BCOS等。联盟链一般应用于企业之间,对安全和数据的一致性要求较高,所以共识机制在联盟链中不仅需要考虑网络中存在故障节点,还需要考虑作恶节点,同时除过确保最终一致性外,还需要确保强一致性。

    私有链,是一个封闭的分布式系统。由于私有链是一个内部系统,所以不需要考虑新节点的加入和退出,也不需要考虑作恶节点。私有链的共识算法还是传统分布式系统里的共识算法,比如zookeeper的zab协议,就是类paxos算法的一种。只考虑因为系统或者网络原因导致的故障节点,数据一致性要求根据系统的要求而定。

    共识机制有哪些?

    常见的共识就机制包括:POW(工作量证明机制)、POS(权益证明机制)、POW+POS(混合共识机制)、DPOS(股份授权证明)等等,另外还有Pool验证池、Ripple瑞波共识协议、PBFT(使用拜占庭容错算法)等等。今天先介绍POW共识机制。

    POW工作量证明共识机制

    一、前言

    PoW(Proof of Work),即工作量证明,闻名于比特币,俗称"挖矿”。PoW是指系统为达到某一目标而设置的度量方法。简单理解就是一份证明,用来确认你做过一定量的工作。监测工作的整个过程通常是极为低效的,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。PoW是按劳分配,算力决定一起,谁的算力多谁记账的概率就越大,可理解为力量型比较。以下内容基于比特币的PoW机制。

    工作量证明(PoW)通过计算一个数值( nonce ),使得拼揍上交易数据后内容的Hash值满足规定的上限。在节点成功找到满足的Hash值之后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证。

    如何才能创建一个新区块呢?通过解决一个问题:即找到一个nonce值,使得新区块头的哈希值小于某个指定的值,即区块头结构中的“难度目标”。

    如果验证通过,则表明已经有节点成功解迷,自己就不再竞争当前区块打包,而是选择接受这个区块,记录到自己的账本中,然后进行下一个区块的竞争猜谜。网络中只有最快解谜的区块,才会添加的账本中,其他的节点进行复制,这样就保证了整个账本的唯一性。

    假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的区块,这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在巨大的挖矿成本下,也使得矿工自觉自愿的遵守比特币系统的共识协议,也就确保了整个系统的安全。

    在了解pow共识机制前,我们先了解下比特币区块的结构,下图是比特币区块的结构图:
    在这里插入图片描述
    从图上可知,比特币的结构分为区块头和区块体,其中区块头细分为:
    父区块头哈希值:前一区块的哈希值,使用SHA256(SHA256(父区块头))计算。占32字节
    版本:区块版本号,表示本区块遵守的验证规则。占4字节
    时间戳:该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块。占4字节
    难度:该区块工作量证明算法的难度目标,已经使用特定算法编码。占4字节
    随机数(Nonce):为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数。占4字节
    Merkle根:该区块中交易的Merkle树根的哈希值,同样采用SHA256(SHA256())计算。占32字节

    如此,细心的同学会发现,区块头总共占了80字节。

    区块体除了筹币交易记录(由一棵Merkle二叉树组成)外,还有一个交易计数。

    比特币的任何一个节点,想生成一个新的区块,必须使用自己节点拥有的算力解算出pow问题。因此,我们先了解下pow工作量证明的三要素。

    二、POW工作量证明的三要素

    工作机制
    为了使区块链交易数据记录在区块链上并在一定时间内达到一致(共识),PoW提供了一种思路,即所有区块链的网络节点参与者进行竞争记账,所谓竞争记账是指,如果想生成一个新的区块并写入区块链,必须解出比特币网络出的工作量证明谜题,谁先解出答案,谁就获得记账权利,然后开始记账并将将解出的答案和交易记录广播给其他节点进行验证,自己则开始下一轮挖矿。如果区块的交易被其他节点参与者验证有效并且谜题的答案正确,就意味着这个答案是可信的,新的节点将被写入验证者的节点区块链,同时验证者进入下一轮的竞争挖矿。

    这道题关键的三个要素是工作量证明函数、区块及难度值。工作量证明函数是这道题的计算方法,区块决定了这道题的输入数据,难度值决定了这道题的所需要的计算量。
    1、工作量证明函数
    在比特币中使用的是SHA256算法函数,是密码哈希函数家族中输出值为256位的哈希算法。

    2、 区块
    区块头在前言中已经做详细介绍,这里我们就介绍下区块体的 Merkle树算法:
    在这里插入图片描述
    如上图所示,首先对4个交易记录L1–L4,分别计算hash(L1)–hash(L4),然后计算hash0=hash0-0+hash0-1和hash1=hash1-0+hash1-1,最后计算出根节点的hash值top hash。

    3、难度值
    关于难度值,我们直接看公式:
    新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)
    tips:难度值是随网络变动的,目的是为了在不同的网络环境下,确保每10分钟能生成一个块。
    新难度值解析:撇开旧难度值,按比特币理想情况每10分钟出块的速度,过去2016个块的总花费接近20160分钟,这样,这个值永远趋近于1。

    目标值=最大目标值/难度值
    目标值解析:最大目标值为一个固定数,若过去2016个区块花费时长少于20160分,那么这个系数会小,目标值将会被调大些,反之,目标值会被调小,因此,比特币的难度和出块速度将成反比例适当调整出块速度。

    那如何计算呢?SHA256(SHA256(Block_Header)),即只需要对区块头进行两次SHA256运算即可,得到的值和目标值进行比较,小于目标值即可。

    区块头中有一个重要的东西叫MerkleRoot的hash值。这个东西的意义在于:为了使区块头能体现区块所包含的所有交易,在区块的构造过程中,需要将该区块要包含的交易列表,通过Merkle Tree算法生成Merkle Root Hash,并以此作为交易列表的摘要存到区块头中。

    至此,我们发现区块头中除过nonce以外,其余的数据都是明确的,解题的核心就在于不停的调整nonce的值,对区块头进行双重SHA256运算。

    介绍完pow工作量证明的三要素后,我们就可以讲解下工作量证明的流程。

    三、POW工作量证明流程

    在这里插入图片描述
    从流程图中看出,pow工作量证明的流程主要经历三步:

    1.生成Merkle根哈希
      生成Merkle根哈希在第二章节中的第2要素中已经有讲解,即节点自己生成一笔筹币交易,并且与其他所有即将打包的交易通过Merkle树算法生成Merkle根哈希,所以为什么说区块是工作量证明的三要素之一。

    2.组装区块头
      区块头将被作为计算出工作量证明输出的一个输入参数,因此第一步计算出来的Merkle根哈希和区块头的其他组成部分组装成区块头,这也就是为什么我们在前言中大费周章的去提前讲解比特币的区块头。

    3.计算出工作量证明的输出
      下面我们直接通过公式和一些伪代码去理解工作量证明的输出:

       i. 工作量证明的输出=SHA256(SHA256(区块头))

       ii. if(工作量证明的输出<目标值),证明工作量完成

      iii.if(工作量证明的输出>=目标值),变更随机数,递归i的逻辑,继续与目标值比对。
      注:目标值的计算见第二章节的要素3的难度值。

    上面的流程图及解析即pow工作量证明的整个过程。

    四、POW共识记账

    前面三部分中讲解的是单节点工作量证明流程,有了这个计算流程,我们就得将其使用起来,在比特币平台中,中本聪就是运用的pow工作量证明来使全网节点达到51%及以上的共识记账,以下将介绍pow工作量证明共识是如何记账的?

    首先,客户端产生新的交易,向全网广播

    第二,每个节点收到请求,将交易纳入区块中

    第三,每个节点通过第三章中描述的pow工作量证明

    第四,当某个节点找到了证明,向全网广播

    第五,当且仅当该区块的交易是有效的且在之前中未存在的,其他节点才认同该区块的有效性

    第六,接受该区块且在该区块的末尾制造新的区块

    大概时序图如下:
    在这里插入图片描述

    五、POW的优缺点

    通过上面的描述,PoW优点很明显:

    1. 完全去中心化(任何人都可以加入);
    2. 节点自由进出,容易实现;
    3. 破坏系统花费的成本巨大;

    关于破坏系统成本巨大可以分两层意思理解:

    1. 在指定时间内,给定一个难度,找到答案的概率唯一地由所有参与者能够迭代哈希的速度决定。与之前的历史无关,与数据无关,只跟算力有关。
    2. 掌握51%的算力对系统进行攻击所付出的代价远远大于作为一个系统的维护者和诚实参与者所得到的。

    缺点也相当明显:

    1. 对节点的性能网络环境要求高;
    2. 浪费资源;
    3. 每秒钟最多只能做七笔交易,效率低下;
    4. 矿场的出现违背了去中心的初衷;
    5. 不能确保最终一致性;
    6. 比特币产量每4年减半,利益驱动性降低导致旷工数量减少从而导致比特币网络瘫痪。

    六、网络攻击和链分叉

    1)网络攻击
    假定一个恶意节点试图双花之前的已花费的交易,攻击者需要重做包含这个交易的区块,以及这个区块之后的所有的区块,创建一个比目前诚实区块链更长的区块链。只有网络中的大多数节点都转向攻击者创建的区块链,攻击者的攻击才算成功了。由于每一个区块都包含了之前的所有区块的交易信息,所以随着块高的增加,之前的区块都会被再次确认一次,确认超过6次,可以理解为无法被修改。

    考虑交易T包含在区块b1中。每个后续区块b2,b3,b4,……bn会降低交易T被修改的可能性,因为修改这些后续的区块需要更多的算力。中本聪用概率理论证明,六个区块后攻击者追赶上最长链的可能性降低到0.0002428%。在过4个或更多区块后这个可能行会降到0.0000012%。每新增一个区块bn,攻击的可能性就会以指数形式下降,很快整个攻击的可能性就会低到可以忽略的程度。

    2)链分叉
    所谓的链分叉,主要是由于在计算hash时,每个人拿到的区块内容是不同的,导致算出的区块结果也不同,但都是正确结果,于是,区块链在这个时刻,出现了两个都满足要求的不同区块,那旷工怎么办呢?由于距离远近、网络等原因,不同旷工看到这两个区块的先后顺序是不一样的,通常情况下,旷工会把自己先看到的区块链复制过来,然后接着在这个区块上开始新的挖矿工作,于是就出现了链分叉。

    PoW解决方案:
    从分叉的区块起,由于不同的矿工跟从了不同的区块,在分叉出来的两条不同链上,算力是有差别的。由于解题能力和矿工的算力成正比,因此两条链的增长速度也是不一样的,在一段时间之后,总有一条链的长度要超过另一条。当矿工发现全网有一条更长的链时,他就会抛弃他当前的链,把新的更长的链全部复制回来,在这条链的基础上继续挖矿。所有矿工都这样操作,这条链就成为了主链,分叉出来被抛弃掉的链就消失了。

    能够让区块链保证唯一性的前提是:所有矿工都遵从同样的机制。当旷工遵从不同的机制时,就会出现硬分叉,这种分叉会导致资产增加,且两条链同时存在,比如BBC。

    展开全文
  • 工作量证明机制(POW)是什么:工作量证明(proof of work)简称POW,是共识机制的一种,可简单理解为一份证明。证明你做过一定量的工作,即通过我查看工作结果就能知道你完成了指定量的工作。比特币挖矿采用的就是...
  • 工作量证明(Proof of Work,以下简称PoW)机制随着比特币的流行而广为人知。PoW协议简述如下:1)向所有的节点广播新的交易;2)每个节点把收到的交易放进块中;3)在每一轮中,一个被随机选中的节点广播它所保有的...
  • 比特币使用的共识机制为工作量证明机制,此机制已经经历了数十年的验证了,虽然原理简单粗暴,但是不得不承认它的安全性与可靠性。下面将实现的是区块链中的pow机制: pow包 package pow import ( "fmt" ...
  • POW-工作量证明机制

    2019-11-22 16:25:06
    工作量证明(Proof Of Work,POW),简单理解就是一份证明,用来确认你做过一定量的工作。检测工作的整个过程通常是极为低效的,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。比如...
  • 特别提示: 比特币(BSV)知识库-Bitcoinwiki-目前为全英文内容,暂无中文译文,并且仍在持续编写和补充中。欢迎中国的开发者在文章底部评论,进行阐述和探讨。
  • PoW (Proof-of-Work)即工作量证明,根据当时区块链网络算力得出的难易程度(前导零,所计算出来的hash开头有多少个0),将区块的属性使其拼凑成一个满足要求的hash值,(nonce值让其一直改变,从而才会计算出不同...
  • 用go语言实现的一个简单的工作量证明算法,代码和可执行程序都有,下载后放在gopath路径下就可直接运行演示
  • 工作量证明:要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备、能源作为担保成本,以确保服务与资源是被真正的需求所使用。 To implement a distributed timestamp server ...
  • 四、POW共识记账 前面三部分中讲解的是单节点工作量证明流程,有了这个计算流程,我们就得将其使用起来,在比特币平台中,中本聪就是运用的pow工作量证明来使全网节点达到51%及以上的共识记账,以下将介绍pow工作量...
  • //block.SetHash() //设置区块的哈希值--->>> v2中来自工作量证明 pow := NewProofOfWork(block) nonce, hash := pow.Run() block.Hash = hash block.Nonce = nonce return block } // 添加哈希值---->> v2中...
  • 06.工作量证明共识机制 pow

    千次阅读 2019-11-28 00:05:55
    常见的共识就机制包括:POW工作量证明机制)、POS(权益证明机制)、DPOS(股份授权证明)POW+POS(混合共识机制)等等,另外还有Pool验证池、Ripple瑞波共识协议等等 比特币的去中心网络采用的是工作量证明共识...
  • 工作量证明机制作为抗女巫攻击的重要手段,已成为区块链和加密货币领域的主流机制之一,目前已广泛使用于一些主流的数字货币系统如比特币、以太币等。这一机制最早由Cynthia Dwork和Moni Naor于1993年在学术论文中...
  • 基于工作量证明POW)的区块链 Block_Chain_Based_Proof_of_Work.pdf 详细介绍了POW的工作原理,过程,推导,及实现方式及应用,学习区块链的值得一看
  • 区块链共识机制之工作量证明(POW)

    千次阅读 2019-11-25 10:02:38
    这些加密网络因各种原因有着多种不同的风格——有些基于ASIC的工作量证明PoW)、有些基于GPU的工作量证明、有些原生权益证明(PoS)、有些授权股权证明(DPOS)、还有我们即将见到的Casper权益证明——这些不同的...
  • Proof of Work):工作量证明机制。 基本原理:第一代共识机制,比特币的基础。理解起来,很简单,就是“按劳取酬”,你付出多少工作量,就会获得多少报酬(比特币等加密货币)。在网络世界里,这里的劳动就是你为...
  • PoW工作量证明机制(Proof Of Work) :系统出一道难于计算易于验证的证明题,证明者提交答案,任何人通过验证这个答案就可以获得奖励。 所谓的证明题一般使用的都是完成一次符合条件的hash碰撞。 可以说挖矿所做的...
  • 共识算法-PoW(工作量证明)算法

    千次阅读 2018-11-09 21:33:37
    title: 共识算法-PoW(工作量证明)算法 tags: 区块链,共识算法 PoW &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区块链其实就是一个基于互联网去中心化的账本,每个区块相当...
  • 总结一下:Pow算法 1、利用CPU投票,长链代表多数票,以此取得共识。 2、基于大多数好人假设,双重支付问题成功概率较低。 3、经济激励约束行为。让掌握多数算例的矿工与整体的利益一致,否则成本高,收益...
  • 本节讨论比特币最核心的部分,也就是比特币的共识机制——工作量证明POW),是否理解工作量证明是你是否掌握比特币原理的分水岭,我读过很多关于比特币原理的文章,其中很大一部分关于比特币工作量证明的描述都是...
  • 什么是PoW?java简单实现给你看。
  • PoW工作量证明

    2019-09-19 14:48:53
    PoW是Proof of Work的缩写,即工作量证明的意思。在《拜占庭将军问题》中介绍过,比特币系统中引入了“工作量”的概念,有意降低了信息传递的效率,让矿工必须完成一定的工作量,才能够在全网广播消息。 (孩子第一...
  • 以太坊pow工作量证明源码解析

    千次阅读 2018-10-25 22:14:57
    共识引擎描述 在CPU挖矿部分,CpuAgent的mine函数,执行挖矿操作的时候调用了self.engine.Seal函数。...再PoW共识算法中,Seal函数实现了工作证明。该部分源码在consensus/ethhash下。 共识引擎接口...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,573
精华内容 3,029
关键字:

工作量证明pow