わかりやすくブロックチェーンを説明してみる(第5回):トランザクション(送金情報)の検証

<連載目次>

はじめに

ブロックチェーンの本質は「データ分散(コピー)」技術です。

これまで第1回から第4回ではブロックチェーンの本質について説明してきました。第1回から第4回だけでもブロックチェーンの本質については十分に理解できたかと思います。

今回(第5回)以降は、ビットコインのブロックチェーンについてもう少し深く掘り下げてみたいと思います。

今回(第5回)は、ビットコインが送金されるときにネットワーク上でどのような検証がおこなわれているかについて説明してみたいと思います。これによりビットコインがなぜ「暗号資産」と呼ばれるのかが明らかになります。

なお本連載はビットコインやブロックチェーンを技術的な側面から解説することを目的としています。ビットコインへの投資を勧める連載では決してありません。

トランザクションの検証

AさんからBさんにビットコインを送金した場合、トランザクション(送金情報)を受け取ったコンピュータは主に以下の検証を行います。なお実際の検証項目はもっとたくさんあります。

  1. Aさんには必要な残高があるのか?
  2. そもそも本当にAさんなのか?
    (Aさんの残高を使う権利のある人か?

この様子を以下の図に示します。

上図に示したようにトランザクションTx(送金情報)を受け取ったコンピュータBは①と②について検証し、問題なければマイニング対象としているブロックの一部として取り込むと同時に、隣接するコンピュータCにそのトランザクションTxを転送します。

もしトランザクションTxに問題があればコンピュータBはコンピュータCには転送はしません。この結果、問題のある送金情報はブロックチェーンに書かれることはなく破棄されることになります。

トランザクションTxをコンピュータBから受け取ったコンピュータCもトランザクションTxを検証し、問題なければ隣接するコンピュータDにトランザクションTxを転送します。ここでいう問題とは、Aさんには必要な残高がなかったり、あるいはAさんではない人がAさんの残高を使おうとした場合などです。

なおこの段階では1つの送金情報(トランザクション)が検証されただけであり、まだブロックチェーンには何も書かれません。

ではどうやって各種検証を行うのでしょうか?

残高確認

これまでの説明では取引台帳に書かれる送金情報は「AさんからBさんへ0.1BTC送金した」という情報でした。ではAさんの残高情報はどこに記録されているのでしょうか?実はビットコインでは残高情報は取引台帳には記録されません。銀行の通帳なら残高は記録されているのですがビットコインの取引台帳では残高は記録されません。残高が記録されていなくても取引台帳全体を検索して計算するば残高はわかりますがさすがにそれでは効率が悪いです。

では残高の情報はどこに記録されているのでしょうか?
実は残高情報はビットコイン・ネットワークに接続している各コンピュータが個別に記録しています。各コンピュータは取引台帳(ブロックチェーン)を参照して各アカウント(ユーザ)の残高を計算し残高データベースを作成します。この残高データベースは各コンピュータが責任を持って管理、他のコンピュータと共有はしません。したがって残高情報は、取引台帳(ブロックチェーン)のようにみんなで管理しているわけではありません。この残高情報データベースはUTXOセット(Unspent Transaction Output)と呼ばれています。UTXOはざっくりいうと未使用コインのことです。

各アカウント(ユーザ)のUTXO(未使用コイン)は取引台帳(ブロックチェーン)の中で散在しています。各アカウント(ユーザ)の残高を計算するには取引台帳(ブロックチェーン)全体を検索し、UTXOをかき集める必要があります。これを送金のたびにしていては実行速度が遅くなるので、事前に一度UTXOセット(データベース)を作成しているわけです。

繰り返しになりますがUTXOデータベースは各コンピュータがローカルに管理しており、ブロックチェーンのようにみんなで共有しているわけではありません。このあたりはいかがなものかと個人的には思ってしまうのですが・・・。


以上を図にまとめてみました。

ちなみにイーサリアムという暗号資産は、ブロックチェーン(取引台帳)に残高情報を持っています。

UTXO方式を使う理由やメリット、デメリットについて説明するとかなり長くなるのでここでは説明を割愛します。

なお話はそれますが、上述では「各アカウント(ユーザ)」という表現を使いました。厳密に言うとビットコインでは「アカウント(ユーザ)」の概念がありません。ビットコインアドレスが「アカウント(ユーザ)」に相当すると言えばそうなのですが厳密には違います。このあたりを説明するとややこしくなるので詳細につていは割愛します。

本人確認(暗号資産と呼ばれる理由はここ)

UTXOデータベースには各ビットコインアドレス(アカウント)の残高情報が記載されています。本人確認とは、その残高を使う権利のある人かどうか(ビットコインの所有者かどうか)を確認することです。

説明の都合上、以下の図ではBさんからCさんにビットコインを送金する際のBさんの本人確認について説明しています。下図では、Bさんに残高がありその残高をBさんは使う権利があるかをチェックしています。

本人確認の方法には「公開鍵暗号」が使われています。これが結構ややこしいのですが、厳密な説明にこだわらずなるべく分かりやすく説明してみます。なお「公開鍵暗号」はインターネット通信において普段から皆さんが特に意識することなく利用している技術です。

「公開鍵暗号」では「秘密鍵」と「公開鍵」が登場します。なにやら難しいそうな単語ですが両方とも単なる0と1の羅列です。そしてビットコインを使う人は全員この「秘密鍵」と「公開鍵」を事前に用意しておく必要があります。用意と言っても実際はウオレット(財布)アプリが用意(生成)してくれます。

秘密鍵

「秘密鍵」は単なる乱数です。銀行に例えると暗証番号のようなものです。「秘密鍵」はウォレットが自動で乱数を発生させその乱数を秘密鍵とします。「乱数」ということは「どんな数字(0と1の羅列)でもいい」ということです。

「秘密鍵」はその名の通り、絶対に他人には教えてはいけません。「秘密鍵」は自分の残高からビットコインを使うときに必要となります。「秘密鍵」が他人にわかってしまうと、自分のビットコインが勝手に使われてしまいます。また「秘密鍵」をなくしてしまうと二度と自分のビットコインを使うことができなくなります。

公開鍵

「公開鍵」は「秘密鍵」を暗号化関数に入力して生成される0と1の羅列です。銀行に例えると口座番号のようなものです。「公開鍵」もウォレットが自動で生成してくれます。「公開鍵」は他人に教えるものです。ビットコインの場合、「公開鍵」=ビットコイン・アドレスです(正確には少し違うのですが)。ビットコイン・アドレスは銀行口座の番号のようなものです。ビットコインを相手に送金する場合、相手のビットコイン・アドレスを指定して送金します。

上図ではAさんからBさんにビットコインを送金する際、Bさんの公開鍵を使って送金情報を暗号化しています。暗号化と言っても実はBさんのビットコインアドレスを取引台帳に書き込んでいるだけです。そのため暗号化という表現はよくないかもしれません。

そしてBさんがこのビットコインを使用するとき、「Bさんにはこのビットコインを使う権利があるのか?」というチェックを全員で行います。そしてこのチェックはBさんの秘密鍵を使って実施されることになります。

デジタル署名

でも待ってください。秘密鍵は他人に見せてはいけないものでした。ではどうやって全員がBさんの秘密鍵を使ってチェックするのでしょうか?非常に簡単にいってしまうとBさんの秘密鍵を使ってチェックするのではなく、Bさんが秘密鍵を使って生成した「デジタル署名」を用いて全員が「Bさんにはこのビットコインを使う権利があるのか?」をチェックします。

このあたりは従来からある「デジタル署名技術」などが使用されているのですが説明が複雑になるので詳細は割愛します。何か特別な新しい暗号技術が使われているわけではない、というくらいの理解でいいかと思います。なおブロックチェーン中級者向けに図解したものを今回の最後に付録としてのせておきます。

このように秘密鍵、公開鍵、デジタル署名などの暗号技術が使われているためビットコインは「暗号資産」と呼ばれています。

ビットコイン・アドレスの表記方法

また上図ではビットコイン・アドレスは520ビット(個)の0と1の羅列だと説明しています。送金のたびに520個も0と1を並べて入力するのかというとそうではありません。実際にはいくつかの関数を経て人が目でみても比較的わかりやすいように英数字で表現されています。ビットコイン・アドレスの例を以下に示します。

ビットコイン・アドレスの例 : 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

ビットコインを送金するたびに送金先のビットコイン・アドレスを手で入力するのかというとさすがにそれはなく、QRコードで入力したり、コピー&ペーストで入力したりします。

秘密鍵の管理

「秘密鍵」は自分のビットコインを使用するときに必要となります。「秘密鍵」は絶対に他人に教えていけません。ということは「秘密鍵」は自分で管理する(保管する)必要がある、ということです。

この点が暗号資産において最も注意すべき点です。秘密鍵はウォレットアプリの中に保存されています。しかしウォレットが壊れてしまった場合、データのバックアップを取っていないと「秘密鍵」はもはやわからなくなり、自分のビットコインが二度と使えなくなります。誰にどう相談してもどうにもなりません。

このようなことがないように、秘密鍵は紙に印刷するなりして厳重に保管しておく必要があります。紙に印刷して保管する以外にも管理の方法はいくつかあるのですが、ここではそれらの方法については触れません。

秘密鍵は通常は256ビット(256個の0と1の並び)です。実際紙に印刷して保管する場合は以下のような16進数で保管します。

秘密鍵の例 : 1A09347FBE2375A39CABC6D7812AB31E4F4245BE1A095E1ACB5634562BC2356

ウォレットが壊れた場合、そのウォレットを再度インストールし、保管していた秘密鍵を新しいウォレットに入力する必要があります。上記のような長い文字列を手で間違いなく入力するのはそれなりに大変です。そこで、複数のパスフレーズ(通常は12個の単語)を用意し、そのパスフレーズから秘密鍵を作る、という方法があります。この場合はパスフレーズを保管しておけばよく、秘密鍵を復元するときはこのパスフレーズを入力します。

秘密鍵はどこに?

すでにビットコインを「暗号資産取引所」で購入している人の中には、「秘密鍵なんて自分で管理していないけど?」「そもそも秘密鍵の存在なんて意識したことなどないけど?」という方もおられるかと思います。

そのような人の秘密鍵はどこにあるのでしょうか?この場合秘密鍵は「暗号資産取引所」のサーバーに保存され、「暗号資産取引所」が管理しています。ですので、みなさんが「暗号資産取引所」からビットコインを購入した場合、そのビットコインの所有者はみなさんではなく「暗号資産取引所」です。もしなんらかの理由で「暗号資産取引所」が秘密鍵を紛失する、あるいは盗難にあった場合、みなさんはビットコインを失うことになります。

だからと言ってウォレットを使って自分で秘密鍵を管理する方がよいかとうと、ここは意見の分かれるところかも知れません。秘密鍵を自分で管理しても紛失する、あるいは盗難に会うという可能性はあります。本連載はブロックチェーンの本質について説明することが目的なので、このあたりについてはこれ以上は触れないことにします。

秘密鍵は1つ?

秘密鍵(銀行でいう暗証番号)から公開鍵(銀行でいう口座番号、ビットコインアドレス)が生成され、取引台帳(ブロックチェーン)には取引情報の一部として公開鍵が書き込まれます(繰り返しになりますが、厳密にいうと公開鍵とビットコインアドレスは同じではありません)。そして取引台帳(ブロックチェーン)は誰でも見ることができます。ということは、ある人の公開鍵(銀行でいう口座番号、ビットコインアドレス)がわかれば、その人の残高が誰にでもわかってしまうということです。

さすがにこれではプライバシー的に問題があるので、通常ウォレットでは複数の秘密鍵を使います。つまり複数の公開鍵(口座番号、ビットコインアドレス)を使います。しかし、複数の秘密鍵を管理(保管)するのは非常に面倒です。ここでいう管理とは、秘密鍵を他人にばれないようにしたり、秘密鍵のバックアップを取ったり、紙に印刷して保管したりすることです。

そこでウォレットによっては先述したように、12個のパスフレーズから秘密鍵を自動で生成し、ビットコインアドレスを使用するものがあります。そしてパスフレーズさえ保管しておけば、そのパスフレーズから秘密鍵を復元することができます。またこの場合、複数(無限個)の秘密鍵を生成します。したがって複数(無限個)のビットコインアドレスが使用できることになります。

そしてビットコインを受け取るときに毎回自分のビットコインアドレスを変更します。変更はウォレットが勝手にしてくれます。これでも自分が使ったすべてのビットコインアドレスが他人にすべてわかってしまうと自分の残高はバレてしまいます。しかし、毎回変更しているビットコインアドレスが他人に全部わかってしまう、ということはまずないかと思います。

ビットコインを受け取るときに毎回ビットコインアドレスを変更してしまうと、古いビットコインアドレスに送金があった場合はどうなるのでしょうか?結論からいうと古いビットコインアドレスに送金されたビットコインもちゃんと自分のものとして扱われます。このあたりの理由について知るにはさらに詳しく学ぶ必要があるのでここでは割愛します。

次回

今回はビットコイン・ネットワーク上にある各コンピュータが各トランザクション(送金情報)に対して全員で何を検証しているかについて概要を説明しました。

その中で秘密鍵、公開鍵、デジタル署名について少しだけふれました。これらの技術は従来からある暗号技術ですが、詳細を理解するためにはそれなり時間と労力が必要です。残念ながらこの点に関しては「わかりやく」とはとても言えない説明で終わってしまいました。

次回(第6回)はブロックチェーンの分岐(フォーク)について説明します。ブロックチェーンのフォークはデータの改ざん(特に二重支払い)と深く関連しています。

<連載目次>

付録.トランザクションの流れ

<連載目次>