2.4 獎勵機制與工作量證明

在前面的章節裡,我們簡單瞭解了比特幣的共識算法,以及為什麼我們直覺上相信它是安全的。但我們回想在本章一開始談到的,比特幣的去中心化一部分是通過技術手段,另一部分是通過聰明的激勵設計來實現的。截至目前,我們主要關注的還是技術手段。現在,我們來討論比特幣的這個激勵設計。

之前我們試圖大膽相信這樣的假設,在我們隨機選取節點時,至少有50%的可能會選中誠實節點,這或許是有問題的。如果對顛覆這個過程的參與者有金錢獎勵,這個關於誠實的假設就格外成問題,這種情況下我們無法真的假設某個節點是誠實的。所以這個問題變成了:我們是否可以給予表現誠實的節點獎勵?

我們再思考下一個確認以後的雙重支付嘗試(見圖2.3)。我們是否可以懲罰那個創建包含雙重支付區塊的節點?好吧,其實不行。就像我們前面說的,因為我們無法判斷哪筆交易是道義上合法的。即使我們知道,我們也很難懲罰它們,因為節點沒有身份。那我們反過來思考,我們是否可以獎勵那些創造的區塊最終被放入長期共識區塊的節點?然而,同樣因為這些節點並沒有透露它們真實世界中的身份,我們不可能給他們的家庭地址寄去現金。要是有某種可以代替的數字貨幣……你大概猜到該怎麼做的。我們可以用比特幣來獎勵創造這些區塊的節點。

讓我們暫停一下。之前,我們討論的都是用抽像的算法來實現分佈式共識,並不是針對某個具體的應用。我們現在要跳出模型,使用事實,我們建立這個分佈式共識過程的應用實際上就是一種貨幣。明確地說,我們要以這種貨幣為單位獎勵那些表現誠實的節點。

區塊獎勵

這是怎麼做到的?比特幣裡有兩種不同的獎勵機制。其中一個就是區塊獎勵。根據比特幣的規則,創建區塊的節點可以在這個區塊中加入一筆特別的交易。這筆交易就是一個造幣的交易,類似於財奴幣裡面的造幣,節點可以指定這筆交易的接收地址。當然,節點通常都會選擇一個屬於自己的地址。你可以把這視為對節點在共識鏈上進行創建區塊服務的報酬。

在寫本書時,區塊獎勵金額定在25個比特幣。但每生成210 000個區塊,金額就會減半。根據區塊生成的速度,我們可以看到,這個金額大概每4年減半一次。我們現在處在第二個4年。比特幣存在的最初4年,區塊獎勵金額為50個比特幣,現在是25個比特幣。然後會不斷減半。這將造成一些有意思的結果,我們不久會看到。

你可能會問為什麼區塊獎勵能做到鼓勵誠實行為。給予我們目前討論的,從表面上看,這個節點無論提議一個正當有效的區塊還是惡意偽造,都會受到獎勵。但其實並非如此!想一想這個節點是如何收取獎勵的?獎勵只有當區塊最終被納入長期共識鏈才會實現。因為造幣交易和其他每一筆交易一樣,只有當它最終被納入共識鏈,才會被其他節點接受。這就是比特幣獎勵制度的一個關鍵概念。這是一個十分微妙卻十分強大的設計。這個設計激勵節點想方設法讓其他節點延展它們自己的區塊。因此如果網絡中大部分節點遵循去延展最長支鏈的規則,那這樣的設計將激勵所有節點去遵循這個規則。這就是比特幣的第一個獎勵機制。

我們前面提到每產生210 000個區塊(大約4年),區塊獎勵將被減半。在圖2.4中,曲線的斜率將持續減半。這是一個等比數列,你可能知道數列的總和是有上限的。最終一共是21 000 000個比特幣。

注意,這是新比特幣被允許創造出來的唯一途徑,沒有任何其他新增幣的機制。所以這是為什麼比特幣最終的數量是2 100萬(至少目前的規則規定是這樣)。按照現在獎勵發放的速度,到了2140年比特幣區塊獎勵就發完了。這是否意味著這個系統到了2140年就無法繼續運行,並且因為不再有獎勵誠實行為的激勵而變得不安全呢?不是這樣的。因為區塊獎勵只是比特幣兩種獎勵機制之一。

