工作量證明挖礦

王一洋發表於2018-09-22

在“區塊”這個章節簡短的說明了一下區塊難度這個概念。給予區塊難度意義的演算法叫做工作量證明(PoW)。

以太坊的工作量證明演算法稱之為“Ethash” (之前叫做Dagger-Hashimoto)。

演算法正式定義為:

m代表的是mixHash,n代表的是nonce,Hn代表的是新區塊的頭(不包含需要計算的nonce和mixHash),Hn是區塊頭的nonce,d是DAG ,就是一個大資料集。

在”區塊”章節,我們討論了存在於區塊頭中的多項。其中兩項叫做mixHash和nonce。也許你會回憶起:

PoW函式就是用來估算這兩項的。

mixHash和nonce到底是如何使用PoW函式來計算出來的有點複雜,如果深入瞭解的話,我們可以另寫一篇文章來講解了。但是在一個高層面上,它大致就是這樣計算的:

會為每個區塊計算一個”種子”。每個“時期”的種子都不一樣,每個時期是30,000個區塊長度。對於第一時期,種子就是32位0的hash值。對於後續的每個時期,種子就是前一個種子hash值的hash值。使用這個種子,節點可以計算一個偽隨機“快取”。

這個快取是非常有用的,因為它可以使“輕節點”的概念變成現實,輕節點概念在這篇文章的前面討論過。輕節點的目的就是讓某個節點有能力高效的校驗交易而用不著儲存整個區塊鏈的資料集。一個輕節點可以僅基於快取來校驗一個交易的有效性,因為快取可以重新生成需要校驗的特定塊。

使用這個快取,節點可以生成DAG“資料集”,資料集中的每項取決於快取中少量偽隨機選擇項。為了成為礦工,你需要要生成全資料集,所有全客戶端和礦工都儲存這個資料集,並且這個資料集隨著時間線性增長。

然後礦工可以隨機抽取資料集中的部分並將它們放入一個數學函式中Hash出一個”mixHash”。礦工會重複生成mixHash直到輸出的值小於想要的目標值nonce。當輸出的值符合這個條件的時候,nonce就被認為是有效的,然後區塊就被新增到鏈中。

挖礦作為安全機制

總的來說,PoW的目的就是以加密安全的方式證明生成的一些輸出(也就是nonce)是經過了一定量的計算的。因為除了列舉所有的可能性,沒有更好的其他方法來找到一個低於要求閾值的nonce。重複應用Hash函式的輸出均勻分佈,所以我們可以確保,在平均值上,找到滿足要求的nonce所需時間取決於難度閾值。難度係數越大,所需時間越長。這樣的話,PoW演算法就給予難度這個概念的意義了:用來加強區塊鏈的安全。

我們所說的區塊鏈的安全又是什麼意思?這非常簡單:我們想要創造一個每個人都信任的區塊鏈。像我們之前在這篇文章中討論的那樣,如果存在超過1條以上的鏈,使用者的信任就會消失,因為他們沒有能力合理的確認哪條鏈才是“有效的”。為了讓一群使用者接受儲存在區塊鏈中的潛在狀態,我們需要有一群人信任的一個權威區塊鏈。

這完完全全就是Pow演算法所做的事情:它確保特定的區塊鏈直到未來都一直保持著權威性,讓攻擊者創造一個新區塊來重寫某個歷史部分(例如清除一個交易或者建立一個假的交易)或者保持一個分叉變得非常困難。為了首先讓他們的區塊被驗證,攻擊者需要總是比網路上的其他人要更快的解決掉nonce問題,這樣網路就會相信他們的鏈是最重的鏈(基於我們之前提到的GHOST協議原則)。除非攻擊者擁有超過一半的網路挖礦能力(這種場景也被稱為大多數51%攻擊 ),要不然這基本上是不可能的。

挖礦作為財富分配機制

除了提供一個安全的區塊鏈,PoW同樣也是分配財富給那些為提供這個安全而花費自己計算力的人的一種方法。回憶一下,一個礦工挖出一個區塊的時候會獲得獎勵,包括:

為“獲勝”區塊提供的5 ether靜態區塊獎勵(馬上就會變成3 ether )

區塊中的交易在區塊內所消耗的gas

納入ommers作為區塊的一部分的額外獎勵

為了保證PoW共識演算法機制對安全和財富分配的使用是長期可持續的,以太坊努力灌輸這兩個特性:

儘可能的讓更多的人可訪問。換句話說,人們不需要特殊的或者與眾不同的硬體來執行這個演算法。這樣做的目的是為了讓財富分配模式變的儘可能的開放,以便任何人都可以提供一些算力而獲得Ether作為回報。

降低任何單個節點(或小組)能夠創造與其不成比例的利潤可能性。任何可以創造不成比例的利潤的節點擁有比較大的影響力來決定權威區塊鏈。這是件麻煩的事情,因為這降低了網路的安全性。

在區塊鏈網路中,一個與上面兩個特性有關的一個問題是PoW演算法是一個SHA256雜湊函式。這種函式的缺點就是它使用特殊的硬體(也被稱之為ASCIs)可以更加快速高效的解決nonce問題。

為了減輕這個問題,以太坊選擇讓PoW演算法(Ethhash) 提高記憶體級別難度。意思是此演算法被設計為計算出要求的nonce需要大量的記憶體和頻寬。大量記憶體的需求讓電腦平行的使用記憶體同時計算多個nonce變得極其困難,高頻寬的需求讓即使是超級電腦同時計算多個nonce也變得十分艱難。這種方式降低了中心化的風險,併為正在進行驗證的幾點提供了更加公平的競爭環境。

有一件值得注意的事情是以太坊正在從PoW共識機制漸漸轉換為一個叫做“權益證明(PoS)”的共識演算法。這就是一個比較野心的話題了,我們希望可以在未來的文章中探索這個話題。

相關文章