Worldcoin・World IDの概要

ChatGPT等で現在のAI領域をリードするOpenAIのCEO サム・アルトマン氏が展開している事業に、**World ID**および**Worldcoin**というものがあります。本記事では、Worldcoin/World IDの意義、World ID発行手順、内部の仕組みについて記載します。
# 背景
以前からWorldcoin/World IDには興味があり、先日、**World IDを発行するための虹彩認証を行ってきました**。せっかくの機会なので、Worldcoin/World IDについて発信もしておこうと思い、本記事を記載しています。
![Image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/ee8ff5c3-46ab-d64d-8348-5568879facfc.jpeg)




# 1.Worldcoin/World IDとは
Worldcoin/World IDは、一人の人間に一意のID(これをWorld IDと呼びます)を割り振って、そのIDに紐づいたウォレットにWorldcoinを配布することで、世界規模でベーシックインカムを達成しようという壮大なプロジェクトです。
また、AIが人間と区別できないレベルに発達した社会を想定して、「人間であることの証明」を実現することもプロジェクトの目的です(サム・アルトマンならではの視点に感じて、ここは個人的に興味深いです)。


World IDを発行するためには、各地に設置してある「**Orb**」という専用のマシンで虹彩を読み取る必要があります（虹彩は人それぞれ異なり、かつ整形等で変更することも難しいらしいです）。虹彩に紐づけてWorld IDを発行することで、一人の人間が複数のIDを取得して不正にWorld Coinを受け取ること(Sybil攻撃、いわゆる「複垢」)を防ぎます。
また、World IDはEthereum上で管理しているため、運営元が集権的に行うのはあくまでID発行のみです(将来的にはID発行もdecentralizedに行うらしいです)。
またWorld IDはゼロ知識照明を採用しており、個人のパーソナルな情報は秘匿しつつ「そのWorld IDの持ち主が一人の人間である」ことのみを証明するようです。

ちなみにWorld IDと既存の認証基盤を連携して、World IDを用いた認証を自作アプリに埋め込むこともできます。詳細は以下の記事に記載されているので、興味のある方は確認するとよいかもしれません。

https://qiita.com/trickstar03/items/18a121f8d89f070ce9da

# 2.人間性証明の意義
人間性証明は、AI技術の進化により、**人間とAIの区別が困難になった世界** でその役割を果たします。
Worldcoinのホワイトペーパーでは、World IDによる人間性証明が有効なケースとして以下が挙げられています(一部ピックアップ)。
- botの排除
  - SNSをはじめ、デジタル世界からbotによるノイズを排除できる
  - 既存技術であるCAPTCHA認証を通過できるAIの発達への対策となる
- web3ガバナンス
  - 既存のweb3での集団意思決定は、多くの場合トークンガバナンス(1トークンにつき1票)に基づくが、これは経済的な豊かさが意思決定の優位に結びついてしまう
  - 人間性証明により、1人の人間につき1票の民主的なガバナンスを構築できる
- 資源の平等な配布
  - 補助金や社会福祉を含む、資源の分配において、アイデンティティの偽造による不正給付を防止できる

:::note info
ちなみにWorldcoinプロジェクトの最終目標は、**AIが生み出した価値を全世界の人間に対して平等に配布することで、UBI(ユニバーサル・ベーシック・インカム)を実現する**ことのようです。
UBIの対象がユニークな人間であることを証明する(AIと、不正に給付を受けようとする人間を弾く)ための手段にWorld IDを位置づけています。
:::


# 3.World IDを発行し、Worldcoinを受け取る
ここから、筆者がWorld IDを発行し、Worldcoinを受け取る際に踏んだ手順を説明します。
手順はシンプルです。
## 3.1.World Appをインストールする
World Appは、World IDやWorldcoinを受け取るウォレットを一元管理するモバイルアプリです。
以下のリンクから、World APPをインストールします。
iOS: https://apps.apple.com/no/app/worldcoin-claim-send/id1560859847
Android: https://play.google.com/store/apps/details?id=com.worldcoin

## 3.2.Orbで虹彩認証を行う
前述の通り、World IDの発行には、Orbによる虹彩認証が必要です。
下記ページからOrb設置場所を検索し、最寄りの場所で認証してください。

https://worldcoin.org/find-orb

:::note warn
多くの場所(体感7割くらい)では事前予約が必要です。
設置場所検索ページで、それぞれの設置場所にカーソルを当てた時に**「Book an appointment」と表示されない場所は、営業時間内であれば予約不要**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/5cceea43-6b4e-5450-5c0c-8704aecb77bd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/f97420be-444a-6556-3482-ed97570762ca.png)

:::
Orbの設置場所に到着したらWorld Appを起動し、Orbの認証画面(Orbに対してQRコードを見せる画面)に遷移します。アプリの指示通りに進めていけば、操作に困ることはないかと思います。
また、ほとんどの設置場所にはスタッフがいるので、仮に何もわからずともWorld Appのインストールからすべてレクチャーしてもらえると思います。


