特集 2019年12月2日

レゴブロックでブロックチェーンを説明する

最近とある仕事でブロックチェーンを勉強する機会があった。

あれでしょ?仮想通貨のやつでしょ?すっごい暴落したやつ!というイメージがあるブロックチェーンだけど、実は仮想通貨に限らず、いろんなことに応用できる技術なのだ。

これは覚えたことを誰かに説明しておかないと忘れちゃう。説明しよう。レゴブロックで。

1975年宮城県生まれ。元SEでフリーライターというインドア経歴だが、人前でしゃべる場面で緊張しない生態を持つ。主な賞罰はケータイ大喜利レジェンド。路線図が好き。(動画インタビュー)

前の記事:桃太郎のきびだんごは経費で落ちるのか

> 個人サイト 右脳TV

裏切りものが何人いるかわからない世界

のっけからダジャレで恐縮である。でもそんなに遠くない気がするのだ。レゴブロックでなんとかイケるのでは?というぼんやりした確信を頼りに進めよう。

lego_block_chain002.jpg
というわけで担当編集の古賀さんに説明します。ブロックチェーンについては「ビットコインが盛り上がったときに本を読んだがさっぱりわからん」とのこと。

いやしかし、仮想通貨(最近は暗号資産と呼ぶ)には苦い思い出もある人も多かろう。トラウマを刺激するつもりはないので、ここは最初に言っておこう。

実はブロックチェーンは「データを安全に保管する仕組み」であって、仮想通貨オンリーの技術じゃないんですよ。

lego_block_chain003.jpg
「そうなんすか?」

ブロックチェーンって、データが改ざんされるとすぐバレるようになってるんです。だからその技術をお金に使うのが一番わかりやすい。自分の残高いじられたら嫌だもんね。

でも、他人にいじられたら嫌なデータって他にもたくさんある。契約関係とか流通とか著作権とか。ブロックチェーンってそっち方面にも応用できるよねー、という話になっているのだ。

じゃぁどうやってデータを安全に保管できんのか、ってのをこれで説明しますね。

lego_block_chain004.jpg
持参したのは我が家で使い倒されてきたレゴブロック
lego_block_chain005.jpg
もとの1000ピースセットにいろんなセットを買い足したので、警察署とカフェとMinecraftのパーツがバラバラに入っているカオス状態である。
lego_block_chain006.jpg
元のセットがバラバラだから、人の種類にも統一感がない。そして一人ハゲているな。

レゴのブロックをデータだと思ってください。ここでは奥のロン毛がデータを管理しています。

銀行とかいろんなシステムって、データを管理しているところがあって、そこをみんなで見に行ってるじゃないですか。上の写真では、ロン毛にお任せしている状態。

でもロン毛のセキュリティがガバガバだったり、悪意を持ったりしたら、エラいことになっちゃう。ロン毛の頑張りにかかっている。

lego_block_chain007.jpg
WAになっておどろう

ロン毛ひとりに任せるのも大変だし、じゃぁみんなで苦労を分散したらいいんじゃない?

同じデータをコピーして、みんなで持ってればいいじゃん。これならひとりがヘマしても他の人がカバーできるし。せっかくのインターネットやん?それって素敵やん?(これを分散型台帳技術と呼ぶ)

lego_block_chain008.jpg
「ところが、みんないい人ばっかりじゃないわけですよ……」
lego_block_chain009.jpg
分かりやすい悪のシンボル

なかには「俺の都合のいいようにデータを改ざんするぞ」みたいなヤツも出るわけです。いやな世の中ですね。

ただ、さっきみたいにみんなでデータを持っていると「この人が絶対正義」ってのがない。リーダーがいないから。

だからこのままだと、「誰が本当のことを言ってるの?」ってパニックになっちゃう。

lego_block_chain010.jpg
しかも裏切りものが何人いるかわからない……! ザワ……ザワ……。
lego_block_chain011.jpg
「そいつぁ困っちゃうなぁ」

