nonnative
庫提供 R1CS 約束,用於檢查證明系統中非本機欄位的計算。
該程式庫基於約束編寫框架 arkworks-rs,並根據 MIT 許可證和 Apache v2 許可證發布(請參閱許可證)。
警告:這是一個學術概念驗證原型;特別是,它沒有經過仔細的程式碼審查。此實作尚未準備好用於生產使用。
此函式庫為素數域Fp
實作了另一個素數域Fq
的域小工具,其中p != q
。
當為許多密碼證明編寫約束系統時,我們僅限於本地欄位(例如,配對友善曲線的標量欄位)。這可能會造成不便;例如,透過曲線循環的證明的遞歸組合要求驗證者在非本地字段上進行計算。
該函式庫使得在非本機欄位上編寫計算成為可能,就像在本機欄位上編寫計算一樣。這自然會帶來額外的開銷,我們透過各種優化將其最小化。
因為非原生欄位在 arkworks 中實作了FieldVar
特性,所以我們可以將其視為原生欄位變數 ( FpVar
)。
我們可以進行標準的欄位操作,例如+
、 -
和*
。請參閱以下範例:
let a = NonNativeFieldVar :: < Fr , Fq > :: new_witness ( ns ! ( cs, "a" ) , || Ok ( a_value ) ) ? ;
let b = NonNativeFieldVar :: < Fr , Fq > :: new_witness ( ns ! ( cs, "b" ) , || Ok ( b_value ) ) ? ;
// add
let a_plus_b = & a + & b ;
// sub
let a_minus_b = & a - & b ;
// multiply
let a_times_b = & a * $b ;
// enforce equality
a . enforce_equal ( & b ) ? ;
每次乘法之後,我們的函式庫在內部執行歸約操作,將中間型別NonNativeFieldMulResultVar
歸約為規範化類型NonNativeFieldVar
。這使用戶能夠無縫地執行一系列操作,而無需擔心底層細節。
然而,這種手術成本高昂,而且有時是可以避免的。我們可以透過使用這種只支援新增的中間類型來減少約束的數量。要相乘,必須將其還原為NonNativeFieldVar
。請參閱下面的骨架範例。
要計算a * b + c * d
,簡單(但更昂貴)的實作如下:
let a_times_b = &a * &b;
let c_times_d = &c * &d;
let res = &a_times_b + &c_times_d;
這總共執行兩次歸約運算,每個乘法執行一次。
我們可以使用NonNativeFieldMulResultGadget
節省一項縮減,如下所示:
let a_times_b = a.mul_without_reduce(&b)?;
let c_times_d = c.mul_without_reduce(&d)?;
let res = (&a_times_b + &c_times_d)?.reduce()?;
它只執行一次歸約操作,並且比第一個實現快大約 2 倍。
該庫採用了使用多個肢體來表示目標字段的元素的標準思想。例如,TargetField 中的元素可以由三個 BaseField 元素(即肢體)表示。
TargetField -> limb 1, limb 2, and limb 3 (each is a BaseField element)
經過一些計算後,肢體變得不堪重負,需要縮小,以便進行更多的計算。
我們大量使用 [KPS18] 和 [OWWB20] 中的最佳化技術。這兩部作品都有自己的開源程式庫:xJsnark 和bellman-bignat。與它們相比,這個庫適用於arkworks環境,並且還針對密度而不是約束數量進行了優化,這對於像Marlin這樣的全息零知識證明很有用。
該庫根據以下任一許可證獲得許可,具體由您自行決定。
除非您另有明確說明,否則您提交的包含在本庫中的任何貢獻均應獲得上述雙重許可(如 Apache v2 許可證中所定義),沒有任何附加條款或條件。
[KPS18]:AE Kosba、C. Papamanthou 和 E. Shi。 “xJsnark:高效可驗證計算框架”,第 39 屆安全與隱私研討會論文集,ser。標準普爾 '18,2018 年,第 944–961 頁。
[OWWB20]:A. Ozdemir、RS Wahby、B. Whitehat 與 D. Boneh。 “使用高效集合累加器擴展可驗證計算”,第 29 屆 USENIX 安全研討會論文集,ser。安全 '20, 2020。