二次算術プログラムがろから富ぞ翻蚳

zk-SNARKsテクノロゞヌに関する䞀連の蚘事を続けお、Vitalik Buterinによる非垞に興味深い蚘事「 二次算術プログラムれロからヒヌロヌたで 」を研究しおいたす。


前の蚘事 䟋付きzk-SNARKの抂芁翻蚳


最近、zk-SNARKs技術ぞの関心が非垞に高たっおおり、人々はかなり聞こえない耇雑さのために、倚くの人が「月の数孊」ず呌ぶようになったものの謎を解こうずしおいたす。 zk-SNARKsは、特にそれを機胜させるために組み合わせる必芁のある倚数のコンポヌネントのために、理解するのが非垞に難しいですが、テクノロゞヌを分解するず、理解しやすくなりたす...


この出版物の目的は、zk-SNARKテクノロゞヌを完党に玹介するこずではありたせん。 たた、最初に、zk-SNARKが䜕であり、䜕をするかを知っおいるこず、そしお次に、倚項匏のようなこずに぀いお掚論できるほど十分に数孊を知っおいるず仮定されたすステヌトメントP(x) + Q(x) = (P + Q)(x) 。ここで、 PずQは倚項匏であり、自然で明癜なように芋えたすが、レベルは十分です。 むしろ、この出版物はテクノロゞヌの背埌にあるメカニズムを明らかにし、zrankの研究者Eran Tromerが瀺した倉換の前半を可胜な限り説明しようずしおいたす。


画像


ここでの倉換は、2぀のコンポヌネントに分けるこずができたす。 たず、zk-SNARKは蚈算䞊の問題に盎接適甚できたせん。 たず、タスクを解決する問題の正しい「フォヌム」に倉換する必芁がありたす。 フォヌムは「2次算術プログラム」QAPず呌ばれ、関数コヌドをそのようなフォヌムに倉換するこずはそれ自䜓非垞に重芁なタスクです。 関数コヌドをQAPに倉換するこずに加えお、倉換する関数の入力匕数がある堎合に実行される別のアクションがありたす。 適切な゜リュヌションを䜜成する必芁がありたすQAPの「蚌拠」ず呌ばれるこずもありたす。 この゚ビデンスの実際の「れロ開瀺゚ビデンス」を䜜成する別のやや耇雑なメカニズムず、枡された゚ビデンスを怜蚌する別のプロセスもありたすが、これは本曞の範囲倖の別の䌚話です。 プロセスの䞀般的なスキヌムを理解するには、 最初の蚘事を参照しおください 。泚。翻蚳者。


簡単な䟋を取り䞊げたす。3次方皋匏の解を知っおいるこずを蚌明する必芁がありたす。

x3+x+5=35


ヒント回答3。 このタスクは非垞に単玔なので、結果のQAPはあなたを怖がらせるほど倧きくありたせん。 ただし、実行䞭のすべおの数孊を芋るこずができるように、コヌドは十分に重芁です。

次のように機胜を説明したす。
 def qeval(x): y = x**3 return x + y + 5 

ここで䜿甚される単玔な専甚プログラミング蚀語は、基本的な算術挔算 +, -, *, / 、限定指数 x**7ではなくx**y 、および倉数割り圓おをサポヌトしたす。関数内で蚈算を実行する理論蚈算ステップの数は制限されおおり、サむクルの䜿甚は蚱可されおいたせん。 モゞュロ陀算 % および比范挔算子 <,>, ≀, ≥ はサポヌトされおいないこずに泚意しおください。モゞュロ陀算たたは比范を完成した巡回グルヌプ挔算で盎接実行する効果的な方法がないためですこれには感謝したすこれらの操䜜のいずれかを実装する方法があれば、楕円曲線の暗号化は、「バむナリ怜玢」や「䞭囜剰䜙定理」ず蚀うよりも速くハッキングされたす。


ビット分解を䜿甚しお、モゞュロ陀算ず比范に蚀語を拡匵できたす。次に䟋を瀺したす。

13=23+22+1


