如何通過“流水线模式”提高生成證明的效率?

2023-06-16 14:41 Fox Tech


撰文:康水躍,Fox Tech CEO;孟鉉濟,Fox Tech 首席科學家;校對:林彥熹,Fox Tech CTO

前言

在當今的數字時代,隨着區塊鏈技術的迅猛發展,人們對於數據隱私和安全性的關注越來越高。爲了實現更高效、可擴展的區塊鏈應用,諸多解決方案被提出,其中之一便是零知識證明(Zero-Knowledge Proof)技術。零知識證明作爲一種強大的密碼學工具,可以在不泄露敏感信息的前提下,驗證某個陳述的真實性。

近年來,zkRollup作爲區塊鏈擴容技術的重要創新之一,引起了廣泛關注。zkRollup通過將大量交易打包,在鏈下執行,並利用零知識證明的特性來驗證這些交易的正確性,從而顯著提高了區塊鏈的吞吐量和可擴展性。而在zkRollup的實現中,如何對交易進行分配打包,並生成證明,成爲了zkRollup系統的重要組成部分。

在Layer1系統當中,交易以區塊的形式被打包並由礦工來計算。而在Layer2系統當中,交易如何打包,或者說如何產生一個Layer2的塊,需要單獨的考量。

FOX是基於zkEVM的Layer2 zkRollup擴容的項目,對於這個問題,FOX正在探索使用流水线形式的處理方式來對交易分批處理,預期能夠對效率產生很大提升。

本文將深入探討流水线方式生成零知識證明在zkRollup中的應用。首先,我們將分析基本的交易打包方式。隨後,我們將重點聚焦於流水线方式生成零知識證明的技術,詳細分析其原理和應用場景。

常規的交易打包方式

在傳統的區塊鏈系統中,交易的確認和打包是一個耗時且資源密集型的過程。通常情況下,交易被逐個驗證並添加到區塊中,然後通過共識算法達成一致,使得區塊鏈的狀態得以更新。然而,這種逐個驗證和打包的方式存在着明顯的局限性,包括低吞吐量和高延遲等問題。

在常規的交易打包流程中,首先,一批待處理的交易會被收集起來,可以是用戶提交的交易或者來自其他鏈上的交易。然後,這些交易會被驗證,以確保其合法性和有效性。這些驗證包括檢查交易的籤名、驗證交易的有效性和一致性等。一旦交易通過了驗證,它們將被打包成一個批次,形成一個待提交的區塊。

而在zkRollup系統當中,用戶提交的交易同樣首先會被放在交易池中等待,在FOX系統當中,Sequencer會定期抓取交易池中的交易並本地執行以及排序,形成一個交易包,也就是區塊,這個時候會將交易執行結果提交到Layer1,同時還要將這個結果以及交易數據提交給產生證明的Folder節點。

根據我們對零知識證明算法的基本了解(讀者可以參考之前FOX的系列文章),Folder如果想要生成證明必須要得到輸入以及執行完畢的結果,這就使得如果按照常規的方式進行,需要等待Sequencer將所有交易全都執行完畢再交給Folder。爲了更加有效利用計算資源,我們希望讓Sequencer在執行完一部分交易以後馬上交給Folder進行證明生成。

FOX正在探索中的流水线處理模式

爲了實現上述目標,我們需要讓Sequencer對於交易分批執行並在執行完一批之後馬上將中間結果發送給Folder。

具體來講,假設交易包交易總數爲100,單個批次交易數量爲10,則流水线處理方式可以用下圖來表示。

圖1:流水线模式生成交易證明

接下來我們來簡單分析一下兩種方式的時間开銷,並討論一下在什么情況下使用流水线方式會有更高的效率。爲了簡化起見,這裏的討論沒有考慮Sequencer將數據發送給Folder的時間。

設交易包的交易數量爲n,批次數量爲k,Sequencer的執行時間函數爲exe(),Folder的證明生成時間函數爲 prove(),聚合證明時間函數爲aggr(),常規方式總時間爲Sum1,流水线方式總時間爲Sum2。

於是按照上述過程,常規方式依賴於Sequencer先進行執行然後Folder進行證明生成,所需要的總時間爲

Sum1=exe(n)+prove(n)

而流水线方式的時間應該包括Sequencer對於第一批交易的執行時間,以及後邊生成證明的時間和後續批次執行時間的較大者,還有最後的聚合時間。

Sum2=exe(n/k)+max{k*prove(n/k),(k-1)*exe(n/k)}+aggr(k)

所以比較二者總時長,執行時間函數exe()基本可以近似於线性函數,而對於prove(),由於FOX系統的證明算法證明生成時間爲线性函數,故prove()也爲线性函數。

