8.4 不能外包的解謎算法

我們現在再看一下對於替代挖礦解謎的另一個設計重點:防止礦池的產生。我們在先前的第5章裡談到,大部分的比特幣礦工都會加入一個礦池,而不是獨立挖礦。這就造成了少量礦池擁有絕大部分挖礦算力的現象。由於每個礦池都有一個中心化的管理方,有些人擔心這其實違反了比特幣去中心化的核心設計原則,會危害到比特幣的安全性。

擁有大部分算力的礦池顯然是一個問題,任何一個中心化管理的礦池可能會實施一套自定義的挖礦策略,然後用它來攻擊網絡。這種礦池也是黑客們攻擊的目標,因為通過攻擊礦池可以迅速地控制大量的挖礦算力。礦池管理員也可能會刪改交易或是強迫收取更高的交易費。礦池中擁有大多數礦工,意味著大部分礦工都沒有運行一個完全有效節點。

有意思的是,這些擔憂有著現實世界的影子,比如選票。在美國和其他許多國家,出售選票是非法的。加入一個被一方控制的礦池,和在比特幣的共識協議裡出售你的選票有點類似。

礦池的技術要求

回憶起來,礦池看起來是一個突然發生的現象。並沒有證據顯示,中本聰在比特幣的最初設計中考慮過礦池的概念。在互相不信任的個體之間運行一個有效率的礦池,這樣的事情在最初的幾年裡看起來不太現實。

正如我們在第5章所看到的,礦池通常會指定一個管理員,他有一個大家都知道的公鑰。每一個加入的礦工還是按照往常一樣進行挖礦,然後遞交「近似」或者「部分」答案給礦池管理員,這些答案在低級別難度的時候可能就是一個有效答案,通過這種做法來證明他們做了多少工作量。當礦池中的某一個參與者找到了一個有效區塊的時候,這個管理員會按照每個人所提交的工作量的占比來分配獎勵。雖然有很多種不同的分配方式,但是所有礦池都遵循這個基本模式。

正因為如此,礦池的存在依賴於比特幣的兩大技術特徵。第一,一個礦工很容易通過提交工分來證明(概率上)他所做的工作量。不管實際上找到一個有效區塊是多麼困難,通過設定一個足夠低的合格工分的臨界值,礦工可以容易地證明他們在任意精度的工作量。考慮到我們需要解謎題目可以在任意難度上被創造出來,這個問題看起來很難改變。

第二,礦池成員可以容易地向管理員證明,他們遵守規則並且通過實際運算來尋找有效區塊,然後礦池會作為一個整體接受獎勵。這是行得通的,因為這個礦池的公鑰是被寫進幣基交易,並包括在區塊裡的梅克爾樹上。即使一個礦工找到了一個有效區塊,甚至只是一個近似區塊(也叫工分),他也無法改變整個礦池的公鑰,而成為新鑄幣的接受者。

「區塊丟棄」攻擊(block-discarding attack)

礦池的這種設計有一個弱點:沒有辦法來確保礦工在找到有效區塊的時候一定會提交給管理員。假設有一個礦池成員對一個大型礦池不滿,他可以正常地參與挖礦然後提交工分,但他在找到一個有效區塊(可以讓整個礦池獲得獎勵)的時候,並沒有告訴管理員而是直接把它丟棄掉。

這個攻擊降低了整個礦池的挖礦能力,因為攻擊者的工作量並沒有實際貢獻到挖礦中去。但是這個礦工依然會收到獎勵,因為他看起來也在不斷地提交工分,只是運氣不好沒有找到有效的區塊。如果這個礦池的獎勵設計方案是收入中性的(也就是所有的挖礦獎勵都被分發到每個參與者),那樣的話這個攻擊會讓這個礦池虧損。

這種攻擊被稱作民間攻擊或者是蓄意破壞攻擊,這也被認為是一種蓄意破壞,因為這個攻擊看上去對攻擊者和礦池都是不經濟的、代價不菲的。這個攻擊者本身也會遭受損失,因為他所丟棄的有效區塊將會使他放棄他應該有的一部分獎勵回報。當然,這個攻擊者還是會由於其他一些挖礦解密算法而獲利。

看起來一個理性的礦工不會採用這種策略,因為他會有所損失而不會得到任何實際的回報。但(令人驚訝的是)在某些情況下,這個策略是可以有利可圖的,我們在下文有所討論。但是無論如何,我們想要設計一個全新的挖礦解謎算法,以確保這種策略永遠都是有利可圖的(以抵抗礦池的存在)。