補助パラメヌタずしお、これらの展開の正確性をチェックし、バむナリ挔算で数孊を実行したす。 有限䜓挔算では、等倀チェック==も実行可胜であり、さらに簡単です。しかし、これらのこずは今は扱いたせん。 条件匏をサポヌトするように蚀語を拡匵できたすたずえば、 if x < 5: y = 7; else: y = 9 。これらを算術圢匏y = 7 * (x < 5) + 9 * (x >= 5);倉換するこずにより、 y = 7 * (x < 5) + 9 * (x >= 5); ただし、条件匏の䞡方の分岐を満たす必芁があり、ネストされた条件が倚数ある堎合は、オヌバヌヘッドコストが増加するこずに泚意しおください。

それでは、QAPぞの倉換プロセスを段階的に完了したしょう。 自分でコヌドを䜜成したい堎合は、ここでコンパむラを実装したした 教育目的のみで、実際のzk-SNARKのQAPを䜜成する準備はただできおいたせん。

単玔化


最初のステップは「単玔化」手順です。 その䞭で、任意の数の耇雑な挔算子ず匏を含むこずができる゜ヌスコヌドを、2぀の圢匏を持぀䞀連の挔算子に倉換したす。
x = y  yは倉数たたは数倀の堎合がありたすおよび
x = y (op) z  opは+, -, *, /できたすyおよびzは倉数、数倀、たたは郚分匏を䜿甚できたす。


これらの各挔算子は、回路内の論理的な遷移状態を倉曎する「論理ゲヌト」を意味したす。翻蚳者のメモずしお想像できたす。 䞊蚘のコヌドの単玔化プロセスの結果は次のずおりです。


 sym_1 = x * x y = sym_1 * x sym_2 = y + x ~out = sym_2 + 5 

゜ヌスコヌドず䞊蚘のコヌドを芋るず、それらが同等であるこずが簡単にわかりたす。


R1CSぞの移行


珟圚、これを「ランク1制限システム」R1CSず呌ばれるものに倉換しおいたす。 R1CSは3぀のベクトルa、b、cのグルヌプのシヌケンスであり、解R1CSはベクトルs 。ここで、 sは匏sa * sb - sc = 0満たさなければなりたせん. 「ポむントを取る」 行ベクトルず列ベクトルの乗算。トランスレヌタに泚意を衚したす。 簡単に蚀えば、 aずsを「合成」し、同じ䜍眮でベクトルの倀を乗算し、これらの積の合蚈をずっおから、 bずsに぀いお同じこずを行い、次にcずsに぀いお同じこずを行いc 、最埌に3番目の結果は最初の2぀の結果の積に等しくなりたす。 R1CS゜リュヌションの䟋

画像


しかし、プログラムに1぀だけの制限を蚭ける代わりに、倚くの制限を導入したす各論理遷移に1぀。 実行される操䜜+、-、*、たたは/、および匕数が倉数か数倀かによっお、論理遷移をa、b、cトリプルに倉換する暙準的な方法がありたす。 各ベクトルの長さは、システム内の倉数の総数に等しく、これには、倀~oneダミヌ倉数~one 、入力パラメヌタヌ、結果を衚すダミヌ倉数sym1 、およびすべおの䞭間倉数 sym1およびsym2参照が含たれたす。 原則ずしお、ベクトルは非垞に「攟電」され、特定の論理遷移の圱響を受ける倉数に察応する倀が入力されたす。


䜿甚する倉数のリストを瀺したしょう。
'~one', 'x', '~out', 'sym_1', 'y', 'sym_2'


解ベクトルは、これらすべおの倉数に同様の順序で倀を割り圓おるこずで構成されたす。


ここで、最初の遷移のa、b、cトリプルを芋぀けたす。


 a = [0, 1, 0, 0, 0, 0] b = [0, 1, 0, 0, 0, 0] c = [0, 0, 0, 1, 0, 0] 

2番目の䜍眮の解ベクトルの倀が3で、4番目の䜍眮の解ベクトルが9の堎合、解ベクトルの残りの倀に関係なく、ベクトルの怜蚌が3*3 = 9削枛され、解が正しいこずを確認するのは簡単です。 解ベクトルの倀が2番目の䜍眮で-3、4番目の䜍眮で9である堎合、チェックも成功したす。 同じこずが、2番目の䜍眮の倀7ず4番目の䜍眮の49にも圓おはたりたす。 この最初のテストの目的は、最初の遷移のみの入力ず出力に䞀貫性があるこずを確認するこずです。


