オン ザ・ブロックチェーン

【ビットコイン】ウォレットの仕組みを徹底解説

calendar

 ウォレットは直訳すると「財布」という意味で、ビットコインのウォレットはまさにビットコインを入れておくための財布のような役割をします。

 ビットコイン界隈では、「ウォレット」という言葉は非常に曖昧な使われ方(広い意味で言ったり、限定的な意味で言ったり)をしているのですが、ここではウォレットと呼ばれるソフトウェア(アプリケーション)の仕組みに関して、説明したいと思います。

スポンサーリンク

ビットコインアドレス

 ウォレットには、ビットコインアドレスが紐付いています。送金時の宛先となる値です。メールアドレスみたいなものですね。
※ビットコインアドレスは26〜35文字の英数字で表されます。見間違いを防ぐために、数字の0(ゼロ)、大文字のO(オー)、大文字のI(アイ)、小文字のl(エル)を除いたアルファベットと数字を使ったBase58(58進数)という形式になっています。

 普通は、ウォレットごとに1つのビットコインアドレスが付与されているイメージを抱くと思いますが、実はそうではありません。

 ウォレットには、普通、複数のビットコインアドレスが紐付いています。

 なぜ1つのウォレットに複数の宛先が要るのかと言うと、基本的にビットコインアドレスは使い捨てだからです。

 普通、ビットコインを送ってもらう際には、「ここに送ってくださいねー。」と、ビットコインアドレスを文字列かQRコードで送り主に伝えるのですが、この時表示されるビットコインアドレスは、実はその都度違います。

 一度でも使った(入金された)ビットコインアドレスはもう使われません。次に送金をお願いしようとして表示するビットコインアドレス(QRコード)は全く別物になっています。

 なぜそんな面倒なことをするのでしょうか?

 ブロックチェーン上には全ての送金履歴が載っており、あるビットコインアドレスの送金履歴、及びその残高を、誰でも簡単に見ることができます。
BLOCKCHAINでそのビットコインアドレスを検索するだけで全ての情報が出てきます。

 ということは、もしウォレットに対してビットコインアドレスが1つしかなかったら、「ここに送ってくださいねー。」と相手にアドレスを教える度に、そのウォレットの残高も教えていることになります。

 透明性が高いにもほどがあります。(笑)

 そうはならないように、ウォレットは自動的にその都度新しいビットコインアドレスを生成して表示するようになっています。新しいアドレスなら、もしBLOCKCHAINで検索されても、何も履歴はありません。

 もちろん、生成されるビットコインアドレスは全てそのウォレットの窓口(入金アドレス)として機能するようになっています。

 分かり易く言うと、ウォレットの中身はそれぞれのアドレスごとにビットコインを小分けに保存しているようなイメージです。

 こうすることで教えたビットコインアドレスから、ウォレットのトータル残高が見えないようになっています。

 もちろん、自分のウォレットの残高を見る際は、そのウォレットに紐付いている全てのアドレス残高の合計が見られるようになっています。

使い捨てと表現しましたがそのアドレスは消えてなくなるわけではありません。使おうと思えば、何度でも自分のウォレットへの入金アドレスとして使うことができます。

送金の仕組み

 というわけで、ウォレットの中身はアドレスごとに区切られて小分けになっているような状態です。
※正確には入金ごとに小分けになっています。もし同じアドレスに複数回入金があってもそれらは合計されることはなく、バラバラの状態で保存されています。

 送金する際には、その小分けになっているアドレスの中のビットコインを丸ごと全部使ってしまうようになっています。

 ちょっと何言ってるか分からないと思うので例を出します。

 例えば、以下のように、アドレスAに2BTC、アドレスBに2BTC、アドレスCに1BTC入っているウォレットがあるとしましょう。

 もし、このウォレットから、他のウォレット内のビットコインアドレスD0.5BTC送金するとどうなるかと言うと、アドレスAに入っているビットコインを全部放出してしまいます。0.5BTC送金したいだけなのに、2BTCも放出してしまうんです。

 いやちょっと待てよ。と言いたくなりますが、大丈夫です。

 その2BTCのうち、0.5BTCは、アドレスDの元へ行き、余った1.5BTCは自分のウォレットに返ってきます。

 その際、1.5BTCを受け取るのはまたも新しく作られたビットコインアドレス(アドレスE)です。