真面目にデータを持っている人もいるけど、デマを流す人がいるかもしれないし、マシンが壊れちゃった人がいるかもしれない。

ホントか嘘かわからない情報が流れるなかで、全員で「これが正しいよね!」と意見を一致させるのは難しいのだ。(これを「ビザンチン将軍問題」と呼ぶ)。

ここで、「そんならデータの保管の仕方を工夫しようぜ」と生み出されたのが、ブロックチェーンである。

lego_block_chain012.jpg
写真を振り返ったら見事にろくろを回していた

ブロックチェーンは「ブロック」の「チェーン」

ブロックチェーンってその名の通り、データの「ブロック」が、「チェーン」でつながっているもの。

lego_block_chain013.jpg
そのまんまやん、っていうレゴパーツがあった。

データがある程度たまったら、それをひとつの「ブロック」にする。

それを「1番ブロック」「2番ブロック」「3番ブロック」……とつなげていく。ほら、ブロックでチェーンだ。

lego_block_chain014.jpg
「みんなが同じデータを持つ」のが基本なので、ロン毛も女子もみーんなおんなじ「ブロックをチェーン状にしたデータ」を持つことになる。ブロックを追加するときもみんな一緒。
lego_block_chain015.jpg
とはいえ、チェーンでつなげただけでは、結局データの一部が改ざんされてもわかんない。困った。

と、ここで、撮影を担当していた藤原さんから質問が。

lego_block_chain016.jpg
「すいません。データの『変更』と『改ざん』ってどう違うんですか。どっちもデータが変わることですよね……?」

えーっとですね、ビットコインを例にすると、さっきの「ブロック」ってのは「取引データ」のかたまりなんですね。

lego_block_chain017.jpg
さっきの「ブロック」の部分をより細かく表現。データのかたまり感を出してみた。

お金を送った、送られた、が積み重なったデータになってます。これを本来変えるタイミングでないときに変えちゃうのが『改ざん』です。

預金通帳を思い浮かべてもらうといいんですけど、新しく1万円預金するのが「残高の変更」で、昔5000円プラスされた記録を1万円プラスに変えるのが「残高の改ざん」になります。

lego_block_chain018.jpg
「なるほど」

さて、データをブロックにしてつなげただけでは、改ざんは防げない。そこで、チェーンの「つなぎ目」を工夫します。

ブロックをつなぐ「ハッシュ値」

ここからはブロックの「つなぎ目」となる、「ハッシュ値」と呼ばれるものを作る話になります。いよいよ核心だ。

lego_block_chain019.jpg
ここで登場するのが……
lego_block_chain020.jpg
このマシーン。ハッシュ値を作る「ハッシュ関数」です。

子どもに作ってもらったんだな、と思うだろう。実際頼んだのだけど、納期(子どもが寝る時間)がギリギリだったので作ってもらえなかった。みんなが寝たあとそれっぽい感じに作ったよお父さんは。

さて、この「ハッシュ関数」。何者かというと……。

lego_block_chain021.jpg
マシーンにデータをセットすると、ムニャムニャと変換して……
lego_block_chain022.jpg
下からポロッとなんか出てくる。これが「ハッシュ値」。

説明の都合で、ハッシュ値をブロック4つ分で表現しているけど、実際はもっと長い。ビットコインで使われているハッシュ関数のひとつ、SHA-256だと64文字(256バイト)だ。

「デイリーポータルZ」というデータなら、こんなハッシュ値になる。

71c8c3dc627e606d94bb50b7c6209e2cd1e516ee13a7a928b67cce3414de3491

ハッシュ値の文字の並びはデタラメで、どんな並びになるか予測不能。同じ「デイリーポータルZ」であれば、毎回おんなじハッシュ値になる。

