Bulletproofs ZKPs एक prover को लॉगरिदमिक-आकार (logarithmic-sized) के proof के साथ एक inner product के ज्ञान को प्रमाणित करने की अनुमति देते हैं। Bulletproofs को किसी trusted setup की आवश्यकता नहीं होती है।
पिछले अध्यायों में, हमने दिखाया कि vectors या inner product को प्रकट किए बिना inner product के ज्ञान को कैसे प्रमाणित किया जाए, हालांकि इसमें proof का आकार था जहाँ vector की लंबाई है। हमने यह भी दिखाया कि लॉगरिदमिक-आकार के डेटा का उपयोग करके inner product के ज्ञान को कैसे प्रमाणित किया जाए, लेकिन बिना zero knowledge गुण (property) के।
इस अध्याय में, हम Bulletproof ZK एल्गोरिथम को प्रदर्शित करने के लिए इन एल्गोरिथम्स को एक साथ मिलाते हैं।
(यह कार्य ZK Bulletproofs पर आधारित एक श्रृंखला का हिस्सा है।)
समस्या का विवरण
Prover और verifier लंबाई के दो elliptic curve basis vectors और और elliptic curve points और पर सहमत होते हैं। इन सभी points के बीच discrete log relationships अज्ञात हैं।
Prover के पास inner product के साथ vectors और हैं। Prover और को के लिए इस प्रकार commit करता है: जहाँ एक blinding term है। Prover को commit करता है।
Prover verifier को भेजता है और यह साबित करने का लक्ष्य रखता है कि और के लिए committed हैं और उनका inner product के लिए committed है। Verifier को vectors या inner product के बारे में कुछ पता नहीं चलता है।
Proof का आकार होना चाहिए।
Bulletproof ZK एल्गोरिथम
Prover रैंडम scalars और रैंडम vectors जनरेट करता है और commitments की गणना करता है:
Prover vector polynomials तैयार करता है (लेकिन भेजता नहीं है):
vector polynomial के constant terms के लिए एक commitment है, linear terms के लिए एक commitment है, और inner product के लिए एक commitment है।
Prover के coefficients के लिए commitments इस प्रकार बनाता है:
ध्यान दें कि , के constant coefficient के लिए एक commitment है, और और क्रमशः के linear और quadratic coefficients के लिए commitments हैं।
Prover verifier को भेजता है।
Verifier रैंडम वैल्यू के साथ उत्तर देता है।
फिर prover पर polynomials का मूल्यांकन (evaluate) करता है और proofs बनाता है कि उनका मूल्यांकन सही ढंग से किया गया था:
पहले, prover ट्रांसमिट करता था ताकि verifier यह जांच सके कि:
लेकिन यह vectors और के कारण आकार में linear होगा। इसके बजाय, prover और को इस प्रकार commit करता है:
और भेजता है।
हम पहले दो verifier चेक्स को इस प्रकार पुनर्व्यवस्थित (re-arrange) कर सकते हैं:
ध्यान दें कि यदि हम सेट करते हैं, तो यह ठीक वैसी ही समस्या (problem statement) है जैसे यह साबित करना कि basis vectors और के संदर्भ में दो vectors और के commitments रखता है, और यह कि और का inner product है। इसलिए, हम पर ओपन होने वाले commitment के ज्ञान के लॉगरिदमिक-आकार के proof का पुन: उपयोग कर सकते हैं।
इस proof के लिए, हमें गोपनीयता (secrecy) की आवश्यकता नहीं है क्योंकि पिछले एल्गोरिथम में और को वैसे भी सार्वजनिक कर दिया गया था।
अब जब verifier के पास सभी आवश्यक डेटा है, तो prover एक interactive proof में भाग लेता है ताकि यह साबित किया जा सके कि में और के commitments हैं और उनका inner product है:
वह सबरूटीन (subroutine) यह साबित करेगा कि और , बिना और को भेजे। यह केवल लॉगरिदमिक-आकार का डेटा भी भेजता है। ध्यान दें कि पिछले अध्याय का रिकर्सिव एल्गोरिथम (recursive algorithm) commitment का उपयोग करता है, इसलिए verifier को स्वयं “ हिस्सा” जोड़ना होगा। अब verifier आश्वस्त हो सकता है कि:
अंत में, verifier जांचता है कि:
याद रखें कि और क्रमशः vector polynomials और के constant और linear terms के लिए commitments हैं। पहली जांच यह सुनिश्चित करती है कि के लिए कमिट किए गए vectors पर उन polynomials के evaluations हैं।
दूसरी जांच यह सुनिश्चित करने के लिए है कि coefficients , , और के commitments को देखते हुए का मूल्यांकन सही ढंग से किया गया था।
Fiat Shamir Transform के माध्यम से Non-interactivity
व्यवहार में, इस एल्गोरिथम को Fiat Shamir Transform के माध्यम से non-interactive बनाया जाता है। Verifier से रैंडमनेस (randomness) माँगने के बजाय, prover अब तक ट्रांसमिट किए गए सभी डेटा को जोड़कर (concatenating) और उसे हैश (hash) करके रैंडमनेस जनरेट करता है। फिर verifier यह सुनिश्चित करने के लिए डेटा को फिर से हैश करता है कि prover ने रैंडमनेस सही ढंग से जनरेट की है।
यह महत्वपूर्ण है कि हैश में सभी पिछले डेटा ट्रांसमिशन शामिल हों, अन्यथा कार्यान्वयन (implementation) में frozen heart vulnerability आ सकती है।
अगला कदम
व्यवहार में, व्यावहारिक रुचि की समस्याओं में कई inner products शामिल होते हैं। उदाहरण के लिए, एक Rank 1 Constraint System:
वास्तव में inner products (उदाहरण के लिए को की पंक्तियों से गुणा करना और इसी तरह और के लिए) और एक एकल Hadamard product है। इसलिए, कई inner products को एक में मिलाने के लिए कुछ गणितीय ट्रिक्स जानना उपयोगी होगा ताकि हमें Bulletproofs न भेजने पड़ें। हम यह सीखेंगे कि इसे रैंडम लीनियर कॉम्बिनेशन्स (random linear combinations) पर हमारे आगामी अध्याय में कैसे प्राप्त किया जाए।
इसके अलावा, कुछ उपयोगी समस्याओं को सीधे एक inner product के रूप में एन्कोड किया जा सकता है, विशेष रूप से range proof या subset sum समस्या। उन स्थितियों में, हम समस्या को arithmetic circuit के रूप में एन्कोड करने को छोड़ सकते हैं और इसे सीधे inner product के रूप में एन्कोड कर सकते हैं। अपने inner product प्रतिनिधित्व (representation) के लचीलेपन (flexibility) को बढ़ाने के साथ-साथ random linear combinations को समझने के लिए आधार तैयार करने के लिए, हम अगले अध्याय में कुछ inner product बीजगणित (algebra) सीखेंगे।
अभ्यास: यह साबित करने के लिए पिछले अभ्यासों को मिलाएं कि जहाँ और 4 की लंबाई वाले vectors हैं। आपका proof succinct और zero knowledge दोनों होना चाहिए। सरलता के लिए एक interactive proof बनाएं। अभ्यासों के लिए इस रिपॉजिटरी का संदर्भ लें।