एक trusted setup पर Quadratic Arithmetic Program (QAP) को evaluate करने से एक prover को यह साबित करने की अनुमति मिलती है कि QAP संतुष्ट (satisfied) है, वह भी witness को उजागर किए बिना और एक constant sized proof का उपयोग करते हुए।
विशेष रूप से, QAP polynomials का मूल्यांकन एक अज्ञात बिंदु (unknown point) τ पर किया जाता है। QAP समीकरण (equation)
संतुलित (balanced) होगा यदि vector a समीकरण को संतुष्ट करता है, और अन्यथा इसके असंतुलित (unbalanced) होने की अत्यधिक संभावना (overwhelming probability) होगी।
यहाँ दिखाई गई योजना (scheme) एक सुरक्षित ZK Proof नहीं है, लेकिन यह यह दिखाने की दिशा में एक कदम (stepping stone) है कि Groth16 कैसे काम करता है।
एक Concrete Example
इसे थोड़ा कम abstract बनाने के लिए, मान लेते हैं कि Rank 1 Constraint System (R1CS) के matrices L, R, और O में 3 rows और 4 columns हैं।
La∘Ra=Oa
चूँकि हमारे पास 3 rows हैं, इसका मतलब है कि हमारे interpolating polynomials की degree 2 होगी। क्योंकि हमारे पास 4 columns हैं, प्रत्येक matrix से 4 polynomials प्राप्त होंगे (कुल मिलाकर 12 polynomials)।
हम groups G1 और G2 में generators elliptic curve points को क्रमशः G1 और G2 के रूप में संदर्भित करते हैं। G1 में एक element को [X]1 के रूप में दर्शाया जाता है। G2 में एक element को [X]2 के रूप में दर्शाया जाता है। जहाँ किसी list में indices को संदर्भित करने वाले subscripts के साथ अस्पष्टता (ambiguity) हो सकती है, वहाँ हम कहते हैं कि X∈G1 या X∈G2। दो बिंदुओं के बीच एक elliptic curve pairing को [X]1∙[Y]2 के रूप में दर्शाया जाता है।
मान लीजिए कि L(∗,j), L का j-th column है। हमारे उदाहरण में, rows (1,2,3) होंगी और columns (1,2,3,4) होंगे। मान लीजिए कि L(L(∗,j)) वह polynomial है जो L के j-th column पर Lagrange interpolation चलाने से प्राप्त होता है, जिसमें x values (1,2,3) का उपयोग किया जाता है और y values, j-th column की values होती हैं।
चूँकि हमारे पास 4 columns हैं, हम L से चार polynomials प्राप्त करते हैं
R1CS के आकार के संबंध में QAP में polynomials की degrees
सामान्य स्थिति (general case) में polynomials की degrees के बारे में कुछ अवलोकन (observations):
u(x) और v(x) की degree अधिकतम n−1 तक हो सकती है क्योंकि वे n points को interpolate करते हैं, जहाँ n, R1CS में rows की संख्या है।
w(x) की degree कम से कम 0 हो सकती है यदि polynomials का योग ∑i=0maiwi(x) जुड़कर शून्य (zero) polynomial बन जाता है, अर्थात्, coefficients एक-दूसरे को योगात्मक (additively) रूप से cancel कर देते हैं।
परिभाषा के अनुसार t(x) की degree n होती है।
polynomials को गुणा करने पर उनकी degrees आपस में जुड़ जाती हैं, और polynomials को विभाजित करने पर उनकी degrees घट जाती हैं।
इसलिए, h(x) अधिकतम n−2 होगा क्योंकि
degu(x)n−1+degv(x)n−1−degt(x)n=n−2
Terms का विस्तार (Expanding)
यदि हम अपने पिछले उदाहरण से sums का विस्तार करते हैं, तो हमें निम्नलिखित प्राप्त होता है
इनमें से प्रत्येक मामले में, चूँकि हम 4 degree 2 वाले polynomials को जोड़ रहे हैं, हमें एक degree 2 वाला polynomial प्राप्त होता है।
सामान्य रूप में, expression ∑i=1maipi(x) एक ऐसा polynomial उत्पन्न करता है जिसकी अधिकतम power p(x) के समान होती है (यह कम भी हो सकती है, यदि उदाहरण के लिए (a1w12+a2w22+a3w32+a4w42)x2 जुड़कर 0 हो जाए)। सुविधा के लिए, हमने coefficients pia को पेश किया है जहाँ i coefficient की power है और a का अर्थ है कि हमने polynomials को witness a के साथ मिला दिया है।
इस प्रकार polynomials को reduce करने के बाद polynomials यहाँ दिए गए हैं:
यहाँ, ui(τ),vi(τ),wi(τ) का अर्थ है कि polynomials का मूल्यांकन trusted setup में τ से उत्पन्न structured reference string का उपयोग करके किया गया था, इसका अर्थ यह नहीं है कि “τ को डालें और polynomials को evaluate करें”। चूँकि trusted setup के बाद τ को नष्ट कर दिया गया था, इसलिए τ का मान (value) अज्ञात है।
हमने srs का उपयोग करके अधिकांश QAP की गणना कर ली है, लेकिन हमने अभी तक h(x)t(x) की गणना नहीं की है:
याद करें कि t(x) की degree 3 (आमतौर पर n) है और h(x) की degree 1 (आमतौर पर n−2) है। यदि हम इन्हें एक साथ गुणा करते हैं, तो हमें अधिकतम degree 3 वाला polynomial मिल सकता है, जो कि powers of tau ceremony द्वारा प्रदान किए जाने वाले से अधिक है। इसके बजाय, h(x)t(x) के लिए एक structured reference string प्रदान करने के लिए powers of tau ceremony को समायोजित (adjusted) किया जाना चाहिए।
जो व्यक्ति trusted setup कर रहा है उसे t(x) पता होता है, यह बस (x−1)(x−2)...(x−n) होता है। हालाँकि, h(x) एक ऐसा polynomial है जिसकी गणना prover द्वारा की जाती है और यह a के मानों के आधार पर बदलता है, इसलिए इसे trusted setup के दौरान जाना नहीं जा सकता है।
ध्यान दें कि हम h(τ) और t(τ) को अलग-अलग (एक structured reference string का उपयोग करके) evaluate नहीं कर सकते और फिर उन्हें एक साथ pair नहीं कर सकते। इससे G1 element प्राप्त नहीं होगा जिसकी हमें आवश्यकता है।
Polynomial products के लिए SRS
ध्यान दें कि निम्नलिखित सभी computations का परिणाम समान मान (value) ही होता है:
Polynomial h(x)t(x) का u पर मूल्यांकन, या (h(x)t(x))(u)
h(u) को t(u) से गुणा किया गया, या h(u)t(u) (h का u पर मूल्यांकन और t का u पर मूल्यांकन)
h(x) को evaluation t(u) से गुणा किया गया, फिर u पर evaluate किया गया, यानी (h(x)t(u))(u)
हम h(τ)t(τ) की गणना करने के लिए तीसरी विधि का उपयोग करेंगे। मान लीजिए, व्यापकता को खोए बिना (without loss of generality), कि h(x)3x2+6x+2 है और t(u)=4 है। तो computation होगी
h(x)t(u)=(3x2+6x+2)⋅4=12x2+24x+8
यदि हम u को 12x2+24x+8 में डालते हैं, तो वह h(u)t(u) होगा।
हालाँकि, इस polynomial को τ पर evaluate करने के लिए prover को τ पता होना आवश्यक होगा। यहाँ मुख्य अंतर्दृष्टि (key insight) यह है कि उपरोक्त computation को इस प्रकार संरचित किया जा सकता है:
h(u)t(u)=⟨[3,6,2],[4u2,4u,4]⟩=12u2+24u+8
यदि trusted setup [4u2,4u,4] प्रदान करता है, और prover [3,6,2] प्रदान करता है, तो prover u को जाने बिना h(u)t(u) की गणना कर सकता है, क्योंकि u से जुड़ी कोई भी चीज़ inner product के right vector में है।
h(τ)t(τ) के लिए Structured reference string
h(τ)t(τ) के लिए एक structured reference string बनाने के लिए, हम τ की क्रमिक powers (successive powers) से गुणा किए गए t(τ) के n−1 evaluations बनाते हैं।
(थोड़ा भ्रमित करने वाली बात यह है कि degree k वाले एक polynomial में k+1 terms होते हैं, इसलिए हम degree k−2 वाले एक polynomial के लिए k−1 evaluations उत्पन्न करते हैं। ध्यान दें कि Upsilon n−1 से शुरू होता है और 0 पर समाप्त होता है)।
यहाँ, n, R1CS में rows की संख्या है, और हमने स्थापित किया है कि h की degree n−2 से अधिक नहीं हो सकती।
h(τ)t(τ) की गणना के लिए structured reference string का उपयोग करने के लिए, prover यह करता है:
अब हम सब कुछ एक साथ जोड़ते हैं। मान लीजिए कि हमारे पास n rows और m columns वाले matrices के साथ एक R1CS है। इससे, हम इसे QAP में बदलने के लिए Lagrange interpolation लागू कर सकते हैं
Sum terms में से प्रत्येक n−1 degree वाला एक polynomial उत्पन्न करेगा (एक Lagrange polynomial की degree उसके द्वारा interpolate किए जाने वाले points की संख्या से एक कम होती है), और h(x) polynomial की degree अधिकतम n−2 होगी, तथा t(x) की degree n होगी।
एक trusted setup एक random field element τ उत्पन्न करता है और गणना करता है:
Prover ([A]1,[B]2,[C]1) को publish करता है और verifier जाँच सकता है कि
[A]1∙[B]2=?[C]1∙G2
यदि witness a QAP को संतुष्ट करता है, तो उपरोक्त समीकरण संतुलित (balanced) हो जाएगा। लेकिन समीकरण का संतुलित होना यह सुनिश्चित नहीं करता है कि prover एक संतुष्ट करने वाले a को जानता है क्योंकि prover arbitrary elliptic curve points publish कर सकता है और verifier को यह नहीं पता होता कि वे वास्तव में QAP से प्राप्त हुए हैं या नहीं।
Proof बहुत छोटा होता है
ध्यान दें कि proof में केवल तीन elliptic curve points होते हैं। यदि एक G1 element का आकार 64 bytes है, और एक G2 element का आकार 128 bytes है, तो proof केवल 256 bytes का होता है। यह R1CS के आकार के बावजूद सत्य है!
R1CS जितना बड़ा होगा, prover का काम उतना ही अधिक होगा, लेकिन verifier का काम constant रहता है।
इस समस्या का समाधान Groth16 protocol पर अगले अध्याय में वर्णित है।
Groth16 में proof अभी भी constant आकार का रहता है, जैसा कि Proof नामक struct पर Tornado Cash के source code में देखा जा सकता है।