jollen / blog

Jollen's Blog
http://www.jollen.org/blog
66 stars 4 forks source link

Blockchain Developer - 簡單易懂的 Memory-Hard Function #32

Closed jollen closed 6 years ago

jollen commented 7 years ago

Bitcoin mining 演算法,就是使用傳統的 SHA-256 函數,而 SHA-256 的優點,也好就是它的一個缺點。

Blockchain Developer - 簡單易懂的 Memory-Hard Function

SHA-256 函數是傳統的 hash 演算法,但是應用在區塊鏈系統時,有一個缺點。Bitcoin mining 演算法,就是使用傳統的 SHA-256 函數,而 SHA-256 的優點,也好就是它的一個缺點。

SHA-256 的問題

為了提升 SHA-256 的計算速度,工程師會利用行平行處理(parallelism)的技術。利用平行運算,大幅提升 SHA-256 的運算速度,這樣做不是很好嗎?

然而,這就是一個問題了。簡單來說,一個能平行化的演算法,就能使用硬體來做加速,例如,使用 GFP 或是 ASIC,這裡就是「弊端」所在了。從 Proof-of-Work 的觀點來看,「大家必須公平地做計算」,意思是說,因為 hash 值的運算是「decentralization」的架構,所以「大家的硬體最好一樣」。

Decentralization of Trust

Proof-of-work 的主要工作是 mining。此外,驗證交易的「可信度」,也是 proof-of-work 的一環。Proof-of-work 的工作不此於此,例如:miner 間的資料庫同步,也是包含在內。總之,proof-of-work 很忙。

這些 proof-of-work 的工作,是 miners 一起進行的,而不是由一個中央伺服器(centralized)來統一運算,這就是 decentralization of trust 的觀念。

更簡單來看,這就是所謂的 decentralization(去中心化)架構。以 mining 來說,每個人都可以參與 hash 值的運算(大家都可以挖礦),所以,想「快一點」的人,就會使用 ASIC 挖礦機。可是,有些人是用自已的電腦來挖礦。

到這裡,問題就很清楚了:大家的硬體如果等級不同,挖礦就會「不公平」。

Memory-Hard Function

為了解決這個問題,科學家就想出了一個方法。這個方法非常簡單,首先,你不可能強制每個人都要買一樣的電腦才能挖礦,所以解決方式就要回歸演算法的本質:parallelism。

於是,科學家提出一種稱為 memory-hard function 的 hash 演算法觀念:一種不能或難以平行化的 hash 演算法。

這讓我想過幾年前的一個有趣故事。過去,多核心處理器開始後,開始有 Android 手機的製造廠,以「多核心手機」做為市場宣傳口號。這當然很好啊,「多核就是快」。但是,學軟體的人都知道一個道理,就是「軟體必須支援多核心」。如果你的軟體設計,本身就不是多核心架構,那就會像這支手機一樣:明明是 4 核心,但是開機後,其實只用了 1 個核心,另外 3 個核心被關閉(省電考量)了。

有了 memory-hard function 後,「挖礦」就理論上公平了,並且也能消息弊端。因為,就算有頂極的挖礦機,也會像這支多核心手機一樣:再強的硬體也很難加速軟體運算。

Memory Intensive

Memory-hard function 是怎麼做到這點的呢?上述的「一種不能或難以平行化的 hash 演算法」,其實是利用這個原理:降低平行處理的優勢。讓平行處理難有發揮的空間,這樣就能降低 GFP、FPGA 或 ASIC 控礦機的優勢了。

要消除平行處理的優勢,只要讓軟體是 memory intensive 即可。Memory intensive 是每天都會看到的現象:記憶體不足時、電腦變慢。

Memory-hard function 的原理就是這樣,在 hash 運算時,可以透過「亂塞一堆資料到記憶體」的方式,降低硬體的運算優勢。這就是 hash 演算法,就稱為 memory-hard function。

Argo2

Argo2 是屬於 memory-hard function 的一種演算法,Blockchain 開發者會知道它,是因為 Argo2 在 2015 年,從 24 個參賽者中,拿下 PHC 競賽的優勝。

小結

Argo2 可以取代傳統的 SHA-256 函數。如果想要知道原因的話,一般的說法就是:Argo2 沒辦法用 ASIC 挖礦機進行挖礦。

接下來,可以試著 fork 一份 block0 專案,導入 Argo2 演算法,並試著比較 Argo2 與 SHA-256 的挖礦困難度。

其它

jollen commented 7 years ago

closed by http://www.jollen.org/blog/2016/12/blockchain-developer-memory-hard.html