虹彩認証が完了すると、情報がWorld Appにリアルタイムに同期され、その場でWorld IDが発行されます。
## 3.3.Worldcoinの請求をする
World ID発行後は、ウォレットに対して**2週間ごとにWorldCoinが配布**されます(Grantと呼ばれます)。ただし、**World Appから事前にGrantの請求をする必要がある**点には注意してください。ソーシャルゲームのログインボーナス感覚で、こまめにWorld Appを確認しましょう。


手順は以上です。極論、予約をしてからOrb設置場所に向かう(or 予約不要のOrb設置場所に向かう)だけで、なんとかなります。

# 4.World IDの仕組みを見る
ここまで発行手順を記載しましたが、その裏側では何が起こっているのか、技術的な部分も確認してみます。
以下のGithubリポジトリにあるドキュメントを見ていきます。

https://github.com/worldcoin/world-id-contracts/tree/main

## 4.1.World IDの発行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/b4dcf9ca-9d95-e5ee-741b-2184b654ae07.png)
ユーザーがOrbで認証を行うと、裏側ではユーザーのWorldID登録処理が行われます。
WorldID登録はsignup-sequencerでバッチ化され、semaphore-mtbとやり取りすることでゼロ知識証明を作成します。
**semaphore**は、ゼロ知識証明を用いて、身元を明かさずにアクション(投票や支持など)を行うためのプロトコルのようです。

https://semaphore.pse.dev/

作成された証明は**WorldIDIdentityManager**というコントラクトに送られます。WorldIDIdentityManagerは証明を検証し、状態を更新します。

また、World IDが対応する各チェーン(Ethereum、Base、Optimism、Polygon)にはそれぞれ**State Bridges**と呼ばれるコントラクトが存在します。State BridgeがEthereum上の状態を取得し、他チェーンのState Bridgesに伝播させることで、結果として各チェーンでWorld IDの検証を可能にしています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/3a4846ff-7dfe-ed05-5917-2b67beeeec41.png)

<details><summary>ドキュメント原文</summary>
World ID creation

Once a user visits an orb and does a successful signup, the orb's backend will insert the user's Semaphore public key (identity commitment) to the signup-sequencer queue. The signup sequencer will create a batch of size 10, 100 or 1000 (based on current parameters), create a zk proof of insertion using semaphore-mtb, calls registerIdentities() and the contract verifies the proof and updates the merkle tree root. Each chain that World ID supports (currently Base, Optimism and Polygon PoS) has a state bridge contract which fetches the state from the WorldIDIdentityManagercontract and propagates it further to the other chains. The state bridge contracts can be found here.
</details>

## 4.2.World IDによる証明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673338/4978f1da-878f-567a-7406-fbbca2a99f52.png)
認証などへの利用のために、WorldIDを統合したアプリ(図の「Smart contract integrating World ID」)があると想定します。
ユーザーはsemaphore-rs(semaphoreのRustライブラリ)を使用して証明を作成し、WorldIDRouter経由でWorldIDIdentityManagerに証明を提出します。このとき、どのチェーンで検証を行うかは、WorldIDRouterが判断し振り分けを行います。
証明が有効な場合、WorldIDを統合したアプリで記述した後続のロジックを実行できます。証明が不正な場合はRevertが発生します。



<details><summary>ドキュメント原文</summary>
Verification (proof of personhood)

The below diagram shows the flow of a verification request. The user will generate a proof using semaphore-rs from within the World App or elsewhere, and then send it to the World ID contract. Alternatively, app developers integrating WorldID can use IDKit.js to handle all the interactions with WorldID on the client side. The WorldIDRouter will route the proof to the specified group (0 - Phone, 1 - Orb) and the WorldIDIdentityManager contract will verify the proof using the SemaphoreVerifier. If the proof is valid, the call won't revert and therefore any subsequent logic from the app integrating WorldID will go through. If the proof is invalid, it will revert with InvalidProof. Note that the inclusion proof needs to be generated against a merkle tree root that already includes the identity commitment of the user. In the backend, the merkle path for a given node is fetched from the signup-sequencer using /inclusionProof and the proof is generated against the latest root inside of the World App. Proofs can also be verified off-chain by the signup-sequencer using /verifySemaphoreProof or using semaphore-rs if you manually provide all the right parameters.
</details>

ここまで仕組みを見てきましたが、ゼロ知識証明を利用したWorld IDの発行・検証において、semaphoreが重要な役割を果たしている印象を受けました。
より詳細に理解するため、semaphoreのドキュメント確認を今後の課題とします。

# 参考資料

https://worldcoin.org/world-id

https://qiita.com/trickstar03/items/06e827d6738101a8c6b0

https://qiita.com/trickstar03/items/1202554b80c114c00d8b