5.4 礦池

設想一下作為單個礦工。假設你花了辛苦賺來的6 000美元買了一台全新閃亮的比特幣礦機,你所期望的性能是平均每14個月會找到一個有效區塊(在2015年早期一個區塊的獎勵價值在10 000美元)。

考慮到電費和其他運營成本,礦機的平均收入期望值應該是每個月400美元。如果可以確定每個月都能獲得400美元,那麼購買一台礦機是合理的投資。但是別忘了,挖礦是一個隨機過程,你不知道什麼時候可以發現下一個有效區塊。在找到有效區塊之前,什麼都賺不到。

高方差

從礦工第一年能找到有效區塊數的概率分佈上看,這個分佈差異是很大的,期望值(也就是第一年能找到區塊的平均數)是相當的低。因為發現區塊的比率是一個很低的固定值,並且這個值和你上次發現一個有效區塊所花費的時間完全沒有關係,因而總的發現區塊的期望值是以柏松概率分佈[1]。柏松分佈是指,如果有N個獨立事件,每個事件成功的概率是λ/N,當N接近於無限大的時候的成功概率分佈。比特幣挖礦中,嘗試每一個臨時隨機數的行為實際上就是一種超小成功概率事件,所以即使對於小礦工來說,N的值也確實很大,這種近似類比是很合適的。

如果你期望每14個月找到一個有效區塊(根據泊松分佈可知λ=6/7個有效區塊/每年),則有超過40%的概率在第一年你不會找到任何有效區塊。對於個體礦工來說,這可能是災難性的。你在一個礦機上花費了數千美元,並且支付了很多電費來運行,結果什麼都沒有獲得。第一年能獲取一個有效區塊獎勵的概率大概是36%,這也就意味著即使你的電費不高,你也就可能剛剛夠支付電費。當然也有很小的概率可能會發現兩個甚至更多的有效區塊,這種情況下才有可能真的賺錢。詳見圖5.11。

圖5.11 挖礦成功的不確定性

註:假設全網哈希算力是不變的,平均發現一個區塊的事件是14個月,對於一個小礦工來說這個成功概率的波動太大了。

這些數字只是一個近似估算,但主要的意思是,即使挖礦從期望值來說是合理的,也就是說,投資有足夠的回報,但由於方差足夠大以至於會有很大的概率什麼都得不到。對於一個小礦工來說,這也就意味著挖礦就是一個賭博遊戲。

礦池

歷史上當小商人遇到大風險的時候,他們會自發組建一個互助保險公司來降低風險。比如,農夫會自發地聚在一起形成一個協議,如果任何一個個體農夫的穀倉不小心被燒掉了,那麼其他的農夫可以把他們的利潤拿來和這個不幸的農夫分享。那麼對於比特幣的小礦工是否也可以用類似的方式來降低風險呢?

礦池應運而生——礦池就是一個比特幣礦工互相之間的保險。一組礦工可以形成一個礦池共同進行挖礦,並指定一個幣基接受人。這個接受人就是礦池管理員。所以不管是誰最終發現了一個有效區塊,礦池管理員將會收到這個區塊的獎勵,繼而根據每個參與者所貢獻的工作量按比例分配給所有礦池的參與者。當然,礦池管理員可能從中分一部分來作為礦池管理服務的收入。

假定每個人都信任這個礦池管理員,這樣的分配安排可以極大地降低礦工成功尋找有效區塊的概率波動。但是礦池管理員如何知道礦池裡每個成員實際上到底貢獻了多少工作量呢?同時他又是如何去分發收入的呢?很顯然,礦池管理員不希望是靠每個成員的申明,因為他們可能會虛報自己的工作量。

挖礦工分

對於這個問題,我們有一個簡潔的解決辦法。礦工可以通過輸出挖礦工分(mining shares)來證明他的工作量,工分就是那些接近有效區塊的區塊。比如目標值是個前面67位是零的數字,輸出的哈希值必須要低於這個目標才算有效。在尋找這個哈希值的過程中,礦工可能找到其他一些區塊,它們的哈希也有許多零,但達不到67個。礦工可以用這些區塊來證明他們確實在工作(見圖5.12),一個合格的工分可能要求40~50個零,取決於礦工所加入的礦池的要求。

圖5.12 挖礦工分

