原標題: In Code We Trust :讀比特幣減半代碼

作者: Dovey WanPrimitive Ventures創始合夥人與Coindesk顧問委員會董事

比特幣減半的代碼前後一共十來行,簡潔地令人髮指。減半的代碼如此簡潔,減半事件如此矚目。每四年的奧運會都會推遲或者取消,但是減半永遠都會如期進行。

加密數字朋克們喜歡把「 Code is Law 」 掛在嘴邊,但是大部分時候「代碼即法律」 不過是加密朋克的理想主義口號,普通人根本無法看懂代碼,大部分時候我們還是需要依賴技術的封裝,接口處的人機交互部分需要傻瓜都能用才會帶來大規模的普及。編程教育也許到了下一代會變為通識教育,由於機器翻譯的高度發展人們不需要為了減少溝通摩擦而學習一門第二人類外語。對信息獲取的摩擦將來自於機器語言盲區,第二語言將會變成機器語言。 「代碼即法律」 對社會整體的計算機通識教育水平要求甚高,所以在我們這一代應該是一個美好的願景罷了。

每個人可以有減半對幣價的不同解讀,但是減半的本質是一個比特幣貨幣政策的完美預期管理機制。從去年開始在很多場合我都說過對「減半行情」 的看法:

1 、聰明的資本不會因為減半這個已經預先設置好的時間點而突然蜂擁入場。

2 、合約和衍生品平台全面成熟,合約主導的市場結構以及合約/現貨交易量倒掛會導致價格經常性均線回歸。

3 、比特幣要面臨第一次大的經濟周期,比特幣是上一次全球金融危機下的產物,還沒有經歷過第二次全球性金融危機(比特幣在這次的表現在很長一段時間都成為了標普的高beta)

減半機制的如期、順利進行,是比特幣代表的「機器自治經濟體」 可以承擔起人類貨幣政策或者一部分經濟活動指引的的一個強大例證。之前在微博上有一個關於這個和朋友的討論,其中一個類比是比較接近的:

1 、國家發債(法幣)依靠的是政府信用。比特幣也是債,只是這個債的信用被去中心化的信任( trustless trust)取代;

2 、區塊獎勵和手續費是國防預算,礦工是軍隊,拿著國防預算維護這個「國度」 的安全和穩定;

3 、開發者是類似立法機構和製定政策機構;

4 、全節點是國會議員,決定了開發者的出台的某項新的法案或者政策是否能被採納接受;

5 、不同的開發團隊充當了不同的黨派,哪個黨派的主導政策,那要看全節點最終選擇了誰;

6 、持幣者是這個國家中的「國民」,轉賬費用其實是某種意義上這個國度裡的「稅收」,不過稅收直接給了軍隊,而不是通過政府進行再分配(當然政府可以有再分配的提案,譬如一些比特幣的分叉幣嘗試過「開發者稅」 就是把固定的礦工獎勵直接打給屬於開發者的固定錢包);

7 、礦機廠家扮演了軍火商的角色。

去年比特幣網絡支付了52億美元給礦工用來確保網絡安全。如果比特幣是一個國家,這52億美元視作國防支出的話,那麼他能在全球國防支出中能排41位,和越南烏克蘭等國相當。

 

美元作為全世界市值最大的永續債,維繫美元信用的成本也是同樣的高昂。美國的軍費開支已經達到了二戰以來最高水平(上圖) 。過去60年美國繼續輸出自身國家的通貨膨脹,國內喜樂安康,物價穩定,一片欣欣向榮。國外區域性危機不斷,戰亂不停,一有不聽話會威脅到美元核心地位的(譬如薩達姆,譬如卡扎伊)就拿起大砲+鐮刀。基本每次的區域性危機,譬如亞洲金融危機,拉美金融危機等等,我們都會看到「美元流動性危機」在危機後厚重的影子。雖然美國政府在這些危機中是否有意收割不得知,但是美國掌握了美元流動性這個可以救命也可以殺人的管子是毫無質疑的。隨著美元的流通性陷阱和信用危機湧現,這個信用成本將會只增不減。