lego_block_chain023.jpg
違うデータをセットすると、違うハッシュ値が出てくる。絶対かぶらないようになっている。すごい。

ちなみに、「あ」1文字だけのSHA-256ハッシュがこれ。

dc5a4d3d82f7e15792959dc661538ae0e541ce66494516f5c9cfd9cd3308494d

さっきの「デイリーポータルZ」のときと同じ64文字だ。どんなデータを元にしても、ハッシュ値の長さは同じになる。

lego_block_chain024.jpg
出てくるハッシュ値はどんなデータでも同じ長さ。圧縮・解凍とは違うので、ハッシュ値から元のデータは復元できない。

同じデータからは同じハッシュ値しか出てこないし、データが変わるとハッシュ値も変わっちゃう……

お?これって「データが変わったらすぐバレる」って仕組みに使えるんじゃない?

lego_block_chain025.jpg
(いまつなげますので、少々お待ちください……)
lego_block_chain026.jpg
チェーンのつなぎ目に、同じハッシュ値を使うのだ。チェーンの端と端で、ブロックが同じ順(オレンジ・黄緑・黄色・緑)に並んでいるのがわかるかな……。

1番ブロックのデータからハッシュ値を作って、それを1番ブロックにくっつける。

そして、1番ブロックのハッシュ値を、2番ブロックにもくっつける。ハッシュ値をブロックのつなぎ目にしちゃう。

こうすると、データの改ざんがあったとき「つなぎ目のあっちとこっちで、ハッシュ値が違うじゃん!」ってわかるのだ。

lego_block_chain027.jpg
さらに2番ブロック以降は、「つないだハッシュ値+2番ブロックのデータ」でまたハッシュ値を作って、3番ブロックにつなげちゃう。以下、「つないだハッシュ値+3番ブロックのデータ」でまたハッシュ値を作って……の繰り返し(写真はチェーンをつなぐのをサボりました)
lego_block_chain028.jpg
「はは~ん!そんなことになってやがったのか~!」
lego_block_chain029.jpg
「いや、しかしですね……これではまだダメなんですよ……」

おつかれさまです。しかし本番はここからなのです……。

ハッシュ値の計算をめっちゃ難しくしないといけない

lego_block_chain030.jpg
あと一息だ。山場を迎えてもう一度頭の中を整理する。
lego_block_chain031.jpg
気持ちを盛り上げるために人を乗せた。

さっきのハッシュ値を出すマシーン(ハッシュ関数)、実際は一瞬でハッシュ値を計算してくれる。あんなにデタラメな文字列がピャッと出てくる。

ってことは、全部のブロックのハッシュ値を計算しなおして、再びブロック同士をつなぎ直しても、全然時間がかからない。

1個の改ざんのために全部変えちゃう、悪いやつならそれくらいのことをする。

lego_block_chain009.jpg
悪いやつ(再登場)

じゃぁどうするのか。ハッシュ値がすぐ計算できるのがよくない。ならば、ハッシュ値の計算を面倒くさくしよう、と考えたのだ。ブロックチェーンを考えた人は。

lego_block_chain032.jpg
例えば「ハッシュ値の最初の部分は絶対白(ゼロ)になるやつじゃなきゃダメ!」ってルールにする。

ブロックのつなぎ目に使うハッシュ値に、一定の条件をつけるのだ。例えば「先頭から0が○桁連続するものとする」と決めちゃう。

20桁と決めたなら、こういうハッシュ値以外あたしゃ認めないよ、となる。

000000000000000000009dc661538ae0e541ce66494516f5c9cfd9cd3308494d

いやいや、さっきハッシュ値は「文字の並びがデタラメで予測不能」って言ったやん。こんなん狙って作れるわけないじゃん。

そうなのだ。こんなハッシュ値は狙って作れない。だから、データを付け足して何回も何回も試すしかない。

