8.1 算法的基本要求

我們首先來看一下一些挖礦算法的主要安全要求。如果算法本身不能滿足比特幣安全性上的基本要求的話,我們也沒有必要引入一些新奇的特點。

已經有許多可能的要求,有些我們在前面的第2章和第5章中已經討論過。挖礦解謎的結果需要被及時驗證,因為每個在網絡上的節點都在驗證每個解謎的結果,即使是那些沒有直接參與挖礦的節點,包括SPV(簡單支付驗證)的客戶端。我們還需要解謎的難度具有可調整的特徵,解謎難度可以隨著新加入用戶而增大的哈希算力得到調整。這樣一來,解謎過程就可以具備足夠的難度使得對區塊鏈的攻擊變得代價高昂,同時又能保證解謎本身可以在一個穩定的頻率上實現(比特幣系統中大約每10分鐘完成一個解謎過程)。

到底什麼是比特幣的挖礦解謎?

到現在為止我們一直在用「比特幣解謎」這個名稱,更加精確的說法是,我們稱它為一個「不完全哈希函數原像解謎」(partial hash-preimage puzzle),因為這個運算的目的,是找到一個不完全的特定哈希函數輸出值的原像——也就是一個低於某一特定目標區值的結果。除此之外,一些罕見的特徵也可以用來作為比特幣的挖礦解謎運算,比如找到一個區塊,它的哈希函數值至少有k個點位是零,但是通常直接比較既定目標是最簡單的方法。

比特幣用的基於SHA-256挖礦解謎哈希函數,很顯然已經滿足了這兩個要求。它可以通過任意調節一個參數(目標)來靈活增加難度。檢查這個謎底很容易,只需要一個SHA-256計算和一個與目標的比較即可,不管找到這個謎底的過程有多麼困難。

另外一個核心的要求更加微妙:在任意單位時間找到一個謎底的成功率,大致上要與所貢獻的哈希算力成比例。這就意味著,大礦工雖然擁有非常強大的挖礦機,他也只是有著一定比例的優勢來成為下一個找到謎底的礦工。即使是小礦工,也會有一定的機會能夠成功並且獲取獎勵。

為了說明這一點,我們先來設想一個沒有滿足這個要求的不合格解謎過程。想像一下某一個挖礦解謎要經過精確的n個步驟找到一個謎底。例如,不同於我們當前要求的「找到一個SHA-256結果低於某一個固定目標的區塊」的做法,如果要求計算n個連續的SHA-256函數值,這種做法檢查結果會變得沒有效率,但是這個問題目前無關緊要,更大的問題在於,因為這個解謎過程需要精確的n個步驟來完成,所以網絡上解謎更快的礦工將會永遠是獲得下一個獎勵的贏家。很快這個情況就變得路人皆知,最快的礦工會完成所有解謎,而其他礦工完全沒有動力繼續參與下去。

再次聲明,一個好的解謎方案,是給每個礦工一個按比例性的成功概率來贏得下一個謎底,這個概率是與他們所貢獻的哈希算力成比例。就好比往一個不同大小色塊組成的目標板上隨機地擲飛鏢,每個不同大小色塊就類似於不同礦工所具有的挖礦運算能力。如果你考慮到這一點,這就意味著你猜中謎底的概率並不取決於你已經做了多少工作去解謎(因為大礦工們總是會做更多的工作量)。所以一個好的解謎是「無關過程的」(progress free)[1]。

從數學角度來看,一個好的挖礦解謎一定是一個「無記憶進程的」(memoryless process)——而任何其他的方法都將由於過去的挖掘工作,不可避免地在一定程度上獎勵挖礦工人。因此,任何可行的解謎從根本上都是一個不斷試錯的過程(trial-and-error)。這種解謎所需要的時間,必然服從一個指數分佈[2],我們曾在第2章討論過。

可以調整的難度、快速驗證和無關過程屬性,是比特幣挖礦解謎的三大核心特徵。基於SHA-256算法的「不完全哈希函數原像解謎」顯然滿足了這三大要求。有些人可能會說其他一些特徵也很重要,我們在後面討論其他潛在功能的時候會提及。

[1] 意思是來得早,不如來得巧,但這個巧後面的學問就大了。——譯者注

[2] 旅客進入機場的時間間隔也是一個指數分佈,後面進來一個人的時間間隔與前面進來人的時間間隔無關。——譯者注

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