LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 深入学习区块链共识机制(二)POW共识

深入学习区块链共识机制(二)POW共识

2019-11-01 Online 来源:区块链网络

PoW,全称Proof of Work,即工作量证明,又称挖矿。大部分公有链或虚拟货币,如比特币、以太坊,均基于PoW算法,来实现其共识机制。根据挖矿贡献的有效工作,来决定货币的分配。

接下来主要以pow在比特币公链上的应用展开讲解。

比特币Pow

比特币的出块时间是10分钟左右。每个区块内包含最多8笔交易,这些交易需要被验证和确认,才能实现账户代币的转移。每个挖矿节点做的工作就是去验证和确认这个区块,使区块内的交易得以实现。而他们用的算法就是pow。pow计算的是一个数学运算难题,矿工们首先验证要挖坑区块的合法性,如果合法,他们就开始计算本次挖矿的数学难题,谁第一个做出来并且广播出去,告诉其他矿工我做出来了,你们不用做了。其他矿工们验证你的计算结果和对应的区块,如果大部分的矿工认同你的结果,那么他们将停止挖坑并同步你的数据。区块内的所有交易也就得到认可,实现转账。你的成功挖矿会被比特币激励模块记录,并会给你发送比特币奖励金。

pow算法主要寻找一个随机数(Block里的Nonce值)作为输入,通过改变这个输入,使Block数据不重复变化,Hash函数(一般是sha256)不断计算这个改变后Block的hash值,找出一个特定格式哈希值的过程(即要求有一定数量的前导0),这里找到的值就是当前hash值 < 目标值(Bits),只不过这个比较是在2进制的格式下比较运算的,也就是比较2进制后数字前面0的个数。这个过程就是pow运算过程。而要求的前导0的个数越多,代表难度越大。在将pow算法之前,先学习下区块信息。

区块

如下图所示1572577941469492.jpg

从图上可知,比特币区块结构分为区块头和区块体,区块体保存交易的具体信息,由它生成的hash保存在区块头里。其中区块头细分为:父区块头哈希值:前一区块的哈希值,使用SHA256(SHA256(父区块头))计算。

版本(Version):区块版本号,表示本区块遵守的验证规则 。

时间戳(Timestamp):该区块产生的近似时间,精确到秒的UNIX时间戳,必须严格大于前11个区块时间的中值,同时全节点也会拒绝那些超出自己2个小时时间戳的区块。

目标值(Bits):该区块工作量证明算法的难度目标,已经使用特定算法编码。

随机数(Nonce):为了找到满足难度目标所设定的随机数,为了解决32位随机数在算力飞升的情况下不够用的问题,规定时间戳和coinbase交易信息均可更改,以此扩展nonce的位数。

Merkle根(MerkleRoot):该区块中交易的Merkle树根的哈希值。矿工收到计算过的区块,会跟自己的区块进行比较,其中Merkle root就是比较它们包含的交易是否一样。

区块头里的所有信息拼接成一个新的字节数组,pow函数运算的参数就是这个字节数组。函数运算是采用SHA256(SHA256())计算。

var?genesisBlock?=?wire.MsgBlock{Header:?wire.BlockHeader{Version:1,PrevBlock:chainhash.Hash{},//?0000000000000000000000000000000000000000000000000000000000000000MerkleRoot:?genesisMerkleRoot,//?4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33bTimestamp:time.Unix(0x495fab29,?0),?//?2009-01-03?18:15:05?+0000?UTCBits:0x1d00ffff,//?486604799Nonce:0x7c2bac1d,//?2083236893},Transactions:?[]*wire.MsgTx{&genesisCoinbaseTx}, }

Pow三要素

1.Hash函数:在比特币中使用的是SHA256算法函数,是密码哈希函数家族中输出值为256位的哈希算法。

2.区块头 Hash函数运算需要的参数,也就是区块头的所有信息字节拼接后的字节数组。

3.目标值(Bits) 每一个区块会用一种压缩的格式(被称为“Bits”)来表示实际的16进制的目标值。通过这个值和系统中其他常量可计算出该难度值下的难度目标值。Hash函数运算出来的结果与目标值进行比较大小,如果小,则表示挖坑成功,否则继续运算。比较大小时为使运算速度快速,目标值和hash值都会转换成2进制,所以比较大小就是比较前导0的个数。比特币是每隔2016个区块后调整难度值。pow挖矿的难度与目标值成反比,如果Bits的实际值增大,那么挖矿容易点;反之,挖矿难度加大。

比特币整个网络会通过调整“难度”这个变量来控制生成工作量证明所需要的计算力,使整个网络的计算力大致每10分钟产生一个区块。

作者:

区块链高级工程师、go语言工程师、IPFS早期研究者、IPFS希望社区创始人。网络著书有《IPFS一问一答》、《IPFS操作教程》、《区块链密码学》、《区块链共识算法》;跟踪并翻译报道《IPFS Weekly》,研究并翻译IPFS、Filecoin白皮书,业界知名专家学者——张默默老师!

—-

编译者/作者:Online

玩币族申明:我们将尊重作者/译者/网站的版权,促进行业健康发展,如有错误或不完整之处请与我们联系。

LOADING...
LOADING...