NFTウォレットの仕組みを整理してみる

 はじめに

おつかれさまです。
前回の記事では、NFTが発行(mint)される流れについて整理しました。 

その中で何度も登場したのが「ウォレット」です。
NFTの発行や売買を行う際には、MetaMaskなどのウォレットを利用しますが、

  • ウォレットは何を管理しているのか?
  • なぜパスワードなしでログインできるのか?
  • mint時に表示される「署名」とは何なのか?

 今回はこの3つの疑問を中心に、Web3におけるウォレットの役割と署名の仕組みを整理します。 

 ウォレットはNFTを保管しているわけではない 

「ウォレット」という名前から、NFTや暗号資産を保管する財布のようなものをイメージするかもしれません。

しかし実際には、ウォレットの中にNFTが保存されているわけではありません。

NFTはブロックチェーン上に記録されており、ウォレットはそれらを操作するための鍵を管理しています。

つまり、ウォレットの本質は

NFTを保管する場所ではなく、ブロックチェーン上の資産を操作するための鍵管理ツール

です。

 

 公開鍵・秘密鍵・ウォレットアドレス  

ウォレットを理解するうえで重要なのが鍵の仕組みです
簡略化すると次のような関係になります。

秘密鍵 → 公開鍵 → ウォレットアドレス 
項目 役割
秘密鍵 本人だけが持つ鍵。絶対に公開しない 
公開鍵 秘密鍵から生成される公開情報
ウォレットアドレス 公開鍵から生成される識別子(0x...形式) 

 

NFTを受け取る際にはウォレットアドレスを共有します。一方で、秘密鍵を持つ人はそのウォレットの所有者として振る舞えるため、秘密鍵は絶対に第三者へ渡してはいけません。 

鍵生成の仕組み

この鍵ペアはECDSA(楕円曲線デジタル署名アルゴリズム)をベースにしており、Ethereumではsecp256k1という楕円曲線を使用しています。

秘密鍵(256bit乱数)
secp256k1による楕円曲線演算 公開鍵(512bit)
↓ Keccak-256ハッシュ → 末尾160bit
ウォレットアドレス(20bytes / 0x...)

秘密鍵から公開鍵やアドレスを生成できますが、その逆は現実的な計算量では不可能です。そのため、アドレスを公開していても秘密鍵が漏れることはありません。 

 

 Web2とWeb3の認証の違い 

普段利用しているWebサービスでは、IDとパスワードを利用して認証を行います。認証情報はサービス側のデータベースに保存されています。 

【Web2】
ID + Password → サーバーで照合 → ログイン

 

Web3では考え方が異なります。サービス側はパスワードを保持しません。代わりに、ウォレットによる「署名」を使って本人確認を行います。

【Web3】
Wallet → 署名 → ログイン

サービス側はパスワードを保持しません
代わりに、ウォレットによる署名を利用して本人確認を行います。

 

 署名とは何か? 

署名(Signature)は、

「この操作を自分が承認したことを証明する仕組み」

です
例えばWeb3サービスへログインする場合、次のような流れになります。

ログインボタン
  ↓
MetaMask起動・署名要求の表示
  ↓
ユーザーが署名を承認 
  ↓
ウォレットが秘密鍵で署名データを生成
  ↓
ログイン

ユーザーから見ると「署名ボタンを押しているだけ」に見えますが、裏側では秘密鍵を使った暗号演算が行われています。 

署名の検証処理

サービス側は「メッセージ」と「署名結果」を受け取り、署名者のウォレットアドレスを復元します。

// 内部では ecrecover 相当の処理が行われる 

// ethers.js での署名(クライアント側)

const message = "ログイン認証: 2024-01-01T00:00:00Z";
const signature = await signer.signMessage(message);

// サーバー側での検証
const recoveredAddress = ethers.verifyMessage(message, signature);
// recoveredAddress がウォレットアドレスと一致すれば認証OK

パスワードの照合ではなく、「この署名を生成できる秘密鍵の持ち主か」を数学的に証明する仕組みです。

 

「ログインの署名」と「mintの署名」の違い

混同しやすいですが、実際には別の処理です。

  ログイン時の署名 mint時の署名
目的 本人確認 トランザクション送信
ブロックチェーンへの書き込み なし(オフチェーン処理) あり
ガス代 不要 発生する

 

前回の記事で整理したmintの流れの最初にある「Wallet署名」は、トランザクションとしてブロックチェーンに送信されます。これが「誰が・どのウォレットへ発行したか」をオンチェーンで証明する根拠になっています。

なぜウォレット管理が重要なのか

Web2ではアカウント情報をサービス事業者が管理しています。パスワードを忘れても、サービス側でリセットできます。

Web3では、秘密鍵をユーザー自身が管理します。そのため、

  • パスワードリセットがない
  • 管理者による復旧が難しい
  • 秘密鍵を失うと、資産へアクセスできなくなる

という特徴があります。その分、自己責任が伴います。これは制約でもありますが、「自分自身で資産とアカウントを管理する」というWeb3の自己主権(Self-Sovereign Identity)の思想でもあります。

まとめ

冒頭の3つの疑問に答える形でまとめます。

疑問 答え
ウォレットは何を管理しているのか? NFTそのものではなく、操作するための「秘密鍵」
なぜパスワードなしでログインできるのか? 秘密鍵による署名で本人確認するため
mint時の「署名」とは何か? トランザクションの承認。ブロックチェーンに記録される

 

ウォレットは、Web3における「認証・承認・資産管理」のすべての起点です。NFTの発行や売買の裏側では、常にウォレットによる署名が動いています。