TrustLevel の ZK 投票アプリが、Cardano のメインネットで動いています。開発に加わる Dominik Tilman 氏は 10 月 31 日、匿名のグループ署名の仕組み Semaphore を Cardano に移植し、Aiken で書いた Plutus v3 のバリデーターでゼロ知識証明 (ZK) を検証している、と X のスレッドで解説しました。
投票者は「登録された参加者の一人であること」だけを証明して票を入れ、誰が投じたかは主催者にも分かりません。コードは Apache 2.0 で公開され、vote.trustlevel.io で実際に試せます。何が保証され、どこから先は保証されないのかを、リポジトリの文書から整理します。
誰が投じたかを隠し、二重投票は止める
リポジトリの説明によると、このアプリが保証するのは 4 つです。登録した参加者だけが投票できること、1 人 1 回までしか投票できないこと、結果を Cardano のチェーン上で誰でも確かめられること、集計を後から書き換えられないこと。そのうえで、主催者を含む誰も、投じられた票と投票者を結びつけられない、としています。
仕組みの中心は、BLS12-381 という楕円曲線の上で組んだ Semaphore です。投票者は手元に秘密の身分情報を持ち、ブラウザの中で Groth16 という方式の証明を作ります。証明が示すのは「この身分は参加者の名簿に入っている」ことだけで、どの身分かは明かしません。1 回しか使えない値 (ナリファイア) をチェーン上の記録に書き込むことで、同じ人の 2 回目の票をはじきます。証明の検証はすべてチェーン上のスマートコントラクトで行われます。
投票者はウォレットも ADA も要りません。票の取引は運営側の中継用ウォレットが出して手数料を払うので、チェーン上で投票者のウォレットのアドレスが票の横に現れることもありません。メインネットでは、主催者が契約への預け入れ約 15 ADA と手数料約 1.5 ADA、さらに投票者 1 人あたり 1.3 ADA の手数料を前払いします。試験網の Preprod なら無料です。
監査と Catalyst のマイルストーン 4
v1.0 のタグは、Project Catalyst のマイルストーン 4 として提出した状態を固定したものです。メインネットと Preprod への対応、監査済みのコントラクト、中継による投票がここに入っています。
監査報告書 (9 月 29 日付) は、投票のバリデーターと、Semaphore の Cardano 版 cardano-semaphore v0.9.5 の重要な経路を対象にしています。10 月 5 日の複数人での試験では 12 票がチェーン上で確定し、最終的な集計が API とチェーンの状態の両方で一致しました。二重投票、同じ証明の使い回し、名簿にない人の証明、締め切り後の投票は、すべて正しく拒否されたと書かれています。3 段階の見直しで出た指摘は計 42 件で、多くは修正済み、一部は「部分的」または「認識済み」として残っています。
開発者自身が書いている限界
このアプリが分かりやすいのは、守れないことをリポジトリに自分で書いている点です。主なものを挙げます。
- 隠せるのは「誰が」で、「何に」投じたかはチェーン上で読める。投票の中身まで秘密にするには、暗号化した投票か、後から開示する方式への設計変更が要る
- 運営側のサーバーは、名簿の証明の取得と票の送信の両方を受けるので、記録を突き合わせれば投票者と票を結びつけうる
- 中継役は票を遅らせたり止めたりできる。ただし証明が中身を縛るので、偽造や改ざんはできない
- 票は 1 本ずつ順に処理され、1 票ごとに 20〜50 秒待つため、100 人の投票には 1 時間を大きく超える時間枠が要る
Cardano のオンチェーンのガバナンスでは、誰がどう投じたかが公開されるのが前提です。一方で、コミュニティの意見集めや団体内の決議のように、誰がどう投じたかを伏せたい場面もあります。今回のアプリは、名簿にいることだけを示して投票する仕組みが、Plutus v3 の上で実際に動くところまで来たことを示しています。残る課題は、運営側のサーバーと中継役への信頼をどこまで減らせるかです。
確認できる次の一点は、GitHub の ZK-Voting-App リポジトリです。限界の節に挙がっている「独立した送信経路」や「2 つ目の中継役」が次のマイルストーンでどう扱われるかで、信頼をどこまで減らせるかが見えてきます。
ことば
- Semaphore — グループの一員であることだけを証明して、匿名で意思表示できるゼロ知識の仕組みです。もとは Ethereum 向けに作られ、今回は BLS12-381 を使う形で Cardano に移されました。
- Groth16 — 証明が小さく、検証が速いゼロ知識証明の方式です。最初に「信頼できる初期設定」が必要で、このアプリでは 21 人が参加した初期設定を使っています。
- ナリファイア — 投票者ごとに 1 回だけ使える値です。正体を明かさずに「この人はもう投票した」ことだけを記録でき、二重投票を防ぐ鍵になります。
一次ソース / 関連リンク
- Dominik Tilman 氏の X のスレッド (ZK 投票の仕組みと限界)
https://x.com/DominikTilman/status/2116432836781908258
GitHub
ZK 投票アプリ (vote.trustlevel.io)(vote.trustlevel.io)
