共識算法
運行於區塊鏈上的數字資產采用各自不同的共識算法以分配資產。諸如 BTC(比特幣)等資產采用了一套簡單直接的工作量證明(Proof of work,PoW)方法,即通過具備大量算力的硬件計算哈希(Hash)以證明其工作量。PoW 方法的問題在於消耗了過多的能源。根據 University of Cambridge 發布的分析顯示,BTC 網絡一年耗費的電力超過阿根廷整個國家的用電量。此外,由於特定硬件制造的所有權以及廉價能源分布的集中,使得普通用戶不容易參與 PoW 的過程,也使網絡容易受到各種攻擊。
另一種共識算法被稱為權益證明(Proof of stake,PoS),該方法存在多種不同形式,但仍存在諸如易通過交易所集中控制資金、依賴定期與網絡進行同步、以及普通用戶不易參與其中等的顯著缺點
在分布式共識系統中,系統的運作依賴於特定種類的可被加密驗證(Cryptographically verifiable)且稀缺(並非無限獲得)的資源,以抵抗 Sybli 攻擊。PoW 與 PoS 中的稀缺資源分別是計算能力與權益。而在空間與時間證明(Proof of space and time,PoST)共識算法中,Chia 采用了存儲空間作為稀缺資源。由於存儲空間並非無限,因此他們認為,空間證明是更加貼近於比特幣最初的“一個 CPU 一票”的理想替代方案。例如,擁有 300 GiB 的用戶擁有三“票”,而擁有 500 GiB 存儲容量的用戶則有五“票”。這里的“投票”指的是在區塊鏈上贏得並且驗證該區塊的機會。
而在 Chia 的共識算法中,僅僅采用空間作為稀缺資源是不夠的。因此,PoST 共識算法引入了時間作為另一種稀缺資源。該算法創建了一種可驗證延遲函數,以作為時間已經被流逝的證明。通過時間與空間的結合,Chia 構造了這樣一種挖礦場景:用戶將數據存儲在硬盤驅動器上一段時間,而贏得區塊記賬權利的機會與分配的空間大小成正比。該機制通過與彩票中獎類似的方式,允許所有普通用戶均可參與其中,而不需要任何特殊硬件、資金以及注冊才可加入。
空間證明
從概念上來講,Chia 采用下列方法來實現對存儲容量的證明:
- 驗證者向證明者發出一項質詢(Challenge),然后
- 證明者向驗證者證明在某一時刻,驗證者保留了特定數量的存儲空間
空間證明的實現細節非常復雜,有興趣的讀者可以參閱這一篇文章。DGideas 博客將會在未來詳細討論該證明的理論依據。不過簡言之,對空間的證明由以下三個階段組成:標繪(Plotting)、證明(Proving,即挖礦過程),以及驗證(Verifying)。
Chia 共識算法白皮書中對於空間證明的示意圖,首先證明者(Prover)標繪或分配部分硬盤空間 (1). 然后通過空間證明 (2,3,4). 來響應質詢以實現挖礦過程,驗證者檢查該證明對該質詢是否有效
Plotting
標繪(Plotting)過程即硬盤容量的初始化過程。證明者(挖礦用戶)是任何擁有至少 100 GiB 可用空間的人,也可能有擁有大量未使用空間的企業。存儲空間容量不設上限。標繪過程可能持續幾個小時到幾天的時間,該過程只需執行一次。經過初始化的空間被一個稱為 plot
的文件占用。繪圖文件(plot
文件)的大小由參數 𝑘 決定,其中占用空間為 780𝑘∗2𝑘−10,而最小的 𝑘 取值為 32,即文件大小為 101.4 GiB。
從 Chia 1.0 版本始,使用快速的商業計算機能夠在六小時之內創建一張 k32 繪圖文件,而對於具有單核心 CPU 以及幾 GB 內存的慢速計算機來說,這個過程可能需要 24 個小時。PopSpace 的構建基於 Beyond Hellman 的這篇論文,但是嵌套了 6 次並包含較小的修改。
以 𝑘=32 為例,經過以上操作,我們得到的 plot
文件包含七個具有隨機數據的查找表,每張表中有 2𝑘 個條目。表 𝑖 中包含兩個指向表 𝑖−1 (上一個表)的指針。最后,每張表 1 的條目都包含一對介於 0 和 2𝑘 之間的整數,稱為“x 值”。空間證明是具有一定數學關系的 64 個 x 值的集合。
一旦證明者完成了繪圖文件的生成,就可以准備接受質詢並創建證明。這種共識算法吸引人的一點就在於它是非交互式(non-interactive)的:創建繪圖文件的過程不需要任何形式的注冊或者互聯網連接。類似於 PoW(工作量證明)算法,在獲得獎勵之前,任何人無法 Chia 修改區塊鏈。
Proving
證明(Proving)過程旨在通過對挑戰者發出一系列質詢來證明他們已經按照共識中的指定方法使用了一定量的空間。當挑戰者(挖礦用戶)接收到質詢后,他們需要檢查自己的 plot
文件,生成證明,並且將任何獲勝的證明提交到網絡中以進行驗證。
每一輪的質詢過程都可以抽象為一個表查找問題。每次質詢以一個 256 位的二進制序列作為輸入,而期待挑戰者得到一個證明作為輸出結果。挑戰者通過從上文所述生成的表 7 中讀取一系列值以應對質詢,它們指向表 6 中的兩個條目,以此類推。最后,挑戰者得到了整個 x 值樹:該過程需要對表 7 進行一次讀取,對表 6 進行兩次讀取,以此類推。假設用戶使用的是查找時間為 10ms 的慢速機械硬盤,整個查找過程大致需要 640ms。整個過程涉及的數據量很小,且與繪圖文件的大小無關。
由於此過程生成的大多數證明都不夠好(下文中討論),無法提交給網絡進行驗證,我們可以優化這個過程,即只檢查樹的一個分支,從而最終只會生成兩個 x 值(而非整個 x 值樹),具體取決於任務。然后,我們將以此方式生成的 x 值散列為 256 位的字符串,以確認證明是否正確。對這些 x 值進行散列處理后,我們便得到了質量字符串,即長度為 256 位的隨機值。通過該值與難度系數,以及 plot
的大小相結合,可以生成 required_iterations
(所需迭代次數)值。如果該值小於某一個特定數目(表示挖礦成功),那么我們就會查找整個 PopSpace。經過優化后,在慢速硬盤上查詢一個分支的時間就降低到了 7 次讀取與查找,即約 70ms 的時間。
繪圖文件的結構,64 個標注為紅色的 x 值表示證明,2 個綠色的值表示質量
對於質詢過程,更進一步的優化方式是使某些比例(如 511512)的圖不符合每個質詢的要求,這種方法被稱為“繪圖過濾器”。舉例來講,要求質詢字符串與 plot_id
以九個 0
開頭。這種要求對所有人均一致(對 Replotting 攻擊者除外),因此是公平的。這使得挖礦幾乎不消耗任何資源,並且每分鍾磁盤讀取量很少。Chia 資產的用戶已經使用單個 Raspberry Pi 設備實現了幾個 PiB 的存儲。Chia 共識算法白皮書中提到,他們假設用戶使用的是廉價低速的機械硬盤驅動器,因為他們的價格比較便宜,並且由於讀取速度和挖礦效率無關,所以這些用戶無需使用固態硬盤。但是,可以使用固態硬盤或者內存實現更快的繪制(Plotting)過程。
Plot key 是存儲在繪圖文件中的私鑰。而 plot ID 通過散列化繪圖文件的公鑰以及礦池的公鑰進行簽名。要創建具有空間證明的塊,需要同時使用 Plot key 和 Pool key 進行簽名。因此,創建繪圖文件后不會對礦池產生影響。實際上,Plot key 是由 plot
中存儲的 Local key 與挖礦軟件中存儲的 Key 通過 2/2 BLS 聚合公鑰得到的。為了安全和高效,證明者可以通過此密鑰和簽名方案來運行集中式服務器。服務器可以連接到存儲許多 plot
的“收割機”。挖礦的過程需要證明者的密鑰和本地密鑰,但不需要池密鑰,因為可以將池的簽名緩存並重用於許多區塊。
Verifying
驗證(Verifying)過程則簡單得多,當挑戰者成功地創建了空間證明之后,驗證者可以通過執行一些散列操作並與證明中的 x 值相比較以確定是否證明成功。回想一下,我們已經說明證明是一個含有 64 個 x 值的列表,其中每個 x 值有 𝑘 位長。對於 k32 來說,一共就是 256 字節長,因此非常緊湊。然而,雖然驗證的過程非常快,但還不足以快到能夠在 Ethereum 上(實現跨鏈的可靠傳輸)進行可靠的驗證,因為驗證過程需要 black3 和 chacha8 操作。
時間證明
對於時間,或者說可驗證延遲函數(Verifiable Delay Function,VDF)的證明過程,實際上是對於順序函數執行過一定次數的證明。
可驗證性(Verfiable)意味着在執行計算(這需要時間)之后,證明者可以在很短的時間內創建一個很小的證明,並且驗證者可以在不必重新進行整個計算的情況下驗證該證明。
延遲(Delay)意味着證明者實際上花費了大量時間(盡管我們不知道確切多少)來計算函數。
函數(Function)意味着它是確定性的:在相同的輸入 𝑥 上計算VDF 總是得到相同的結果 𝑦。
這里的關鍵詞是“順序性”,即意味着證明者不能僅僅通過購買更多的機器來提高運行速度,這與比特幣等的 PoW(工作量證明)不同。一種要求順序時間的方法是多次哈希:hash(hash(hash(𝑎))) 。因此,我們可以假設對 VDF 的計算需要消耗一定的真實時間。Chia 使用的構造是重復平方:證明者必須對質詢進行 2𝑇 次平方,這需要 𝜃(𝑇) 的時間,證明者還必須創建證明已正確執行的證明。
驗證者(區塊鏈)向證明者(時間領)發送質詢,而證明者計算輸出與針對輸出的相應證明
接下來所述細節對於理解共識算法並不是很重要,但是對於選擇要使用的 VDF 還是很重要的。因為如果攻擊者獲得了速度更快的計算機,則可能仍會發生某些攻擊。
Chia 使用的 VDF 是在未知順序的類群中重復平方。生成具有未知順序的大群主要有兩種方法:第一種是使用 RSA 模數,將整數 mod 𝑁 作為一個組。如果你采用多方計算(Multi-party Computation,MPC)形式,即在擁有許多參與方的情況下生成你的模數,那么這個組的順序就是未知的。另一個更簡單的方法是使用具有大質數判別力的類組,這就是具有未知順序的組。這不需要任何復雜或可信的設置,Chia 采用這種方法。要創建這些組之一,只需要一個大的隨機質數。缺點是類組代碼在真實世界中獲得的測試較少,而且優化也不如 RSA 組那樣廣為人知。我們使用相同的初始元素進行平方(𝑎=2,𝑏=1 類組元素),而根據挑戰為每個 VDF 生成一個新的隨機質數,作為判別子。判別子的大小為1024位,也就是說證明大小在1024位左右。我們使用 Wesolowski 方案分成𝑛(1≤𝑛≤64)個階段,這樣創建證明的速度非常快。由於 n-wesolowski 證明可能會很大,所以我們一旦有 1-wesolowski 證明就用它們來代替,因為這些證明比較小,但需要更多的時間來生成。證明本身並不體現在鏈上,因此它們是可以替換的。
簡言之,VDF 接收一個輸入,稱為質詢,並產生一個輸出,同時產生一個證明,證明函數的評估是正確的。
將一個值注入到一個 VDF 中意味着該值與一個 VDF 的輸出相結合,生成一個新的值,作為下一個 VDF 的輸入/質詢。因此,我們是將 VDF 串聯起來,但在中間提交一個新的值(塊)。這樣做是為了讓我們有一個塊的線性進展,交替進行空間證明和時間證明。
總結
在本篇文章中,我們回顧了空間證明(Proof of space)與時間證明(Proof of time)的實現思路,並討論了影響細節的安全問題。
讀者可能注意到,我們目前僅討論了 Chia 共識算法中所涉及的兩種稀缺資源的證明方式,而仍未涉及到如何贏得並驗證區塊的方法。我們將在后續文章中詳細介紹相關細節實現。