※実際は手数料を引かれて余った金額が返ってきます。

 もちろん、複数のアドレスの中のビットコインをまとめて送金することもできます。もし上記の残高5BTCのウォレットから、どこかのアドレスへ3.5BTC送金するとなると、アドレスAとアドレスBが消えて、相手に3.5BTCが渡り、自分に0.5BTC返ってくるということになります。

 一見面倒な仕組みですが、この仕組みによって保存される過去の取り引きデータは、コンピュータにとっては非常に読み込みやすい構造と言え、残高を合計したり、過去の取り引きを遡ったりという作業を効率よく行うことができます。

 ところで、ビットコインを送金する際には1つ重大なルールがあります。

 あるアドレスに入っているビットコインを送金できるのは、そのアドレスに紐づく秘密鍵を知っている人だけなんです。

公開鍵と秘密鍵

 それぞれのビットコインアドレスには、公開鍵(Public key)秘密鍵(Private key)が紐付いています。
※公開鍵、秘密鍵ともに、256bit(32byte)の英数字の羅列です。

 ウォレットに対してではなく、生成されたビットコインアドレスそれぞれに紐づく公開鍵と秘密鍵が存在します。

 ビットコインアドレス、公開鍵、秘密鍵は3つでワンセットです。

 実際の処理では、まず初めに秘密鍵が作られ、それをある一方向関数により変換して作られるのが公開鍵、同様にその公開鍵を変換することで作られるのがビットコインアドレスです。それぞれ逆向きに変換することは不可能なので、アドレスや公開鍵から秘密鍵を知ることはできません

 取り引きの際、ビットコインアドレスと公開鍵は公開する必要がありますが、秘密鍵は一切外に出ないようになっています。なので秘密鍵を知っているのはそのアドレスを作った人だけです(正確には作った人が知ってるわけではないですがそのウォレット内に保存されています)

 上述したように、あるアドレスに入っているビットコインをどこかに送金しようと思ったら、そのアドレスに紐づく秘密鍵が必要になります。

 例えば、アドレスAに入っているビットコインを送金する際には、アドレスAに紐づく秘密鍵が必要だと言うことです。

 この仕組みによって、それぞれのアドレスの中のビットコインは、そのアドレスの秘密鍵を知っている人にしか動かせないことになります。

 要するに自分が作ったアドレスに入金されたビットコインは自分だけが自由に使えるということです。当たり前のことです。

 ビットコインアドレスにはもちろん持ち主に関する情報(例えば名前とか住所とか)は含まれていないので、秘密鍵を知っていることがそのアドレスの所有を証明する唯一の手段です。

 逆に言えば、秘密鍵さえ知っていれば本人と認められ、そのビットコインアドレスからの送金を自由に行うことができます。秘密鍵は本人を証明する重要な情報です。

 秘密鍵と公開鍵は何らかのデータを暗号化→復号する為に使います。

 秘密鍵によって暗号化されたデータはそのペアとなる公開鍵でしか復号できません。また逆に公開鍵で暗号化したデータはそのペアとなる秘密鍵でしか複合できません。

 秘密鍵を本人が誰にも教えず管理できていさえすれば、この特性を使って本人確認(電子署名)を行うことができます。

 例えば、秘密鍵Aを知る人が、「あいうえお」という文字列を秘密鍵Aで暗号化したら「kc2g1dv7a」になったとしましょう。

 それを通信相手に伝えます。『「あいうえお」を僕の秘密鍵で暗号化したら「kc2g1dv7a」になったよ。』と。

 その「kc2g1dv7a」を、秘密鍵Aとペアになった公開鍵Aで復号して、もし「あいうえお」になれば、送り主が秘密鍵Aを知っていることが証明されます。

ウォレットの役割

 上記で説明したようにビットコインアドレスは入金のたびにどんどん新しく作られます。もちろん、それに対応する秘密鍵も公開鍵もその都度作られます。

 ウォレットは、それらの作業を自動的に行なってくれています。

 ビットコインアドレスをどんどん作成しながら、それらが1つの財布として機能するように管理するのがウォレットの役割です。

 誤解を恐れずに言うと、ウォレットの内部構造は、生成したビットコインアドレス秘密鍵公開鍵、およびその残高を記録しておく表のようなものです。

 残高の部分が空白になっているのは、残高はウォレット自体が持っている情報ではないからです。残高はあくまでブロックチェーンから読み込むことで知りえる情報です。その都度ブロックチェーンを読みに行って最新の情報を知ることが出来ます。それを書き入れるための枠だけをウォレット側で用意しているようなイメージです。

 要するにウォレットが保存しているのは、過去に生成したビットコインアドレスとそれに紐づく秘密鍵、公開鍵だけです。

 具体的な取引内容については、全てブロックチェーンに刻まれており、ウォレット内に保存されているわけではありません。