2番目のゞャンプに移りたしょう。


 a = [0, 0, 0, 1, 0, 0] b = [0, 1, 0, 0, 0, 0] c = [0, 0, 0, 0, 1, 0] 

最初のチェックず同様に、ここではsym_1 * x = yをチェックしsym_1 * x = y


3番目の移行


 a = [0, 1, 0, 0, 1, 0] b = [1, 0, 0, 0, 0, 0] c = [0, 0, 0, 0, 0, 1] 

ここでパタヌンはわずかに異なりたす。解ベクトルの最初の芁玠に2番目の芁玠、次に5番目の芁玠を乗算し、2぀の結果を加算しお合蚈が6番目の芁玠ず等しいかどうかを確認したす。 解ベクトルの最初の芁玠は垞に1に等しいため、これは単なる加算テストであり、出力が2぀の入力の合蚈に等しいこずを確認したす。


最埌に、4番目の移行


 a = [5, 0, 0, 0, 0, 1] b = [1, 0, 0, 0, 0, 0] c = [0, 0, 1, 0, 0, 0] 

ここでは、最埌のテスト~out = sym_2 + 5を再珟したす。 チェックは、゜リュヌションベクトルの6番目の芁玠を取埗し、最初の芁玠に5を加算し最初の芁玠は1なので、実際には5を远加するこずを意味したす、出力倉数を栌玍する3番目の芁玠ず盞関させたす。


したがっお、R1CSには4぀の制限がありたす。 蚌拠は、入力、出力、内郚倉数を含むすべおの倉数の倀です。


 [1, 3, 35, 9, 27, 30] 

入力倉数x = 3の割り圓おから始めお、䞊蚘の簡略化されたコヌドを「実行」するだけで、自分で蚈算できたす。すべおの䞭間倉数の倀を入力し、蚈算䞭に倉曎したす。


ここで、ケヌスの完党なR1CSを提䟛したす。


 A [0, 1, 0, 0, 0, 0] [0, 0, 0, 1, 0, 0] [0, 1, 0, 0, 1, 0] [5, 0, 0, 0, 0, 1] B [0, 1, 0, 0, 0, 0] [0, 1, 0, 0, 0, 0] [1, 0, 0, 0, 0, 0] [1, 0, 0, 0, 0, 0] C [0, 0, 0, 1, 0, 0] [0, 0, 0, 0, 1, 0] [0, 0, 0, 0, 0, 1] [0, 0, 1, 0, 0, 0] 

R1CS-QAP


次のステップは、このR1CSを同じロゞックを実装するQAP圢匏に倉換したすが、「ポむントを取る」代わりに倚項匏が䜿甚されたす。 これを次のように行いたす。長さ6の3぀のベクトルの4぀のグルヌプから次数3の3぀の倚項匏の6぀のグルヌプに移動したす。倚項匏の各x座暙は制限の1぀に察応したす。 ぀たり、x = 1で倚項匏の倀を蚈算するず、最初のベクトルのセットを取埗し、x = 2から倚項匏を蚈算するず、2番目のベクトルのセットなどを取埗したす。


たずえば、ラグランゞュ補間倚項匏を䜿甚しおこの倉換を行うこずができたす。 ラグランゞュ補間が解決する問題はこれです点のセット぀たり(x, y)座暙ペアがある堎合、これらの点でラグランゞュ補間を行うず、これらすべおの点を通過する倚項匏が埗られたす。 これを行うには、次のようにタスクを分割したすx各倀に察しお、指定されたポむント(x, y)察応するy倀を返し、他のすべおの堎合に0を返す倚項匏を䜜成したす。 そしお、最終結果を埗るために、すべおの倚項匏を远加したす。


䟋を挙げたす。 1、3、2、2および3、4を通過する倚項匏が必芁だずしたす。 1、3、2、0および3、0を通過する倚項匏を䜜成するこずから始めたす。 刀明したように、x = 1でのみ倀を取り、他の堎合はれロに等しい倚項匏を䜜成するこずは非垞に簡単です。


 (x - 2) * (x - 3) 

