1. 程式人生 > >比特幣替代採礦謎題之ASIC效能謎題

比特幣替代採礦謎題之ASIC效能謎題

被設計為ASIC效能應用最廣泛的謎題被稱為“記憶體謎題”——需要大量記憶體來計算,而不是,或者除了大量CPU時間之外的謎題。類似但具有不同概念的是記憶體限制謎題,其中訪問儲存器的時間主導總計算時間。一個謎題可以只是沒有記憶體限制的記憶體困難(memory‐hard),或者沒有記憶體困難(memory‐hard)的記憶體限制,或者兩者兼而有之。這是一個微妙但重要的區別,因為即使CPU速度是計算時間的瓶頸,並行解決大量這種謎題的成本仍然可以由儲存器的成本來支配,反之亦然。通常,對於一個計算謎題,我們需要一些記憶體困難(memory‐hard)和記憶體限制的東西,確保大量的記憶體的需要,且這是限制因素。

為什麼記憶體困難(memory‐hard)和記憶體限制的謎題可以幫助ASIC效能?

計算現代雜湊函式所需的邏輯運算只是CPU中的一小部分,這意味著對於Bitcoin的謎題,ASIC通過不實施任何不必要的功能而獲得了很大的里程。一個相關的因素是記憶體效能的變化(以及每單位效能的成本)遠遠低於不同型別處理器的計算速度的變化。所以如果我們設計一個記憶體困難的謎題,需要相對簡單的計算但需要大量的記憶體進行計算,這意味著解決謎題的代價會隨著記憶體成本的升高而提高。

正如我們所看到的那樣,SHA-256確實沒有記憶困難,它只需要一個很小的256位狀態,很容易適應CPU暫存器。 但是設計一個記憶困難的工作證明謎題並不難。

 

Scrpt

最流行的記憶體困難謎題被稱為scrypt。這個難題已被廣泛應用於萊特幣,第二大流行的加密貨幣,以及各種其他Bitcoin替代品。

Scrypt是一個記憶體困難雜湊函式,最初設計為以難以強制的方式雜湊密碼,所以挖掘難題與Bitcoin的部分雜湊原像謎題相同,除了用scrypt替換SHA-256。

事實上,scrypt之前存在的比特幣和已經使用的雜湊密碼給安全性帶來了一些信心。密碼雜湊具有類似的ASIC效能目標,因為就安全性起見,我們希望具有自定義硬體的攻擊者無法在計算密碼的雜湊值上比合法使用者或伺服器(可能只有通用計算機)的速度更快。

Scrpt基本上有兩個步驟。第一步是用隨機資料填充隨機存取儲存器(RAM)的大量緩衝區。第二步是以偽隨機順序讀取(並更新)該儲存器,要求整個緩衝區儲存在RAM中。

 

Scrypt偽碼

1 def scrpt(N,seed):

2v=[0]*N//initialize    memory buffer of length N

//Fill up    memory buffer with pseudorandom data

3v[0]=seed

4for i = 1    to N:

5v[i]    =SHA-256(v[i-1])

//Access memory buffer in a    pseudorandom order

6x=SHA-256(v[N-1])

7for i = 1    to N:

8j=x %    N//Choose a random index based on    X

9X=SHA-256(X^V[j])//Update    X based on this index

10 return X

 

Scrypt虛擬碼演示了核心原理,但我們省略了一些細節:實際上,scrypt在稍大的資料塊上工作,填充緩衝區的演算法稍微複雜一些。

為了看看為什麼scrypt是記憶體困難的,我們設想試圖在不使用緩衝區V的情況下計算相同的值。這肯定是可以的——然而,在第9行中,我們需要重新計算值V[j],這將需要計算SHA-256的迭代次數。因為在迴圈的每個迭代期間j的值將在0和N-1之間被偽隨機選擇,所以這將需要大約N / 2個SHA-256計算。這意味著計算整個函式現在將使用N*N/2=N的平方/2 SHA-256計算,而不是使用2N,如果使用緩衝區。因此,使用記憶體將scrypt從O(n)函式轉換為O(N)。這應該很簡單的選擇n足夠大,O(n)足夠慢,使用記憶體更快。

時間記憶權衡

雖然在沒有大型記憶體緩衝區的幫助下計算scrypt要慢得多,但仍然可以以較少的記憶體成本獲得更多計算。假設我們使用大小為N /2(而不是大小N)的緩衝區。現在,如果j是偶數,我們只能儲存值V [j],丟棄j是奇數的值。在第二個迴圈中,大約一半的時間將選擇j的奇數值,但現在可以很容易地實時計算——我們只是計算SHA 256(v[j-1]),因為v[j-1]將在我們的緩衝區中。由於這是大約一半的時間,所以它增加了N / 2個額外的SHA-256計算。

因此,將我們的記憶體需求減半將SHA-256計算的數量增加了四分之一(從2N到5N / 2)。一般來說,我們可以使用SHA-256的N / k儲存器和計算(k + 3)N/ 2次迭代來僅儲存緩衝器V的第k行。

在極限中,如果我們設定k = N,我們將回到我們之前的計算,其中執行時間變為O(N)。 這些數字並不適用於scrypt本身,而是漸近的估算。

還有其他的設計可以減輕與時間交換記憶體的能力。例如,如果在第二個迴圈中不斷更新緩衝區,那麼由於需要儲存更新,所以時間儲存的折衷效果會降低。

驗證費用

scrypt的另一個限制是,它需要儘可能多的記憶體來驗證它的計算。

為了使儲存硬度有意義,N將需要相當大。這意味著,單次計算的scrypt比SHA-256的單次迭代要貴一個數量級,這是檢查Bitcoin更簡單的挖掘謎題所需要的。

這有一些負面的後果,因為網路中的每個客戶都必須重複這個計算,以便檢查所聲稱的新區塊是否有效。

這可能會減緩新區塊的傳播和接受程度,並增加分叉的風險。這也意味著每個客戶端(即使輕量級的SPV客戶端)都必須有足夠的記憶體來有效地計算該功能。因此,可用於密碼學中的scrypt的記憶體量N在一定程度上受到實際問題的限制。

直到最近,還不知道是否有可能設計一個難以計算記憶體困難但很快驗證(易於記憶)的挖掘謎題。

這個屬性對於密碼雜湊是沒有用的,它們在使用加密儲存器之前一直是記憶體苦難功能的主要用例。

在2014年,約翰·特羅姆普(JohnTromp)提出了一個叫做杜鵑迴圈的新謎題。杜鵑迴圈是基於從布魯克雜湊表生成的圖形中找到週期的難度,該表是僅在2001年提出的資料結構。

如果不建立一個大的雜湊表,沒有任何已知的方法來計算它,但可以通過檢查(相對較小)的迴圈來簡單地進行驗證。

這可能使記憶體困難或記憶體限制的工作證明更有用於比特幣共識。不幸的是,沒有數學證據表明這個函式不能有效地計算,而不使用記憶體。

通常,新的加密演算法看起來是安全的,但是社群不會相信,直到他們已經存在多年,沒有發現攻擊。由於這個原因,最近發現的布穀鳥迴圈在2015年之前並沒有被任何加密的使用。