Zero-Knowledge-Proofs

zkSnarks:確保一個變數在所有使用它的操作中都有一個單一的值

  • February 18, 2022

我正在閱讀 Maksym Petkus 所寫的 zkSnarks 解釋 - http://www.petkus.info/papers/WhyAndHowZkSnarkWorks.pdf

在 4.5 節中,pdf 解釋瞭如何表示以下操作

$ a $ X $ b = r1 $

$ r1 $ X $ c = r2 $

作為 $ l(x)r(x) - o(x) $ 在哪裡 $ l(x) $ 是左操作數多項式, $ r(x) $ 是右操作數多項式 & $ o(x) $ 是輸出多項式。

如果你看到這裡 $ a $ 在第一組操作的 LHS 中僅使用一次 - 它僅在第一個操作中使用(即 $ a $ X $ b = r1 $ ) - 它沒有出現在第二個中。

在 4.6 中,他繼續討論如何在以下情況下做同樣的事情 $ a $ 重複。IE

$ a $ X $ b = r1 $

$ a $ X $ c = r2 $

這裡 $ a $ 存在於兩個操作中

所以他說

儘管如此,因為我們的協議允許證明者將任何係數設置為多項式,所以他不受限制設置不同的值 $ a $ 對於不同的操作(即,由一些 x 表示)

這種自由打破了一致性,並允許證明者證明執行者不感興趣的其他程序的執行。因此,我們必須確保任何變數在它所使用的每個操作中只能有一個值

他說,在 4.6.1 中進一步領先

因此,如果驗證者需要強制證明者在所有操作中設置相同的值,那麼應該只能修改比例而不是單個係數。

我無法理解這一點 - 的係數 $ l(x) $ 來自所有的操作(你會發現 $ l(x) $ 通過在兩個操作上使用諸如拉格朗日多項式插值之類的東西)。那麼證明者如何為不同的操作使用不同的係數。有人可以舉例說明嗎?

假設你想使用 $ a $ 在您所寫的兩個約束中。你想假設 $ l(x_1) = a $ 和 $ l(x_2) = a $ , 在哪裡 $ x_1 $ 和 $ x_2 $ 是兩個約束的索引。但 $ l(x) $ 是由證明者創建的,他們當然可以選擇一個 $ l(x) $ 它評估為兩個不同的值 $ x_1 $ 和 $ x_2 $ . 然後你基本上有兩個獨立變數而不是使用 $ a $ 兩次。這在連結的 PDF 中的第 36 頁頂部顯示。

直到那時,每個約束都是獨立驗證的。我的意思是 $ l(x_i)*r(x_i) - o(x_i) = 0 $ 在每個索引 $ x_i $ ,這是通過確保檢查 $ (x-x_i) $ 是多項式的根。現在,我們需要一種方法來驗證兩個不同約束之間的變數是否相等。換句話說,以某種方式建立諸如 $ l(x_1) = l(x_2) $ 不同指標之間。

這樣做的方式是進一步限制證明者構造多項式的方式(例如 $ l(x) $ ),所以他們不能只插入他們喜歡的任何值。一種方法是給證明者不同的多項式 $ l_a(x) $ 每當評估為 1 $ a $ 被使用,其他地方為 0。例如,一個多項式,其中 $ l_a(x_1) = l_a(x_2) = 1 $ , 其他地方為零。然後他們可以簡單地將其乘以 $ a $ 設置相同的值 $ a $ 在所有位置都使用它。為了強制證明者使用它,我們再次對其進行加密並提供 $ \alpha $ 改版: $$ g^{l_a(x)}, g^{\alpha l_a(x)} $$ (就像以前做過很多次一樣)。然後,證明者可以將這些中的每一個提升到 $ a $ 在所有地方設置該值。

如果我們有另一個這樣的對另一個變數 $ d $ : $$ g^{l_d(x)}, g^{\alpha l_d(x)} $$ 然後證明者可以同時設置 $ a $ 和 $ d $ 然後將加密的多項式相乘(對應於將指數中的多項式相加)。

對 $ R(x) $ 和 $ O(x) $ .

還有一個問題,在第 4.9.3 節中討論,它允許證明者通過乘以另一個來向他們的多項式添加額外的東西 $ g^1 $ 和 $ g^{\alpha} $ . 這是通過引入另一個秘密轉變來解決的 $ \gamma $ .

引用自:https://crypto.stackexchange.com/questions/98487