libsnark 生成器有毒廢物
我正在查看 libsnark 的測試和範例,我們以這里為例: https ://github.com/christianlundkvist/libsnark-tutorial/blob/master/src/test-gadget.cpp
在第 19 行有:
default_r1cs_ppzksnark_pp::init_public_params();
- 這是產生有毒廢物的步驟嗎?
如果是這樣,則使用相同的原型板生成驗證和證明密鑰,然後還創建證明:
const r1cs_ppzksnark_proof<default_r1cs_ppzksnark_pp> proof = r1cs_ppzksnark_prover<default_r1cs_ppzksnark_pp>(keypair.pk, pb.primary_input(), pb.auxiliary_input());
但是證明者和生成者不應該是不同的實體嗎?另一方面,如果我最終查看初始化(init_public_param),我最終會在 libff 中為曲線定義 public_params:
https://github.com/scipr-lab/libff/blob/master/libff/algebra/curves/public_params.hpp
這只是一個模板列表,沒有什麼私人的。
- 生成器步驟應該如何與證明者步驟分開?
- 證明者擁有一切(公共和私人資訊),因此他確實可以從頭開始生成電路,但驗證者應該“不”接受來自證明者的密鑰對,對嗎?
- 最後,生成器(知道一切,公共和私人資訊)準備密鑰,將它們發送給證明者和驗證者。證明者建構自己的 pb(原型板),因為他需要 pb.primary_input() 和 pb.auxiliary_input() 來創建證明,然後使用自己的 pb 和生成器的證明密鑰來生成證明。在我的實驗中,生成器和證明者生成的密鑰是相同的,即使我初始化了 2 個不同的 pb,這對我來說是違反直覺的,因為證明者可以模擬生成器。因為protoboard的init過程是一樣的,key是一樣的嗎?
感謝所有閱讀本文的人!任何提示表示讚賞 T。
該行:
default_r1cs_ppzksnark_pp::init_public_params();
用於指定證明系統使用的公共參數( $ \mathbb{G}_1, \mathbb{G}_2, \mathbb{G}_T, \mathbb{F}_p, $ … ETC)。這些是生成器、證明者和驗證者知道的,因此不是秘密的。
證明者和生成器應該是不同的實體是 100% 正確的——生成器使用隨機的“有毒廢物”值來生成密鑰材料。任何知道這些有毒廢物值的人都可以破壞協議的健全性保證,並為其不認識證人的陳述偽造證據。
要回答您的其他問題:
- 生成器步驟應該如何與證明者步驟分開?
生成器應僅由受信任方執行一次,並發布生成的證明和驗證密鑰。在實踐中,使用安全多方計算 (MPC) 協議,只要 $ 1 $ -在……之外- $ n $ 的參與方是誠實的,有毒廢物從未被任何參與者了解過。這就是 ZCash 所做的,例如:https ://z.cash/technology/paramgen/
- 證明者擁有一切(公共和私人資訊),因此他確實可以從頭開始生成電路,但驗證者應該“不”接受來自證明者的密鑰對,對嗎?
這是對的。事實上,任何人都可以從頭開始生成電路(以及一些相應的證明者/驗證者密鑰),因為生成這些不需要見證人。但是,驗證者永遠不應該盲目地信任提供給它的密鑰。
- 最後,生成器(知道一切,公共和私人資訊)準備密鑰,將它們發送給證明者和驗證者。證明者建構自己的 pb(原型板),因為他需要 pb.primary_input() 和 pb.auxiliary_input() 來創建證明,然後使用自己的 pb 和生成器的證明密鑰來生成證明。在我的實驗中,生成器和證明者生成的密鑰是相同的,即使我初始化了 2 個不同的 pb,這對我來說是違反直覺的,因為證明者可以模擬生成器。因為protoboard的init過程是一樣的,key是一樣的嗎?
我感覺你的實驗已經結束了。Libsnark 從 中獲取隨機性
/dev/urandom
,因此生成器的兩次不同呼叫應導致不同的有毒廢物值,並相應地產生不同的密鑰材料。生成器在行上執行:const r1cs_ppzksnark_keypair<default_r1cs_ppzksnark_pp> keypair = r1cs_ppzksnark_generator<default_r1cs_ppzksnark_pp>(constraint_system);
如果您多次執行此步驟,您每次都會收到一個新的密鑰對。