註:礦工不斷嘗試去發現哈希值低於目標區域的有效區塊。在這個過程中他們會發現一些區塊的函數值比目標值少了幾個0——但是已經是非常稀有的,這證明了他們確實在進行繁重的運算工作。在這個圖中,淺色陰影的哈希值就代表工分,深色陰影部分是有效區塊的哈希值。

礦池管理員也會作為參與者之一運行比特幣節點,收集交易並組裝區塊。他會把他自己的接收地址放在幣基交易裡,然後把這個區塊發給所有礦池裡的礦工們。礦工們收到後會在這塊上面開始挖礦,最後遞交工分來證明他們確實進行了運算工作。

當礦池一個成員找到了一個有效區塊,他會把這塊發給礦池管理員,然後管理員會根據大家的工作量按比例分配獎勵。發現這個有效區塊的礦工並不會因此獲得特別獎勵,所以如果其他礦工的工作量更大,那麼其他礦工就會獲得更多的獎勵,即使他們並不是真正發現有效區塊的人。如圖5.13。

圖5.13 挖礦獎勵

註:圖上三個礦工在同一區塊上挖礦。他們最後的獎勵是根據他們工作量的大小來決定的。即使是右邊那個礦工找到了有效區塊,但左邊那個獲得了更多的獎勵,因為他的工作量更大。找到有效區塊的礦工並沒有收到特別獎勵。

礦池管理員如何分配獎勵的方案有好幾種,我們將會探討一下最常見也是最簡單的兩種,也有其他一些方案被不同的礦池使用,但這兩種基本上可以解釋獎勵方案之間的權衡選擇。

工分分紅

在這個模式裡,管理員會對每一個超過特定區塊難度的工分發放固定的獎勵分紅。在這個模式裡,礦工在發送工分之後,管理員馬上就會對其支付獎勵,而不需要等到整個礦池發現一個有效區塊。

從某些方面來說,工分分紅的模式對礦工是最有利的,他們可以確保每次發現一個工分的時候都有一定的收入,而管理員其實擔當了所有的風險,因為無論礦工是否找到有效區塊,他都必須按照工分支付獎勵。當然,和其他模式相比,因為風險的增加,管理員也會收取更高的管理費用。

這個模式的問題是,礦工沒有動力把有效區塊提交給管理員。也就是說,即使把有效區塊丟棄了,他們也會得到同樣的獎勵,但對整個礦池來說是個巨大的損失。一個惡意的管理員可以作為礦工參與另外一個礦池,用這個方法攻擊另一個競爭對手,讓他的礦池無法維持下去。

按實際比列分紅

在這個模式裡,不是按照工分分發固定分紅,每個工分所能得到的分紅,取決於整個礦池是否可以找到一個有效區塊。每次找到一個有效區塊,區塊獎勵(25個比特幣再加上交易費)會按照每個礦工的實際工作量按比例分配。

在這個模式裡,礦工仍然會承擔與礦池風險成一定比例的風險。但是如果礦池足夠大,發現有效區塊的概率波動會相當低。按實際比例分配的模式大大降低了礦池管理員的風險,因為只有礦池發現有效區塊的時候才會支付礦工獎勵。這也解決了工分分紅模式的問題,礦工有動力把有效區塊提交給管理員,因為只有那樣他們的獎勵才會被相應發放。

相比工分分紅模式,這個模式略微增加了管理員的工作量,他要校驗、計算和分配獎勵。

礦池跳換

即使只有這兩種礦池運營模式,我們可以看到礦工有動力去時不時地進行礦池跳換(pool hopping)。比如,一個按實際比例運行的礦池很快發現有效區塊時,不管有效區塊被發現的間隔是多久,管理員都會快速支付礦工獎勵。

一個聰明的礦工可能嘗試在挖礦週期的早期(也就是上一個區塊剛剛被發現),在按實際比例分紅的礦池中挖礦,這個時候的獎勵可能相對比較高,然後只在週期的後期切換(「跳」)到一個工分分紅模式的礦池,這個時候按實際比例分紅的礦池收益可能相對較低。這樣導致的結果就是按比例分配的礦池可能無法運行。實際上更加複雜的方案可以防止這種礦工行為,比如「根據最近N個工分提交的結果才分配」是比較平常的做法,但即使這些方案也有可能誘發礦工跳換的行為。如何設計一個礦池方案以使其更好地防止這種行為,仍舊是一個有待解決的問題。

歷史和標準化