可以得出結論:

  • 若exe(n)>prove(n),則當prove(n)>aggr(k)時,Sum1>Sum2.

  • 若exe(n)<prove(n),則當(k-1)exe(n/k)>aggr(k)時,Sum1>Sum2.

所以說,如果聚合時間aggr(k)足夠小,且證明生成時間爲线性函數,則採用流水线方式非常有助於提升系統效率,減少總的生成證明時間。

上述的分析只對线性時間證明算法成立,從這一點也可以看出FOX採用线性時間證明算法的重要性。

圖2:證明計算流程圖

之所以說流水线方法處於正在探索的狀態,是通過對於這種模式的分析我們可以看出,每一個交易包被分成的批次越多,Sequencer需要記錄和傳輸給Folder的數據就越多,开銷就越大,但是對於Folder而言,單次處理的計算量會降低一些,聚合的過程會更復雜。所以具體如何分割,是一個需要權衡的問題,也具體地依賴於Sequencer和Folder的計算性能。

對交易進行高效分配打包從而逐批生成證明是關鍵優化點

在 zkRollup 實現中,高效地對交易進行分配打包並生成證明是關鍵的優化點。FOX正在不斷地優化模式,尋找更加高效的解決方案。下面是FOX採用的基本流程:

  1. 交易收集:收集待處理的交易,並將其存儲在一個交易池中。這些交易可能是用戶提交的交易,或者是其他系統或合約產生的交易。

  2. 交易排序:對交易池中的交易進行排序,以確定打包的順序。通常,可以使用基於優先級、時間戳或其他因素的排序算法。排序的目標是最大化交易的整體吞吐量和效率。

  3. 交易分配:將排序後的交易分配到合適的區塊中。在 zkRollup 中,通常會創建一個新的區塊來容納一定數量的交易。分配的過程可以使用貪婪算法或其他分配策略,以最大化每個區塊的容量利用率。

  4. 區塊打包:對已分配的交易進行打包,形成一個完整的區塊。在FOX的Layer2架構當中,這個區塊實際上只包含了交易的摘要信息,這個摘要信息可以是交易的哈希或其他形式的緊湊表示,而不是交易的詳細內容,詳細的交易信息會被存儲在FOX的Ringer當中,從而實現數據可用性(DA)。

  5. 證明生成:對打包後的區塊生成相應的證明。這個證明應該能夠證明區塊中每個交易的有效性,以及整個區塊的一致性。FOX的流水线模式主要應用於這個環節,用來更高效地利用Folder算力,將一個區塊當中的交易分批地傳送給Folder進行證明生成。Folder分別對每批交易計算正確性證明,最後再聚合起來。通常,這個證明是基於FOAKS這種快速有針對性的零知識證明算法,通過將區塊中的交易與狀態轉換規則進行比對,驗證它們是否遵循了系統的規則和約束。

  6. 證明驗證:接收方可以使用證明來驗證區塊的有效性,而無需重新計算整個區塊。這個驗證過程可以是高度有效的,因爲它只涉及對證明的檢查,而不需要對交易進行復雜的計算。

FOX的“流水线模式”主要發生在證明生成這個環節。在交易收集和排序中,Sequencer 收集待處理的交易,並按照某種規則對它們進行排序,確定執行的順序。在此後的交易分批執行中,Sequencer 將排序後的交易分批執行。每批中的一組交易被發送給執行引擎進行處理。執行引擎模擬執行這些交易,並記錄狀態轉換的中間結果。在每批交易執行完之後,Sequencer 將中間結果發送給Folder。

這可以通過將中間結果編碼以狀態更新、交易哈希等形式逐批發送給Folder的通信通道來完成。Folder在接收到各批中間結果後會使用這些結果,從而逐批地生成相應證明。這些證明的生成基於FOX自研的FOAKS零知識證明的算法,其使用中間結果作爲輸入,來證明交易的有效性和整個區塊的一致性。

最後一步是證明驗證。生成的證明被發送給驗證方,即部署在Ethereum的智能合約Verifier,以驗證區塊的有效性。Verifier使用驗證算法對證明進行檢查,以確保其正確性和合法性。

通過這種流水线方式,Sequencer 可以在執行交易的同時,不斷將中間結果發送給Folder,從而逐批地進行證明的生成。這可以提高整個系統的效率和吞吐量,同時減少了證明生成的延遲。

結語

本文介紹了在zkRollup當中,一種比較新穎的對於交易分批次處理生成證明的方案,流水线方式,並且詳細分析了這種方式的時間开銷,對於线性證明算法而言,合理的使用流水线方式可以有助於減少總的證明生成時間。FOX採用的證明系統就實現了线性證明時間,對於快速生成證明和提升用戶體驗都有着很大的幫助。FOX團隊將會不斷探索並優化這個方案。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

標題:如何通過“流水线模式”提高生成證明的效率?

地址:https://www.sgitmedia.com/article/2727.html

相關閱讀: