仮想通貨やブロックチェーンの基本である、ウォレットの仕組みに焦点を当てます。ウォレットの基本的なことから、少し専門的な部分について見てみたいと思います。
技術的な部分は難しいのですが、セキュリティ面やブロックチェーン技術を少しでも理解するには、専門的な部分に突っ込まざるを得ません。頑張って調べてみたいと思います!
仮想通貨ウォレットの基本
仮想通貨ウォレットとは、ブロックチェーンネットワークにアクセスするためのツールです。より具体的には、ブロックチェーンを使って送金したり、dApps(分散型アプリ)を使ったりする際に必要になります。
ちなみにネットワークとは、点と点がつながっていて、データなどの受け渡しが可能な状態のことです。場合によっては、網目(ネット)状になっています。
ブロックチェーンは、専用のソフトウェアを稼働させているコンピュータ(ノード)が作るネットワークだと言えます。仮想通貨ウォレットは、そのネットワークにアクセスするのに必要になります。
種類
仮想通貨ウォレットにはさまざまな種類があります。ここでは簡単に分類してみたいと思います。
ソフトウェアvsハードウェア
仮想通貨ウォレットは、ソフトウェアかハードウェアかという基準で分類できます。
ソフトウェアウォレットは以下の3つに分けられます。
- ブラウザ拡張機能のウォレット
- デスクトップアプリのウォレット
- スマホアプリのウォレット
ソフトウェアウォレットの利点は、あまりいろんな所をクリックしたりせずとも簡単に使える点です。あと無料で使えるものも多く、手軽なイメージがあります。
一方でハードウェアウォレットと言うと、USBメモリやカード型の物理デバイスのことを指します。LedgerやTrezorというブランドのハードウェアウォレットが有名です。
セキュリティ性能が高い点が魅力です。しかし、ソフトウェアウォレットと比べていちいち物理デバイスを取り出したりする手間が発生するので、少し不便です。また購入する必要があり、1~2万円くらいかかります。
ペーパーウォレットというのもありますが、あまり実用的ではありません。
ホットvsコールド
仮想通貨ウォレットはインターネットに接続されているかどうかでも分類されます。インターネットに接続されているかどうかで、ウォレットの安全性や使いやすさなどが大体決まるので、このような分け方がされます。
インターネットに接続されているなら、ホットウォレットと呼ばれます。「ウォーミングアップが完了している」みたいなイメージです。ソフトウェアウォレットはホットウォレットに当たります。
一方でインターネットに接続されていないなら、コールドウォレットと呼ばれます。ハードウェアウォレットはインターネットに接続する必要があるものの、仮想通貨のアクセス権である秘密鍵を物理デバイスの中に保存できるので、コールドウォレットと考えられます。
カストディアルvsノンカストディアル
仮想通貨ウォレットは、カストディアルウォレットとノンカストディアルウォレットといったように分類することもできます。
カストディアルウォレットとは、ユーザー以外の第三者が管理するウォレットです。より具体的には、第三者が秘密鍵やシードフレーズを管理するウォレットで、中央集権型取引所のアカウントなどがあります。
カウンターパーティーリスクがあるものの、第三者が秘密鍵を管理してくれるので手軽に使えます。
カウンターパーティーリスクとは、第三者を信用しないといけないことで生じる危険を指します。例えば、管理者がユーザーによる出金を拒否することなどが挙げられます。
ノンカストディアルウォレットとは、ユーザー自身が管理するウォレットです。ノンカストディアルウォレットには、メタマスクやトラストウォレットなどがあります。
ノンカストディアルウォレットは第三者を信用する必要がありません。しかし、自分で秘密鍵をハッカー達から守らなければいけません。
無料vs有料
仮想通貨ウォレットは、無料ウォレットと有料ウォレットに分けることもできます。
例えば、メタマスクは無料ウォレットです。メタマスクは、スワップの手数料などの報酬を得ているので、無料でもサービス提供ができます。
有料ウォレットの例に、ハードウェアウォレットがあります。
使える機能
メタマスクなどの仮想通貨ウォレットで何ができるのかを記載します。
受信
仮想通貨ウォレットを保有していると、仮想通貨やNFTを受けとれます。
受け取る方法は銀行入金の方法と似ています。入金先アドレスを送り手に伝えて、送り手が送ってくれれば、基本的に受け取れます。
保管
仮想通貨ウォレットでは、受け取った仮想通貨やNFTの保管もできます。
メタマスクなどのウォレットでは基本的に、自分が管理するトークンは自分以外に利用されません。
ただハッキングが頻発しているのも事実です。ハッキングについては今度まとめてみたいです。
ハッキングを防止するには、秘密鍵やシードフレーズの管理を徹底することが重要です。詳細は後述しています。
残高確認
仮想通貨ウォレットでは、自分が管理する仮想通貨の残高を確認できます。
ただし残高を確認できるといっても、仮想通貨ウォレットに入っている仮想通貨を数えられるということではありません。
ウォレット内にトークンは入ってないので、数えられません。
細かな仕組みは後述したいと思います。
送金
仮想通貨ウォレットでは、仮想通貨やNFTの送金も行えます。
必要な資金を用意し、送り先アドレスと送金額を入力する点は銀行での送金と同じです。ただしそのあとは、銀行送金と異なります。
詳細は後述しますが、まずはウォレットの秘密鍵を使って署名を行い、ノードに送ります。その後ノードに承認され、バリデータに承認されれば送金完了となります。
dAppsの利用
メタマスクなどの仮想通貨ウォレットを使うと、Uniswapなどの分散型アプリも利用できます。
残高表示や送金時の署名の仕組みなどが組み合わさり、dAppsの利用を可能にしています。
その他サービスの利用
メタマスクなどの仮想通貨ウォレットは、外部のサービス提供者と提携し、外部サービスも提供しています。
例えばメタマスクでは、スワップ(仮想通貨同士の交換)が可能です。スワップ機能においても、メタマスクは仲介役として以下のようなサービスを提供しています。
出典:MetaMask
またメタマスクからは、日本円を使って仮想通貨を買うこともできます。メタマスクが仲介役として「Mercuryo 」という外部サービスを提供することで可能となっています。
仕組み①:RPCによるブロックチェーンデータ取得
仮想通貨ウォレットを使うと、ブロックチェーンとのやり取りが可能になるのでした。それによりトークンの受け取りや残高確認、送付などができるようになるという話でした。
ここでは、それらの機能を支える仕組みである、ブロックチェーンデータの取得方法を記載します。
ウォレットが残高を表示する仕組み
まずは、ブロックチェーンデータの取得のイメージを深めるために、ウォレットがどのように残高を表示しているかを見てみたいと思います。
前提として、ウォレットの中には仮想通貨やNFTは入っていないのでした。しかしそれなら、なぜ残高が分かるのでしょうか。
中に入っていない仮想通貨をどうやって数えてる?
ウォレットが残高を表示できる理由は、ブロックチェーンデータの取得にあります。ブロックチェーンには全ユーザーの全トランザクション(取引)が記録されています。記録は「〇日前に、AからBに、1BTCが送られた」といった形です。
ウォレットはこの情報を使って、あるべき残高を算出しているのです。
残高の記録方法はブロックチェーンによって違ったりもしますが、ウォレットはそのブロックチェーンが採用している残高の記録方法に従って、情報を収集します。
ブロックチェーンの残高記録方法には、UTXOモデルやアカウントバランスモデルがあります。
送信直後の残高が変わっていない理由
「送金したのに、送金分が残高に反映されない!」ということがあります。この理由は上の仕組みで説明できます。
ウォレットはブロックチェーンに記録されている情報を参照し、残高を計算するのでした。そのため、トランザクションが未承認(= まだ記録されていない)なら、残高に反映されないというわけですね。
RPCという方法でデータを取得
ウォレットがブロックチェーンデータを取得するときは、RPC(Remote Procedure Call、遠隔手続き呼び出し)という方法が使われます。
RPCを利用すると、あるコンピュータで動作するソフトウェアから、別のコンピュータ(サーバ)上で動作するプログラムを呼び出してもらったり、結果を返してもらったりできます。
同じRPC仕様に準拠した仕組みを採用していれば、機種やOS、プログラミング言語などが異なっていても共通の手順で呼び出すことができます。
RPCはには約束事があり、それを守ることで、離れた場所(異なるネットワーク)にあるサーバと情報をやり取りできます。以下は、情報のやりとりのイメージです。
まずウォレットのソフトウェアが、ブロックチェーンデータを持つコンピュータ「RPCノード」にリクエストを出します。すると、RPCノードがウォレットに情報を返してくれるという流れです。
RPCノードはブロックチェーンネットワークに参加していて、最新のブロックチェーンデータを持っています。そのため、ウォレットユーザーは最新の残高が分かります。
dAppsもRPCを利用
ちなみにRPCによる通信は、dAppsなどにも利用されています。dAppsはインタフェース(ユーザーが操作する画面)と、サーバ上のプログラミングコード(スマートコントラクト)に分けられますが、この2つの連携はRPCによって可能になっています。
説明を読んでいると「サーバのあるネットワークの詳細情報を知らなくても、コミュニケーションを取れる」との記載があります(↓)。この意味がよくわかりませんでしたが、一応メモしておきたいと思います、、
A Remote Procedure Call, or RPC, is a lightweight software communication protocol, which allows a program (the client), to communicate with a remote program (the server) hosted on a different network without needing details about the server’s network.
RPC or Remote Procedure Call refers to a lightweight software communication protocol that helps the client or dApp communicate with a remote program or server. The server could be hosted on a different network, and the client could connect with the server through RPC without the details of the server network.
他人が運用するRPCノードの力を借りる
多くのウォレットユーザーは、自分自身でRPCノードを運用していません。
それでも残高確認ができるのは、他の団体が運用するRPCノードの力を借りているからです。具体的には、AlchemyやInfura、Ankrなど、ノードプロバイダと呼ばれる団体のRPCノードに力を借ります。
メタマスクではどのRPCノードの力を借りるかを、ユーザーが自分で変更できます。例えば、これまで利用していたInfuraが不祥事を起こしそうだと思ったら、AnkrのRPCノードに切り替えられます。
「他の団体なんか信用できない!」という人もいると思います。そんな人は自分自身でノードを運用して、そのノードからブロックチェーンデータを引き出すこともできます。
切り替えるには「RPCエンドポイント」を変更する
利用するRPCノードを変更したいときは、RPCエンドポイントを変更します。
ちょっとややこしいのですが、RPCエンドポイントとRPCノードは少し違います。RPCノード上に、複数のRPCエンドポイントが存在するという関係性で、RPCエンドポイントはリクエストの送信先です。
メタマスクでは、ネットワークURLとなっている部分がRPCエンドポイントです。
上記画像では、InfuraのRPCノード上にあるRPCエンドポイントが指定されます。この部分を変更すれば、他のRPCノードからブロックチェーンデータをもらえるようになります。
ちなみにAnkrは、無料で使えるRPCエンドポイントを以下URLで公開しています。
AnkrのRPCエンドポイントを選択しても、同じ残高が表示されるはずです。
初期のウォレットはフルノードだった
ここではウォレットの歴史を見てみたいと思います!
今日では、自分自身でノードを運用しなくても、ウォレットを使ってブロックチェーンデータを取得できます。しかし当初は、自分自身でノード(フルノード)を運用しないとウォレットを使えない仕組みでした。
ちなみに以下は、当初のビットコインのウォレットのインターフェースです。
出典:Bitcoin.com
ウォレットを利用したいユーザーは、ウォレットを同期するために、最初から現在までのブロックチェーンの全情報をダウンロードする必要があったわけです。
当初はダウンロードが必要なデータがそれほど多くないので、問題にはなりませんでした。
しかし、ブロックチェーンのデータは膨らんでいき、最初のダウンロードに数日かかるようになります。また、数日ぶりに残高確認をしようとしたら、ダウンロードのための待ち時間が生じる、なんてことも起こり始めたようです。
仕組み②:仮想通貨ウォレットの暗号技術
仮想通貨ウォレットの様々な機能に暗号技術が活用されています。
秘密鍵と公開鍵、シードフレーズとは
仮想通貨ウォレットは秘密鍵や公開鍵を使うことで、セキュリティの高い通信を可能にします。
ここでは暗号技術の説明の前提として、秘密鍵と公開鍵、さらにシードフレーズの役割について見てみたいと思います。
秘密鍵
秘密鍵とは、ブロックチェーンアドレスの管理権のようなものです。ホットウォレットならウォレットアプリの中、ハードウェアウォレットならデバイスの中に保管されています。
とあるアドレスの管理下の仮想通貨やNFTは、そのアドレスの秘密鍵を持つ人だけが送金したりできます。具体的には、送金などをするには「デジタル署名」という秘密鍵を使った操作を要求されるので、秘密鍵を持たない人は送金などができません。
秘密鍵はリカバリーにも使います。PCが壊れたりしても、別のデバイスのウォレット画面で秘密鍵を入力すれば、アドレスは復活します。
ちなみに秘密鍵は、以下のように数字と文字の羅列になっています。
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
こんなふうな形式は、機械には良くても人間には認識しづらく、記録間違いや入力間違いがありそうです。間違いが無くても、記録や入力の後はすごく疲れそうです。
そこで、シードフレーズの利用が提案されました(この提案は、BIP-38と呼ばれます)。
シードフレーズ
シードフレーズは、ウォレットを作ったときに「メモしてください」といって出てくる、12とか24の英単語が順番に並べられているやつです。
下はシードフレーズのイメージです。
- follow
- flip
- army
- energy
- fabric
- swallow
- achieve
- correct
- stereo
- void
- view
- pen
シードフレーズと秘密鍵の共通点は、どちらもアドレスの管理権限として機能するという点です。シードフレーズを入力しても、秘密鍵を入力しても、ウォレットのアドレスは復活させられます。
大きな違いは、シードフレーズはウォレット単位で生成されるが、秘密鍵はアドレス単位で生成される、という点です。1つのウォレットで複数のブロックチェーンアドレスを保有している場合、シードフレーズは1つだけですが、秘密鍵はアドレスごとにあります。
1つのウォレットで複数のブロックチェーンアカウントを保有する場合、秘密鍵はアカウントごとにあります。ただし、イーサリアムとEVM対応チェーンの秘密鍵・公開鍵・アドレスは、基本的に同一の文字列です。
イーサリアムと多くのEVM対応チェーンでは、鍵やアドレス生成の仕組みが一緒です。そこでメタマスクなどのメジャーなウォレットは、わかりやすくするために同一の鍵とアドレスを割り当てているのです。
あと、人間にとってはシードフレーズのほうが認識しやすいです。
ちなみに、シードフレーズにはいろんな呼び名があります。
- シード(根源)フレーズ
- リカバリー(復活)フレーズ
- シークレット(秘密)リカバリーフレーズ
- ニーモニック(覚えやすい)フレーズ
それぞれの呼び名はシードフレーズの役割や特徴を表しています。
シードフレーズは各アドレスを束ねる根源的なフレーズであり、ウォレットを復活させることができて、秘密にしておく必要があり、人間にとって覚えやすいという特徴があります。
ちなみにウォレットを復活させるには、「BIP39」という規格に対応しているウォレット画面にシードフレーズを打ち込む必要があります。
メタマスクやトラストウォレットなど、多くのウォレットがBIP39に対応しています。
公開鍵
公開鍵は、銀行でいうところの銀行口座、メールでいうところのメールアドレスの役割を果たします。つまり、仮想通貨やNFTの受け取り先として機能してくれ、他人に知られても問題ありません。
また、「デジタル署名」というメカニズムにおいても使われます(詳細は後述)。送金などのトランザクションを受け取ったノードは、送信者の公開鍵を使ってトランザクションに不正がないかをチェックします。
ちなみに、公開鍵の代わりにウォレットアドレスが使われるケースが多いです。ウォレットアドレスは公開鍵を暗号化して作られるもので、公開鍵と同じように利用できます。それでいて公開鍵よりも短くて使い勝手がよいので、ウォレットアドレスのほうがよく使われます。
シードフレーズ、秘密鍵、公開鍵の生成方法
シードフレーズや秘密鍵が第三者に推測されると、資産が盗まれる可能性があります。そのためシードフレーズや秘密鍵は、予測できない方法で生成されるべきです。
公開鍵はシードフレーズから作られます。公開鍵からシードフレーズを推測できるとまずいので、公開鍵の生成方法も重要!
シードフレーズの生成には、予測不可能性(エントロピー)を高められる、特殊な方法が使われます。例えば、RNG(Random Number Generator)というシステムの利用があります。
シードフレーズが活用されるウォレットでは、秘密鍵や公開鍵はシードフレーズを元に作られます。シードフレーズを「楕円曲線暗号」という特殊な方法で暗号化して作ります。
さらにウォレットアドレスは、公開鍵を暗号化して作られます。その際に利用される暗号化技術には、SHA-256やKaccak-256などがあります。
「ウォレットから秘密鍵が作られ、秘密鍵から公開鍵が作られる」という解説もよく見ます。
シードフレーズがあるかどうかの違いですかね?
現状、暗号化が解読されることは理論的にないようです。そのため、シードフレーズや秘密鍵を安全に管理する限りでは、ウォレットのハッキングは起こらないということになります。
ただ、不安な場合は12語ではなく24語のシードフレーズを利用するなど、工夫もできます。24語のシードフレーズは12語のシードフレーズよりも予測したり、全て数え上げることなどが難しいです。
- 12語⇨128ビット(2の128乗通り)
- 24語⇨256ビット(2の256乗通り)
ウォレットアプリ側が秘密鍵を保管している可能性もありますが、メタマスクなどのオープンソースのウォレットはおそらく大丈夫なのかなと思います。
デジタル署名
仮想通貨ウォレットには、仮想通貨ではなく秘密鍵と公開鍵が保管されているという話でした。この秘密鍵と公開鍵は、デジタル署名の仕組みを成り立たせています。
署名とは、本人が作成したことや内容に改ざんがないことを証明するメカニズムです。
ブロックチェーンで利用されるデジタル署名は、暗号技術を活用し、中央管理者不在の状態で行われます。電子契約書のやり取りに使われる「電子署名」という仕組みの一種と考えることもできます。
デジタル署名がどのように実行されるかを、2つの手順に分けて見ていきましょう。
- ユーザーによる署名
- ノードによる確認
ユーザーによる署名
デジタル署名の最初のステップは、ユーザーがウォレット画面で行うサインです。サインの流れは以下の通りです。
- ウォレットを開く
- 送金先や送金額を入力する
- 送金情報がハッシュ値に変換される(自動)
- 秘密鍵を使い、ハッシュ値に署名(サイン)する
- 署名されたメッセージはノードに送られる(自動)
英語になってしまいますが、以下のようなイメージです。
各手順を補足していきます。
まず手順3について、ハッシュ値という言葉が出てきます。ハッシュ値は、以下のように元のメッセージを加工した結果できます。
この特殊な加工のことを「ハッシュ」「ハッシュ関数にかける)と言います。ハッシュ関数には、SHA-256やKaccak-256などがあります。
実は、ハッシュ値への変換は必須ではありません。ハッシュ値に署名しなくても、元のメッセージにそのまま署名することも可能だからです。
でも効率化のためにハッシュ値に変換します。ハッシュ値の長さは一定かつ短いので、変換すると署名しやすくなります。あとハッシュ関数での変換はすぐできるので、効率が上がるようです。
手順4は、「秘密鍵を使い、ハッシュ値を署名する」でした。何だか難しそうですが、実際の手順は簡単です。ウォレット画面に表示されたメッセージを見て、「確認」ボタンを押すだけです。
秘密鍵はウォレットの中に保管されているので、ユーザーがどこかから持ってくる必要はありません。
ハッシュ値にサインしたものは、毎回ユニークな文字列となります。これが自動的にノードに送られます。
改めてユーザーによる署名の流れを振り返ってみましょう。
- ウォレットを開く
- 送金先や送金額を入力する
- 送金情報がハッシュ値に変換される(自動)
- 秘密鍵を使い、ハッシュ値に署名(サイン)する
- 署名されたメッセージはノードに送られる(自動)
ノードによる確認
ユーザーによる署名の最後に、署名が付与されたメッセージ(トランザクション)はブロックチェーンネットワーク内のノードに送られるのでした。
メッセージを受け取ったノードは、本人が送ったメッセージなのか、途中で改ざんされていないかをチェックします。チェックの流れは以下の通りです。
- 公開鍵を使って、署名されたメッセージをハッシュ値に戻す
- 元のメッセージをハッシュ値に変換する
- 手順1のハッシュ値と、手順2のハッシュ値の一致を確認する
- また、送金者の残高が十分かもチェックする
- バリデーターやマイナーに検証され、記録される
上記の流れを図にすると、以下のようになります。
以降は各手順を補足しています。
まず手順1について、署名されたメッセージを受け取ったノードは、公開鍵で署名を外します。送信者の秘密鍵で行った署名は、送信者の公開鍵によって解除できる仕組みになっているので、解除に成功すればウォレットの持ち主本人がメッセージを送ったと分かります。
「公開鍵暗号」という暗号技術が使われています。ビットコインやイーサリアムは、公開鍵暗号の中でも「ECDSA」という方法を用いています。
手順2では、ノードがメッセージをハッシュ値に変換します。こうすることで、2つのハッシュ値が用意できました。1つは復号して得たハッシュ値、もう一つはノードがハッシュ関数に掛けて得たハッシュ値です。
上記の2つのハッシュ値は、手順3で見比べられます。ハッシュ値が一致すれば、改ざんされていないことが分かるというわけです。
仮想通貨ウォレットの収益元
仮想通貨ウォレットの収益源についても、補足的に見てみたいと思います。
ウォレット利用料
有料のウォレットの場合、その料金が収益源になります。
例えば、メタマスクは機関投資家向けサービス「MetaMask Institutional(MMI)」も提供していて、利用には月額手数料がかかります。
あとハードウェアウォレットの場合、購入時に1~2万円くらいかかります。
スワップの手数料
メタマスクなどは、スワップの手数料を受け取っています。株式会社bitFlyer Blockchainが出した『web3Research2023』によると、「 サービスリリースから半年でスワップ取引の合計額が$2bn (約2,173億円*) を上回る」とのことです。
ちなみにメタマスクのスワップの手数料は、0.875%です。コインベースウォレットのスワップ手数料は、公式ページで見つかりませんでしたが、bitFlyer Blockchainの資料によると1%です。
外部サービスとのレベニューシェア
ウォレットの画面に外部サービスを埋め込んでいるケースでは、レベニューシェアによりウォレット側が手数料の一部を受け取ることもできます。
レベニューシェア(revenue share)とは、発生した売り上げを一定の割合で分配する契約、仕組みのことです。
例として、メタマスク画面からAというdAppsが利用されたと仮定します。またdAppsの利用には、もともと1%の手数料がかかるとします。
メタマスク経由でAが利用されたとき、1%の手数料の半分をdAppsがメタマスクに支払っているとしたら、レベニューシェアを行っているといえます。
まとめ
思ったよりも長くなりました。仮想通貨ウォレットは何気なく使っていますが、仕組みを知ることで安全性の対策もできそうです。
ウォレットを安全に使うためには、これ以上の知識が必要になりそうなので、今後もまたウォレットについてのまとめを書いてみたいと思います。
参照
↓全体的な参照先
https://research.binance.com/static/pdf/wallets-deep-dive.pdf
https://blockchain.bitflyer.com/pdf/web3Research2023.pdf
↓RPCについて
↓秘密鍵とシードフレーズについて
↓エントロピーとは
↓デジタル署名
コメント