zk-SNARKsを構成する4つの技術を解説する
はじめに
vitalikが自身のブログでも言及していたzkSNARKs in a nutshell | Ethereum Foundation Blogを読み、日本語の翻訳がなかったので和訳してまとめました。
zk-SNARKsとは
非対話型ゼロ知識証明の一種。暗号資産ZCashはトランザクションの記録にこれを利用しています。
第三者にとって、「トランザクションが正当に行われたことは確かめられるが、送金者や受取人、送金額などそれ以外の情報はわからない」となるような手続きを実現するプロトコルです。
zk-SNARKsはJ.P. MorganのQuorumなどで実装されており、イーサリアムでもMetropolisアップデートで実装されました。
それでは解説を見ていきましょう。
zkSNARKs in a nutshell
- zkSNARK は難解
- しかしざっくり 4 つの単純な技術に還元することができる
A) 多項式問題としてのエンコード
- 検査対象のプログラムは,
という多項式の二次式に編纂されるt(x) h(x) = w(x) v(x) - 証明者は, この等式が成り立つことを検証者に納得させたいと考えている
B) ランダムサンプリングによる簡約化
- 検証者は秘密の評価点
を選び, 多項式の乗算と多項式関数の等式検証から, 単純な乗算と数の等式検証へと問題を縮小する:s t(s)h(s) = w(s)v(s) - これにより, 証明サイズと検証時間の両方が大幅に短縮される
C) 同型符号化・暗号化
- 同型性を持つ符号化・暗号化関数
を用いる (ただし, 完全な同型ではない, まだ実用化されていないもの)E - これにより証明者は,
といくつかの暗号化された値のみを知り,E(s) を知らなくてもs を計算することができるようになるE(t(s)), E(h(s)), E(w(s)), E(v(s))
D) ゼロ知識
- 検証者が真の暗号化された値を知らなくても, その正しい構造(structure)をチェックできるように, 証明者は値
にある数を掛けて変更(permutes)するE(t(s)), E(h(s)), E(w(s)), E(v(s)) - 大雑把に言うと, ランダムな秘密数
に対して,k \neq 0 の評価とt(s)h(s) = w(s)v(s) の評価は同じで, ただし,t(s)h(s)k = w(s)v(s)k と(t(s)h(s) k) だけ送られると,(w(s)v(s) k) もt(s)h(s) も導出できず, その点で異なる.w(s)v(s)
RSA とゼロ知識証明
- RSA の仕組みについて簡単に復習
- 整数全体ではなく, ある数の剰余を扱う
- ここでは「
」と表記し, 「a + b ≡ c \ \pmod n 」を意味する(a + b) \ \% \ n = c \ \% \ n - なお, 「
」の部分は右辺の「\pmod n 」ではなく, 実際には同じ式中の「c 」と「\equiv 」以外に適用される\equiv
- なお, 「
証明者は次のような数字を用意する.
-
: 2 つのランダムな秘密の素数p, q n \coloneqq p q -
となるような乱数d: 1 < d < n - 1 -
となるような数e: d e \equiv 1 \pmod {(p-1)(q-1)}
公開鍵は
暗号化: メッセージ
復号化:
- RSA の顕著な特徴の 1 つは, 乗法的に同型であること
- 一般に, 2 つの演算の順序を入れ替えても結果に影響がない場合, 同型と呼ぶ
- 同型暗号の場合は, 暗号化されたデータに対して計算を行うことができるという性質がある
- 存在するがまだ実用化されていない, 完全な同型暗号は, 暗号化されたデータに対して任意のプログラムを評価できるようになる
- ここでは RSA の場合で, 群間乗算の話だけをしている
- よりフォーマルには
E(x) E(y) \equiv x^e y^e \equiv (xy)^e \equiv E(x y) \pmod n - 要するに, 2 つのメッセージの暗号化の積は, メッセージの積の暗号化に等しい.
- この同型性により, 既にある種のゼロ知識による乗算の証明が可能
- 証明者はある秘密の数
とx を知っていて, それらの積を計算するが, 暗号化されたバージョンy ,a = E(x) andb = E(y) のみを検証者に送るc = E(x y) - ここで検証者は,
をチェックし, 検証者が知るのは積の暗号化されたバージョンと, 積が正しく計算されたことだけで, 2 つの因数も実際の積も知らない(a b) \ \% \ n \equiv c \ \% \ n - 積を足し算に置き換えると, これはもう, 残高を足すことがメインの操作であるブロックチェーンの方向に行ってしまう
- 証明者はある秘密の数
対話型検証
- ゼロ知識の次に zkSNARKs のもう一つの主要な特徴である簡潔性に焦点を当てる
- zkSNARKs の特筆すべき点はその簡潔さ
- なぜなら, ゼロ知識パートは, 限定された形の同型符号化を可能にするある符号化によって「無料で」提供されることになるから
SNARKs とは, succinct non-interactive arguments of knowledge の略称. この一般的な対話型プロトコルでは, 証明者 (prover) と 検証者 (verifier) がいて, メッセージを交換することによって, 証明者は検証者にある文(statement)[例:
- Succient: 実際の計算の長さに比べて, メッセージのサイズが小さい.
- Non-interactive: 対話が全くないか, あってもごくわずか. zkSNARK の場合, 通常はセットアップ段階があり, その後, 証明者から検証者へのメッセージが 1 つだけある. さらに, SNARK はいわゆる「公開検証者」の性質を持つことが多い. これは, 誰もが新たに対話することなく検証できることを意味し, ブロックチェーンにとって重要.
- ARguments: 検証者は, 計算能力の限られた証明者からは守られる. 十分な計算能力を持つ証明者は, 間違った文についての証明・論証を作ることができる(十分な計算能力があれば, どんな公開鍵暗号も破ることができる). これは, 「完全な健全性」に対して「計算上の健全性」とも呼ばれる.
- of Knowladge: 証明者は, ある種の witness(例えば, 使いたいアドレス, ハッシュ関数の preimage, あるマークルツリーのノードへのパス)を知らないと証明・論証を構成することができない.
ゼロ知識という接頭辞をつけると, 検証者は対話の間, 文の正当性以外には何も知らなくてよい という性質も必要になる(大雑把に言えば). 特に, 検証者は witness-string を知らない. それが具体的にどのようなものかは後述する.
- 例として, 次のようなトランザクション検証計算を考える:
f(\sigma_1, \sigma_2, s, r, v, p_s, p_r, v) = 1 -
,\sigma_1 : アカウントのマークルツリーの前状態および後状態のルートハッシュ\sigma_2 -
,s : 送信者および受信者のアカウントr -
,p_s :p_r の残高がs において少なくとも\sigma_1 であることを証明するマークルツリーの証明, そしてv がv の残高からs の残高へ移動した場合, それらはr のかわりに\sigma_1 へハッシュする\sigma_2
-
- すべての入力が既知であれば,
の計算を検証することは比較的容易である.f - そのため,
をf と\sigma_1 だけが公知で,\sigma_2 が witness-string である zkSNARK にすることができる(s, r, v, p_s, p_r, v) - ゼロ知識のプロパティにより, 検証者は, 正しい取引に関するいかなる要件にも違反しない方法でルートハッシュを
から\sigma_1 に変えるある witness を知っているが, 誰が誰にいくら送金したか分からない\sigma_2 - ゼロ知識の正式な定義(詳細は割愛)は, 設定文字列を生成し, 秘密の witness を知らないシミュレータが存在し, 検証者と対話することができるが, 外部の観測者はこの対話を本物の証明者との対話と区別することができない, というもの
NP と複雑系理論に基づく漸近法
zkSNARK がどのような問題や計算に使用できるかを確認するために, 複雑性理論からいくつかの概念を定義する. witness とは何か, ゼロ知識証明を「読ん」でもわからないことは何か, 多項式に関する特定の問題にのみ zkSNARK があってもよい理由は何か, などについては気にしないのであれば, このセクションは読み飛ばしてかまわない.
P と NP
まず, 0 か 1 しか出力しない関数に限定して, そのような関数を問題 (probrems)と呼ぶことにする. 長い結果の各ビットを個別にクエリできるので, これは現実的な制限ではないが, 理論的にはかなり楽になる. さて, 与えられた問題を解く(関数を計算する)ことがどれだけ「複雑」かを測りたい. 数学関数
ある
複雑さ理論の主要な問題のクラスは P と NP の 2 つ:
- P は多項式時間プログラムを持つ問題 L のクラスである.
指数
クラス NP
NP クラスの全ての問題に対して zkSNARK が存在し, 実際, 現在存在する実用的な zkSNARK は NP の全ての問題に汎用的に適用することができる. NP 以外の問題に対する zkSNARK が存在するかは不明である.
NP 内のすべての問題は, NP の定義に由来するある種の構造を常に持っている:
- NP とは, ある事実を検証するための多項式時間プログラム V を持つ問題 L のクラスであり, そのプログラムは, その事実に対する多項式サイズのいわゆる witness が与えられたときに, その事実を検証するために使用することができる.
- More formally:
となるような多項式サイズの文字列V(x, w) = 1 (witness と呼ぶ) が存在する場合, かつその場合に限り,w .L(x) = 1
NP の問題の例として, ブール式の充足可能性 (SAT) の問題を考えてみよう. そのために, 帰納的な定義でブール式を定義する.
- 変数
はブール式である (変数を表す文字として他の文字も用いる) .x_1, x_2, x_3,... -
がブール式なら,f はブール式 (negation) である.\neg f -
とf がブール式なら, (g ) と (f\land g ) はブール式 (conjunction / and, disjunction / or) である.f \lor g
文字列 "
論理式は, 式が真と評価されるように変数に真理値を割り当てる方法があれば, 充足可能である(ここで,
-
が充足可能なブール式なら 1, そうでなければ 0SAT(f) \coloneqq f
上の例 "
P = NP ?
- NP の定義を長さ 0 の witness string に限定すると, P の問題と同じ問題を捉えることになる
- そのため, P 問題はすべて NP に属する
- 複雑系理論の研究の主要な課題の 1 つは, この 2 つのクラスが実際には異なること, つまり NP には P にない問題があることを示すこと
- これは当たり前っぽいが, もし正式に証明できれば 100 万米ドルを獲得できる
- その逆, P と NP が等しいことを証明できれば, その金額もさることながら, 暗号通貨がある日突然存在しなくなる可能性が大きい (余談)
- なぜなら, Proof of work のパズル, ハッシュ関数の衝突, アドレスに対応する秘密鍵の解を見つけるのがずっと簡単になるから
- それらはすべて NP の問題であり, P = NP だとすれば多項式時間プログラムが存在するはず
- ただ実際はほとんどの研究者は P と NP はイコールではないと考えている
NP 完全
SAT に話を戻す. この一見単純な問題の興味深い性質は, NP に属するだけでなく, NP 完全であることだ. ここでいう「完全」とは, 「チューリング完全」と同じ完全である. これは, NP の中で最も難しい問題の一つであるという意味だが, より重要なのは, -これが NP 完全の定義だが-, NP のあらゆる問題の入力は, 次の意味で SAT の等価入力に変換できること.
任意の NP 問題 L に対して, いわゆる簡約関数 (reduction function)
このような reduction function は, コンパイラと見なすことができる: あるプログラミング言語で書かれたソースコードを, ある意味での振る舞いを持つ別のプログラミング言語(通常は機械語)で書かれた同等のプログラムに変換するのである. SAT は NP 完全であるため, このような reduction は NP のあらゆる問題に対して存在し, 例えば, ビットコインの取引が適切なブロックハッシュを与えられたときに有効かどうかをチェックする問題にも存在する. 取引を論理式に変換する reduction function があり, その式は取引が有効である場合にのみ満たすことができる.
簡約式 (Reduction) の例
このような reduction を見るために, 多項式の評価の問題を考える. まず, 多項式を, 整数の定数, 変数, 加算, 減算, 乗算, 括弧からなる式と定義する. さて, 考えたい問題は
-
がf を持つ多項式であり, その変数が集合0 から取られる場合,\{0, 1\} PolyZero(f) \coloneqq 1
SAT から
ブール式の構造要素に reduction 関数
なお,
-
がr(f) に\{0, 1\} を持つ場合, またその場合に限り,0 または,SAT(f) = PolyZero(r(f)) は満足される.f
Witness Preservation
- この例から, reduction 関数は入力をどのように変換するかを定義しているに過ぎないことがわかる
- しかしより詳しく見てみると (あるいは, reduction が有効であることの証明を読んでみると), 入力と一緒に有効な witness を変換する方法も見えてくる
- 今回の例では, 数式を多項式に変換する方法だけを定義したが, 証明と共に, witness を, 充足する割り当てに変換する方法を説明した
- この witness の同時変換はトランザクションでは必要ないが, 普通は行われる
- これは zkSNARK にとって非常に重要なことで, 証明者の唯一の仕事は, そのような witness が存在することを, witness に関する情報を明かすことなく, 検証者に納得させることだから
Quadratic Span Programs (QSP)
前節では, NP 内の計算問題がどのように互いに還元 (reduce) できるか, 特に, NP 内の他のすべての問題(トランザクション検証問題を含む)の基本的に再定式化に過ぎない NP 完全問題が存在することを見た. このことは, NP のすべての問題に対する一般的な zkSNARK を見つけることを容易にする: 我々は適切な NP 完全問題を選ぶだけである. つまり, zkSNARK を使ってどのように取引を検証するかを示したい場合, NP 完全で, おそらく理論的にはるかに取り組みやすい特定の問題に対してそれを行う方法を示せば十分.
この章と次の章は, 論文GGPR12(リンク先の技術報告には論文より多くの情報がある)に基づいており, 著者らは Quadratic Span Programs(QSP)という問題が zkSNARKs に特に適していることを発見した. Quadratic Span Programs は, 多項式の集合からなり, 与えられた別の多項式の倍数であるそれらの線形結合を見つけることが課題である. さらに, 入力文字列の個々のビットによって, 使用できる多項式が制限される. 詳しくは(一般的な QSP はもう少し緩やかだが, 後で使うので強いバージョンを既に定義している):
長さ
- この体 F 上の多項式
の集合v_0,...,v_m, w_0,...,w_m - F 上の多項式
(目的多項式)t - 射影関数
f: \{(i, j) | 1 ≤ i ≤ n, j \in \{0, 1\}\}. → \{1, ..., m\}
ここでの作業を大まかにいうと, 多項式に係数を掛けて, その和(線形結合)が
入力
-
に対して, もしi ならばk=f(i, u[i]) a_{k}, b_{k}=1 -
に対して, もしi ならばk=f(i, 1-u[i]) a_{k}, b_{k}=0 - ターゲット多項式
はt を割り切るv_{a} w_{b} - ただし
v_{a}=v_{0}+a_{1} v_{0}+\ldots+a_{m} v_{m}, w_{b}=w_{0}+b_{1} w_{0}+\ldots+b_{m} w_{m}
- ただし
ブール式の充足可能性に例えると, 係数
一般的な計算や回路から QSP への reduction については, 一般的な概念の理解に寄与しないのでここでは触れまない. 従って, QSP は NP 完全(いやむしろ, NP/poly のような非一様なアナログでは完全)であることを信じてもらわなければならない. 実際には, reduction は実際の「エンジニアリング」な部分である. それは, 結果として得られる QSP ができるだけ小さくなるように, また, 他のいくつかの良い特徴を持つように, 巧妙な方法で行われなければならない.
QSP について, すでに見えていることの 1 つは, より効率的に検証する方法である: 検証作業は, ある多項式が別の多項式を割り切るかどうかを調べることからなる. これは, 証明者が
そこで検証者は,
多項式の同一性を全点ではなく一点のみでチェックすると, もちろん安全性は低下するが,
zkSNARK の詳細
ここで, QSP の zkSNARK を詳細に説明する. これは, QSP ごとに実行されなければならないセットアップ段階から始まる. zCash では, 回路(トランザクション検証者)が固定されているため, QSP の多項式は固定されており, セットアップは一度だけ実行され, 入力
多項式を簡潔かつゼロ知識で評価する方法
まず, より単純なケース, つまり, QSP 問題全体ではなく, 秘密の点における多項式の暗号化された評価について見てみる.
ここで,群(通常は楕円曲線)と生成元
-
,E(s^0), E(s^1), ..., E(s^d) は全ての多項式の最大次数d
その後,
これらの値を用いれば, 証明者は
と仮定して
を計算したい場合,
が得られ, これは公開されている CRS から
ここで唯一の問題は,
そこで証明者は
このペアリング関数を用いて, 検証者は
しかし, より重要なのは,
実際, 上記のプロトコルでは, 検証者が多項式
この例からわかることは, 検証者はこれを確認するために多項式をすべて評価する必要はなく, ペアリング関数を評価すれば十分であるということです. 次のステップでは, ゼロ知識部分を追加し, 検証者は
そのために, 証明者はランダムな
- 証明者が実際にこれらの値を計算できること
- 検証者によるチェックが依然として真であること.
1.について,
であることに注意し, 同様に
2.について, 検証者が確認するのは, 受け取った値
QSP 問題に対する SNARK
QSP では, 多項式
前節で, 共通参照文字列 (CRS) の設定方法を既に説明した. 秘密の値
を公開する.
多項式は一つではなく, 問題に対して固定された多項式の集合であるため, 評価した多項式もすぐに公開する:
-
,E(t(s)), E(\alpha t(s)) -
,E\left(v_{0}(s)\right), \ldots, E\left(v_{m}(s)\right), E\left(\alpha v_{0}(s)\right), \ldots, E\left(\alpha v_{m}(s)\right) E\left(w_{0}(s)\right), \ldots, E\left(w_{m}(s)\right), E\left(\alpha w_{0}(s)\right), \ldots, E\left(\alpha w_{m}(s)\right)
そしてさらに秘密の値
-
,E(\gamma), E\left(\beta_{v} \gamma\right), E\left(\beta_{w} \gamma\right) E\left(\beta_{v} v_{1}(s)\right), \ldots, E\left(\beta_{v} v_{m}(s)\right) E\left(\beta_{w} w_{1}(s)\right), \ldots, E\left(\beta_{w} w_{m}(s)\right) E\left(\beta_{v} t(s)\right), E\left(\beta_{w} t(s)\right)
を公開する.
これは完全な共通参照文字列である. 実際の実装では, CRS の一部の要素は必要ないが, そうすると表現が複雑になる.
さて, 証明者はどうするのか?上で説明した reduction (還元, 簡約) を用いて, 多項式
-
,V_{{free }}:=E\left(v_{{free }}(s)\right), W:=E(w(s)), H:=E(h(s)) -
,V_{{free }}^{\prime}:=E\left(\alpha v_{{free }}(s)\right), W^{\prime}:=E(\alpha w(s)), H^{\prime}:=E(a h(s)) Y:=E\left(\beta_{v} v_{{free }}(s)+\beta_{w} w(s)\right)
ここで,
検証者の仕事は次のようなもの:
-
に含まれない全てのインデックスを網羅するI_{free} に対しk E(v_{in}(s))=\Sigma_{k} a_{k} v_{k}(s)
これで検証者は, ペアリング関数
e\left(V_{{free}}^{\prime}, g\right)=e\left(V_{{free}}, g^{\alpha}\right), \quad e\left(W^{\prime}, E(1)\right)=e(W, E(\alpha)), \quad e\left(H^{\prime}, E(1)\right)=e(H, E(\alpha)) e(E(γ), Y) = e(E(β_v γ), V_{free}) e(E(β_w γ), W) e\left(E\left(v_{0}(s)\right) E\left(v_{ {in }}(s)\right) V_{{free}}, E\left(w_{0}(s)\right) W\right)=e(H, E(t(s)))
ここで一般的な概念を理解するためには, ペアリング関数によって, 暗号化された値に対して限られた計算を行うことができることを理解する必要がある: 任意の足し算はできるが, 掛け算は 1 回だけである. これは足し算は, 暗号化自体が既に加法的同型であり, 掛け算はペアリング関数が持つ 2 つの引数によって実現されるから. つまり,
シークレットポイントでの多項式の評価についてのセクションを思い出すと, これらの 3 つの最初のチェックは, 基本的に, 証明者が CRS 内のパーツから作り上げた多項式を評価したことを確認するもの. 2 番目の項目は, 証明者が任意の多項式ではなく, 正しい多項式
証明者が正しい証明をしたと仮定して, 等式がうまくいくことを確認しよう. 左辺と右辺はそれぞれ
e(E(\gamma), Y)=e\left(E(\gamma), E\left(\beta_{v} v_{{free}}(s)+\beta_{w} w(s)\right)\right)=e(g, g)^{\gamma\left(\beta_{v} v_{free}(s)+\beta_{w} w(s)\right)} e(E(β_v γ), V_{free}) e(E(β_w γ), W) = e(E(β_v γ), E(v_{free}(s))) e(E(β_w γ), E(w(s))) = e(g, g)^{(β_v γ) v_{free}(s)} e(g, g)^{(β_w γ) w(s)} = e(g, g)^{γ(β_v v_{free}(s) + β_w w(s))}
3 番目の項目は, QSP 問題の主要条件である,
ゼロ知識の追加
- 冒頭で述べたように, zkSNARKS の特長は, ゼロ知識よりもむしろその簡潔さにある
- ゼロ知識の追加方法についてはここから説明し
- 次章ではその簡潔さについてもう少し説明
- このアイデアは, 証明者がいくつかの値をランダムな秘密の量で「シフト」し, 方程式の反対側でシフトのバランスをとるというもの
- 証明者は, ランダムな
を選び, 証明の中で次のような置換を行う\delta_{free}, \delta_w
- これらの置き換えにより, witness の因子をエンコードした値
とV_{free} は基本的にランダムと区別がつかなくなり, witness の抽出が不可能になるW - ほとんどの等式検査は修正に対して「免疫 (immune)」があり, 唯一修正しなければならないのは
またはH h(s)
次の式がまだ成立することを確かめなければならない:
言い換えると
この修正により, 次のようになる:
積を展開すると,
これを実行すればよい.
入力サイズと Witness サイズのトレードオフ
前節で見たように, witness は群(典型的には楕円曲線)の 7 要素のみからなる. さらに, 検証者がしなければならない作業は, ペアリング関数を含むいくつかの等式をチェックし,
第 2 パラメータである入力サイズについては, 一部を witness にシフトさせることで小さくすることが可能.
つまり, 入力
イーサリアムとの関連
任意計算 (arbitrary computations) の検証はイーサリアムブロックチェーンの中核であるため, zkSNARKs はもちろんイーサリアムと非常に関係が深い. zkSNARKs を使えば, 誰でも検証可能な秘密の任意計算を実行できるだけでなく, これを効率的に実行することも可能になる.
Ethereum はチューリング完全仮想マシンを使用しているが, 現在のところ Ethereum に zkSNARK 検証器 (verifier) を実装することはまだ不可能. verifier のタスクは概念的には単純に見えるかもしれないが, ペアリング関数は実際には計算が非常に難しいため, 現在 1 ブロックに利用できる量よりも多くのガスを使用することになる. 楕円曲線の乗算はすでに比較的複雑で, ペアリングはそれをさらにレベルアップさせる.
zCash のような既存の zkSNARK システムは, すべてのタスクに同じ問題/回路/計算を使用している. zCash の場合, それは取引検証器 (transaction verifier) である. イーサリアムでは, zkSNARK は単一の計算問題に限定されることなく, しかし代わりに, 誰もが新しいブロックチェーンを立ち上げることなく, 自分の専門的な計算問題のための zkSNARK システムを立ち上げることができるようになる. イーサリアムに新しく zkSNARK システムを追加するたびに, 新しい秘密信頼設定フェーズ (一部は再利用可能だが, 全てではない), つまり新しい CRS を生成する必要がある. また, 「一般的な仮想マシン」用の zkSNARK システムを追加するようなことも可能である. これは, Ethereum で新しいスマートコントラクトのために新しいブロックチェーンをブートストラップする必要がないのと同じように, 新しいユースケースのために新しいセットアップを必要としないだろう.
zkSNARK をイーサリアムに取り込む
イーサリアムで zkSNARKs を有効にする方法は複数ある. いずれもペアリング関数と楕円曲線演算の実費を削減し(他の必要な演算はすでに十分安価), その結果, これらの演算にかかるガスコストも削減することが可能.
- EVM の(保証された)性能を向上させる
- 特定のペアリング関数と楕円曲線乗算のみ EVM の性能を向上させる
もちろん, 最初の選択肢は, 長期的にはより良い結果をもたらすものだが, 実現は困難. 私たちは現在, EVM に機能や制限を追加することで, 既存の実装をあまり変更せずに, より良いジャストインタイムコンパイルと解釈を可能にすることに取り組んでいる. もう一つの可能性は, EVM を完全に取り替えて, eWASM のようなものを使用すること.
2 つ目の選択肢は, すべてのイーサリアムクライアントに, 特定の楕円曲線上の特定のペアリング関数と乗算を, いわゆるプリコンパイルコントラクトとして強制的に実装させることで実現できる. メリットは, おそらくこの方がはるかに簡単かつ迅速に実現できること. 一方欠点は, あるペアリング関数とある楕円曲線に固定されてしまうこと. イーサリアム用の新しいクライアントは, これらのプリコンパイルされたコントラクトを再実装しなければならない. さらに, 進化してよりよい zkSNARK やペアリング関数, 楕円曲線が見つかったり, 楕円曲線やペアリング関数, zkSNARK に欠陥が見つかったりすると, 新たにプリコンパイルされたコントラクトを追加しなければならなくなる.
おわりに
いかがでしたでしょうか。zk-SNARKsの記事というとELECTRIC COIN CO. の一連の解説記事やその翻訳記事(こちらのシリーズやこちら)を読まれる方も多いと思います。私はそちらも読みましたが、技術的な解説はこちらの方が簡潔で分かりやすいなと思いました。その後にELECTRIC COIN CO.の記事を読むとさらに理解が深まるかと思います。
マサカリ・質問等お待ちしています。
Discussion
Harukiさんとてもわかりやすく翻訳してまとめてくださってありがとうございます!ただ数学的な知識が乏しいのでかなり読み飛ばしながら理解させていただきました。
もしHarukiさんのツイッターなどあれば追っていきたいのですがございますか?