📌

Circomは何をしているのか?そしてコンパイルオプションについて

2023/05/06に公開

はじめに

zk-SNARKsを使ったDAppsを実装するのに、現状一番使われているものの一つがCircomだと思います。
回路の書き方はなんとなく理解したもののCirom自体が何をしているのか理解しきれていないので、ちょっと詳しく調べていきます。

Circomでやっていること

zk-SNARKsである知識を持っていることの証明は以下のような流れになっています。(What are zk-SNARKs?より抜粋)

Computation → Arithmetic Circuit → R1CS → QAP → zk-SNARK

細かい説明は抜粋元の記事を読んで頂くとして、Circomで作っているのはComputationの部分ですね。
これをコンパイルしてR1CS等にしていくことになります。

R1CS(rank-1 constraint system):ある任意の制約は式変形することで制約の数を減らせることもある。式変形後のある特定の形式の数式のこと。
QAP(Quadratic Arithmetic Program):用途が違うだけでR1CSと同じようなある特定の形式の数式のこと。

コンパイルオプション

普段利用してるのは以下のコマンドのようにr1csとwasmオプションくらいです。(これで開発には必要十分っぽい)
そのため、他のオプションも調べてみます。

circom zk/circuits/sample.circom -o zk/ --r1cs --wasm

--r1cs: R1CSフォーマットで出力(.r1csファイルが出力される)
--wasm: 証明の生成を行うwasmファイルを出力
--sym: witnessをsymフォーマットで出力(.symファイルが出力される)

witness:制約の答え(3a+2b=0を満たす任意のaとbの組み合わせのこと)
symフォーマット:デバッグや注釈モードで制約を出力するのに使用

後は、なんとなくhelpの内容見れば分かりそうですね。ただ、0@,01,02オプションあたりはよく分かりませんでした。以下のようなエラーが出て、特に何か出力されなかったので、分かったら更新します。

error: Found argument '--0@' which wasn't expected, or isn't valid in this context

まとめ

ちょっと理解できなかった部分もあるので、分かったら更新したいと思います。

Discussion