美文网首页区块链
【区块链】工作量证明(PoW)讲解

【区块链】工作量证明(PoW)讲解

作者: 一个测试员的日常 | 来源:发表于2018-01-25 22:19 被阅读2658次

    比特币是第一个区块链成功应用,区块链是去中心化账本,每个区块相当于账本的每页,每页都记录着交易信息。

    从去中心化账本的角度来看,每个加入到比特币网络节点都要保存一份完整的账本。如果每个节点不能同时记账,处于不同网络,接收不同节点信息,难以保证获得最新账本信息。如果每个节点同时记账的话,必然会导致账本的不一致,造成账本混乱。

    比特币区块链通过竞争记账方式解决去中心化的账本一致性问题。竞争记账是过程,而不证明竞争结果。采用工作量证明(Proof of Work,PoW)的机制来实现竞争结果判定。

    PoW是确认做了多少工作量的证明。使用例子说明PoW整个证明流程。例子如下:

    使用“blockchain”,在字符串后面加上nonce的整数值串。工作量要求是:在“blockchain”+nonce进行SHA256哈希运算,如果得到哈希结果(以十六进制表示)是以若干个0开头,则验证通过。

    需要经过2688次计算才能找到3位均为0的哈希值,而要找到前6位均为0的哈希值,则需要进行620969计算。见下图:

    图1

    哈希结果要满足前n位均为0要求,需要多次进行哈希值的计算。一般来说,n值越大,需要完成的哈希计算量也越大。要寻找4个前导0的哈希值,预期大概要进行2^16尝试。

    比特币网络中任何一个节点,如果想生成一个新的区块并写入区块链,必须解出比特币网络的PoW的题目。

    解出比特比网络PoW题目关键3个要素是:工作证明函数、区块和难度值。

    1.工作证明函数

    ​ 工作量证明函数是计算方法。在比特币系统使用SHA256作为工作量证明函数。

    2.区块

    ​ 区块决定输入数据,因为使用区块头作为工作量证明输入数据。区块头共有80个字节,请看下图。

    图2

    在构造区块过程中,需要将该区块要含有的交易信息列表,通过Merkle树诉算法生成哈希值,把它作为区块头Merkle根的值。

    Merkle树是完全二叉树,通过哈希值的计算,将这棵二叉树转化为Merkle树。


    图3

    在上图可以看出有四个交易:Txa~Txd,分别计算各自哈希值进行运算,得出Merkle树根。
    现在区块头能有确定值的字段分别是:版本、父区块哈希值、Merkle根、时间戳。Nonce是用于工作量证明计数器,需要不断运算。难度目标在3.难度值讲解。

    3.难度值

    ​ 难度值决定大约需要经过多少次哈希运算产生一个合法区块。

    在全网算力不断变化,需要维持平均10分钟出一个区块,难度值必须根据全网算力的变化进行调整。

    难度调整是每个完整节点中独立自动发生。每2016个区块,所有节点都会按统一公式自动调整难度,调整公式:

    新难度值=旧难度值*(过去2016个区块花费时长/20160分钟)

    工作量计算有一个目标值:

    目标值=最大目标值/难度值。

    最大目标值是恒定:

    0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

    目标值的大小与难度值成反比,比特币工作量证明要求矿工计算出来哈希值必须小于目标值。把目标值作为区块头难度目标值。

    �根据上述讲述,梳理工作量证明步骤如下:

    1. 构建区块,把将要写入区块交易信息组成交易列表,通过Merkle树算法把交易列表信息生成Merkle根哈希。
    2. 把Merkle根哈希、难度值等相关字段组装成区块头,把区块头80字节数据作为工作量证明的数据输入。
    3.不停地变更区块头的随机数,即nonce的数值,变更后不断采用SHA256运算。与目标值做对比,如果小于目标值,则解题成功,工作量证明完成。

    在工作量证明完成后,产生新的区块。当新区块在网络中传播时,每个节点广播到其他节点。

    参考书籍如下:
    《精通比特币》
    《区块链技术指南》邹均

    相关文章

      网友评论

        本文标题:【区块链】工作量证明(PoW)讲解

        本文链接:https://www.haomeiwen.com/subject/odybaxtx.html