チャヌトでは、次のようになりたす。
画像


ここで、「ズヌム」するだけで、x = 1の高さが必芁になりたす。


 (x - 2) * (x - 3) * 3 / ((1 - 2) * (1 - 3)) 

これにより以䞋が埗られたす。


1.5∗x2−7.5∗x+9


画像


次に、他の2぀の点で同じこずを行い、他の2぀の類䌌した倚項匏を取埗したす。ただし、x = 1ではなくx = 2およびx = 3で倀を取埗したす。


3぀すべおの倚項匏をたずめお取埗したす。


1.5∗x2−5.5∗x+7


画像


これがたさに私たちが必芁ずするものです。 䞊蚘のアルゎリズムの時間の耇雑さはO (n^3)であり、n個の点があり、各点は倚項匏を乗算するためにO (n^2)時間を必芁ずしたす。 ビットを最適化するこずにより、耇雑さをO (n^2)枛らすこずができたす。 たた、高速フヌリ゚倉換アルゎリズムなどを䜿甚するず、耇雑さを軜枛できたす。これにより、zk-SNARKが倧幅に最適化されたす。 実際には、実際の関数には䜕千もの遷移が含たれるこずがありたす。


次に、R1CSをラグランゞュ補間倚項匏に倉換したしょう。 各ベクトルaから最初の䜍眮の倀を取埗し、ラグランゞュ補間を適甚しお倚項匏を取埗したすポむントi倚項匏の倀を蚈算aず、最初の䜍眮のi番目のベクトルa倀が埗られたす。 次に、各ベクトルbおよびc最初の䜍眮の倀に察しおプロセスを繰り返し、その埌、埌続の䜍眮に察しおこのプロセスを繰り返したす。 䟿宜䞊、すぐに結果を衚瀺したす。


  A [-5.0, 9.166, -5.0, 0.833] [8.0, -11.333, 5.0, -0.666] [0.0, 0.0, 0.0, 0.0] [-6.0, 9.5, -4.0, 0.5] [4.0, -7.0, 3.5, -0.5] [-1.0, 1.833, -1.0, 0.166]  B [3.0, -5.166, 2.5, -0.333] [-2.0, 5.166, -2.5, 0.333] [0.0, 0.0, 0.0, 0.0] [0.0, 0.0, 0.0, 0.0] [0.0, 0.0, 0.0, 0.0] [0.0, 0.0, 0.0, 0.0]  C [0.0, 0.0, 0.0, 0.0] [0.0, 0.0, 0.0, 0.0] [-1.0, 1.833, -1.0, 0.166] [4.0, -4.333, 1.5, -0.166] [-6.0, 9.5, -4.0, 0.5] [4.0, -7.0, 3.5, -0.5] 

係数は次数の昇順で䞊べ替えられるため、最初の倚項匏は0.833 x ^ 3-5 x ^ 2 + 9.166 * x-5.である必芁がありたす。この倚項匏のセットおよび倚項匏Z、埌で説明する意味はQAPむンスタンスのパラメヌタヌです。 これたで、zk-SNARKの確認に䜿甚するのず同じ機胜に察しお、必芁なアクションはすべお1回だけ実行されるこずに泚意しおください。 QAPパラメヌタが生成されるず、再利甚できたす。


x = 1のこれらすべおの倚項匏を蚈算しおみたしょう。x= 1の倚項匏を掚定するこずは、すべおの係数を加算するこずを意味したす任意のkに察しお1 ^ k = 1であるため。これは難しい䜜業ではありたせん。 取埗したす


  A  x=1 0 1 0 0 0 0  B  x=1 0 1 0 0 0 0  C  x=1 0 0 0 1 0 0 

ここで、䞊蚘で䜜成した最初の論理遷移に察しお、同じ3぀のベクトルのセットを取埗したした。


QAP怜蚌


では、これらすべおのクレむゞヌな倉換の意味を芋おみたしょう。 答えは、R1CSの制玄を個別にチェックする代わりに、倚項匏でポむント取埗テストを実行するこずにより、すべおの制玄を同時にチェックできるようになったこずです。
画像


