🙆

ゼロ知識証明を利用した年齢確認アプリInroの紹介

2024/02/21に公開

この記事について

ETHGlobalのCircuit Breakerイベントで開発したアプリの紹介と、開発過程で直面した課題について共有します。

ETHGlobalとは

Web3開発者の育成と支援を目的に、さまざまなイベントを主催する組織です。2023年には日本でETHGlobal Tokyoが開催され、マイナンバーカードを使用してウォレットを作成できるMynaWalletがファイナリストに選ばれました。
他に大きなイベントとしてはDevconnectがあります。

ETHGlobalで紹介される技術

ETHGlobalでは、主にイーサリアムブロックチェイン上で動作するアプリケーション(DApps)開発に関連する技術が紹介されます。

なんでEthereumなの

Ethereumは、プログラム(スマートコントラクト)をEthereum Virtual Machine(EVM)上で実行できるブロックチェインプラットフォームです。スマートコントラクトはチューリング完全なプログラミング言語で記述されるため、任意の計算処理を実行できる能力を持っています。これにより、従来のブロックチェイン技術が提供していた単純な送金機能を超えて、複雑な条件に基づく自動的な取引や契約の実行が可能になります。Ethereumのこのような特徴は、分散型アプリケーション(DApps)の開発を可能にし、多くの開発者を魅了しています。

ハッカソンが盛ん

実はNFTもハッカソンから生み出されています。あと懸賞金が桁違いに高いです。数百万、数千万円なんてのもたくさんあります。
今回のCircuit Breakerはゼロ知識証明をテーマにしたハッカソンでした。

どうやってハッカソンに参加するの

Webページから申し込むだけです。参加費用としてStake(0.005Eth,2-3000円くらい)を取られますが、プロジェクトを提出すると他のイベントの参加費用として再利用できます。

今回開発したアプリについて

Inroは、一切の個人情報を相手に知らせることなく成人であることを証明できるアプリです。従来、年齢確認が必要な場合、IDカードに記載されたプライバシー情報を相手に見せる必要がありました。Inroでは、IDをスキャンして生成したQRコードを提示するだけで年齢確認が完了します。

動作プロセス

ユーザーは以下のステップで操作します。

  • IDをスキャン:現在はマイナンバーカードのみ対応。
  • QRコードを表示:InroアプリでQRコードを生成し、提示します。

検証者は以下のステップで操作します。

  • QRコードをスキャン:Inroシステムを用いて提示されたQRコードをスキャン。
  • 検証結果を確認:他の個人情報にアクセスせず年齢を検証。

使用技術

フロントエンドにはReact NativeExpoを、バックエンドにはハッカソンのスポンサーであるSindriを使用しています。認証機構にはゼロ知識証明が用いられ、SindriはこれをAPI経由で利用可能にするサービスです。ゼロ知識証明の実装には、Rust風の記法で書けるNoirを採用しています。

技術選定の理由

Web3の世界でJavaScriptベースのライブラリが豊富であるためReact Nativeを選択しました。Sindriはスポンサーであり、Noirは使いやすさとSindriのチュートリアルでの紹介により選ばれました。

ゼロ知識証明とは

ゼロ知識証明(Zero-Knowledge Proof, ZKP)は、ある情報を持っていることを証明する手法であり、その情報自体を明かすことなく証明できます。これは、情報の所有者が特定の情報を知っている(例えば、ある秘密の数字や条件を満たすある事実)ことを、第三者に対してその他の余計な情報を一切開示することなく証明できるという特徴を持っています。

今回のInroで言えば、自分の年齢すら相手に教えることなく(ゼロ知識)、成人であることのみ証明できるのがポイントです。

ゼロ知識証明の特徴

  • プライバシーの保護: ゼロ知識証明を使えば、個人情報や機密情報を明かすことなく、特定の情報を持っていることだけを証明できます。これにより、プライバシーを保護しつつ、必要な検証できます。
  • セキュリティの向上: 情報を直接共有しないため、情報漏洩のリスクを大幅に減少させることができます。
  • 汎用性: さまざまな場面での認証や検証に利用でき、金融取引、ID認証、秘密情報の検証など、多岐にわたります。

ゼロ知識証明の仕組み

ゼロ知識証明の基本的な仕組みは、証明者(Prover)と検証者(Verifier)の間で行われるインタラクティブなプロセスです。証明者は、ある秘密の情報を知っていることを検証者に対して証明しますが、その情報自体やその他の余計な情報は一切伝えません。

応用例

  • 暗号通貨の匿名取引: ゼロ知識証明は、暗号通貨の取引において、取引の当事者が正当な権利を持っていることを証明しつつ、取引の内容を匿名で保持するために使用されます。
  • デジタルIDの認証: 例えば、年齢認証や学歴の確認など、特定の属性を持っていることを証明する際に、その詳細情報を明かすことなく認証ができます。Webサービスのパスワードなども直接入力することなく、パスワードを知っていることのみを証明できれば盗み見られてアカウントがハックされることを防げたりします。
  • ブロックチェインとスマートコントラクト: ゼロ知識証明は、ブロックチェイン技術やスマートコントラクトにおいて、特定の条件が満たされていることを証明するために使用されることがあります。これにより、プライバシーを保護しつつ、トランザクションの正当性を保証できます。

ゼロ知識証明は、プライバシーを守りながらセキュリティを確保するための強力なツールです。ブロックチェインや暗号通貨だけでなく、さまざまなデジタル認証の分野でその応用が期待されています。

参考動画

https://www.youtube.com/watch?v=7NVb07bYDoY