礦池之間的區塊丟棄攻擊

好多年以來,人們都覺得進行區塊丟棄攻擊是無利可圖的,實際上如果兩個礦池之間的互相攻擊卻不一樣。這種方案已經被提出來好多次,伊泰·艾瑞爾(Ittay Eyal)2015年的論文中首次深入分析了這種攻擊模式。

我們考慮一個簡單的案例:假設兩個礦池A和B,每個有50%的全部挖礦算力。現在假設B動用了一半的能力(25%的總體算力)來加入礦池A挖礦,然後把所有找到的有效區塊丟棄掉。我們可以推演,在一個簡單的模型裡,B會贏得5/9的所有獎勵,大於他正常挖礦時候所獲得的50%的獎勵。在這個簡單的案例裡,動用一半的挖礦算力去攻擊礦池A對礦池B來說是一個最佳的策略。

這個案例隨著礦池數量的增加而變得更加複雜。截至本書撰寫之時,丟棄區塊攻擊在實際中還沒有被大範圍觀察到。但長期來看可能性還是存在的,像這類攻擊會對大型礦池的運營產生關鍵影響。

獎勵破壞

我們設計這種攻擊的目的,是讓礦工們即使加入了一個礦池挖礦,也會缺乏向礦池管理員提交有效區塊的動力。目前,只有礦池管理員可以獲取挖礦獎勵,因為管理員要求所有的參與者在他們挖礦的幣基交易中加入一把特殊的公鑰。這個公鑰是否被正確地放入,可以在提交近似區塊的時候被很容易地檢查驗證。礦池管理員是唯一知道私鑰的人,因此可以決定新鑄幣的走向。

但如果我們要求所有的參與者都知道私鑰(這樣一來,當找到有效區塊的時候大家都可以重新定義區塊獎勵的去向)呢?為了做到這一點,我們需要一個解謎算法,每一個解謎運算的嘗試都要求知道幣基交易裡的私鑰。我們可以把解謎從「找到一個區塊,其哈希值低於一個特定的目標」改成「找到一個區塊,這個區塊裡的數字簽名的哈希值低於一個特定的目標」。這個數字簽名必須要用幣基交易裡同一把公鑰來計算。

這樣的解謎算法,會給礦池管理員兩個都不可靠的選擇:他們可以把私鑰分發給所有成員,如此,他們之中任何一人都可以私自挪用全部礦池資金。另外一個辦法是他們可以代表礦池成員進行簽名。計算一個簽名的計算量比計算一個哈希函數要大許多,這樣一來,礦池管理員會承擔主要的苦活與累活,所以最好讓礦池管理員成為一個獨立的礦工。

不能被外包的挖礦的優劣

由於這類解謎算法不能夠有效地(並不是完全不可能)被外包到一個不能被信任的參與者,這就使得成立一個由不被信任的參與者所組成的礦池變得十分困難。它可以有效地阻止所有的礦池形成,即便是像P2Pool這樣成立一個沒有礦池管理員的去中心化礦池。

存在如下爭議,部署這類解謎算法可能會不可抑制地造成更多的中心化,而不是更少。因為概率上較高幅度波動(找到有效區塊而獲得獎勵的概率問題)會讓小礦工們不敢參與挖礦,剩下的只會是大型挖礦團隊。目前,雖然礦池表面上控制了大量的挖礦算力,但還是不清楚如果他們想利用這個優勢來發起攻擊的話,其中許多成員是否會叛逃。大型挖礦礦池和可以承受高幅度收入波動的小礦池,到底哪個風險更大?這是一個未能解決的問題。

設計一個共識協議,理想方案是小額度地獎勵每個找到低等難度解謎答案的礦工,以「自然地」降低概率波動風險。這就意味著礦工們不需要組成礦池,同時小礦工們還可以參與挖礦獲利。僅僅降低每個區塊產生之間的時間間隔不會起到作用——它需要被降低1 000倍或者更多,才能夠在概率風險上與大型挖礦礦池所面臨的情況相當。但到那個時候,每個區塊之間的間隔只有不到一秒,陳舊區塊的數量會變得不可控制的高。還有一個問題,是否存在另一種共識協議,可以做到在不需要瞬時廣播所有解謎結果的情況下,讓解謎運算變得更加容易?

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