'抗ASIC的工作量證明:究竟是現實還是幻想?(二)'

"

演講人 | Howard Chu:

軟件工程師和優化天才,擁有世界上最快的多處理器TCP堆棧,世界上最快的Appletalk堆棧,世界上最快的LDAP服務器,比實時語音識別更快,比實時雷達數據解複用器/解碼器更快等。

"

演講人 | Howard Chu:

軟件工程師和優化天才,擁有世界上最快的多處理器TCP堆棧,世界上最快的Appletalk堆棧,世界上最快的LDAP服務器,比實時語音識別更快,比實時雷達數據解複用器/解碼器更快等。

抗ASIC的工作量證明:究竟是現實還是幻想?(二)

現在,你認為什麼是工作量證明算法呢?如今工作量證明只是一個延遲循環。工作量證明的目標是耗時又耗能,而且還低效。這於我而言,是一種精神上的打擊,我花費畢生精力在構建高效軟件、調優編譯器上,只為追求低能耗高效率。但你靜下心沉思時,就能發現哪種運算昂貴,哪種運算低廉。這賦予我們一個如何寫出最低效算法的特殊視角。另一個我陷入的難題是隱私、去中心化這兩樣東西與效率無法共存。高效系統無一例外都傾向於中心化,事實上,不僅工作量證明證實了這一點,大部分系統中心化的話效率也就更高。比如網絡通信,你如何保證跨網絡的通信安全?整個週末我們探討了大量隱私相關話題,大家將隱私(privacy)和保密(secrecy)混為一談,兩者有一個很大區別:隱私只是保密的一個子集。如果你在兩個端點間有一條加密通信渠道,比如TLS協議層,你保證了通信渠道中的信息安全,但事實你並沒有保證通信渠道的安全。外人知道你在通信,雖是私人間的對話,但並不保密。保護自己的隱私並不會破費太多,AES加密通道費用相當低廉,而且我們有AES加速硬件。但如果要保密某件事,防止他人得知,那麼成本就會高出許多。保證通信渠道隱私,就必須在渠道中添加大量噪音,用噪音掩蓋你真正發送的信息。所以當你追求高效時,就與隱私和保密相違背,因此採用低效、去中心化的工作量證明著實困擾著我,但我們還是努力去攻克它。

我們想要把RandomX設計成一種既低效又耗能,還要應用大量的CPU的算法。從一張AMD Zen core的區塊圖可以得知,在圖的上方是前端,有指令緩存、解碼器、分叉預測器、運算緩存;在中層,有整數運算單位、浮點數運算單位;在底層有內存接口和數據緩存。

運行RandomX需要應用Core的所有組件,除此之外不應用任何組件。CPU芯片擁有其他交互界面。RandomX有一個PCI Express接口,有一個管理總線用於芯片間通信、系統管理,這些是我們無法真正高效利用的功能,因為這些功能都是某些設備專有的。雖然無法將這些功能從一枚芯片解析到另一枚芯片上,但我們可以利用所有核心組件和內存接口。

如何做到?先生成一個隨機程序,將隨機程序翻譯為機器代碼,然後執行隨機程序並轉換輸出,最有趣且最重要的是第三步。我們期望第一步和第二步的成本趨近於0,因為這兩步並沒有真正貢獻。

前面我也有提到,生成隨機程序這一步有點麻煩,如果你使用的是一種高級語言,就必須根據嚴格的規則構建程序,否則代碼不會執行程序。所以標準的方法是構建一棵抽象語法樹,樹上的每一個支點都是隨機程序的語句。從抽象語法樹下載源代碼,然後將源代碼提交給編譯器,編譯器解析源代碼,並轉換為一棵抽象語法樹。這樣會產生大量多餘工作。如果構建一個ASIC芯片來處理,就可以避免多餘工作,提高效率。因此構建RandomJS的想法破裂了。現在最好的方法是生成隨機字節,不用語法,不按照構建規則。

然後將隨機程序轉換為CPU原生機器代碼,並非只適用x86架構,還需適用當今ARM和CPU這樣的大型架構。因此我們需要使用簡單的機器指令,才能輕鬆地映射到真正的機器指令中。只是我們沒有剩餘時間來開發一個優化版的編譯器,因為分析和重寫代碼花費的時間,等於沒有生成哈希的時間。

所以實際的程序都必須應用盡可能多的CPU組件,為了使用芯片上所有的可用緩存層,我們解析了大量CPU配置文件。我們正在使用芯片上的指令緩存,充分利用整數運算以及浮點數運算,真正打敗了內存控制器。

我們使用的是Blake 2B,一個專門運行在CPU設備上的加密哈算法,來計算最終結果。對於大型計算,我們仍使用AES算法,AES運算出色是因為大多數現代CPU都有AES加速硬件。如果無加速硬件,就不能應用AES算法。

如果你要分析一個程序,會出現一個問題,你需要高度優化部分運算,你可以查看該程序計算你的交易是否較慢,如果慢你可以跳過。如果運算較快,我就會執行該程序,快速獲得哈希值。因此為了優化部分運算,我們必須鏈接多個程序,強制執行實現,要麼運行整個程序,要麼跳過程序。

鏈接程序的一個關鍵阻礙是,驗證時間必須與Cryptonight大致相同。因此給程序不能過於複雜。

我們使用大量內存是讓你不再使用芯片內存,所以我們使用2字節以上,現實中如今的芯片可以建立2字節內存,但非常昂貴。我們預計內存數量能滿足未來幾年的需求。而且,未來我們可能會增加內存大小。

我們的輕模式無需2字節RAM內存,只需256 mb即可,如果進一步減少內存,減少至128mb,速度上可能要慢上3700倍。

當前RandomX代碼已預備好運行在monerod x86系統中。但我們仍需在ARM上實現RandomX。GPU方面工作正在進行中,還支持在Nvidia、CUDA實現以及用一種OpenCL版來支持AMD GPU(非通用版OpenCL),此版本的OpenCL仍使用大量AMD特定彙編代碼。當前我們已完成4次安全審計。

原文:https://www.monerooutreach.org/monero-konferenco/howard-chu.php

稿源(譯):https://first.vip/shareNews?id=2092&uid=1

翻譯 | Tracey_頭等倉

採編 | 筋斗雲_頭等倉

"

相關推薦

推薦中...