PSE’s Summer Contribution Program の学び
Ethereum FoundationのPrivacy and Scaling Explorationsが主催するPSE’s Summer Contribution Programに、この度参加しました。そこでZKPについて、どのような学びがあったかを書いていきます。細かい学習内容については追って記事を書いていきますが、今回は総括ということで全体的なことを書いていきます。
- 全体の流れ
- どのような成果を得られたか
- 参加者のコントリビューション
- 今回参加してみた感想
1. 全体の流れ
大きく3つのステージで約2ヶ月間学びました。参加者は全体で58名。うち日本メンバー23人、韓国メンバー11人、台湾メンバー24人であった。
学習内容は下記の通りです。
Stage1 : グループごとに学びを深める
- ZKについての紹介
- 暗号化、ハッシュ関数、さまざまな高度な暗号の概念
- 楕円曲線の概念や現代暗号。双線形写像、ペアリング・ベースの暗号、KZG多項式コミットメント、マルチ・パーティ計算など。
- zkSNARKs - 算術回路から始まり、R1CSやQAPまで。Groth16やPlonkのような一般的な証明システムについても学ぶ
- PSEで開発されたプロトコルの探求。理論よりも実践的な応用と実際のコーディングに重きが置かれる。
- 実際にCircuitをcircomやHalo2で書いてみる
Stage2 : Hands on workshop
Stage2では実際にCircomやHalo2など自身の関心のある分野での学びを探求する。この時間で学びを深めることでStage3でのコントリビューションへつながる。
Stage3 : Contribution to Project
実際にGithubなど使用してプロジェクトにプルリクをしたりと貢献していくことが目的となる。
2. どのような成果を得られたか
Stage1 -> Stage2 -> Stage3と段階を踏みながら、学びを深める -> アウトプットという形で進められたため、はじめによくわからなかった内容も後々理解できるということが多かったです。ZKPは数学が必須(特にStage1の3と4)のため、そこで苦戦するメンバーも多かったがお互いに学び合える環境があったので乗り切ることができたと思います。またメンターの方々が丁寧に教えてくれるため、メンバー同士でわからないことも安心して学習に励むことができました。
私のグループの例
学習の成果は参加メンバーに大きく違っていたと思います。ZKPもプログラミングも知らない人から、プログラミング経験者でZKPも既にある程度知っている人まで多種多様な人が参加していました。ですので、私のようにZKPの全体感や数学の部分まで多少理解ができ、Circomなどを触ることができるようになった人もいれば、自分達で課題をみつけてCircomやHalo2をどんどんコーディングしていく人たちもいました。
それでは具体的にどのような成果があったか、Stage3で参加者が実際のプロジェクトにコントリビューションした内容を見ていきます。
3. 参加者のコントリビューション
ここでは参加者の成果を紹介していきます。約2ヶ月のプログラムのアウトプットとして、OSSへのコントリビュートを目標に設定し、最終日にはすべての地域での参加者がプレゼン方式で報告をしました。日本、韓国、台湾から様々なコントリビューションが生まれましたが、今回は日本の参加者の発表から紹介します。
署名された画像から指定の画像が処理されたことの証明 by Atsuki Koyamaさん
本来、元の画像(A)のサイズを圧縮した処理後の画像(B)からAを復元できないところ、ゼロ知識証明を用いることで、BがAから生成されたことを証明することができます。1/4の圧縮でこれを実現しました。
Keccakのトランスクリプトの実装 by Masato Tsutsumiさん
回路内でトランスクリプトを複製する必要がない場合のパフォーマンスを上げるため、PoseidonTranscriptの代わりにKeccakTranscriptを導入しました。
KOSの状態保護 by Yusuke Nakaeさん
OT拡張プロトコルの1つであるKOSでは、送信者はいくつかのメッセージを送信して、選択したもの以外は公開しませんが、セットアップに対する保護がありませんでした。これに対してコイントスプロセスの前にエラーに切り替えることで対応しました。
Chiquitoのテストコード by Kento Ikedaさん
Ethereum FoundationのPSEにより実装されたChiquitoに、lookup builder structsのテストコードを追加しました。
URLの変更 by Taishi Nakaiさん
DefinitelySetupという、p0tionでセットアップされたGroth16フェーズ2の信頼性のあるセットアップセレモニーのためのアグリゲーターの現在のURLを、変更される可能性が極めて低いURLに変更しました。
ペアリングのライブラリのデプロイとverifierコントラクトとの連結 by Gakuto Yamakiさん
ペアリングのライブラリをデプロイすることで、verifierコントラクトのコード量を減らし、トランザクション内で複数の証明が検証される場合のオフラインアカウントへのアクセス回数を減らすことを実現しました。
Circom wrapperの導入 by yugoさん
Circomでコンパイルされた.r1csおよび.wasmファイルを、PSE/folding-schemesで定義された元のR1CS構造に変換することで、Ciricomで回路を記述し、foldingスキームを用いて証明を行うことを実現しました。
ディレクトリの整理 by KFさん
nodeとbrowserのディレクトリを1つにまとめ、npm run nodeではnode環境で、npm run browserではbrowser環境で正しく作動するようにしました。
SemaphoreをHTML/CSS/JavaScriptで実装 by Nikita Kentさん
Semaphoreがweb3や特定のフロントエンドフレームワークのためのものだと誤解されやすいため、あえてHTML/CSS/JavaScriptで実装を行いました。
RLNjsのファイルサイズ削減 by Ryoko Watanabeさん
importでコードを減らし、ファイルサイズを3.2Mから2.0Mに削減しました。
by Masayuki Suzukiさん
create-unirep-appのcircomのバージョンを2.0.0から2.1.0にアップデートしTuples and Anonymous Componentsを使用可能にするだけでなく、置換データに対しても証明を生成できるように実装しました。
Semaphoreの参照サイトへの説明の追加 by Jo Shinozakiさん
signalsという単語が、Semaphoreの文脈ではスマートコントラクトに送られる値を指すのに対し、Circomの文脈ではZ/pZの体を含むデータを指すという違いを説明しました。
4. 今回参加してみた感想
ここではプログラムに参加したメンバーである田伏さん、まささんそして私mametaの実際の感想を書き連ねます
田伏さん
チューターのTakamichiさんやSoraさんに質問をするとすぐに対応していただいたり、分からない部分を生徒同士で考え話し合うことで、モチベーションを継続でき、あっという間の2ヶ月間でした。また参加者がとても優秀な方ばかりで、自分を客観視するとても良い機会になりました。これで終わりではなく、ZKの理論や実装を学び続けていきたいです。
まささん
本プログラムは、ゼロ知識証明、特にzkSNARKについて、理論と実装の両面から理解を深めることができるとても充実したプログラムでした。
zkSNARKは、「ある計算fを正しく行った結果がyである」ということを、明かしたくない入力は秘密にしながら相手に証明できる技術だと私は理解しました。
理論を学ぶだけでなく、zkSNARKで証明したい演算回路(計算f)を、halo2を用いて書くこともできるようになりました。メンターの方のサポートもあり、写真編集の証明回路およびシュノア署名の検証回路を実装することができました(https://github.com/matsutakk/zkimg )。zkSNARKは、Koyamaさんのhalo2-photo-proofのように、プライバシー保護だけでなくディープフェイク対策にも有効なのではと思います(https://arxiv.org/abs/2211.04775 )。
メンターの方はもちろん、参加した他の学生と共に学ぶことで、効率よく学習ができたと思います。まだまだこの世界は広く、今後とも少しづづ勉強していきたいと思います。最近は、Proofs, Arguments, and Zero-Knowledgeを読んでおり、今回学んだ基礎を元に、zkSNARKの構成要素をより深く理解していきたいなと思います。皆さん、ありがとうございました!
mameta
私はもともとZKPについて興味があり記事など読みながら自分で浅く勉強してきたものの、結局どのような仕組みでゼロ知識証明をすることができるのかわからないことが多かった。今思えばわからないことだらけで何をどこから理解していけば良いかが捉えられていなかったのだと思う。
それが今回のPSEのプログラムに参加することで、どのような数学的知識を身につけたら良いのか、それが生かされてどのような証明プロセスになっているかなど理解が深まった。正直わからないことも多いが、何がわからないかがわかっているのでこれから自走できるところまできたと思う。
今回のプログラムでは特に参加者メンバー同士での学び合いができたことで、気兼ねなくお互いに知見や良記事を共有でき学びを深めることができた。なぜZKではハッシュ関数としてSHA256ではなくPoseidonHashを使うのか?Trusted Setup Ceremonyではどのようなロジックで信用に足るパラメータを生成することが可能になっているのか?1人では学びきれないところまで、視野を広げることができたのは他の参加者のおかげである。
OSSへの貢献することへの重要性も学んだ。OSSの理念とそこに貢献していくことで、意見交換することができるし自分の学びを深めることができる。またそういったことを積み重ねることでさまざまなチャンスが舞ってくることもある。少しハードルが高いと思っていたことではあるが、PSEのプロジェクトへ少しずつコントリビュートしていきたいと思う。
Discussion