एक quadratic arithmetic program एक arithmetic circuit है, विशेष रूप से एक Rank 1 Constraint System (R1CS) जिसे polynomials के एक सेट के रूप में दर्शाया गया है। इसे Rank 1 Constraint System पर Lagrange interpolation का उपयोग करके प्राप्त किया जाता है। R1CS के विपरीत, एक Quadratic Arithmetic Program (QAP) को Schwartz-Zippel Lemma के माध्यम से O(1) समय में समानता (equality) के लिए टेस्ट किया जा सकता है।
मुख्य विचार (Key ideas)
Schwartz-Zippel Lemma के अध्याय में, हमने देखा कि हम दो vectors को polynomials में बदलकर और फिर उन polynomials पर Schwartz-Zippel Lemma टेस्ट चलाकर, O(1) समय में यह टेस्ट कर सकते हैं कि क्या वे बराबर हैं। (स्पष्ट करने के लिए, टेस्टO(1) समय लेता है, vectors को polynomials में बदलने से overhead उत्पन्न होता है)।
चूँकि Rank 1 Constraint System पूरी तरह से vector ऑपरेशन्स से बना होता है, हमारा लक्ष्य यह टेस्ट करना है कि क्या
La∘Ra=?Oa
O(n) समय के बजाय O(1) समय में सही साबित होता है (जहाँ n, L, R, और O में पंक्तियों की संख्या है)।
लेकिन ऐसा करने से पहले, हमें vectors और उन्हें दर्शाने वाले polynomials के बीच के संबंध के कुछ प्रमुख गुणों को समझने की आवश्यकता है।
यहाँ सभी गणितीय गणनाओं के लिए, हम मान लेते हैं कि हम एक finite field में काम कर रहे हैं, लेकिन संक्षिप्तता के लिए हम modp नोटेशन को छोड़ देते हैं।
Vector addition और polynomial addition के बीच Homomorphisms
Vector addition, polynomial addition के homomorphic है
यदि हम दो vectors लेते हैं, उन्हें polynomials के साथ interpolate करते हैं, और फिर polynomials को एक साथ जोड़ते हैं, तो हमें वही polynomial प्राप्त होता है जो हमें तब मिलता जब हम vectors को एक साथ जोड़ते और फिर उनके sum vector को interpolate करते।
अधिक गणितीय रूप में कहें तो, मान लीजिए L(v) वह polynomial है जो vector v पर Lagrange interpolation से प्राप्त होता है, जिसमें x वैल्यू के रूप में (1,2,...,n) का उपयोग किया गया है, जहाँ n, v की लंबाई है। निम्नलिखित सत्य है:
L(v+w)=L(v)+L(w)
दूसरे शब्दों में, vectors v और w को अलग-अलग interpolate करके उनके polynomials को जोड़ने पर वही परिणाम मिलता है जो vectors v+w को interpolate करने पर मिलता है।
हल किया गया उदाहरण
मान लीजिए f1(x)=x2 और f2(x)=x3 है। f1, (1,1),(2,4),(3,9) या vector [1,4,9] को interpolate करता है और f2, [1,8,27] को interpolate करता है।
इन vectors का योग [2,12,36] है और यह स्पष्ट है कि x3+x2 इसे interpolate करता है। मान लीजिए f3(x)=f1(x)+f2(x)=x3+x2।
f3(1)f3(2)f3(3)=1+1=2=8+4=12=27+9=36
Python में गणित को टेस्ट करना
किसी प्रस्तावित गणितीय identity की unit testing करने से वह सत्य नहीं हो जाती, लेकिन यह यह ज़रूर दर्शाती है कि क्या हो रहा है। पाठकों को प्रोत्साहित किया जाता है कि वे कुछ अलग-अलग vectors आज़माकर देखें कि यह identity सही साबित होती है या नहीं।
मान लीजिए λ एक scalar है (विशेष रूप से, finite field में एक field element)। तब
L(λv)=λL(v)
हल किया गया उदाहरण
मान लीजिए हमारे 3 points [3,6,11] हैं। वह polynomial जो इसे interpolate करता है, वह f(x)=x2+2 है। यदि हम इस vector को 3 से गुणा करते हैं, तो हमें [9,18,33] मिलता है। जो polynomial इसे interpolate करता है वह है
from scipy.interpolate import lagrangex_values = [1, 2, 3]y_values = [9, 18, 33]print(lagrange(x_values, y_values))# 2# 3 x + 6
Scalar multiplication वास्तव में vector addition है
जब हम कहते हैं कि “एक vector को 3 से गुणा करें”, तो हम वास्तव में यह कह रहे होते हैं कि “vector को उसी में तीन बार जोड़ें”। चूँकि हम केवल finite fields में काम कर रहे हैं, हमें “0.5” जैसे scalars की व्याख्या से कोई सरोकार नहीं है।
हम element-wise addition (एक finite field में) के अंतर्गत vectors और addition के अंतर्गत polynomials (यह भी finite field में) दोनों को groups के रूप में मान सकते हैं।
इस अध्याय से सबसे महत्वपूर्ण निष्कर्ष यह है:
एक finite field में addition के अंतर्गत vectors का group, एक finite field में addition के अंतर्गत polynomials के group के homomorphic होता है।
यह बहुत महत्वपूर्ण है क्योंकि vector समानता (equality) की टेस्टिंग में O(n) समय लगता है, लेकिन polynomial समानता की टेस्टिंग में O(1) समय लगता है।
इसलिए, जहाँ R1CS समानता को टेस्ट करने में O(n) समय लगता था, हम इस homomorphism का लाभ उठाकर R1CSs की समानता को O(1) समय में टेस्ट कर सकते हैं।
यही Quadratic Arithmetic Program होता है।
Polynomials में Rank 1 Constraint System
ध्यान दें कि एक rectangular matrix और एक vector के बीच matrix multiplication को vector addition और scalar multiplication के रूप में लिखा जा सकता है।
उदाहरण के लिए, यदि हमारे पास 3×4 matrix A और एक 4 डायमेंशनल vector v है, तो हम इस matrix multiplication को इस प्रकार लिख सकते हैं:
हमने A और v के बीच matrix multiplication को पूरी तरह से vector addition और scalar multiplication के रूप में व्यक्त किया है।
चूँकि हमने पहले यह स्थापित किया था कि एक finite field में addition के अंतर्गत vectors का group, finite field में addition के अंतर्गत polynomials के group के homomorphic होता है, इसलिए हम उपरोक्त गणना को vectors को दर्शाने वाले polynomials के रूप में व्यक्त कर सकते हैं।
संक्षेप में यह टेस्ट करना कि Av1=Bv2
मान लीजिए कि हमारे पास matrix A और B हैं, जैसे कि
A=[6437]B=[31296]
और vectors v1 तथा v2 हैं
v1=[24]v2=[22]
हम यह टेस्ट करना चाहते हैं कि क्या
Av1=Bv2
सत्य है।
जाहिर है कि हम matrix arithmetic को हल कर सकते हैं, लेकिन अंतिम जाँच में n तुलनाओं (comparisons) की आवश्यकता होगी, जहाँ n, A और B में पंक्तियों की संख्या है। हम इसे O(1) समय में करना चाहते हैं।
सबसे पहले, हम matrix multiplication Av1 और Bv2 को addition के अंतर्गत vectors के group में बदलते हैं:
AB=[64],[37]=[312],[96]
अब हम polynomial group में
[64]⋅2+[37]⋅4=?[312]⋅2+[96]⋅2
का homomorphic समतुल्य (equivalent) खोजना चाहते हैं।
आइए इनमें से प्रत्येक vector को x वैल्यू [1,2] पर polynomials में बदलें:
अंतिम assert स्टेटमेंट n की बजाय केवल एक तुलना (comparison) करके यह टेस्ट करने में सक्षम है कि क्या Av1=Bv2 है।
R1CS से QAP: संक्षेप में यह टेस्ट करना कि La∘Ra=Oa
चूँकि हम जानते हैं कि Av1=Bv2 का संक्षेप में टेस्ट कैसे किया जाता है, क्या हम यह भी संक्षेप में टेस्ट कर सकते हैं कि La∘Ra=Oa है?
Matrices में m कॉलम होते हैं, इसलिए आइए प्रत्येक matrices को m कॉलम vectors में विभाजित करें और प्रत्येक के लिए m polynomials उत्पन्न करने के लिए उन्हें (1,2,...,n) पर interpolate करें।
मान लीजिए u1(x),u2(x),...,um(x) वे polynomials हैं जो L के कॉलम vectors को interpolate करते हैं।
मान लीजिए v1(x),v2(x),...,vm(x) वे polynomials हैं जो R के कॉलम vectors को interpolate करते हैं।
मान लीजिए w1(x),w2(x),...,wm(x) वे polynomials हैं जो O के कॉलम vectors को interpolate करते हैं।
व्यापकता खोए बिना (Without loss of generality), मान लीजिए कि हमारे पास 4 कॉलम (m=4) और तीन पंक्तियाँ (n=3) हैं।
चूँकि किसी कॉलम vector को एक scalar से गुणा करना किसी polynomial को scalar से गुणा करने के homomorphic होता है, इसलिए प्रत्येक polynomials को witness के संबंधित एलिमेंट से गुणा किया जा सकता है।
ध्यान दें कि अंतिम परिणाम अधिकतम n−1 डिग्री वाला एक एकल (single) polynomial है, क्योंकि u1(x),…,un(x) में से प्रत्येक की डिग्री अधिकतम n−1 है।
यह इस बात से स्पष्ट होता है कि हमने उन्हें कैसे बनाया: L के प्रत्येक कॉलम में n एंट्रीज़ होती हैं, और Lagrange interpolation के माध्यम से n पॉइंट्स को interpolate करने पर अधिकतम n−1 डिग्री का polynomial उत्पन्न होता है।
सामान्य मामले में, La को प्रत्येक m कॉलम को polynomials में बदलने के बाद
i=1∑maiui(x)
के रूप में लिखा जा सकता है।
ऊपर दिए गए समान चरणों का उपयोग करके, R1CS La∘Ra=Oa में प्रत्येक matrix-witness गुणनफल (product) को इस प्रकार बदला जा सकता है:
Homomorphisms L(v1)+L(v2)=L(v1+v2) और L(λv)=λL(v) के कारण, यदि हम u(x) की गणना L(La) के रूप में करते हैं, तो हमें वही परिणाम मिलता है जो L के कॉलम पर Lagrange interpolation लागू करने और फिर प्रत्येक polynomials को a में मौजूद संबंधित एलिमेंट से गुणा करके परिणाम जोड़ने पर मिलता है।
दूसरे शब्दों में कहें तो,
i=1∑maiui(x)=L(La)∣ui(x) is the Lagrange interpolation of column i of L
तो फिर m के बजाय केवल एक ही Lagrange interpolation की गणना क्यों न की जाए?
हमें इस बात में अंतर करना होगा कि QAP का उपयोग कौन कर रहा है। Verifier (और trusted setup जिसे हम बाद में कवर करेंगे) witness a को नहीं जानता है और इसलिए L(La) की गणना नहीं कर सकता है। यह एक ऑप्टिमाइज़ेशन है जो prover कर सकता है, लेकिन ZK प्रोटोकॉल में अन्य पक्ष इस ऑप्टिमाइज़ेशन का उपयोग नहीं कर सकते।
इसमें शामिल सभी पक्षों को QAP पर एक साझा सहमति होनी चाहिए – किसी भी proof और वेरिफिकेशन से पहले matrices के polynomial interpolations पर।
Polynomial डिग्री का असंतुलन (Polynomial degree imbalance)
हालाँकि, हम अंतिम परिणाम को सरलता से इस प्रकार व्यक्त नहीं कर सकते:
u(x)v(x)=w(x)
क्योंकि डिग्रियाँ मेल नहीं खाएँगी।
दो polynomials को एक साथ गुणा करने पर एक गुणनफल polynomial (product polynomial) प्राप्त होता है जिसकी डिग्री उन दो polynomials की डिग्री का योग होती है जिन्हें एक साथ गुणा किया जा रहा है।
चूँकि u(x), v(x), और w(x) में से प्रत्येक की डिग्री n−1 होगी, u(x)v(x) की डिग्री सामान्यतः 2n−2 होगी और w(x) की डिग्री n−1 होगी, इसलिए वे बराबर नहीं होंगे, भले ही जिन अंतर्निहित (underlying) vectors को उन्होंने गुणा किया है, वे बराबर हों।
ऐसा इसलिए है क्योंकि जो homomorphisms हमने पहले स्थापित किए थे, वे केवल vector addition के बारे में दावा करते हैं, Hadamard product के बारे में नहीं।
हालाँकि, वह vector जिसे u(x)v(x) interpolate करता है, अर्थात
((1,u(1)v(1)),(2,u(2)v(2)),...,(n,u(n)v(n)))
वही vector है जिसे w(x) interpolate करता है, अर्थात
यद्यपि “अंतर्निहित (underlying)” vectors बराबर हैं, उन्हें interpolate करने वाले polynomials बराबर नहीं हैं।
Underlying equality का उदाहरण
मान लीजिए कि u(x) वह polynomial है जो
(1,2),(2,4),(3,8)
को interpolate करता है, और v(x) वह polynomial है जो
(1,4),(2,2),(3,8)
को interpolate करता है।
यदि हम u(x) को vector [2,4,8] को interpolate करने वाला और v(x) को vector [4,2,8] को interpolate करने वाला मानते हैं, तो हम देख सकते हैं कि उनका product polynomial दोनों vectors के Hadamard product को interpolate करता है। [2,4,8] और [4,2,8] का Hadamard product [8,8,64] है।
यदि हम u(x) और v(x) को एक साथ गुणा करते हैं, तो हमें w(x)=4x4−18x3+36x2−42x+28 प्राप्त होता है।
हम नीचे दिए गए प्लॉट में देख सकते हैं कि product polynomial दोनों vectors के Hadamard product [8,8,64] को interpolate करता है।
तो हम w(x) को u(x)v(x) के बराबर कैसे “बना” सकते हैं यदि वे (1,2,...,n) पर समान y वैल्यू को interpolate करते हैं?
0 vector को interpolate करना
यदि v1∘v2=v3 है, तो v1∘v2=v3+0 होगा।
0 को Lagrange interpolation के साथ interpolate करने और f(x)=0 प्राप्त करने के बजाय (याद रखें कि Lagrange interpolation सबसे कम डिग्री वाले interpolating polynomial को खोजता है), हम एक उच्च डिग्री वाले polynomial का उपयोग कर सकते हैं जो डिग्री के असंतुलन (mismatch) को संतुलित करेगा।
उदाहरण के लिए, नीचे दी गई छवि में काला polynomial (b(x)), [(1,0),(2,0),(3,0)] को interpolate करता है:
अब, चूँकि 4x4−18x3+8x2+42x−36, [0,0,0] का एक मान्य (valid) interpolation है, हम अपने मूल समीकरण को इस प्रकार लिख सकते हैं:
u(x)v(x)=w(x)+b(x)
और यह समीकरण संतुलित (balanced) हो जाएगा!
b(x) की गणना आसानी से u(x)v(x)−w(x) के रूप में की गई थी (नीला polynomial माइनस लाल polynomial)।
हालाँकि, हम prover को कोई भीb(x) चुनने की अनुमति नहीं दे सकते, अन्यथा वे एक ऐसा b(x) चुन सकते हैं जो u(x)v(x) और w(x) को संतुलित कर दे, भले ही वे समान vector (हमारे उदाहरण में [8,8,64]) को interpolate न करते हों। b(x) को चुनने में prover के पास बहुत अधिक लचीलापन (flexibility) है। विशेष रूप से, हम यह आवश्यक करना चाहते हैं कि b(x) के roots x=1,2,…,n पर हों – अर्थात्, 0 vector को interpolate करें। इस तरह, v1∘v2=v3+0 का polynomial ट्रांसफॉर्मेशन अभी भी अंतर्निहित (underlying) vectors का सम्मान करता है।
b(x) के उनके चुनाव को सीमित करने के लिए, हम निम्नलिखित प्रमेय (theorem) का उपयोग कर सकते हैं:
Polynomial गुणनफल (product) के roots का union
Theorem: यदि h(x)=f(x)g(x) है और f(x) के roots का सेट {rf} है तथा g(x) के roots का सेट {rg} है, तो h(x) के roots {rf}∪{rg} होंगे।
उदाहरण
मान लीजिए f(x)=(x−3)(x−4) और g(x)=(x−5)(x−6) है। तब h(x)=f(x)g(x) के roots {3,4,5,6} होंगे।
हम यह लागू करने (enforce) के लिए उपरोक्त theorem का उपयोग कर सकते हैं कि b(x) के roots x=1,2,…,n पर हों।
b(x) को zero vector होने के लिए बाध्य करना
हम b(x) को b(x)=h(x)t(x) में विघटित (decompose) करते हैं जहाँ t(x) यह polynomial है:
t(x)=(x−1)(x−2)…(x−n)
तब t(x) के साथ गुणा किया गया कोई भी polynomial भी zero vector होगा, क्योंकि इसके roots x=1,2,…,n पर होने चाहिए।
इसलिए, हम अपने समीकरण में b(x) को h(x)t(x) से बदल देंगे।
इस प्रकार, हमारी समानता (equality) बन जाएगी:
u(x)v(x)=w(x)+h(x)t(x)
हम बुनियादी बीजगणित (algebra) का उपयोग करके h(x) की गणना कर सकते हैं:
h(x)=t(x)u(x)v(x)−w(x)
QAP एंड-टू-एंड
मान लीजिए कि हमारे पास matrices L, R, और O तथा witness vector a के साथ एक R1CS है।
La∘Ra=Oa
Matrices में n कॉलम और m पंक्तियाँ हैं जहाँ n=4 और m=3 है।
हम प्रत्येक matrices को m कॉलम vectors में विभाजित करते हैं और प्रत्येक के लिए m polynomials उत्पन्न करने के लिए उन्हें (1,2,...,n) पर interpolate करते हैं।
जहाँ ui(x), vi(x), और wi(x) वे polynomials हैं जो क्रमशः L, R, और O के कॉलम को interpolate करते हैं, t(x), (x−1)(x−2)...(x−n) है, जहाँ n, L, R, और O में पंक्तियों की संख्या है, तथा h(x) है:
Quadratic Arithmetic Programs के साथ Succinct Zero Knowledge Proofs
मान लीजिए हमारे पास एक ऐसा तरीका हो जिससे verifier, prover को एक रैंडम वैल्यू τ भेज सके और prover इसके जवाब में यह दे:
ABC=u(τ)=v(τ)=w(τ)+h(τ)t(τ)
Verifier यह जाँच कर सकता है कि AB=C है और यह स्वीकार कर सकता है कि prover के पास एक मान्य (valid) witness a है जो R1CS और QAP दोनों को संतुष्ट करता है।
हालाँकि, इसके लिए verifier को यह विश्वास करना होगा कि prover, polynomials का सही मूल्यांकन (evaluate) कर रहा है, और हमारे पास prover को ऐसा करने के लिए मजबूर करने का कोई तंत्र (mechanism) नहीं है।
अगले अध्याय में, हम इस अध्याय में हमारी चर्चा के आधार पर एक R1CS को QAP में बदलने के लिए Python कोड दिखाएंगे।
फिर हम यह समस्या हल करने के लिए trusted setups पर चर्चा करेंगे कि prover से ईमानदारी से polynomials का मूल्यांकन कैसे करवाया जाए।