暗号学の現在―現代暗号入門

開発で苦労した点と工夫

Inroの基本的な処理の流れをここではブラックボックス的に書きましたが、内部の処理も含めて図示すると以下のようになっています。

この処理を作っていく過程で直面した課題とそれに対する工夫について、このセクションでは詳しく説明します。

IDの読み取りに関する課題と工夫

NFC TypeBの理解と対応

パスポート、運転免許証、マイナンバーカードなど、複数のIDに対応する必要がありましたが、これらはすべてNFC TypeBという規格を使用しています。当初、NFCの異なるタイプについての知識が乏しかったため、これらのカードをどのように読み取るかが大きな課題でした。React Nativeを使用して開発を進めていましたが、react-native-nfc-managerがNFC TypeBに対応していないことが判明しました。特にiOSではサポートされていなかったため、最終的にはネイティブコード(Swift:iOS,Kotlin:Android)を書くことでこの問題を解決しました。

マイナンバーカードの仕様が公開されていない

マイナンバーカードの仕様を理解するために、APDU通信に関する文献を読みましたが、すぐには理解できませんでした。サンプルプログラムを参考にしつつ、Swiftコードへの移植に成功しました。この過程で、NFC読み取りにISO7816ライブラリを使用することになりました。

QRコード容量問題の解決

証明者の作ったProofを検証者に渡す方法としてQRコードを使おうとしました。まずは生成されたProofを直接QRコードに変換しようとトライしましたが、QRコードの最大容量に収まらないほどProofが長かったためQRコードへ変換できませんでした。そのため、SindriAPIからProofの詳細を取得するためのProofIDのみをQRコードに含め、APIを介して検証結果を取得する方法に切り替えました。

検証プロセスの課題と解決

Inroの検証プロセスでは次の2つのことを確認します。ゼロ知識証明の計算自体が正しく行われているかと、証明者は成人していると判定されたかです。この検証の方法として、1.検証者のデバイス内で検証する、2.自前のバックエンドサーバで検証する、3.ブロックチェイン上に実装したロジックで検証するという選択肢がありました。

最もセキュアな検証方法は、ネットワークを介さないデバイス内で完結させる(1)ことでしたが、これには多くの技術的な障壁がありました。例えば、Noirやsnarkjsを使った方法では、モバイルアプリ内で検証をすることは使用可能なライブラリが限定されることから技術的な実装が難しいという問題が有りました。ブロックチェイン上に実装したロジックで検証することを Account Abstractionを利用する方法で検討しましたが、スマートコントラクトの複雑化とガス代の増加が課題でした。

最終的に、SindriのAPI を使用し、perform_verifyオプションを有効にすることで、APIのレスポンスに検証結果を含めることができました。このようにすることで、数秒程度で検証プロセスが完了できました。

証明の生成と検証速度

snarkjsを使ってみるとわかるのですが、証明の生成は数分単位で時間がかかります。ただ、年齢確認にそんなに時間がかってしまうと不便で使えません。この問題を解決するのに前述のSindriのAPIを使うのが効果的でした。証明の作成が数秒程度で完了し実際に使えるレベルの処理速度になりました。

参加して良かったこと

ETHGlobalのハッカソンに取り組んでみた結果、こんな良いことがありました。

Web3 の新しい技術にふれる良い機会になる

ハッカソンのスポンサーになっているWeb3企業の技術を使うとプライズの対象として審査してもらえるため、私達はスポンサーの技術を使ってみることにしました。Web3の世界は技術スタックも整備が行き届いていない中で進化してきているため、最新の技術スタックに追いつき続けることはなかなか根気が必要だと思いました。

ETHGlobalのハッカソンでは、新しい技術に触れてみる動機が明確なので、各回異なるスポンサーの提供する最新技術に半強制的に触れる機会を得られるのがとても良いと感じました。今回私達も、ビルド開始までの準備期間でAztec, Avail, Sindriといったスポンサーの技術のチュートリアルをやってみたことで、最新技術を使うことにより得られる開発者体験を実感できました。

将来的に社会実装されるであろう Web3 プロダクトについて知れる

このETHGlobalのハッカソンでは、MynaWallet の様に Ethereum Foundation の Grant を受ける プロジェクトが生まれる場所でもあります。こうした後押しを受けて、将来的に社会実装されるプロダクトの情報を得られる環境は、Web3のプロダクトを開発してみたいと考えている人にとって良い刺激になると感じました。

各回YouTube公開される以下の様なフィナーレの動画で紹介されるファイナリストのプロダクトを見ておくだけでも良い情報源になると感じました。

https://www.youtube.com/watch?v=EV116tBuxv8

Web3 のプロダクトづくりに挑戦できる

しかし情報収集しているだけではなかなか挑戦してみたいプロダクトのアイデアが湧くわけでもないので、やはりWeb3プロダクトづくりに挑戦できるきっかけとして、このイベントは最高だと感じました。 Web3の技術に触れ、運営・参加者含めてグローバルな雰囲気を感じながらアイデアの実現に向けビルドする日々は、タフな日程が続きますが、充実した日々を送れました。

デモ動画がすべて

運営からも動画が大事とアナウンスが度々あるのですが、この動画を元にジャッジされるため、この動画に採点基準をクリアできていることを散りばめるように動画を作る必要があります。この動画でしか自分たちのプロダクトの魅力が伝えられないため気合を入れて作る必要があります。ちなみにデモは様々な国の人が参加するので地球規模でやっているんだなと、お祭り感を感じられます。

GitHubで編集を提案

Discussion