Skip to content

[仕様概要] RSA x ZK ハイブリッド投票プロセスの全体像 #62

Description

@nezu511

概要 (Overview)

本仕様は、Leviathan EVMの最大の独自性である「身元証明と完全匿名のハイブリッド統合」を実現するための投票フローを定義する。
特定の管理者に依存しない究極の民主主義インフラとして、Phase 1で「マイナンバーのRSA署名による確実な身元証明」を行い、Phase 2で「ZK-SNARKsによる完全匿名性と二重投票防止」を両立する。

これら重い暗号処理はSolidity層ではなく、Rustで実装されたEVMコアの「プレコンパイルコントラクト」としてネイティブに統合することで、ガス代最適化と処理の高速化を実現する。

Phase 1: 有権者登録(RSAによる身元証明とCommitmentの登録)

このフェーズの目的は、個人の身元を確実に担保しつつ、誰の物か分からない「投票箱(Commitment)」をオンチェーンのStateに登録することである。

1. フロントエンド(スマホアプリ)の処理

  • 乱数の生成: ユーザーの端末内で Secret(秘密のパスワード)と Nullifier(無効化キー)を生成する。
  • Commitmentの作成: 上記2つをハッシュ化し、ユーザー専用の「投票箱」となる Commitment を作成する。
  • 署名対象データの構築: リプレイ攻撃や箱のすり替えを防ぐため、以下のデータを結合して Message Hash(32バイト)を作成する。
    • Commitment (32バイト)
    • Contract Address (20バイト)
    • Chain ID (32バイト)
  • マイナンバー署名: JPKI(マイナンバーカードのICチップ)の秘密鍵を使用し、生成した Message Hash に対してRSA-2048署名を行う。

2. オンチェーン(Leviathan EVM)の処理

ユーザーからのトランザクション(ガスレスのメタトランザクションを想定)を受け取り、RustネイティブのRSA検証プレコンパイル(例: 0x0a)を呼び出す。

  • 入力データ (Tight Packing): ガス代最適化のため、ゼロパディングを排除した以下のフラットなバイト列をSolidityからプレコンパイルへ渡す。

  • 状態の更新: プレコンパイルでの検証が成功した場合のみ、コントラクトは該当の Commitment を「登録済み投票箱リスト」としてMerkle Patricia Trie (MPT) にコミットする。


Phase 2: 匿名投票(ZK-SNARKsによる証明と二重投票防止)

このフェーズの目的は、自分が「登録済みのCommitmentの所有者である」ことだけをゼロ知識証明(ZK)で証明し、完全な匿名性を保ったまま投票を実行することである。ここではマイナンバーカードは一切使用しない。

1. フロントエンド(スマホアプリ)の処理

  • 投票先の選択: ユーザーが候補者(例: A候補)を選択する。
  • ZK Proof(証明書)の生成: 端末のバックグラウンド(Circom回路)で以下の条件を満たすZK-SNARKsの証明書を生成する。
    • 「私はオンチェーンに登録されているCommitmentのどれか1つを生成した SecretNullifier を知っている」
    • 「しかし、それがどのCommitmentであるかは明かさない」
  • トランザクション送信: 生成した ZK Proof、投票先データ、および生の Nullifier のみをRelayer経由でEVMへ送信する。ユーザーのIPやアドレスは完全に秘匿される。

2. オンチェーン(Leviathan EVM)の処理

  • Nullifierの検証(二重投票防止): コントラクトは送信された Nullifier が過去に使用されていないか(State内に存在しないか)をチェックする。すでに存在する場合はトランザクションをRevertする。
  • ZK Proofの検証: BN254等のプレコンパイルを利用し、提出された証明書が数学的に正しいかを検証する。
  • 状態の更新: 検証に成功した場合、以下をインメモリのCacheに対して行い、トランザクション終了時にMPTへコミットする。
    1. 選択された候補者に1票を加算する。
    2. 提出された Nullifier を「使用済みリスト」に登録する。

セキュリティとプライバシーの担保(まとめ)

  • 成りすましの防止: Phase 1において、登録される Commitment 自体にJPKIの署名をバインディングしているため、他者による登録データの横取りや改ざんは数学的に不可能である。
  • 匿名性の絶対保護: Phase 2において、EVMに公開されるのは「ZKの証明書」と「Nullifier」のみであり、Phase 1で登録した個人情報(誰がどのCommitmentを置いたか)と、Phase 2の投票行動(誰に投票したか)のリンクを数学的に完全に断ち切っている。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions