区块链大学区块链研习社区块链

《锋哥论道区块链》之四区块链1.0之比特币--共识机制:工作量证

2019-04-22  本文已影响4人  7dfc697cf7a9

POW共识机制用于解决双重支付问题。
【原译文】
为了在点对点的基础上构建一组散列化的时间戳服务,仅仅像报纸或世界性新闻网络组一样工作是不够的,我们还需要一个类似于亚当•柏克(Adam Back)提出的哈希现金(Hashcash)。在进行随机散列(hash)运算时,工作量证明机制引入了对某一个特定hash值(比方说hash算法为SHA-256)的寻找工作,该hash值以一个或多个0开始。那么随着0的数目的上升,找到符合条件的hash值所需要的工作量将呈指数增长,但是检验结果仅需要一次随机散列(hash)运算(也就是将找的值通过执行hash后与给定的特定值核对)。
我们在区块中补增一个随机数(Nonce),这个随机数要使得该给定区块的随机散列值(hash)出现了所需的那么多个0。我们通过反复尝试来找到这个随机数(nonce),找到为止。这样我们就构建了一个工作量证明机制。只要该CPU 耗费的工作量能够满足该工作量证明机制,那么除非重新完成相当的工作量,否则该区块的信息就不可更改。由于之后的区块是链接在该区块之后的,所以想要更改该区块中的信息,就还需要重新完成之后所有区块的全部工作量。
同时,该工作量证明机制还解决了在集体投票表决时,谁是大多数的问题。如果决定大多数的方式是基于IP地址的一个IP地址一票,那么如果有人拥有分配大量IP地址的权力,则该机制就被破坏了。而工作量证明机制的本质则是一CPU一票。“大多数”的决定表达为最长的链,因为最长的链包含了最大的工作量。如果大多数的CPU为诚实的节点控制,那么诚实的链条将以最快的速度延长,并超越其他的竞争链条。如果想要对已出现的区块进行修改,攻击者必须重新完成该区块的工作量外加该区块之后所有区块的工作量,并最终赶上和超越诚实节点的工作量。我们将在后文证明,设想一个较慢的攻击者试图赶上随后的区块,那么其成功概率将呈指数化递减。
另一个问题是,硬件的运算速度在高速增长,且节点参与网络的程度会有所起伏。为了解决这个问题,工作量证明的难度(the proof-of-work difficulty)将采用移动平均目标的方法来确定,即令难度指向令每小时生成区块的速度为某一预设的平均数。如果区块生成的速度过快,那么难度就会提高。
【解读】
比特币采用哈希算法,逻辑上是对整个区块进行哈希运算,实际上是对区块头执行哈希运算。也就是说,所谓的区块的哈希值,更确切的表述为区块头的哈希值。区块头大小为80byte,包含六个字段:version、timestamp、bits、nonce、 hashpreblock及hashmerkleroot。如此设计首先带来的好处是方便哈希运算,每次运算只需要80字节的参数输入,而不是整个区块的数据,同时交易列表的任何变化又能体现在哈希运行结果上。
比特币采用SHA256哈希运算,且每次都是连续进行两次SHA256运算才能作为最终结果,前一次运算的结果作为后一次运算的输入,即Double SHA256,一般简称SHA256D,比特币合格区块判断依据如下:
SHA256D(Version,hashPreBlock,hashMerkleRoot,Timestamp,Bits,Nonce)<=MAXTARGET/Diff
比特币工作量证明(POW)的达成就是矿工计算出来的区块哈希值必须小于目标值。比特币工作量证明的过程,就是通过不停的变换区块头(即尝试不同的nouce值)作为输入进行SHA256哈希运算,找出一个特定格式哈希值的过程(即要求有一定数量的前导0)。而要求的前导0的个数越多,代表难度越大。我们可以把比特币矿工解这道工作量证明迷题的步骤大致归纳如下:
(1)生成用于发行新比特币奖励的Coinbase 交易,并与当前时间戳的其他所有准备打包进区块的交易组成交易列表,通过Merkle Tree算法生成Merkle Root Hash;
(2)把Merkle Root Hash及其他相关五个字段组装成区块头,其中nonce置零,将区块头的80字节数据(Block Header)作为工作量证明的输入;
(3)不停的变更区块头中的随机数即nonce的数值(nonce初始置零,每次增1),并对每次变更后的的区块头做双重SHA256运算(即SHA256(SHA256(Block_Header))),将每次结果值与当前网络的目标值做对比,如果小于目标值,则成功搜索到合适的随机数nonce并获得该区块的记账权,工作量证明完成。
(4)如果在当前时间戳未成功,则更新时间戳,重复上述步骤,直到找到符合条件的nonce。
(5)在节点成功找到满足条件的哈希值之后,会马上对全网进行广播打包区块。
(6)网络的其他节点收到广播打包区块,会立刻对区块的哈希值及交易数据的有效性进行验证。如果验证通过,则表明已经有节点成功解迷,自己就不再竞争当前区块打包,而是选择接受这个区块,记录到自己的账本中,然后进行下一个区块的竞争猜谜。

上一篇下一篇

猜你喜欢

热点阅读