圖2.4 比特幣的總供應量

註:區塊獎勵每4年減半一次,限制了比特幣的供應上限為2 100萬個。這是一個簡化的模型,實際中的曲線會有輕微的差異,但都有2 100萬的上限限制。

交易費

比特幣的第二個獎勵機制稱為交易費。任何交易的製造者都可以選擇讓交易輸出值比輸入值小。第一個創建區塊把交易放進區塊鏈的人可以取得這個差額,作為交易費。如果你是一個節點,正在創建一個包含200筆交易的區塊,那麼這200筆交易的交易費將會被付到你放在區塊內的那個地址。這些交易費現在是完全自願的,但是我們可以預見,隨著區塊獎勵逐漸發完,交易費會變得越來越重要,幾乎是必需的,因為用戶需要通過交易費來保障合理的服務質量。從某種程度上來說,這已經開始發生。但目前還不清楚這個系統會如何演變——這取決於還並不完善的博弈論的研究與發展。這也是比特幣一個很有趣的研究領域。

我們在描述共識機制時還有一些問題沒有解答。第一個主要問題是我們要你相信這樣的假設:我們能隨機選取一個節點。第二個是因獎勵那些節點參與而產生的新問題:如果大家都想來分一杯羹成為一個節點來獲得這些獎勵的話,整個系統會變得不穩定。第三個是第二個問題的複雜版,就是可能會有攻擊者創建大量的女巫節點來嘗試顛覆整個共識過程。

挖礦與工作量證明

事實證明,這些問題都是相互聯繫的,所有這些問題都有相同的解決辦法——工作量證明(proof of work)。工作量證明的核心理念是,我們把隨機選取節點改為根據節點佔有某種資源的比例來選取節點,我們希望這種資源是沒有人可以壟斷的。比如說,如果這個資源是計算能力,那我們稱之為工作量證明系統。或者這個資源可以是某種幣的擁有量,我們稱之為權益證明(proof of stake)。雖然比特幣沒有使用,但權益證明也是另一種合格的模式,並被其他加密貨幣所使用。我們將在第8章中更多地討論權益證明和其他工作量證明的變種。

先回到工作量證明。我們試著更好地理解根據計算能力來選擇節點到底是什麼意思。換一個角度理解,我們是允許節點用它們的計算能力來互相競爭,導致的結果是計算能力的比例決定了節點被自動選中的概率。工作量證明還有一種理解方式,即我們把製造新身份的難度適度提高了。這就好像是對製造新身份,繼而對女巫攻擊收稅一樣。這聽起來好像有點模糊,我們接下來看下比特幣使用時工作量證明體系的細節,事情就變得清楚多了。

比特幣是用哈希函數解謎來證明工作量的。任何一個提議並創建區塊的節點想要製造下一塊,這個節點必須要找到一個數,或者我們把它稱為臨時隨機數(見第1章1.1節)。當你把這個臨時隨機數、前序塊的哈希值還有要填進這個區塊的交易列表連接起來,組成一整串字符,然後用哈希函數計算這一整串字符的輸出值,這個輸出值正好要落在一個相對於這個哈希函數所有可能的輸出中很小的目標區間內。用公式來表示的話,就是臨時隨機數要滿足下面的不等式:

H(nonce∥prev_hash∥tx∥tx∥…∥tx)<target

就像我們前面看到的,通常一個區塊會包含這個節點提議的一系列交易。而且,這個區塊還會包含一個指向前序區塊的哈希指針(我們這裡說的哈希指針是一個寬泛的概念。這個指針只是文本中的字符串,它並不需要告訴我們去哪裡找到這個區塊。我們可以通過在網上詢問其他的節點找到區塊。重要的是,這個哈希值既作為我們在網絡上請求其他節點尋找區塊的ID,又能夠讓獲取這個區塊後驗證它)。除此之外,我們現在還要求區塊包含一個臨時隨機數。這個想法是為了適度提高發現符合要求的臨時隨機數的難度,即把包含臨時隨機數在內的整個區塊的哈希值組合到一起,輸出結果要是一種特定的形式。如果哈希函數符合我們在第1章中所描述的謎題友好特性,那唯一解出哈希謎題的辦法就是去試足夠多的臨時隨機數,直到成功為止。具體來說,如果這個目標區域是所有可能的輸出的1%,那你大概就要試100次才能成功。事實上,這個目標區域遠比輸出範圍的1%小得多得多,我們後面就能看到。[1]