礦池興起於2010年比特幣的GPU時代,並迅速變得十分受歡迎。道理很簡單,因為它降低了礦工的概率波動風險。時至今日,礦池已經發展得十分先進。已經有很多礦池管理協議應運而生,甚至有人建議這些礦池管理協議應該被標準化,並且作為比特幣本身的一部分。就像比特幣的點對點網絡協議一樣,這些礦池協議也提供了一種特定的通信應用程序編程接口(Application Programming Interface,簡稱API),用於礦池管理員與每個礦工交流分派工作和礦工們遞交工分給管理員。獲取有效區塊模版(getblocktemplate,簡稱GBT)就作為一種標準化的礦池協議放進了比特幣改進方案(Bitcoin Improvement Proposal,簡稱BIP)之中。一種被稱為層(stratum)的競爭協議,目前在實際中運用很廣泛,就是一份BIP。不像比特幣本身的協議,從事存在多個互不兼容的礦池協議沒有造成太多的不便。每個礦池可以選擇它們喜歡的協議,然後讓市場來判定孰優孰劣。

有些挖礦機甚至把這些協定放進了硬件,但這最終會對限制這些礦機的靈活性有所限制。然而這使得購買礦機加入礦池變得異常簡單。只需要把礦機插上電並連接上網絡,選擇一個礦池,然後這個礦機立刻就會接受該礦池的指令開始挖礦,並把電力消耗轉變成收益。

51%的礦池

2015年早期的時候,絕大部分礦工都通過加入礦池來挖礦,只有很少的礦工還在單獨挖礦。而在2014年6月,網絡裡最大的礦池GHash.IO,曾經變得如此巨大,其算力甚至超過了比特幣全網算力的50%。主要是因為這個礦池給礦工優厚的獎勵,以至於大家都想加入。

圖5.14 (a)礦池的算力分佈

資料來源:blockchain.info(2014年6月)

圖5.14 (b)礦池的算力分佈

資料來源:blockchain.info(2014年8月)

圖5.14 (c)礦池的算力分佈

資料來源:blockchain.info(2015年4月)

但這也是比特幣社區一直所擔心的,也導致了對GHash的反擊。到了8月,GHash不再接受新用戶而主動下調了一些比例。即便如此,兩個礦池依然掌控了整個網絡一半左右的算力。

到了2015年4月,形勢改變了許多,至少從表面上來看變得不是那麼集中。但一個礦池掌控51%的算力依然是社區裡一個令人擔憂的問題。然而GHash遭受的負面的公眾效應讓很多礦池意識到這個問題,並盡量避免增長得過大。隨著新的礦工加入市場,標準化的協議使得礦池之間的切換更加容易,礦池的市場份額一直在變動。礦池在長期如何發展,目前還不明朗。

無論如何,礦池有可能會掩蓋這樣一個事實:實際上的算力集中在幾個大的挖礦機構手上,這些大的機構可以同時參與多個不同的礦池以掩蓋它們的真實規模。這種做法被稱為「洗算力」(laundering hashes,類似於洗錢)。因為礦池的原因,發現洗算力變得非常困難,這也使得外人無法知曉礦機的實際物理控制有多麼集中。

礦池是有益的嗎

礦池的好處在於礦工挖礦變得更加容易預測,也讓小礦工更加容易參與。如果沒有礦池的存在,挖礦效益上的概率波動會讓小礦工承受不起。

礦池另外的一個好處在於,每一個礦池都有一個中心化的礦池管理員在網絡中組裝區塊,所以網絡更新變得更加容易。只要更新管理員的軟件,即可更新所有礦池成員的軟件。

當然礦池的一大問題是中心化管理。礦池管理員實際掌握了多大的算力是一個問題。當然,理論上一個礦工如果覺得管理員權力太大,可以自由地選擇離開,但實際中有多少礦工會這樣做還不清楚。

另一個壞處是減少了比特幣網絡上校驗全部交易節點的數量(全節點)。以前,無論大小,所有礦工都必須自己運行一個全節點。他們要存儲整個區塊鏈,並校驗每個交易。現在他們把這項工作交給了礦池管理員。這也是我們在第3章中提到的:整個網絡中進行校驗交易的全節點的數目在下降。

如果你對礦池的中心化模式感到不安的話,你可能會問:我們是否可以重新設計挖礦的流程,這樣我們就不需要任何礦池,大家必須自己進行挖礦。我們會在第8章中探討這個問題。

[1] 柏松是18世紀法國數學家,概率學奠基人之一,柏松分佈被廣泛用於各個領域的概率分析。——譯者注

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