Zero-Knowledge-Proofs

如何在 zkSNARK 中建構電路

  • April 22, 2021

我有幾個關於如何使用 zk-snark 的問題。由於使用 zk-snark 的基本邏輯是:

  1. 使用電路來表示問題,
  2. 從電路中生成一個 R1CS,
  3. 將 R1CS 轉換為 QAP,然後我們可以執行 zk-snark

第一部分,問題是否有具體的定義或特徵,是否所有可以驗證的問題都轉化為電路,使用zk-snark生成證明**?**此外,如何通過程式或使用數學方法將問題扁平化為電路?

這個問題有什麼具體的定義或者特徵嗎,能不能把所有可以驗證的問題都轉換成電路,用zk-snark來生成證明?

問題應該在NP 類中。NP 問題是存在一種(有效的)算法可以在多項式時間內決定或證明的問題,該算法是陳述 s(他們的陳述)的見證,或者不是。許多 zkSNARK 都是基於電路可滿足性問題。電路可滿足性是一個NP完全問題。有兩種類型的電路:可以相互轉換的布爾電路和算術電路。粗略地說,我們可以為我們可以在電腦上執行的所有算法(例如 SHA-256)設計電路。下圖是一個簡單的布爾電路,由導線和邏輯門(AND、OR 和 NOT)組成。在基於這個簡單電路的 zkSNARK 系統中,證明者想要說服驗證者他知道輸入( $ x_1 $ = 1, $ x_2 $ = 1, $ x_3 $ = 0) 對於這個輸入,電路的輸出為真,換句話說,他知道滿足這個電路的輸入。 在此處輸入圖像描述

如何通過程式或使用數學方法將問題扁平化為電路?

將 NP 問題轉換為(布爾或算術)電路後,您應該將此電路轉換為對 SNARK 友好的格式,如 R1CS。有一些編譯器可以用高級程式語言在其中編寫你的問題並將問題編譯為 R1CS 格式,例如,你可以使用ZoKrates,乙太坊上 zkSNARKs 的工具箱,或者你可以使用libsnark的小工具庫.

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