IT社員3人組によるリレーブログ

某IT企業に勤める同期3人が、日常で思ったことを記録していきます (twitter: @go_mount_blog)

【Bitcoin】で使われるブロックチェーン技術とは?②

どうも、Keiです。

夏は暑くてたくさん汗をかくため痩せるのではなく、食欲がなくなるから痩せるんだと聞きました・・・失望しました。

 

さて、今回はブロックチェーン技術について語る第2回目となります。

第1回では、ノード、トランザクション、ブロックなど、ブロックチェーンの基礎について説明をしました。

未読の方は2回目を読む前に是非読んでみて下さい。

 

 

今回は、ビットコインが何故ハッキング等の影響によって改ざんが行われないか、ブロックチェーン技術の高信頼性のメカニズム「Proof of Work (PoW)」について説明します。

また、みなさんもブロックチェーンのキーワードとして「マイニング」という言葉を聞いたことがあるかと思いますが、これについてもわかりやすく説明したいと思います。

 

【復習】ビットコインで買い物をしたとき!

まず、第1回目の内容を例を使って復習しましょう。

下はAさんが宝石を買ったときにブロックが追加される様子を表しています。

(BTCはビットコインの略です)

 

f:id:go-mount:20180718114948p:plain

 

Aさんがビットコインを送金、入金した1つ1つの記録(トランザクション)は、ブロック単位にまとめられて、数珠つなぎに記録されていきます。

ここでは、Aさんは既にビットコインの送金、入金の記録があることを想定しているため、Aさんの元帳にはブロック1、ブロック2の記録があります。

 

ここで、Aさんは新たに宝石の買い物をしました。

この宝石購入のトランザクションは新しいブロック3としてブロック2につながれます。

 

 ここで、このブロック1とブロック2の元帳の情報はAさん以外の全ノードも持っているので、他の誰かがAさんを装ってブロックを追加できちゃうのでは?という心配もあるかもしれませんが、ビットコインを使う際に認証があるため、その危険性は排除されています。

 

ブロックを追加するためのコンセンサス

前回記事の最後に、ブロックを追加するためにはノードの過半数の合意(コンセンサス)が必要ということを説明しました。

 しかし、なぜコンセンサスは必要なのでしょうか?

 

Aさんが宝石を購入して、そのトランザクションが入ったブロックを追加して、他のノードも元帳を更新すれば良いのではないでしょうか?

この答えは、第三者からのAさんの元帳の書き換え、抹消などの改ざん行為へのセキュリティを上げるためです。

 

 ブロックチェーンでは、ブロックを追加するときに元帳全体のセキュリティを上げるために、膨大な計算を行います。(詳細は後程)

この膨大な計算のことをマイニングといいます。そして、膨大な計算を始めに解いたノードはその報酬としてビットコインを得ることができます。

一方で、この膨大な計算は非常に難解なので、始めに解いた人の計算があっているか全ノードで確かめ、過半数以上が承認すれば、晴れてブロックが元帳に追加されるというわけです。

 

これがブロックチェーンのコンセンサス(Proof of Work)の仕組みです。

ここで、この難解な計算って具体的に何をしてて、これをやることでなぜ信頼性があがるのか?気になりますよね。

これを知るために、ブロックの中身を見てみましょう!

 

膨大な計算の実態は!

マイニング(膨大な計算)を理解するために必要なキーワードとして「ハッシュ」と「ナンス」があります。

 

ハッシュとは?

 ここまではわかったけど、ハッシュって?ハッシュは理解できんわ・・って人もいると思います。(わかる人は読み飛ばしちゃって下さい。)

 そんな方のために、ここでは優しくハッシュについて説明します。ぜんぜん難しくないです。

 

f:id:go-mount:20180718165837p:plain

 

 ハッシュというのは、ある入力に対して出力を返す関数のようなものです。

上の図のように、入力の長さは数字の5でもアルファベットが混じった”A2b45x78910”でも何でもよく、これをハッシュ関数に入力すると長さが毎回同じ出力が現れます。

 

 ここで、入力に対して出力は1通りにしかならないため、上の図のように何回5を入力しても同じ出力結果が返ってきます。

これを利用して、2つのテキストファイルの中身が一致してるかどうか、2つのファイルをそれぞれハッシュ関数に入れて、同じ出力が返ってくるかどうか調べることにも利用されます。

 

また、ハッシュの特徴として、出力結果から入力値を求めるのは非常に難しい点があります。(非可逆性といいます)

 

0000から始まるハッシュ値を探しまくる!

 さて、ハッシュが何かわかった所で、このハッシュがどのようにブロックチェーンでは使われていて、どうして信頼性が向上するのかについて説明します。

ではまず、ブロックのフォーマットをもう少し詳しく見てみましょう。

 

f:id:go-mount:20180718172405p:plain

 

 上の図で、ブロックはトランザクションの情報と前のブロックの一部から作成したハッシュ値を保存しています。

ここで言うハッシュ値というのは、前のブロックのトランザクションの一部を「入力」としてハッシュ関数に入れた結果として、「出力」されたものです。

 

ここで、「出力」されたハッシュ値にはルールがあり、"0000"のように初めての文字列は0が4つ続かなければいけないというルールがあります。

 

例えば、

 

0000127de37b942baad06145e54b0c619a1f22327b2ebbcfbec78f5564afe39d

 

こんな感じですね。

 

また、「入力」としてトランザクションの一部の他に「ナンス」と呼ばれる文字列も使われます。

 トランザクションは実際のお金の入出記録なので変更できませんが、この「ナンス」は変更ができます。

 

わかった人もいるかも知れませんが、「マイニング」で膨大な計算量でしていることは何かというと、ハッシュ関数の出力値が"0000"から始まるようにするために、「ナンス」を調整する作業なのです。

 

つまり、「マイニング」とは宝探しみたいなイメージがありますが、"0000"から始めるハッシュ値となる「ナンス」を探すことなのです。

 

f:id:go-mount:20180718190003p:plain

 

この計算はめちゃくちゃ時間がかかります。

ビットコインでは、計算期限として10分を定めています。

 

さて、ここまででブロックを追加するために必要であった膨大な計算の実態がわかったかと思います。

この計算を最初に実行できて、「ナンス」を見つけた人は、それ以外の人から検算をしてもらい、正しければ報酬をもらうことができます。

また、この計算が正しければ晴れてブロックを追加することができるため、ビットコインの決済が完了するということです。

 

 

いかがだったでしょうか?

「ハッシュ」や「ナンス」など、詳細な用語について説明しながら、ブロックチェーンにおけるブロックを追加する手順を説明しました。

第3回は、今回説明したProof of Work以外のコンセンサスの方法やビットコインの危険性(51%攻撃)について説明したいと思います。

go-mount.hatenablog.com