いまさら聞けないIT用語集 ビットコインの根幹となるブロックチェーン

文●大原雄介(http://www.yusuke-ohara.com/) 編集●北村/ASCII.jp

2018年06月04日 12時00分

今回のお題は、ブロックチェーン。ジサトライッペイ氏が帰省の折にご母堂より御下問され、答えられなかった用語その2である。

最近よく聞くブロックチェーンってなに?

ブロックチェーンそのものは、仮想通貨であるビットコインを成立させるための重要な技術であって、ブロックチェーンなしではビットコインは成立しない。

逆にブロックチェーン自身はビットコインと結びついた技術ではないので、ビットコイン以外への適用が始まりつつある。トラの被り物(ブロックチェーン)はジサトラメンバー(ビットコイン)には欠かせないが、世界中でトラの被り物をしている人が全員ジサトラメンバーか? というとそういうわけではないのと同じだ。

改竄をどう防ぐかが
ブロックチェーンの肝

ブロックチェーンとは、簡単に言えば「あるデータが改竄されていないことを証明する手段」である。たとえばイッペイ氏が見栄を張りたくて、本当は1つしか買ってないCore i9-7980XEを「2つ買った」と主張したとしよう。

もちろんその場合、Core i9-7980XEが手元に2つないとおかしいのだが、どこかからもう1つ借りて「ほら2つあります」と見せることは不可能ではない。

したがって、見分ける方法としては、ショップの領収書に「2つ買った」と書いてあるかどうかがポイントになる。ただし、これも白で塗りつぶしたり、写真を撮って画像を加工するなど、いろいろ手はある。

確実なのはショップが保管しているレシートのコピーと比べることだが、税務署でもないかぎりそう簡単にコピーの比較はできない。かくして、その気になれば簡単に改竄ができることになる。この改竄をどう防ぐかがブロックチェーンの肝である。

さてそのブロックチェーン、構造そのものはデータとハッシュ(Hash)から構成される。データそのものは、上の例で言えばレシートに記された情報そのものである。一方のハッシュ、正確にいえばハッシュ関数であるが、これは「任意のデータを、ほぼ一意に決まる固定長の値に変換するもの」かつ「逆方向の変換はできない」ものである。具体的には以下のような形だ(値は適当なので真剣に検証しないように)。

Core i9-7980XE 1個→(ハッシュ変換)→0x00123515
Core i9-7980XE 2個→(ハッシュ変換)→0x805A2013

ハッシュ関数はその性質上、元の値が変わっただけで大きく結果が変わる。これを利用して、ハッシュの値を比較することで、元の値が同じか違うかを簡単に判断できる。また、変換後の値から元の値が推察できない。例えば「0x00123515」というハッシュの値を知っても、これを「Core i9-7980XE 1個」には戻せない。

データを改竄すると
ハッシュ値が変わるのでバレる

ブロックチェーンでは、毎回データとハッシュを計算するのだが、おもしろいのは「あるブロックのハッシュが、次のブロックに記録される」ということだ。

DATA1のハッシュは、DATA2のハッシュに記載される。DATA2のハッシュはDATA3のハッシュへと続いていく

上の例で言えば、イッペイ氏のレシートの情報を元にしたハッシュは、イッペイ氏のレシートではなく、次のジサトラハッチ氏のレシートに記載される。ハッチ氏のレシートのハッシュは、その次のジサトラショータ氏のレシートに、という具合に1つづつずれる形で記録される。

これは、改竄をしにくくするためだ。仮にここでイッペイ氏がレシートのデータを改竄したとする。すると、図のHash #1の値が変化してしまう。

改竄をばれないようにするためにはハッチ氏のデータも変更しないといけない。ところがハッチ氏のデータを変更すると、今度はショータ氏、つばさ氏……とつながっているデータ全部を変更しない限り、つじつまが合わなくなる。

もちろんこの図のように4件程度であればまだ改竄は不可能ではないだろうが、これが百万件になると、現実問題として改竄は限りなく困難になる。

この改竄の難しさをさらに担保するのが、「すべての利用者が」データを共有することだ。イッペイ氏がレシートを改竄するとハッシュの値が変わるが、そのデータをイッペイ氏が隠してしまえば外からそれを見られない。

ところがブロックチェーンではP2P(Peer to Peer)の形ですべてのユーザーがデータを保持して共有する仕組みが整えられている。つまりデータを隠せないため、イッペイ氏がデータを改竄してしまうと、イッペイ氏の持っているデータが他のユーザーの持っているデータと一致しなくなることで、改竄が発覚するというわけだ。

ハッシュサイズを増やすと
安全性が増すが処理が重くなる

このあたりまでが仕組みの説明だが、もう少しだけ細かい話をしておきたい。ハッシュ関数にどんなものを使うかは自由だが、たとえばビットコインの場合は、結果が32bitの値になるものが使われている。

32bitということは、およそ43億通りということで一見無尽蔵に使えそうに見えるが、地球上の人口は74億人ほど(2016年)なので、仮にデータにそれぞれの名前を格納すると明らか43臆を超えるわけで、つまり異なるデータであっても同じハッシュの値になるケースが出てくる。

これはハッシュの衝突と呼ぶが、衝突が多くなるとハッシュ関数の信頼性が揺らぐことになる。ただ衝突を起きにくくするためには、だいたいにおいてハッシュのサイズを大きくすること(32bitではなく64/128bitにするなど)が必要になるが、こうした大きなサイズのハッシュの計算にはけっこうな処理能力が必要になり、処理が重くなるという欠点もある。

またデータとハッシュの両方をネットワーク経由で分散保持するので、ハッシュのサイズが大きくなるとネットワークの負荷も増えることになる。このあたりを勘案して、必要なハッシュのサイズを決めることになる。

同じタイミングで新規ブロックを
追加した場合は1つに統合する

また先の例ではレシートにたとえたので、新しいブロックはレジで新しい買い物が発生した際に生成されることになるが、これでは買い物が発生しないと、ずっとブロックに変更がないことになる。そこで、ビットコインでは一定時間ごとに新規ブロックを追加するようにしている。

先の例では0円の買い物レシートが追加されることになるが、幸いに買い物は0円でもレシートに記された日時は変化するため、ハッシュの値は当然変化する。こうして常にブロックを長くすることで、改竄をさらに困難にするわけだ。

またネットワーク越しにすべてのユーザーがブロックを変更できるということは、たまたま同じタイミングで異なるユーザーが新規ブロックを追加することがありえる。たとえば12時にイッペイ氏がCPUをA店で、12時1分にハッチ氏がGPUをB店で、同じく12時1分にショータ氏がC店でメモリーを買ったとする。この場合の流れをまとめたのが下図である。

たまたま同じタイミングで2つの新規ブロックが追加された場合の処理

A店でまずイッペイブロックができたあと、B店とC店でそれぞれ同時に、イッペイブロックの後ろにハッチブロックとショータブロックを持つ2つの分岐(ブランチ)ができることになる。

B店とC店はそれぞれお金を受け取ってこのブランチを作ったあとで、P2Pでその結果を他のノード(ハッチブランチなら店舗AとC、ショータブランチなら店舗AとB)に送り出す。この時点で初めて、ノードの分岐が発生したことがわかるわけだ。

この分岐が発生したらどうするかというと、ハッシュ値に基づく多数決方式でどちらの分岐が「正当」なのかを決める。ここで「正当」というのは、正しい取引をしたかとか、お釣りをちょろまかしたから不正だという話ではなく、単にどちらの流れをすべてのノードで共有するかを決めるだけの話である。

仮に多数決でショータブロックが正当と決まった場合、ハッチブロックは孤児ブロックという扱いになる。店舗で言えば「あれ? カード決済がうまく通らなかったので、もう一度やりますね」といったあたりだ。

この場合、ハッチ氏の決済が一度やり直され、ショータブロックの後にハッチブロックがつながることになる。店舗Bでは引き続き孤児ブロックと化したもともとのハッチ氏のブロックを保持することはできるが、それはもはや他の店舗には通知されない。

説明が長くなったが、ブロックをつなげる(チェイニングする)ということで、ブロックチェーンという名前になっているわけだ。

ブロックチェーンの欠点は
データ転送に時間がかかること

ここまで説明してきた通り、ブロックチェーンそのものは耐改竄性が高く、またすべての仕組みが自動でできるので技術的には管理者も不要(置くこともできる)、取引記録を秘匿化可能(公開させることも可能)、といろいろ便利な点もあるが、欠点もある。

まず、激しいトランザクションに耐えられない。ブロックチェーンの場合、すべてのユーザーがブロックを共有するため、ブロックを1個追加するのにけっこうな時間がかかる。ビットコインの場合、1回のビットコインの転送にはおおむね10~20分を要する。

これについてはいろいろ改善の方法なども提案されているが、基本的に参加者が多ければ多いほど時間がかかる構図に間違いはないので、広く使れていくに従ってどんどん遅くなる。たとえばカードの決済に10~20分かかっていたらユーザーが使わなくなるのは自明で、こうした取引には向かない。

またブロックチェーンは改竄されたかどうかは判断できても、そのデータが正しいものなのかどうかは一切関与しないので、データの正当性そのものは別の手段で担保する必要がある。

またネットワークと少なからぬ計算パワーを要するのも事実で、このあたりも普及を妨げる要因となっている。技術的にはスマートフォンに楽に実装できるが、実際の運用を考えると、特に外出時には激しくバッテリーとパケット通信量の残量が減るだろう。したがって、今のところは固定回線を持った、PCあるいはサーバーなどでの利用がメインとなると思われる。

技術的な欠点としては、参加者がそれほど多くないブロックチェーンにおいては、悪意を持った参加者が猛烈な勢いでブロックを追加すれば、改竄されたブロックを正当なものとして承認させるという力技が有効になる。実際モナコインの場合、改竄が発生して巻き戻しを余儀なくされている。

これについてもいくつか改善の提案はなされているが、それぞれ副作用があることもあって、今のところ決定的な解決法は見つかっていない。

データが正しく伝えられたかどうかはわかるが
そのデータの中身が正しいかどうかはわからない

つまるところブロックチェーンとはなにか? といえば、利用者の立場から見て実社会で一番近いのが、日本郵便の提供する「内容証明郵便」である(実装の仕組みは全く異なるが)。

内容証明郵便は、その郵便の中身が正しく相手に伝えられた、もしくは受け取られなかったことを日本郵便が担保してくれる仕組みである。中身が正しいかどうかはともかく、間違いなく伝わることが保障されるあたりが、ブロックチェーンに一番近い。

ブロックチェーンとは、内容証明郵便のデジタル版に近いものといえる

というわけでイッペイ氏は、ショップから内容証明郵便を受け取るような羽目にならないように、2つ目のCore i9-7980XEを早急に購入すべきだと思う(もちろん冗談だが)。

■関連記事