POW即工作量证明,区块链是由网络上互不相识、匿名的节点共同维护,每个区块就是所投入工作量的证明,要确保妄图修改历史区块的节点比那些诚实的、仅仅是要增加新区块的节点耗费更大的工作量,那么与其耗费大力气篡改区块,还不如老老实实的竞争出块权,还能得到区块链奖励。
那么比特币的POW到底在做什么?真如大家传说中的挖矿吗?当然不是真的挖矿啦,比特币利用了哈希的随机性,一点小小的改动,哈希值变化会很大,无法进行预测。
POW具体在做什么呢?计算区块头的哈希值,好像大家忘记了,好吧,我把上个文章的图在贴过来,
这几个成员变量里面除了nNonce其它都是固定值,我们要选一个nNonce使得区块头的哈希值小于某一个数,这个“某一个数”的选择直接就影响了难度。比如,如果最大的哈希值是 2^256-1,你会发现你很容易找到nNonce使得哈希值小于2^255。
上面这个例子很容易啦,因为2^255太大了,如果把这个目标值改小了,这个可就没这么容易算了,比特币假定这个概率是线性的,目标值越小,尝试就会越多(平均来说),也就是难度越大。
新产生的区块只有满足了共识协议中的难度规定才可能被大家接受。每2016个区块产生后,网络各节点会通过区块头的时间戳来计算时间间隔,应该是1,209,600秒(两星期)。
如果产生2016个区块的时间少于两个星期,期望的难度值就会相应增加(最高300%),使得下次2016块产生的时间是正好两星期。
如果产生2016个区块的时间大于两个星期,期望的难度值就会相应降低(最高30%)。
(注意:比特币区块是从0开始的,计算2016个区块产生的时间是,0~2015)
区块链是一条工作量证明的链,如果你要修改一个区块,这个区块后续的区块都要修改,要花费更多的算力才能追上正常链的高度,这里有一个51%攻击,就是你的算力达到了全网算力的51%,就可以做到了。实际上这个百分比可以比50%小,也能达到目的。那么有这么大的算力为什么不老老实实的挖矿呢?现在的奖励可不算少。
这个哈希只是在计算区块头的哈希,80个byte,也就是说交易再多,也不会增加计算的资源需求,大不了重新计算一遍Merkle根。
现在没有用Bitcoin Core来挖矿的了吧,但是挖矿的代码都还在,用bitcoin-cli generate 1命令可以产生区块,当然仅限自己的私有链,上代码,
代码位置:bitcoin/src/wallet/rpcwallet.cpp
这个generate函数下面调用了generateBlocks
代码位置:bitcoin/src/rpc/mining.cpp