概要 (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)を呼び出す。
Phase 2: 匿名投票(ZK-SNARKsによる証明と二重投票防止)
このフェーズの目的は、自分が「登録済みのCommitmentの所有者である」ことだけをゼロ知識証明(ZK)で証明し、完全な匿名性を保ったまま投票を実行することである。ここではマイナンバーカードは一切使用しない。
1. フロントエンド(スマホアプリ)の処理
- 投票先の選択: ユーザーが候補者(例: A候補)を選択する。
- ZK Proof(証明書)の生成: 端末のバックグラウンド(Circom回路)で以下の条件を満たすZK-SNARKsの証明書を生成する。
- 「私はオンチェーンに登録されているCommitmentのどれか1つを生成した
Secret と Nullifier を知っている」
- 「しかし、それがどのCommitmentであるかは明かさない」
- トランザクション送信: 生成した
ZK Proof、投票先データ、および生の Nullifier のみをRelayer経由でEVMへ送信する。ユーザーのIPやアドレスは完全に秘匿される。
2. オンチェーン(Leviathan EVM)の処理
- Nullifierの検証(二重投票防止): コントラクトは送信された
Nullifier が過去に使用されていないか(State内に存在しないか)をチェックする。すでに存在する場合はトランザクションをRevertする。
- ZK Proofの検証: BN254等のプレコンパイルを利用し、提出された証明書が数学的に正しいかを検証する。
- 状態の更新: 検証に成功した場合、以下をインメモリのCacheに対して行い、トランザクション終了時にMPTへコミットする。
- 選択された候補者に1票を加算する。
- 提出された
Nullifier を「使用済みリスト」に登録する。
セキュリティとプライバシーの担保(まとめ)
- 成りすましの防止: Phase 1において、登録される
Commitment 自体にJPKIの署名をバインディングしているため、他者による登録データの横取りや改ざんは数学的に不可能である。
- 匿名性の絶対保護: Phase 2において、EVMに公開されるのは「ZKの証明書」と「Nullifier」のみであり、Phase 1で登録した個人情報(誰がどのCommitmentを置いたか)と、Phase 2の投票行動(誰に投票したか)のリンクを数学的に完全に断ち切っている。
概要 (Overview)
本仕様は、Leviathan EVMの最大の独自性である「身元証明と完全匿名のハイブリッド統合」を実現するための投票フローを定義する。
特定の管理者に依存しない究極の民主主義インフラとして、Phase 1で「マイナンバーのRSA署名による確実な身元証明」を行い、Phase 2で「ZK-SNARKsによる完全匿名性と二重投票防止」を両立する。
これら重い暗号処理はSolidity層ではなく、Rustで実装されたEVMコアの「プレコンパイルコントラクト」としてネイティブに統合することで、ガス代最適化と処理の高速化を実現する。
Phase 1: 有権者登録(RSAによる身元証明とCommitmentの登録)
このフェーズの目的は、個人の身元を確実に担保しつつ、誰の物か分からない「投票箱(Commitment)」をオンチェーンのStateに登録することである。
1. フロントエンド(スマホアプリ)の処理
Secret(秘密のパスワード)とNullifier(無効化キー)を生成する。Commitmentを作成する。Message Hash(32バイト)を作成する。Commitment(32バイト)Contract Address(20バイト)Chain ID(32バイト)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. フロントエンド(スマホアプリ)の処理
SecretとNullifierを知っている」ZK Proof、投票先データ、および生のNullifierのみをRelayer経由でEVMへ送信する。ユーザーのIPやアドレスは完全に秘匿される。2. オンチェーン(Leviathan EVM)の処理
Nullifierが過去に使用されていないか(State内に存在しないか)をチェックする。すでに存在する場合はトランザクションをRevertする。Nullifierを「使用済みリスト」に登録する。セキュリティとプライバシーの担保(まとめ)
Commitment自体にJPKIの署名をバインディングしているため、他者による登録データの横取りや改ざんは数学的に不可能である。