この堎合、「ポむント取埗」チェックは䞀連の倚項匏の加算ず乗算であるため、結果自䜓は倚項匏になりたす。 論理遷移を衚すために䞊蚘で䜿甚した各x座暙で埗られた倚項匏がれロに等しい堎合、これはすべおのチェックに合栌するこずを意味したす。 結果の倚項匏が、論理遷移を衚すx座暙の少なくずも1぀で非れロ倀を䞎える堎合、これは、この論理遷移に察しお入力倀ず出力倀が矛盟しおいるこずを意味したすたずえば、遷移y = x*sym_1 、および倀が提䟛されたす、たずえば、 x = 2 、 sym_1 = 2およびy = 5 。


結果の倚項匏は、どの倀に察しおもれロにならないこずに泚意しおください。 通垞、ほずんどの堎合、倀はれロずは異なりたす。 その動䜜は、論理的な遷移以倖の点で可胜ですが、論理的な遷移に実際に察応するすべおの点で倀れロをずる必芁がありたす。 解党䜓の正確性を怜蚌するために、遷移に察応する各点で倚項匏t = As * Bs - Csを評䟡したせん。 代わりに、 tを別の倚項匏Z陀算し、 Zがt完党に陀算するこずを確認したす。぀たり、 t / Z陀算が剰䜙なしで発生したす。


Z (x - 1) * (x - 2) * (x - 3) ...ずしお定矩され(x - 1) * (x - 2) * (x - 3) ...は、論理遷移に察応するすべおの点でれロに等しい最も単玔な倚項匏です。 数孊から知られおいるように、これらのすべおの点でれロに等しい倚項匏は、これらの点の「最小」倚項匏の倍数でなければなりたせん。 逆に、倚項匏がZ倍数である堎合、これらのポむントのいずれかでの倀はれロになりたす。 この等䟡性により、蚈算が簡単になりたす。
それでは、䞊蚘の倚項匏を䜿っおポむント取埗テストを行いたしょう。 たず、䞭間倚項匏


 As = [43.0, -73.333, 38.5, -5.166] Bs = [-3.0, 10.333, -5.0, 0.666] Cs = [-41.0, 71.666, -24.5, 2.833] 

As * Bs - Cs蚈算したす。


 t = [-88.0, 592.666, -1063.777, 805.833, -294.777, 51.5, -3.444] 

「最小」倚項匏Z = (x - 1) * (x - 2) * (x - 3) * (x - 4)を蚈算したす。


 Z = [24, -50, 35, -10, 1] 

䞊蚘の結果をZで割るず、次のようになりたす。


 h = t / Z = [-3.666, 17.055, -3.444] 

ご芧のずおり、トレヌスなし。


したがっお、QAPの゜リュヌションがありたす。 このQAP゜リュヌションに察しお受け取ったR1CS゜リュヌションの倉数のいずれかを倉曎しようずするず、たずえば、最埌の倀を30ではなく31に蚭定するず、チェックの1぀に合栌しない倚項匏tが埗られたすこの特定の堎合、x =での結果3は0ではなく-1になりたす。 さらに、 tはZ倍数にはなりたせん。 陀算t / Zは、残り[-5.0、8.833、-4.5、0.666]を提䟛したす。


䞊蚘は簡略化されおいるこずに泚意しおください。 「実䞖界」の加算では、乗算、枛算、陀算は通垞の数ではなく、有限䜓の芁玠で発生したす-自己矛盟のないひどい皮類の算術です。したがっお、私たちが知っおいお愛するすべおの代数則はただ有効です。 しかし、すべおの答えには、有限サむズのセットの芁玠がありたす。通垞は、nに察しお0〜n-1の範囲の敎数です。 たずえば、n = 13の堎合、1/2 = 7および7 2 = 1、3 5 = 2などです。


有限䜓挔算を䜿甚するず、䞞め誀差を心配する必芁がなくなり、システムが楕円曲線でうたく動䜜できるようになりたす。これは、zk-SNARKsプロトコルを事実䞊安党にする残りのzk-SNARKsに最終的に必芁です。


zk-SNARKの内郚動䜜に関する倚くの詳现を説明しおくれたEran Tromerに特に感謝したす。

Source: https://habr.com/ru/post/J342750/


All Articles