🤫

zkって何?── Web3を支える技術 ──

に公開

はじめに

Web3が抱えてきた課題のひとつに、取引手数料(ガス代)の高さがありました。
この問題は、Layer2ソリューションの登場によって大きく改善されてきました。

https://zenn.dev/nonejp/articles/0758b1cf3c3a4c#コスト効率の理想と現実の乖離

では、そのLayer2を支える技術にはどのようなものがあるのでしょうか。
本記事では、その中でも特に重要な技術のひとつである zk(ゼロ知識証明) に焦点を当て、その仕組みや活用事例についてまとめます!

zkって何?

zk(ゼロ知識証明)は、「ある事実が正しいこと」をその事実の中身を明かさずに証明する暗号技術です。
たとえば、「あなたが18歳以上である」ことを、生年月日や名前といった個人情報を開示せずに証明できる──そんなことを可能にします。

洞窟の問題

ゼロ知識証明の有名な説明に、ジャン=ジャック・キスケータ氏の「洞窟の問題」があります。
これはペギー(証明者)が、自分が「秘密の合言葉」を知っていることを「秘密の合言葉」を明かさずに証明しようとするお話です。

  1. 円形の洞窟があり、入り口から左右(A・B)に分かれ、奥でつながっています。
  2. 奥の扉は秘密の合言葉でしか開きません。

  1. ペギー(証明者)はこの合言葉を知っていると主張します。

  2. ヴィクター(検証者)は、ペギーが本当に合言葉を知っているか確認するために、ペギーに「Aから出てきて」とか「Bから出てきて」とランダムに指示します。

  3. ペギーが合言葉を知っている場合

    • 合言葉を使って指示通りのルートで出ることができます。

  4. ペギーが合言葉を知らない場合

    • 選んだルートが指示と一致した場合は、扉を開けられず失敗します。

    • 選んだルートが指示と逆だった場合は、引き返すことで偶然成功できます。

この繰り返しによって、ヴィクターは「ペギーが合言葉を知っている」ことを高い確率で確認できますが、合言葉そのものは一切知らされません

まさに「ゼロ知識」での証明です!

3つの条件

ゼロ知識証明は、次の3条件を満たす必要があります。

  1. 完全性
    証明が正しい場合、正しい検証手順を踏めば、必ず「正しい」と判断できること。
    例:あなたが本当に秘密の鍵を持っているなら、検証者はその事実を100%確認できる。

  2. 健全性
    証明が間違っている場合、確率的に極めて低い例外を除き、「誤って正しいとされる」ことはない。
    例:あなたが本当は秘密の鍵を持っていない場合、適当な嘘で騙せる可能性はほぼゼロ。

  3. ゼロ知識性
    証明の過程で、証明対象の内容自体(秘密の情報)を一切漏らさないこと。
    例:秘密の鍵の値を直接渡さずに、それを持っていることだけを証明する。

この3条件がそろうことで、「プライバシーを守りながらも、信頼できる証明」が成り立ちます。

zkの分類

ゼロ知識証明にはいくつかの方式がありますが、ブロックチェーンの文脈で特に注目されているのが zk-SNARKzk-STARK です。どちらも「秘密を明かさずに正しさを証明する」点は共通していますが、その設計思想や特徴には大きな違いがあります。

zk-SNARK

zk-SNARK は、現在もっとも広く使われている方式です。

  • 特徴

    • Succinct(簡潔さ)
      証明のサイズが非常に小さく、数百バイト程度で済むため、ブロックチェーンに載せやすい。

    • Non-Interactive(非対話型)
      検証者とのやり取りが1回で済む(従来の対話型ゼロ知識証明は複数回のラウンドが必要)。

    • Trusted Setup が必要
      初期設定で秘密情報(CRS)を生成し、安全に破棄しなければならない。

  • 利点

    • 証明が小さく、検証が高速。
  • 課題

    • Trusted Setup が必要なため、初期段階で秘密情報を生成し、安全に破棄しないとセキュリティが危うくなる。
    • 証明の生成コストが比較的高く、専用の最適化やハードウェアが必要になるケースがある。

zk-STARK

zk-STARK は、zk-SNARKの課題を解決するために登場した方式です。

  • 特徴

    • Scalable(スケーラブル)
      大規模な計算でも効率よく証明を生成できるように設計されている。

    • Transparent(透明性)
      Trusted Setup が不要。すべて公開可能なランダム性(公開乱数)から安全に生成できる。

    • 量子耐性
      量子コンピュータ攻撃にも強い設計。

  • 利点

    • 初期設定が不要なため、セキュリティリスクが小さい。
    • より複雑で大規模な計算にも対応しやすい。
    • 長期的に見て量子計算時代にも耐えうる。
  • 課題

    • 証明サイズが大きく(数十KB〜数百KB)、オンチェーンに載せるコストがzk-SNARKより高い。
    • 検証コストもzk-SNARKに比べると重くなる傾向がある。

