比特幣為什麼要減半?

買賣虛擬貨幣

就在今夜,比特幣即將迎來眾所矚目的第三次減半。

自2009年誕生,比特幣已經走過波瀾壯闊的十年。從交易所、礦機、投資者到媒體,比特幣已經帶動加密貨幣行業形成一個完整的生態系統。比特幣區塊獎勵減半從供給側直接減少一半的貨幣供給,顯然在邊際和投資者心理上都極大彰顯了比特幣的稀缺性。

因此,四年一次的比特幣減半成為整個加密貨幣行業關注的焦點。

但看了那麼多比特幣減半的文章,你可能還不知道比特幣具體是怎麼減半的,比如四年減半一次的四年是怎麼來的,怎麼計算當前區塊的獎勵等問題。

值此比特幣第三次減半之際,來跟隨金色財經記者看看Bitcoin Core的程式碼是具體怎麼執行比特幣區塊獎勵減半的。

比特幣減半程式碼

比特幣減半,是比特幣區塊獎勵減半的簡稱。而比特幣的區塊獎勵減半是比特幣共識的一部分,直接寫在比特幣軟體程式碼裡。

具體減半程式碼在這裡,下面是截圖。

比特幣區塊獎勵減半程式碼 來源:Bitcoin Core github

就這6行程式碼定義的函式GetBlockSubsidy決定著不同區塊高度下的比特幣區塊獎勵。中本聰創造的比特幣共識設定區塊獎勵從50個比特幣開始每210000個區塊比特幣獎勵減半,減半64次後區塊獎勵為0。

210000個區塊的時間大約為四年,這也是幣圈人說的四年一次減半的由來。因為比特幣減半事件是寫進比特幣軟體程式碼裡並有分佈在全世界的比特幣全節點驗證,其共識很難改變,這也是“In Code We Trust”的由來。

逐行解讀比特幣減半

上訴程式碼主要有幾個函式和引數:GetBlockSubsidy、nHeight、Consensus.nSubsidyHalvingInterval、halving、nSubsidy。它們的涵義如下:

GetBlockSubsidy主要是活的當前區塊高度下的區塊獎勵(nSubsidy );

nHeight為當前區塊高度;

Consensus.nSubsidyHalvingInterval為比特幣共識決定的區塊獎勵減半間隔區塊,此值為一個常數,為210000。

halvings為減半次數,是一個整數變數,也就是對nHeight/210000取整;

COIN為常數,為100000000,也就是說,在比特幣程式碼裡,比特幣的單位是聰。

nSubsidy為區塊獎勵。

1239行程式碼呼叫GetBlockSubsidy函式。

1240行程式碼:halvings=nHeight/Consensus.nSubsidyHalvingInterval,計算當前區塊對應的減半次數。比如截止本文發稿,區塊高度為629929,629929/210000=2.99,取整halvings=2。當區塊高度達到630000時,halvings=3。

1242和1243行程式碼:if (halvings >= 64) return 0;判斷減半次數是否大於64,如果減半次數大於等於64,則區塊獎勵為0。這也是來自比特幣共識,只有64次減半,64次減半後區塊獎勵為0。

1245行程式碼nSubsidy=50*COIN,比特幣軟體每次執行程式碼都把區塊獎勵設定成50* COIN,也就是5000000000。

1247行程式碼nSubsidy>>=halvings,這一句是真正起作用的比特幣區塊獎勵減半程式碼。>>= 是二進位制右移操作,nSubsidy>>=halvings等價於nSubsidy=nSubsidy除以2的halvings次方。

1248行程式碼返回給比特幣節點當前節點的區塊獎勵值。

上述程式碼最後的實質是下面的公式:

因此,1-209999區塊每個區塊獎勵為50/(2^0) =50枚比特幣;210000-419999區塊獎勵減半為50/(2^1)=25枚比特幣,420000-629999區塊獎勵減半至50/(2^2)=12.5個BTC。區塊高度630000後減至50/(2^3)=6.25枚比特幣。

大神也有BUG

不過,上述6行程式碼不是中本聰的原始程式碼,中本聰的原始程式碼如下:

儘管中本聰是大神,但不代表其程式碼就沒有bug。因為nSubsidy是個64位的有符號整數,而>>= 超過64在C++中屬於未定義行為,會導致數值環回,最終導致BTC數量不斷重複2100萬個比特幣的釋放過程,見下圖。

Pieter Wuille修復了這個bug,有一個專門的比特幣改進協議BIP042描述這個bug,文件見這裡。

參考資料:

Where in the Code Does the Halving Take Place

BIP042

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;