用這種哈希函數解謎以及工作量證明的辦法,我們可以完全捨棄採取那種隨機選取節點的辦法。這些節點在競爭哈希函數解謎的過程中一直都是互相獨立的。有時一個節點鴻運當頭,正好發現一個臨時隨機數可以滿足要求。這個幸運的節點就可以提議創建下一個區塊了。這就是比特幣系統實現完全去中心化的方式,沒有任何人能決定誰可以提交下一區塊。

難於計算

哈希謎題有三個重要的特性。第一個特性是要有一定的難度。我們前面說適度的難度,其實你馬上會看到難度實際上是隨時間而改變的。在2014年年底,產生一個區塊平均要做1020次哈希運算。換言之,目標區域僅僅是整個輸出範圍的1/1020。這是超大的計算量——舉例來說,超過了商業化筆記本電腦可能的計算範疇。因此,只有一些節點還在不厭其煩地競爭造塊。這個不停嘗試解哈希謎題的過程,就是我們聽說的比特幣挖礦,參與挖礦的節點被稱為礦工。儘管技術上每個人都可以成為礦工,但由於挖礦的高成本導致了挖礦生態系統要消耗大量能源。

可參數化成本

第二個特性是,我們希望成本是可以通過參數來變化的,而不是一個固定值。在比特幣的點對點網絡裡,是這樣來達到這一特性的:每產生2 016個區塊之後,所有的節點都會自動重新計算目標區域相對於整個輸出範圍的比例大小,使得後續的區塊產生的時間間隔約為10分鐘。兩個區塊之間的平均間隔是10分鐘,2 016個區塊就需要兩個星期。所以大約每兩個星期,目標區域的大小會被重新計算一次。

我們想一下這意味著什麼。如果你是個礦工,你花了一定的費用投資了一些硬件來做比特幣挖礦。但是整個挖礦體繫在不斷增加,越來越多的礦工加入這個行業,或是他們部署了運算越來越快的硬件設備,那兩個星期的時間段裡,被找到的區塊可能比預期的要多一點。然後,那些節點就會自動調整目標區域,你要找到一個塊所要做的工作量就隨之增加。所以如果你投了一筆固定資金在硬件上,你找到下一區塊的速率實際上取決於其他礦工在做什麼。有一個公式可以很好地描述這一點:任何一個礦工,比如愛麗絲,找到下一區塊的概率,就相當於她控制的計算力佔整個全球計算力的比例。這意味著,如果愛麗絲的挖礦設備的計算能力佔全部計算能力的0.1%,那大概每產生1 000個區塊,她就可以找到一個區塊。

這樣重新調整的目的是什麼?我們為什麼想要維持10分鐘間隔不變?原因很簡單。如果區塊產生的間隔太小,就會造成很多低效率,我們還會失去許多優化上的好處,比如在一個區塊內放入大量的交易。10分鐘並沒有神奇之處,如果把10分鐘下調到5分鐘大概也可以。關於其他加密貨幣的理想區塊間隔應該是多少,已經有很多討論。除去關於理想間隔的不同意見,大家都認為應該是個固定的值。它不允許被無限降低。這就是為什麼我們有自動重新計算目標區域的特徵。

這個成本函數和工作量證明的設定方式,讓我們重新審視比特幣的安全假設。現在我們終於可以丟棄之前讓你盲目相信的假設。不必再去說那些連身份都沒有的節點大多數是誠實的了,誠實具體代表什麼也並不清楚,我們現在可以清楚地表述,只要以計算能力為權重的大多數礦工,遵循比特幣協議,或者說是誠實的,那麼比特幣中的大量攻擊就都沒有可能發生。因為如果以計算能力為權重的大多數礦工是誠實的,提議下一個區塊的競爭會自動保證在任意時間點,下一個區塊至少有50%的概率是由一個誠實節點提議的。

礦工行為的兩種行為模式

