🌊

【Semaphoreとは?】ゼロ知識証明を使ってメンバーシップを証明する

2023/09/19に公開

Semaphoreとは?

Semaphoreはゼロ知識証明を利用しています。ゼロ知識証明とは「自分があることについて知っている」と証明したい主張者が、証明者に具体的な知識を教えることなく検証できる技術です。

Semaphoreでは、ユーザーは自分がメンバーグループであることをユーザー自身のアイデンティティを証明者に教えることなく証明できます。

Semaphoreのユースケース

Semaphoreの公式サイトによると、ユースケースとしては匿名投票や内部告発、匿名なDAOでのメンバー照合が想定されています。

Semaphoreを使うメリット

「なんでSemaphoreをわざわざ使うの?」と思うかもしれません。比較するために従来のweb2システムでのログインと選挙を考えてみます。

従来のログイン

例えばあるサービスの会員だと証明するために、ユーザーIDとパスワードを用いてログインします。大体の場合ユーザーidとパスワードは各サービスごとに設定されています。そしてログインできればあなたは自分がそのサービスのメンバーであることを証明できます。

でも、もしかしたらユーザーidやパスワードが流出してしまうかもしれません。どのようにパスワードがサービスに保管されているかや脆弱性に問題ないかはサービスを信用する必要があります。また、パスワードはサービス間で使い回す場合もあるでしょうし、そうなるとユーザーidとパスワードをサービスに登録するのは少しリスクかもしれません。

選挙(日本)

次に選挙を考えてみましょう。日本では自分の住民票がある市区町村の選挙管理委員会から投票所入場券が届きます。そして指定の投票所に行き自分の名前が選挙名簿にあるか確認してもらい、投票となります。

もし入場券がない場合はマイナンバーカードや運転免許証を見せることで入場できます。

Semaphoreのメリット

上記の例から分かることはユーザーの個人情報を少なからずサービスに登録したり、他人に限定的に公開したりする必要があるということです。つまり個人情報をユーザーの管理下以外に一時的か長期間置くことになります。

その点Semaphoreはそれらのデータを使わずにグループの一員であることを証明できるのでユーザーのプライバシー保護に役立っていると言えます。

Semaphoreの一連の流れ

ではSemaphoreがどう成り立つのか、まずは流れを確認しましょう。

1.ユーザーがSemaphoreのidentityを作る
2.グループにユーザーのidentityを加える(マークルツリーなど)
3.ユーザーは証明可能な匿名のシグナルを送る(投票とか承認とか)

オンチェーンでの処理とオフチェーンの処理

オフチェーンでJavaScriptのライブラリでユーザーidを生成し、グループの管理を行い、証明の生成を行います。

オンチェーンでは、solidityコントラクトによってグループの管理と証明の検証を行います。

semaphoreのidentyを作る

semaphoreのidentyは以下の2つから成り立っています。
・identity trapdoor
・identity nullifier

両方ともownerしか知らないように秘密にしておきます。さらにtrapdoorとnullifierをハッシュにしたものはcommitmentという変数で扱われます。

以下生成の部分

import { Identity } from "@semaphore-protocol/identity"

const { trapdoor, nullifier, commitment } = new Identity()

公式ドキュメントにはcommitmentはイーサリアムのアドレスのようなもので、ユーザーがグループメンバーか検証するときに使われ、trapdoorとnullifierは証明を作るときに使われるイーサリアムの秘密鍵のようなものと書かれています。

semaphoreのグループ

semaphoreのグループはマークルツリーで表されます。ツリーは以下の情報を持ちます。

・グループのID
・ツリーの深さ(グループの最大人数を2^ツリーの深さ分で決める)
・メンバー

semaphoreでの証明

ユーザーのidentityがsemaphoreのグループに追加されると、ユーザーは以下のことをゼロ知識証明を使って証明できます。

・ユーザーはグループメンバーである
・ユーザーがシグナル(ユーザーが行うアクション動作)と証明を作った

Discussion