【CTO Tech Blog】Sumcheckプロトコル
- CTO Tech blog

今回は、zk-SNARKs/STARKsなどゼロ知識証明系のプロトコルでよく登場するSumcheckプロトコルについて。
Sumcheckプロトコルは1992年に発表された多変数多項式を利用したプロトコル。多変数多項式は複数の変数で構成される多項式で、例えば2つの変数xとyで構成される2変数多項式であればg(x,y)=3x2y+2xy+5y2+1のような式で、3変数多項式であればg(x,y,z)=2x2yz+3xy2z2+5z+7だったり。n
個の変数で構成されるn
変数多項式をg(x1,...,xn)と表記する。
Sumcheckは、各変数に0か1を代入して多項式を評価し、すべての変数の組み合わせに対して評価した値の合計を効率的に検証するプロトコル。検証者は実際にすべての組み合わせで多項式を評価することなく、その合計値が正しいことを検証できるというもの。どうして変数に代入する値は0と1なのかといううと(実際には任意のセットを用いることもできるが)、多くの暗号や計算問題はブール値で定式化でき、計算も簡単になるため。
証明プロセス
証明者があるn
変数多項式g(x1,...,xn)のすべての変数の組み合わせの総和がH
であることを証明したい場合(検証者は多項式については既知)、
① 証明者は、まずx1について和を計算する1変数多項式g1(X1)を送信する。これは、たとえばn = 3
、g(x1,x2,x3)=x1x2+x2x3+x1x3という多項式の場合、x2とx3のすべての組み合わせに対して多項式を評価し、
- g(X1,0,0)=X1⋅0+0⋅0+X1⋅0=0
- g(X1,0,1)=X1⋅0+0⋅1+X1⋅1=X1
- g(X1,1,0)=X1⋅1+1⋅0+X1⋅0=X1
- g(X1,1,1)=X1⋅1+1⋅1+X1⋅1=2X1+1
その和g1(X1)=0+X1+X2+2X1+1=4X1+1を求めることを意味する。
② 証明者から1変数多項式g1(X1)を受け取った検証者は、その多項式を評価してその和を計算する。つまりg1(0)+g1(1)を計算し、それが証明者が主張するn
変数多項式の和H
と等しいか検証する。上記の例だとg(x1,x2,x3)のすべての組み合わせの和は、
- g(0,0,0)=0⋅0+0⋅0+0⋅0=0
- g(0,0,1)=0⋅0+0⋅1+0⋅1=0
- g(0,1,0)=0⋅1+1⋅0+0⋅0=0
- g(0,1,1)=0⋅1+1⋅1+0⋅1=1
- g(1,0,0)=1⋅0+0⋅0+1⋅0=0
- g(1,0,1)=1⋅0+0⋅1+1⋅1=1
- g(1,1,0)=1⋅1+1⋅0+1⋅0=1
- g(1,1,1)=1⋅1+1⋅1+1⋅1=3
で合計すると6。これに対し、g1(0)+g1(1)はg1(0)+g1(1)=(4⋅0+1)+(4⋅1+1)=6となり一致する。結果が一致するということは、g1(X1)が実際にx1について和を取った多項式であることが、高い確率で確信できる。
③ 次に検証者は有限体Fからランダムな値r1∈Fを選択し、それを証明者に送信する。
④ 証明者は、次にg2(X2)を計算するが、この時x1には0と1ではなく検証者から受け取ったr1を代入する。そして計算結果のg2(X2)を検証者に送信する。たとえば、r1=3だとすると上記の例は、
- g(3,X2,0)=3⋅X2+X2⋅0+3⋅0=3X2
- g(3,X2,1)=3⋅X2+X2⋅1+3⋅1=4X2+3
で、その和g2(X2)=7X2+3を検証者に送信する。
⑤ 検証者は、g1(r1)=g2(0)+g2(1)が成立するか検証する。上記の例ではg1(r1)=g1(3)=4⋅3+1=13とg2(0)+g2(1)=(7⋅0+3)+(7⋅1+3)=13が一致するかどうかを検証する。
⑥ 検証が成功したら、検証者は再度r2∈Fを選択し、証明者に送信する。
⑦ 証明者は次にg3(X3)を計算するが、x1,x2はそれぞれr1,r2を用いる。r2=5とした場合、g3(X3)=g(3,5,X3)=3⋅5+5⋅X3+3⋅X3=8X3+15。
これを合計n
回繰り返す。
⑧ 最終的に検証者はrn∈Fを選択し、gn(rn)=g(r1,...,rn)が成立するか検証する。
このようにSumcheckプロトコルは、証明者は各ステップで1つだけ変数を残して他の変数の組み合わせに対して和をとる1変数多項式を送信し、それを検証者に検証させ、最終的にn
個の変数を用いて元の多項式を評価させることで、O(2n)の計算ではなくO(n)の計算で多項式の評価値の総和を検証できるようにしている。
Fiat-Shamir変換
上記は証明者と検証者の対話型のプロトコルになっているけど、Fiat-Shamir変換で非対話型にすることができる。証明者が最初の多項式g1(X1)を計算したら、g1のハッシュ値をr1=H(g1)とし、その次はr2=H(g1,g2,r1)と計算していくことで非対話型にできる。
zk-SNARKs/STARKsなどでは、ある多項式の総和が0になることを検証する仕組みとしてこのSumcheckプロトコルを利用してるみたい。
ブログ元記事へのリンク
ブログの元記事はこちらから
当HPでは数式などが正しく表記されていない可能性がございます。
ぜひ元記事をご確認ください。
https://techmedia-think.hatenablog.com/entry/2025/05/21/182655
Chaintopeでブロックチェーンの未来を共に創りませんか?
Chaintopeは、独自のブロックチェーン「Tapyrus」と、開発プラットフォーム「Tapyrus Platform」を活用し、デジタル社会の信頼基盤を構築しています。
私たちは、ブロックチェーン技術の可能性を最大限に引き出し、社会に新しい価値を提供することを目指しています。
募集職種:
ブロックチェーンエンジニア
アプリケーションエンジニア
インフラ・保守エンジニア
プロジェクトマネージャー
フィールドセールス
Chaintopeで働く魅力:
最先端のブロックチェーン技術に触れる機会
リモートワークやフレックスタイム制による柔軟な働き方
専門性の高いチームとの協働
ブロックチェーン技術に情熱を持つあなたのスキルを、私たちのチームで活かしませんか?
詳細は、採用情報をご覧ください。