在分佈式系統和計算安全研究領域,假設一定比例的節點是誠實的,來展示在其他節點表現隨意的情況下,系統如何按照預期運行,是很常見的方法。這是我們採用的基礎方法,除了以計算能力為權重計算大多數之外。最初的比特幣白皮書也包含了這樣的分析。

但博弈論領域給出了一種完全不同的,更複雜且實際的方法來決定系統如何運行。這個觀點不區分節點誠實或惡意,而是假設每個節點都按自己的意願行動。每個節點考慮其他節點的潛在可能策略之後,採用一種(隨機的)策略最大化自己的回報。如果協議和激勵機制設計得當,大多數節點在大多數時候會遵循這個規則。「誠實」的行為只是許多策略中的一種,我們在道德上並不依賴於此。

博弈論的觀點認為,最大的問題是礦工默認的行為是否是一種「納什均衡」(Nash equilibrium),即這是否代表了一種穩定的狀態,在這種狀態下沒有節點可以通過表現不誠實而獲得更高的回報。針對這個問題現在各界仍有爭議,並且是一個活躍的研究領域。

解哈希謎題是概率性的,因為沒有人可以預測到哪個臨時隨機數會解出謎題。唯一的方法是一個一個去試臨時隨機數,並希望能夠成功。在數學上,這被稱為伯努利試驗(Bernoulli trial)。伯努利試驗是一種有兩種可能結果的試驗,在連續試驗下,每種結果發生的概率是固定的。在這裡,兩種結果是哈希值是否落在目標區域內,假設哈希函數像隨機函數一樣,那些結果的概率都是固定的。典型地,節點多次嘗試臨時隨機數的伯努利試驗是一個離散概率過程,它可以用一個叫作泊松過程(Poisson process)的連續概率過程近似表示,在泊松過程中,事件以固定的速率獨立出現。最後的結果是,發現下一個區塊所需要時間的概率密度函數,見圖2.5。

圖2.5 發現下一個區塊所需時間的概率密度函數

這被稱為指數分佈。假設一個區塊現在被發行,下一個區塊有一定的小概率很快被發現,比如幾秒鐘或幾分鐘。也有一定的小概率花了較長時間才發現下一個區塊,比如一小時。但總體來說,網絡會自動調整難度使得區塊間隔時間的長期均值維持在10分鐘。注意圖2.5表示的是整個網絡內區塊被創造出來的頻率,而不是哪個礦工事實上發現了這個區塊。

如果你是一名礦工,你大概想知道要多長時間才能找到下一區塊?這個概率密度函數會是什麼樣?它的形狀會相同,但x軸的坐標不一樣。可以用一個漂亮的公式表示:

對於某個特定的礦工:

發現下一區塊的平均時間=10分鐘/佔全部計算能力的比例

如果你有全網絡0.1%的計算能力,這個公式告訴我們,你每10 000分鐘能找到一個區塊,大約一個星期。不僅是你發現區塊的時間間隔非常長,時間間隔的波動也會非常大。因此產生的一些重要結論我們在第5章會講到。

易於證實

現在回到工作量證明函數第三個重要的特性,就是證實一個節點正確地計算了工作量證明很容易。即使一個節點要嘗試1020次來找到使區塊哈希值落在目標範圍內的臨時隨機數,並且臨時隨機數必須是作為區塊的一部分被公佈出來。這樣任何其他節點很容易檢查區塊的內容,計算它的哈希值,證實它的輸出在目標區域內。這是個相當重要的特徵,因為這樣使得我們擺脫了中心化管理。我們不需要一個中央權威機構來證明礦工正確地完成了工作。任何節點或者礦工,都可以迅速地證實其他礦工找到的區塊符合工作量證明的規定。

[1] 這段話很拗口,也難懂。打個比方,假如你是個炮兵,那些前序區塊哈希值加上所有要打包的交易就是炮彈,哈希函數就是大炮,臨時隨機數就好比瞄準器,你所想擊中的目標,比如一個指揮所,它肯定在你能打到的範圍內,但非常小,而且其實根本不知道在哪裡。擊中目標的唯一辦法是狂轟濫炸,這就是比特幣工作量的概念,炸的越多,擊中的概率越高。如果這個指揮所的目標區域是轟擊區域1%大的話,你大概平均要發出100枚炮彈才可能擊中目標。——譯者注

《區塊鏈:技術驅動金融》