活用事例

Layer2におけるzkRollup

イーサリアムのスケーリング手法として注目される zkRollup は、トランザクションをそのまま全てL1に記録するのではなく、以下のようなプロセスで処理します。


https://chain.link/education-hub/zero-knowledge-rollup

  1. ユーザーによるトランザクション送信

    • ユーザーは通常通り、送金やスマートコントラクト実行などのトランザクションを送信します。
    • トランザクションは zkRollupのオペレーター(Sequencer) に送られます。
  2. オフチェーンでのトランザクション処理

    • オペレーターは複数のトランザクションをまとめて処理し、アカウント状態を更新します。
  3. 状態遷移の証明生成(zkSNARK/zkSTARK)

    • オペレーターは「まとめた処理が正しく行われた」ことを示す ゼロ知識証明 を生成します。
  4. L1(Ethereum)への提出

    • オペレーターは以下をEthereumに投稿:
      • 新しい状態のルートハッシュ(Merkle Treeのrootなど)
      • 証明
  5. オンチェーンでの検証

    • Ethereumのスマートコントラクトが証明を検証します。
    • 有効なら新しい状態が確定、無効ならロールアップは拒否します。

https://ethereum.org/ja/developers/docs/scaling/zk-rollups/

この仕組みにより、「詳細な計算はオフチェーン、検証だけオンチェーン」という役割分担が成立し、スケーラビリティとセキュリティを両立することができます。

SuiのzkLogin

Suiの zkLogin は、ユーザーが既存のWeb2アカウント(例:Google, Facebook)を使いながら、ゼロ知識証明を介してSuiブロックチェーンにログインできる認証方式です。

https://sui.io/zklogin

仕組みは以下の流れで動作します。

  1. OAuth ログイン

    • ユーザーは Google や Facebook などの OAuth プロバイダでログインします。
    • ログインすると JWT(署名付きのデータ) が発行されます。
    • JWT には nonce というユーザー指定の値が含まれており、ここに「短期的に使う公開鍵」と「期限」が埋め込まれています。
  2. 短期用鍵の準備

    • ウォレットは「短期用鍵ペア」を生成します。
      • 公開鍵 → JWT の nonce に記録済み。
      • 秘密鍵 → そのセッションで取引に署名するためだけに使う。
  3. ゼロ知識証明の生成

    • JWT の中には sub(ユーザーID)や iss(プロバイダ)、aud(アプリID)などが入っていますが、これをそのまま公開するとプライバシーが漏れてしまいます。
    • そこで JWTから Groth16 というzk-SNARK系のゼロ知識証明 を作り、下記を実現します。
      • 「JWT が正しくプロバイダにより署名されていて、有効期限内である」ことを証明
      • 「JWT の nonce に含まれる短期用公開鍵と、自分が持つ短期用秘密鍵が一致している」ことを証明
      • JWT の中身(ユーザーIDやメールなどの個人情報)は公開せず秘匿
  4. トランザクション送信

    • 実際の取引は次のセットで送信されます:
      • 短期用秘密鍵で署名したトランザクション
      • JWT から生成したゼロ知識証明
    • Sui のバリデータは、
      • 短期用署名の正当性を確認
      • 証明を検証して「有効なログイン済みユーザーである」ことをチェック
        → 問題なければトランザクションを実行。
  5. アドレスの生成

    • 通常のウォレットは「公開鍵 → アドレス」ですが、zkLogin では違います。
    • アドレスは以下の要素から計算されます:
      • sub(OAuth のユーザーID)
      • iss(OAuth プロバイダ)
      • aud(アプリケーション ID)
      • user_salt(プライバシー保護のための乱数)

https://docs.sui.io/concepts/cryptography/zklogin#how-zklogin-works

この流れにより、ユーザーは「Web2の便利さ」と「Web3のプライバシー・セキュリティ」を両立しながらログインできます。

まとめ

Web3の発展を支える重要な技術であるゼロ知識証明(zk)を解説しました。
本記事で一部を紹介したように、すでにゼロ知識証明を活用したプロジェクト・サービスは数多く登場しており、その可能性はますます広がりを見せています。今後もWeb3の進化において欠かせない技術のひとつとなるでしょう。

私たちは、こうした最先端の技術動向をこれからも分かりやすく発信していきます!

NonEntropy Tech Blog

Discussion