はじめに
今年開催されたIVS京都2023ではNFT名刺を作って現地で配りました。
そのNFTではお会いしたことの証明として、後日そのNFTの所有を検証できるような仕組みを実装していました。残念ながらその仕組みを説明する機会は一度も訪れませんでしたが、その時にNFTを持っている証明として「認証」についてあれこれ考えたので共有させていただきます。
認証とは
ブロックチェーンでは、自分が秘密鍵を知っていることをさまざまな方法で証明して相手に伝えることができます。もちろん秘密鍵を誰にも教えないことが前提になります。Webサービスにおけるパスワードと同様に、事前の本人確認時に示し合わせたキーワードを持っておけば、そのサービスを利用したいときにはそのパスワードを伝えるだけで本人確認完了となります。秘密鍵とパスワードの違いは、パスワードはそのまま相手に伝えないといけませんが、秘密鍵の場合はその鍵は教える必要がなく、公開鍵という別の鍵で本人確認ができるためセキュリティが高くなります。一方で秘密鍵はパスワードのように「変更」することができないので管理する難しさが出てきます。
証明方法
1.ウォレットへのログインで証明する
ウォレットへログインして自分しか見ることのできない情報を提示することで認証します。
注意点:
検証する人がウォレットを信頼していることが必要になります。
ログインの必要が無いエクスプローラーではなりすましで提示できるので認証には不適切です。
2.検証者が提示したデータへの署名で証明する
検証する人が提示したキーワード(PIN番号などのワンタイムトークン)を秘密鍵で署名することで認証します。
注意点:
認証に使用した署名データは他人によって再利用されないように適切に無効化する必要があります。
3.トークンの所有で証明する
トークンを操作できることを提示することで認証します。
3-1.検証者にトークンを送信して認証
注意点:
申請者の手数料負担が必要です。また、認証のたびにトークンが減ってしまいます。
3-2.検証する人から申請者のトークンを回収して認証
注意点:
検証者の手数料負担が必要です。認証のたびに申請者のトークンが減ってしまいます。
発行者が回収できるような設定のトークンを準備しておく必要があります。
申請者がなりすましで他人のアドレスを提示していないか確認する必要があります。
(つまり、厳密にはこの方法は秘密鍵を所有していることの証明にはなりません)
3-3.検証する人にトークンを送信し、同じトランザクション内で申請者にトークンを返送
注意点:
検証者、申請者双方の署名が必要です。
署名が集まるまでトランザクションをロックしておく仕組みがブロックチェーン上に必要です。
4.その他、トランザクションの記録事実で認証
トークンの移動させずとも、メタデータへの記録、ネームスペースのレンタル、トークンのロックなどのトランザクションを実行してもらい、その成功を監視することで認証することができます。
注意点:
厳密な検証にはマークルパトリシアツリーなどの使用が必要です。
まとめ
以上になります。
ちなみにNFT名刺で実装したのは3-3の方法になります。この方法だとNFT所有者はトークンを減らさずにブロックチェーンの監査機能によって所有を証明することができます。実装にはSymbolブロックチェーンのアグリゲートトランザクションを使用しました。
他にもいい認証の方法があればぜひ教えてください。