🔥

Circomでシュノア署名を構築する方法:ステップバイステップガイド

2024/09/26に公開

ゼロ知識証明(ZKPs)やシュノア署名のような暗号署名は、ブロックチェーン技術においてますます重要になっています。多くのツールが存在しますが、Circomを使用してシュノア署名を構築することは、複雑な計算を効率的に処理するための1つの方法です。

この記事では、circom-schnorr-verify GitHubリポジトリの例を参照しながら、Circomを使用してシュノア署名検証機能を構築する方法をステップバイステップで解説します。

シュノア署名とは?

コードに入る前に、基本を説明します。シュノア署名は効率的で安全なデジタル署名の一種で、暗号システム、特にプライバシーに焦点を当てたプロジェクトで人気があります。シュノア署名はメッセージの出所を確認し、改ざんされていないことを保証するために使用されます。

シュノア署名が好まれる理由として、以下の点が挙げられます:

  • 離散対数問題に基づいており、証明された安全性を持つ。
  • 署名サイズを削減でき、ECDSA(楕円曲線デジタル署名アルゴリズム)よりも効率的。
  • 集約が可能で、マルチシグネチャのセットアップに非常に役立つ。

Circomでシュノア署名検証器を構築する手順

それでは、Circomを使用してシュノア署名検証器を構築する方法を見ていきましょう。circom-schnorr-verifyリポジトリに従って進めます。

1. Circomをセットアップ

まず、Circomをまだインストールしていない場合は、公式のインストールガイドに従ってインストールしてください。こちらから確認できます。Circomがインストールされたら、リポジトリをクローンして作業を開始します。

git clone https://github.com/nixkitax/circom-schnorr-verify.git
cd circom-schnorr-verify

2. 回路の概要

リポジトリ内には、SchnorrVerifier.circomファイルがあり、シュノア署名を検証するためのコアロジックが定義されています。Circomでは、プログラムの各機能を個別の「コンポーネント」として設計します。

回路の全体的な流れは次の通りです:

  1. 入力変数: 公開鍵、メッセージ、署名、チャレンジスカラーが必要です。これらの値は回路への入力として提供されます。
  2. 署名検証ロジック: コアの検証ロジックは、シュノアアルゴリズムを使用して、署名が公開鍵とメッセージに一致するかどうかをチェックします。
  3. 出力: 回路は1(有効な署名)または0(無効な署名)を出力します。

3. シュノアアルゴリズム

シュノア署名アルゴリズムは以下の3つのステップから成り立っています:

  1. 鍵生成: 公開鍵と秘密鍵のペアを生成します。
  2. 署名: メッセージが秘密鍵を使用して署名されます。
  3. 検証: 公開鍵とメッセージを使用して署名が検証されます。

Circomの回路では、検証部分を実装しています。これには以下のステップが含まれます:

  • メッセージと署名のハッシュを計算。
  • 楕円曲線方程式に対してスカラーと公開鍵を検証。
  • 再構築された署名が提供されたものと一致するかを確認。

4. SchnorrVerifier.circomの解説

では、回路の主要なセクションを分解して見ていきます。

template SchnorrVerifier() {
    signal input pubKey[2];
    signal input signature[2];
    signal input msg;
    signal output valid;

    // 楕円曲線のポイントを検証し、シュノア署名が有効かどうかを確認します。
    // ここでのコードロジックは、楕円曲線の数学を用いてシュノア署名検証を実行します。
}
  • pubKey[2]: 楕円曲線上の点として表現された署名検証に使用される公開鍵。
  • signature[2]: 署名は2つの部分(rとs)に分かれています。
  • msg: 署名されたメッセージ。
  • valid: 回路の出力。署名が有効であれば1、無効であれば0を返します。

検証プロセスでは、Circomの算術機能を使用して楕円曲線の操作が行われます。署名と公開鍵の背後にある数学的な正しさを確認し、すべてが合致しているかをチェックします。

5. 回路のコンパイルと実行

回路が書けたら、次にCircomを使用してコンパイルします:

circom SchnorrVerifier.circom --r1cs --wasm --sym --c

このコマンドにより、以下が生成されます:

  • SchnorrVerifier.r1cs: R1CS形式でコンパイルされた回路。
  • SchnorrVerifier.wasm: 証明を生成するために使用されるWebAssemblyバージョンの回路。
  • SchnorrVerifier.sym: 回路をデバッグまたは検査するためのファイル。
  • Cコード(.cファイル)、他の環境で回路を使用できるようにするためのもの。

6. Witnessの生成

次に、入力(公開鍵、メッセージ、署名)に基づいてWitnessを生成します。Witnessは、入力が回路の制約を満たすことを証明するものです。

node SchnorrVerifier_js/generate_witness.js SchnorrVerifier_js/SchnorrVerifier.wasm input.json witness.wtns

input.jsonファイルには、検証する公開鍵、署名、メッセージを指定します。ファイルの例は次のようになります:

{
    "pubKey": [ "118104539330594078774417826155090343498289", "0" ],
    "signature": [ "148339988769576591168694867740121696124184", "422937316917897660876227372201482830084219" ],
    "msg": "123456"
}

次に、Witnessファイルが生成され、証明の検証に使用されます。

7. 証明の検証

最後に、生成されたWitnessを使用して証明を検証します。CircomはSolidity検証器を出力できるため、検証器コントラクトをEthereumまたはその他のEVM互換チェーンにデプロイすることができます。

circom verifier.circom --r1cs --wasm --sym --c

結論

Circomでシュノア署名検証器を構築することで、ゼロ知識証明のメリットを活かしつつ、オンチェーンでのメッセージの完全性と認証を確保することができます。Circomは複雑な暗号アルゴリズムの記述を簡素化し、circom-schnorr-verifyリポジトリを使用して、すぐに作業を始めることができます。

Circomを使用することで、リソース制約のあるブロックチェーンシステムでも効率的な署名検証が可能です。重い計算はオフチェーンで行い、軽量な検証のみをオンチェーンで行うことで、ガスコストを削減し、アプリケーションのスケーラビリティを確保できます。

さらに詳

しく知りたい方は、こちらのリポジトリを参照して、自分の回路で実験を始めてみてください。

Discussion