跟大家一起學習區塊鏈技術系列之一 比特幣之區塊鏈 POW

POW即工作量證明,區塊鏈是由網絡上互不相識、匿名的節點共同維護,每個區塊就是所投入工作量的證明,要確保妄圖修改歷史區塊的節點比那些誠實的、僅僅是要增加新區塊的節點耗費更大的工作量,那麼與其耗費大力氣篡改區塊,還不如老老實實的競爭出塊權,還能得到區塊鏈獎勵。

那麼比特幣的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

跟大家一起學習區塊鏈技術系列之一 比特幣之區塊鏈 POW

這個generate函數下面調用了generateBlocks

代碼位置:bitcoin/src/rpc/mining.cpp

跟大家一起學習區塊鏈技術系列之一 比特幣之區塊鏈 POW


分享到:


相關文章: