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

    千次阅读 2018-10-19 16:00:39
     下面的流程图及解析即pow工作量证明的整个过程。 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
    


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

    展开全文
  • 三、POW工作量证明流程流程图中看出,pow工作量证明的流程主要经历三步: 1.生成Merkle根哈希   生成Merkle根哈希在第二章节中的第2要素中已经有讲解,即节点自己生成一笔筹币交易,并且与其他所有即将打包的...

    什么是共识机制

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

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

    共识机制的目标

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

    为什么需要共识机制?

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

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

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

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

    区块链分类

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

    1. 公有链

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

    2. 联盟链

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

    3.私有链

    私有链是一个封闭的分布式系统。由于私有链是一个内部系统,所以不需要考虑新节点的加入和退出,也不需要考虑作恶节点。私有链的共识算法还是传统分布式系统里的共识算法,比如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(工作量证明)算法

    千次阅读 2018-11-09 21:33:37
    title: 共识算法-PoW(工作量证明)算法 tags: 区块链,共识算法 PoW &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;区块链其实就是一个基于互联网去中心化的账本,每个区块相当...

    title: 共识算法-PoW(工作量证明)算法
    tags: 区块链,共识算法


    PoW

            区块链其实就是一个基于互联网去中心化的账本,每个区块相当于一页账本,它记录了交易内容。因为比特币是一个去中心账本,会引发记账一致性问题。一致性问题就是所有的区块,记账内容可能不一样。

            在比特币系统中,每一个节点都要保存一份完整交易信息。但是应为每个节点的环境不同,会接受到不一样的信息,如果同时记账,会导致账本不一致。因此我们需要找出一个代表帮我们记账,然后内容分享给其他节点,比特币中通过竞争记账的方法解决记账系统的一致性问题。

            在比特币系统中,大约每10分钟进行一轮算力竞赛,竞赛的胜利者,就获得一次记账的权力,并向其他节点同步新增账本信息。因此在比特币中,中本聪设定了只要完成记账的节点给予一定的比特币作为奖励,因此大家把记账形象的称为“挖矿”。

            那么怎么判断竞争胜利(记账成功)呢? 中本聪采用了一个PoW(工作量证明)算法来进行判断。工作量证明,顾名思义就是提供一个工作多少的证明。那么这个证明是怎么来的呢?

            说工作量证明怎么来之前我们先说下Hash算法,Hash算法有一个特性:通过hash加密的文本或文件,哪怕只有一个字节改变,Hash的值就完全不相同。在区块链中,需要找出一个Nonce,Nonce的值和区块上的信息拼接后进行hash计算,当hash值满足给定条件,第一个找出nonce的节点获得记账权。这个找Nonce值计算Hash值的过程就是工作,找到满足条件的Nonce值就是证明。

            举个例子 ,假设我们区块上的信息是 blockchain ,我们要找出一个Nonce随机数和blockchain拼接,最后计算的Hash值结果以6个0开头,率先找到随机数的节点就获得此次记账的唯一记账权。
    Hash值示例:

    00000017504a984ab0339f7d1517691e63099fb83d6ae9d6ebd722c25755f2cc

    计算量分析

            难度值度值是比特币系统中的节点在生成区块时的重要参考指标,它决定了节点大约需要经过多少次哈希运算才能产生一个合法的区块。比特币的区块大约每10分钟生成一个,如果要在不同的全网算力条件下,新区块的产生都基本保持这个速率,难度值必须根据全网算力的变化进行调整。简单地说,难度值被设定在无论节点计算能力如何,新区块产生速率都保持在每10分钟一个。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。

            以我写这篇文件的时间来看,比特因为越来越少,所有难度越来越高,挖一个比特币的成本需要3W多人民币。为什么成本这么高呢?我们通过比特币来简单分析下挖矿难度有多大。Hash值是由数字和大小写字母构成的字符串,每一位有62种可能性,假设任何一个字符出现的概率是均等的,那么第一位为0的概率是1/62(其他位出现什么字符先不管),理论上需要尝试62次Hash运算才会出现一次第一位为0的情况,如果前两2位为0,就得尝试62的平方次Hash运算,以n个0开头就需要尝试62的n次方次运算。

            我们以Block #544228为例,它当前hash为:000 000 000 000 000 000 14d90bb35d84eaf8b5ed2ae85f42b9d37c715ab3a02b06。 可以看到它前面有24个0,那么理论上就需要尝试 64^24 ,大概需要2.230074519853062e43 次这是一个非常大的数字,需要消耗很大的资源(电能、算力)。

    PoW过程

            比特币PoW的过程,可以简单理解成就是将不同的nonce值作为输入,尝试进行SHA256哈希运算,找出满足给定数量前导0的哈希值的过程。而要求的前导0的个数越多,代表难度越大。比特币节点求解工作量证明问题的步骤大致归纳如下:

    1.生成铸币交易,并与其他所有准备打包进区块的交易组成交易列表,通过Merkle树算法生成Merkle根哈希;
    2.把Merkle根哈希及其他相关字段组装成区块头,将区块头的80字节数据作为工作量证明的输入
    3.不停地变更区块头中的随机数,即nonce的数值,并对每次变更后的区块头做双重SHA256运算(即SHA256,将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。

            比特币的工作量证明,就是俗称“挖矿”所做的主要工作。

            Merkle 可信树是一棵完全二叉树,应用 Merkle 可信树需要计算并输出Merkle 可信树的每个叶子节点的认证路径上的节点的哈希函数值。

            上图展示了一个具有4个交易记录的 Merkle树的根哈希值的计算过程。首先以这4个交易作为叶子结点构造一棵完全二叉树,然后通过哈希值的计算,将这棵二叉树转化为Merkle树。
    首先对4个交易记录:TxaTxc,分别计算各自的哈希值HAHC,然后计算两个中间节点的哈希值HAB=Hash(HA+HB)和HCD=Hash(HC+HD),最后计算出根节点的哈希值 ABCD=Hash(HAB+HCD)。

    PoW共识记账

    在进行工作量证明之前,记账的节点会做一些工作:
    1.客户端产生新的交易,向全网进行广播要求对交易进行记账
    2.每一个记账节点一旦收到这个请求,将收到的交易信息纳入一个区块中
    3.每个节点都通过PoW过程,尝试在自己的区块中找到一个具有足够难度的工作量证明;
    4.当某个节点找到了一个工作量证明,它就向全网进行广播
    5.当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
    6.其他节点表示它们接受该区块,而表示接受的方法则是在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机哈希值视为先于新区块的随机哈希值。

    PoW能否解决拜占庭将军问题

            关于比特币PoW共识机制能否解决拜占庭将军问题一直在业界有争议。2015年,Juan Garay对比特币的PoW共识算法进行了正式的分析,得出的结论是比特币的PoW共识算法是一种概率性的拜占庭协议(Probabilistic BA)。Garay对比特币共识协议的两个重要属性分析如下。

    • 一致性(Agreement)

            在不诚实节点总算力小于50%的情况下,同时每轮同步区块生成的几率很少的情况下,诚实的节点具有相同的区块的概率很高。

    • 正确性(Validity)

            当不诚实算力具一定规模,超过51%,甚至不用接近50%的时候,比特币的共识算法并不能保证正确性,也就是,不能保证大多数的区块由诚实节点来提供。这就是著名的51%算力攻击。

            因此,我们可以看到,比特币的共识算法不适合于私有链和联盟链。其原因首先是它是一个最终一致性共识算法,不是一个强一致性共识算法。第二个原因是其共识效率低,提供共识效率又会牺牲共识协议的安全性。

            PoW机制存在明显的弊端。一是浪费大量的算力,只用来竞争挖矿权,并没有更多实际或科学价值。二是它并不完全公平,当计算机硬件升级到一定程度,比如量子计算机可能几秒就计算出了Hash值。

    展开全文
  • 三、POW工作量证明流程流程图中看出,pow工作量证明的流程主要经历三步: 1.生成Merkle根哈希   生成Merkle根哈希在第二章节中的第2要素中已经有讲解,即节点自己生成一笔筹币交易,并且与其他所有即将打包的...
  • 工作量证明:要求用户进行一些耗时适当的复杂运算,并且答案能被服务方快速验算,以此耗用的时间、设备、能源作为担保成本,以确保服务与资源是被真正的需求所使用。 To implement a distributed timestamp server ...
  • Proof of work - 工作量证明

    万次阅读 多人点赞 2016-09-13 23:16:09
    转自: http://www.3says.com/article/621 http://blog.csdn.net/hacode/article/details/8750037 ... 起源 ...工作量证明(Proof Of Work,简称POW),简单理解就是一份证明,用来确认你
  • 朴素贝叶斯分类流程图介绍

    千次阅读 2016-08-03 10:47:48
     根据上述分析,朴素贝叶斯分类的流程可以由下表示(暂时不考虑验证):  可以看到,整个朴素贝叶斯分类分为三个阶段:  第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要...
  • 图像分类基本流程及 KNN 分类器

    千次阅读 2018-09-07 16:14:06
    1. 图像分类以及基本流程 1.1 什么是图像分类   所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像。虽然看起来挺简单的...
  • 功能测试的测试工作流程

    千次阅读 2018-03-19 20:49:35
    按照产出的文档,介绍项目开发过程中的工作步骤 1. 测试计划:这个计划,我个人觉得应该在详细设计确定后,代码开始编写的时候进行制定,因为我是“提早开始测试工作”思路的忠实fans,虽然现在项目里都只有我一个...
  • BlockChain:Python一步一步实现(流程最清楚)区块链底层技术流程图(理解一目了然,值得收藏) 导读 基于Python编程,实现一步一步实现(流程最清楚)区块链底层技术流程图,理解一目了然,值得收藏。 目录 ...
  • 软件测试工作基本流程

    千次阅读 多人点赞 2019-06-24 19:54:13
    最近在为面试新工作做准备,所以想想整理一下软件测试的基本工作流程,大致梳理一遍,这样也便于自己在面试过程中可以沉着的面对面试官的测试工作如何进行的问题。 首先,作为测试人员需要学习并了解业务,分析需求...
  • 软件测试工作流程概括与总结

    万次阅读 多人点赞 2018-08-08 23:37:45
    最近在为面试新工作做准备,所以想想整理一下软件测试的基本工作流程,大致梳理一遍,这样也便于自己在面试过程中可以沉着的面对面试管的测试工作如何进行的问题。 首先,作为测试人员需要学习并了解业务,分析需求...
  • activiti学习资料(diagram,业务流程图)

    千次阅读 2012-10-17 14:38:52
    diagram,动态)是阐明了业务用例实现的工作流程。 业务用例模型中的活动  业务用例工作流程说明了业务为向所服务的业务主角提供其所需的价值而必须完成的工作。业务用例由一系列活动组成,它们共同为...
  • 机器学习系列(7)_机器学习路线(附资料)

    万次阅读 多人点赞 2016-02-28 11:54:10
    3.4 基本工作流程 以上我们基本具备了机器学习的必要条件,剩下的就是怎么运用它们去做一个完整的机器学习项目。其工作流程如下: 3.4.1 抽象成数学问题 明确问题是进行机器学习的第一步 。机器学习的...
  • 权益证明生态系统

    万次阅读 2019-05-14 09:22:15
    然而,我们看到大多数下一代协议都采用了 PoS,并且围绕这种工作量证明 (PoW) 的替代方案形成大型生态系统。类似于 PoW 会创造出以挖矿 (ASIC 生产者,矿场和矿池等等) 为中心的数十亿美元的产业,新型网络维护....
  • 软件测试——工作业务流程

    千次阅读 2020-04-25 11:14:29
    软件测试的工作流程 一、作为测试人员需要学习并了解业务,分析需求点 为什么测试人员需要参加需求分析?也就是进行测试需求分析的目的是什么? 把用户需求转化为功能需求:1)对测试范围进行度量 2)对处理分支...
  • 零知识证明: 抛砖引玉

    万次阅读 2019-05-12 08:25:00
    在Goldwasser等人之前,这个领域的研究工作主要聚焦在加强证明系统的 可靠性(Soundness) 。也就是说原先大家都假设,会有恶意的证明者试图耍手段,误导验证者接受错误的论述。但 Goldwasser 等人却从另一个角度...
  • 每个阶段工作在一组元素,如顶点,三角形或像素。下 1  [  Shr99  ]给出了典型 的OpenGL 固定管道。 1:  在 OpenGL的 固定管道。   人们很容易看到这种...
  • 基于存储证明(Proof of storage)的Permacoin挖矿原理解析

    千次阅读 热门讨论 2018-04-14 08:11:47
    过去的一周让人感觉五味杂陈,心力交瘁,工作非常忙,非常累,非常没有进展,时而芳香,时而谢特,本想着这周末什么也不干撸点没意义的事情度日呢,然而还是觉得把意义拆散来的可靠些。所以依旧很早爬起来总结一下...
  • filecoin工作原理

    千次阅读 2020-03-12 10:57:23
    Filecoin 矿工可以选择提供网络存储,通过定期产生证明其正在提供指定容量的加密证明来获得Filecoin加密货币(FIL) Filecoin使各方能够通过Filecoin区块链上共享账本中记录的交易来交换FIL货币。 加密货币FIL是沟通...
  • QIIME 2教程. 02插件工作流程Plugin Workflows(2020.11)

    万次阅读 多人点赞 2017-07-16 15:09:04
    本文主要内容翻译自QIIME2官方教程 https://docs.qiime2.org/2017.6/tutorials/moving-pictures/ ... 1简介和安装提到了两种常用安装方法,我们每次在分析数据前,需要打开工作环境,根据情况选择对应的打开方式。# 创
  • 操作系统 I/O 全流程详解

    千次阅读 多人点赞 2020-06-18 11:18:24
    字节块通常会在控制器内部的一个缓冲区按位进行组装,然后再对校验和进行校验并证明字节块没有错误后,再将它复制到内存中。 内存映射 I/O 每个控制器都会有几个寄存器用来和 CPU 进行通信。通过写入这些寄存器,...
  • 机器学习系列(7)_机器学习路线(附资料)

    万次阅读 多人点赞 2016-02-28 11:55:21
    3.4 基本工作流程 以上我们基本具备了机器学习的必要条件,剩下的就是怎么运用它们去做一个完整的机器学习项目。其工作流程如下: 3.4.1 抽象成数学问题 明确问题是进行机器学习的第一步 。机器学习的训练...
  • 全面了解信贷业务流程

    万次阅读 多人点赞 2020-04-13 11:44:55
    信贷业务流程,用户生命周期。

空空如也

空空如也

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

工作量证明流程图

友情链接: Slide5.rar