マスターシード

 上記のようなやり方だと、過去に使ったビットコインアドレスに関するデータ(秘密鍵・公開鍵も)がどんどん増えていってしまうことになります。ほぼ使い捨てで使われることはないにも関わらずです。

 もし何年も同じウォレットを使っていれば、おそらくとてつもない量のアドレスの死骸だらけになります。

 しかし、実はそこも巧妙な仕掛けがあります。

 秘密鍵から公開鍵とアドレスが作られることは上述しましたが、実は秘密鍵も決してランダムに作られているのではなく、ウォレットが持つあるデータを元に作られています。

 その元となるデータのことをマスターシードと言います。マスターシードはとんでもなく大きな数値になっています。

 マスターシードはウォレット固有のものです。二つとして同じ物は存在しません。

 マスターシードの値から、あるパターンに則って無数の秘密鍵を生み出すことができます。パターンに則って作られるというのは、言い換えると再現性があるということです。

 つまり、マスターシードの値さえ分かれば、そのウォレットはどんな順番で、秘密鍵、公開鍵、及び、ビットコインアドレスを作るのかが全て分かることになります。

 この仕組みを利用すれば、ウォレットは過去に作られた全ての鍵やアドレスについて、いちいち全てを保存しておく必要はないと言うことです。

 「シード」には「種」という意味があるように、マスターシードは秘密鍵の種のようなものであり、結果的にそのウォレットの全ての情報が詰まっていると言えます。

 このようなマスターシードから全てを導き出せる仕組みのウォレットのことを、階層的決定性ウォレットと言います。

 階層的決定性ウォレットという仕組みは、ビットコインの黎明期には無かったもので、ウォレット内部の情報量が増え続けてしまう問題を解決する為に実装されました。

 お気づきの人は多いと思いますが、マスターシードがもし他人にバレるとウォレットを丸ごと盗まれることになります。

 言わば、マスターシードとはウォレット自体の秘密鍵みたいなものです。

 盗まれるリスクは怖いですが、逆に言えば、マスターシードさえあればそのウォレットはいつでもどこでも再現することができると言えます。

パスフレーズ

 もしスマホが壊れてウォレットを失くしても、ビットコインが消えて失くなるわけではありません。ブロックチェーンに刻まれた残高情報はそのままです。ただウォレット(秘密鍵)が無いとそのビットコインを動かす権利を失うので、自分のものではなくなるだけです。

 なのでウォレット(秘密鍵)さえ再現できれば、全ては元通りというわけです。

 マスターシードさえ分かれば、もし酔っ払ってスマホをトイレに落っことしたとしても、少なくともビットコインは大丈夫です。他は知りませんが。(笑)

 マスターシード自体は、16進数百数十桁という、とてもメモしておけるようなものではないのですが、それを人間が覚えやすい(というかメモしやすい)形に変換したのがパスフレーズと呼ばれるものです。

 パスフレーズは12個の英単語が順に並んだものになっています。覚えようと思えば覚えられるかも知れませんが、記憶だけに頼るのも怖いので、書き写すなりして保存しておきましょう。

 パスフレーズの見方については各ウォレットアプリによって違うのでよく調べてみて下さい。リカバリーフレーズ復元フレーズと呼ばれている場合もあります。

 パスフレーズは絶対にデジタルデータとして残さないように注意してください。パスフレーズはウォレットをレストアする時以外は一切使わない情報なので、スマホやPCに入れていても百害あって一利なしです。

 その12個の単語を、スペルミスの無いように、もちろん順番も間違わないようにノートに書き写すなり、写真に取って印刷するなりして(写真データは消すこと!)、どこかに大事にしまっておくようにしましょう。

 紙に書き写して、火事で燃えてしまわないように金庫にでも入れておくのが一番いいかと思います。もっとも、家が燃えたらビットコインどころの話じゃないかも知れませんが。(笑)

 以上、ウォレットの仕組みを徹底解説してみました。安全なビットコインライフを!

この記事をシェアする

コメント

down コメントを残す




管理人

Nobuo

Nobuo

仮想通貨に興味があるただの人です。モナコインが好きなのでMonazon.jpを作りました。よろしくです。