MimbleWimble是一種區塊鏈協議,依靠強大的加密原語提供極佳的可擴充套件性,隱私性和可替代性。MimbleWimble協議的專案主要目標和特點——隱私,這使得從交易的公開資訊無法追蹤交易金額、傳送方和接收方;採用Utxo刪減和最小化交易數量(<100位元組核心),與其他區塊鏈相比節省大量空間;強大且經過驗證的密碼學, MimbleWimble只依賴於橢圓曲線密碼學,它已歷經數十年的嘗試和測試。近期出現以社群技術驅動的專案Grin使用新的PoW的Cuckoo Cycle演算法鼓勵挖礦。
回顧:Qtum 量子鏈研究院:新型的隱私保護協議MimbleWimble
PoW共識最早由比特幣採用,也是區塊鏈最早使用的一種共識方法。目前為止PoW是容錯能力最好的公有鏈共識機制。公有鏈的安全基石是共識機制,PoW以物理算力為基礎,當鏈的算力達到一定規模後,像比特幣,由於必須擁有全網一半以上的算力(51%攻擊),這使得攻擊非常昂貴,在算力比較去中心化的時候,很難發生算力攻擊。
所以演算法選型傾向於算力的分散化(抗並行挖礦演算法)。這是通過使主儲存器延遲成為瓶頸來實現的,因為DRAM延遲保持相對穩定,而CPU速度和儲存器頻寬在硬體架構和處理技術之間變化很大。
常見的POW演算法型別
純hash型別的演算法:隨機碰撞、計算困難
Equihash類演算法:廣義生日悖論問題、memory-hard
ethhash:基於DAG解決約束、memory-hard
Cuckoo Cycle:圖論式工作模式證明、memory-hard
Cuckoo Cycle
而在此之上延伸出PoW的Cuckoo Cycle演算法,該演算法是一種更平等的共識方式,可以最大限度地降低硬體架構中的效能差異,並使硬體的開採具有成本效益。
Cuckoo Cycle是一種新穎的圖論理論演算法設計,它結合了可擴充套件的記憶體需求和即時可驗證性。此外,它也是第一個設計執行時記憶體延遲主導。除非出現任何無法預料的記憶體時間權衡,否則它會產生近乎理想的記憶體限制工作證明,其商品硬體的成本效益可以極大地有利於礦業的分散化。
Cuckoo Cycle的一個有趣特性是製造ASIC並不符合成本效益。儘管如此,ASIC幾乎無法避免,因此在某些時候,用於Cuckoo迴圈的ASIC將變得可用。然而,即使發生這種情況,硬體製造商也無法在普通使用者上建立ASIC。
本文主要介紹 Grin 採用的 PoW 共識演算法 —— Cuckoo Cycle。
Grin的PoW演算法:Cuckoo Cycle
Grin的基本Proof-of-Work演算法稱為Cuckoo Cycle,2014年由John Tromp 發明。它主要是一種記憶體約束演算法,意味著解決方案時間受記憶體頻寬而非原始處理器或GPU速度的約束。 因此,Cuckoo Cycle的解決方案應該在大多數商品硬體上都是可行的。 Grin 引入了兩種POW演算法。主要演算法是被設計為 ASIC 友好的,而次要演算法是抗 ASIC 的。在最初發布時,Grin 挖礦從最初抗ASIC 逐漸過渡到對ASIC友好。
網路啟動時90% 的區塊將會被次要演算法挖出,而主要演算法只會挖出大約 10% 的區塊。主要演算法稱為Cuckatoo31+,次要演算法Cuckaroo29 ,Cuckaroo29抗ASIC是通過每6個月改變一次演算法來實現的。
Cuckoo Cycle問題
Cuckoo Cycle問題是指從Cuckoo圖中找到一個L長度的環。Cuckoo圖是一個二分圖, 其中邊(即連線節點的線)僅在2個單獨的節點組之間連線的圖。由N個節點和M個邊組成, 節點採用Cuckoo雜湊表表示。
圖的一側是用奇數索引編號的陣列(最大為圖的大小),另一側用偶數索引編號。下面的簡單圖表就是這樣一個圖形,偶數側(頂部)有4個節點,奇數側(底部)有4個節點,4條邊。
Cuckoo Cycle的存在概率
要保證POW的工作量證明的安全性和公平性,意味著需要所有參與方無法通過某種方法來提高解決問題的概率。Cuckoo Cycle存在的概率,和圖的節點多少,邊的多少有關,隨著M、N的增加,圖中尋找到L大小的環路概率 會趨於穩定。
下圖是L=42時,隨著M/N的比例變化,所能找到的環的概率。可以看到M=29 、31, N=2M,M/N = 50%,此時尋找到L=42的環的概率在1/42。
Cuckoo 圖的Edge修剪和環路檢測
通過計算節點的自由度,反覆修剪小於2的邊(永遠不會成為迴圈的一部分),可以大幅度減少環路尋找演算法所需的邊數 。比如下圖,先是可以把(2,15) (11,12) 的邊剪掉,此時(10,11) (4,15) 又出現可以剪掉的條件,最後剩下右邊的修剪完成對圖,實現其邊數減少了40%。
環路的檢測是從第一條邊開始,依次加入其他邊,在沒有環的時候會形成樹結構;對新加入的邊,根據深度選擇一顆樹,通過回溯根節點判斷是否形成環路。對所有點邊執行一次可以找到所有邊相關的環路,並和目標引數比較,如果有相等長度的環路,即解決問題成功。
Grin的PoW執行流程
當處理完一個塊後,可以得到其區塊頭,對區塊頭的雜湊結合Cuckoo演算法,尋找圖中的環,並對找到的結果進行雜湊和目標難度比較,當小於目標時,PoW工作量完成。其流程如下:
對新塊頭進行雜湊處理以建立雜湊值K
雜湊值K將用作SIPHASH函式的KEY,該函式將為圖中的每個元素生成位置對
通過剪邊,執行Cuckoo迴圈檢測演算法試圖在生成的圖中找到解(即長度為42的迴圈)
對找到的環進行Blake2b雜湊並將其與當前目標難度進行比較
如果雜湊難度大於或等於目標難度,則將塊廣播到網路,並在下一個塊開始工作
如果沒有找到解決方案,則將區塊頭中的Nounce增加1,並更新時間戳,以便下一次雜湊值迭代
參考資料
https://forum.aeternity.com/t/pow-vs-pos/767