lego_block_chain033.jpg
さっきの1番ブロックのデータに、オレンジのブロックを付け足してハッシュ値を計算してみるけど……違うわー。
lego_block_chain034.jpg
じゃぁ茶色のブロックを付け足して計算したら……やっぱり違うわー。
lego_block_chain035.jpg
いろいろ試した末にオレンジと茶色を付け足したら……で、出た~~~~!
lego_block_chain036.jpg
「出ましたよ!」

このとき、オレンジと茶色のブロックみたいに付け足すデータを「ナンス(nonce)値」と呼ぶ(Number used once:一回しか使わない、の略)。

で、試行錯誤の末に条件を満たしたハッシュ値が出たら「ちゃんとこれで計算すると出たから!」と証明するために、ナンス値とハッシュ値をブロックに追加する。

lego_block_chain037.jpg
ナンス値とハッシュ値をブロックに追加。ハッシュ値がブロックのつなぎ目になるのは、さっき言ったとおり。
lego_block_chain038.jpg
「どちゃくそ面倒くさいっすね」

めでたく面倒くさくなったので、データの改ざんが難しくなった。よかったよかった。

さてナンス値の試行錯誤は、何万回何十万回何千万回と繰り返すため、計算はめっちゃ大変。コンピューターの力がすんごい必要になる。

そんな大変なこと、誰がやってくれるの? 管理者とかリーダーとかいないんでしょ?

lego_block_chain039.jpg
「誰がやってくれると思う~?」

ここからはビットコインの場合の話なんですけど、ビットコインは最初にナンス値を計算できた人にご褒美(ビットコイン)をあげるようになっている。

そんなこと言われたら黙っちゃいられない。世界中の人が一番乗りを目指して、CPUをぶんぶん回しながらナンス値を計算することになる。

これが「マイニング(採掘)」と呼ばれる行為だ。

lego_block_chain040.jpg
「なんか聞いたことある!」

マイニング、言葉だけでも聞いたことある人が多いと思う。実はこういうことなんですって。

lego_block_chain041.jpg
ご褒美がもらえるから、世界中の人が寄ってたかってマイニング(ナンス値を計算)する。悪人1人では太刀打ちできない。

ご褒美ほしさにみんな頑張ることで、結果としてデータの改ざんを防げるようになる。悪者もやる気を無くす。うまい仕組みだなぁと思う。

lego_block_chain007.jpg
で、再びこれ。みんなが同じデータを持っているので、誰がトラブっても大丈夫。改ざんの心配もない。なのに管理者はいない。これがブロックチェーンのすごいところ。

はーここまで長かった。以上がブロックチェーンのざっくりとした仕組みである(間違っていたら優しく教えてください)

ちなみにこの「みんなが力業でハッシュ値を探す」というやり方を「Proof of Work」という。でもこれって、すんごいCPUパワーを使うので、電気代も馬鹿にならない。もっと環境にいいやり方はないの?ということで、最近では「Proof of Stake」「Proof of Consensus」と呼ばれる別のやり方もある。あと全体公開する「パブリックブロックチェーン」に対して閉じた環境で行う「プライベートブロックチェーン」ってのもあって……。

lego_block_chain042.jpg
「その辺まで行くとしんどいので今日はここまでです……」

おわかりいただけただろうか……

ちゃんと説明できたか不安だけど、要するに「悪いやつにデータをいじられない仕組みの、すんごいやつってこと~?」と思ってもらえたらいい。

あと1対1でなにか説明している様子を写真で撮ると、何か騙している感が半端ないこともわかりました。

lego_block_chain043.jpg
こういう人、ルノアールとかでよく見かける
 

参考文献:
杉井靖典「いちばんやさしいブロックチェーンの教本」
大石哲之 「ビットコインはどのようにして動いているのか?」 

▽デイリーポータルZトップへ

デイリーポータルZを

 

▲デイリーポータルZトップへ バックナンバーいちらんへ
↓↓↓ここからまたトップページです↓↓↓