在減半之際,我想來想去最有意義的事情應該是讓更多人了解比特幣減半的真實執行層面的機理。這篇文章我會嘗試逐行給大家解釋比特幣減半代碼,希望每個人都能相信的是自己理解的東西,而不是某個人,某個虛幻的概念,或者「信仰」本身。

美元本是美聯儲發行的永續債,在墨綠色的紙上印上In God We Trust後變得似乎異常神聖。可是每個地方,每個人的「上帝」 都各有各的不同,該相信哪個「上帝」 呢?骨子裡千百年來不相信鬼神的中華民族的上帝又是什麼的?

代碼真實可見,執行邏輯可被校驗。與人類自發形成的社會協議不同,代碼的存在讓執行變得「不可逆」。所以可能更準確的說法應該是「 Code is Law Enforcement(代碼即執法)而不是「 Code is Law 」。當國家機器壟斷了暴力機構,當立法執法成為了巨大的黑盒,選擇相信一個可審查的「 enforcement 」 機制,是比特幣帶給我們的一個選項。

下面上代碼和解釋, in code we trust

int halvings = nHeight / consensusParams.nSubsidyHalvingInterval

  • 這裡定義了減半次數halvings ,即「減半次數」為整數變量
  • nHeight是當前區塊高度,後面那一堆調用了共識裡的一個「減半間隔區塊數」,在比特幣代碼裡是210,000
  • halvings在每次代碼執行的時候都會返回當前區塊高度/210000,因為定義為整數變量,當不被210,000整除的時候,小數部分不會被存儲,所以在511號晚上之前(區塊高度630,000) ,都是2
  • 每到新的整除高度,譬如630,000 -變為3 ,再下次的840,000-變為4halvings變量都會相應增加

if (halvings >= 64) return 0;

  • 如果減半次數大於等於64 ,區塊獎勵返回0
  • 這個可以保證最多只有64次減半,到了64次之後,礦工將不再有獎勵
  • 屆時的比特幣網絡必須依靠手續費來保證網絡的安全和礦工的激勵制度
  • 當年有人問過中本聰,擔心不擔心「無獎勵終局」 中本聰的回答其實非常好: 「到了那個時候( 100多年以後),比特幣要么已經滅亡,要么挖出來的比特幣已經成為大規模的流通價值載體。」 兩種情況都不需要擔心沒有無挖礦獎勵礦工拒絕挖礦的情況

CAmount nSubsidy = 50 * COIN;

  • 這裡的nSubsidy =挖礦獎勵
  • 每次代碼執行都會把挖礦獎勵設置成50個比特幣* COIN
  • COIN是常數變量100,000,000用來把挖礦獎勵變成聰的單位

nSubsidy >>= halvings; return nSubsidy;

  • 最後兩行是真正的減半執行命令
  • 挖礦獎勵>>=減半數中用了C++裡的一個右移操作。因為是是二進制右移,所以x>>=y表示x = x除以2y次方
  • 當到了630,000區塊高度的時候, y在這裡是減半數halvings ,減半數從2變成了3
  • 所以挖礦獎勵從50個比特幣除以22次方,變成了50個比特幣除以23次方,由此完成了減半

下面我把完整的減半代碼貼上,感興趣的同學可以去點擊閱讀原文的比特幣源代碼自行查閱


CAmount GetBlockSubsidy(int nHeight, const Consensus::Params&consensusParams)

{

int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;

// Force block reward to zero when right shift is undefined.

if (halvings >= 64)

return 0;

 

CAmount nSubsidy = 50 * COIN;

// Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.

nSubsidy >>= halvings;

return nSubsidy;

}

最後,減半不是什麼大節日,你慶祝也好,看衰也罷,減半都會如期進行,直到全世界只剩下最後一個比特幣全節點。安安靜靜找個喜歡的人,看看夜光白皮書,一起讀一讀完成減半的代碼,聊聊人生,這也許是作為比特幣愛好者你我最好的安排。