ブロックチェーンってどんなもの?
どうも、ぺろりんです。
本でまったりとブロックチェーンのお勉強をしていこうかなと思います。
まず手初めに、今回は以前読んだ「ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術」
から得た知識を自分なりにまとめてここにメモしておきます。
ブロックチェーンって何?
ブロックチェーンは、「ハッシュ関数を用いた、分散ネットワークにおける合意形成の仕組み」です。
以下ではこの内容をご説明していきます。
ブロックチェーンのはじまり
2008年11月、有名な仮想通貨ビットコインに関する一報の論文が、正体不明の人物(または団体)サトシ・ナカモトにより暗号技術のメーリングリストで発表されました。ここに含まれていたのが、ブロックチェーンの概念でした。
そして、2009年1月には、上記の論文をもとにしたビットコインのソフトウェアが配布され、運用がはじまりました。
ブロックチェーンのはじまりは仮想通貨ビットコインを可能とする技術の一要素でした。しかし理解がすすむにつれ、仮想通貨(もしくは暗号通貨)以外にも「ブロックチェーン」という技術が有用であることがわかり、「ブロックチェーン」そのものが研究されるようになりました。
そもそもの問題意識
分散ネットワークでの合意形成ってどうすればうまくいくだろう?という疑問への一つの回答がブロックチェーンという考え方です。
分散ネットワークでは、ネットワークに参加する全員が同じデータを持っていて同期します。
たとえばAさんからBさんにXというデータを送ると、この情報がネットワークの参加者全員に共有(同期)されます。
でもこれ、同じデータを持っているはずのCさんとDさんで、先ほどのデータ転送の情報が違っていたらどうでしょう?
Cさんの持つ情報:AさんからBさんにXというデータを送りました。
Dさんの持つ情報:AさんからBさんにYというデータを送りました。
これではどちらが正しいかわからなくて困ってしまいます。
こういうことは、ネットワーク内で同期するときに失敗したり、誰かが情報を改ざんすることで起こり得ることです。
このように同期すべき情報の食い違いが起きたとき、どの情報が正しいかを合意するにはどうすれば良いでしょうか?
これに対し、ブロックチェーンという技術ではハッシュ関数というものを用いて解決します。
ハッシュ関数
関数というのは、何かしらの入力を一定のルールに基づいて加工して出力するための、「一定のルール」の部分のことを言います。
ハッシュ関数がどんなルールかというと、以下の条件を満たすようなルールです。
(このような条件を満たせば、具体的なルールは何でも良いです)
(1)入力に対し、ランダムな(ランダムっぽい)値を出力する。
(2)入力aと入力bが少しでも異なると、出力の値は大きく異なるものになる。
(3)入力がどんなものでも、出力は一定の長さのデータ列になる。
(4)入力と出力が1対1対応する。
(入力aの出力cと入力bの出力dがあったとき、どんなa,bに対してもc≠dとなる)
ただし(4)については、現実的には“概ね”1対1となる関数が採用されています。
(入力a,bに対して出力c=dとなる確率が非常に小さいものが使われています)
実用されているハッシュ関数はいくつかありますが、たとえばSHA-1というものでやると、こんな感じになります。
今回は、「perorin」と書いたテキストファイルを入力として、この「テキストファイル」に対してSHA-1という規格のルールで加工した出力(ハッシュ値)を見てみます。
入力データ(テキストファイル)に対して、


「7b64a8408882dc4c5c54de8e8d9d2a86e1347e58」という値が出力として生成されました。

Windowsの標準機能でできますので、ご興味のある方は参考に挙げておいたリンク先あたりを参照しながらお試しあれ。
やることは、
ファイル作成→コマンドプロンプトを開く→certutil -hashfile [ファイルフルパス] [ハッシュアルゴリズム] を実行
というだけです。
(参考)
・ハッシュ関数(Wikipedia)
・原理から学ぶネットワーク・セキュリティ 第4回 ハッシュ関数(日経 xTECH)
・windows標準でMD5などのハッシュ値を出力(Qiita)
ブロックチェーンによる問題の解決
さて、問題にもどると、ブロックチェーンでは「同期すべき情報はどれが正しいか?」という合意形成のために、先ほどご説明したハッシュ関数を使用します。
ブロックチェーンによる合意形成の仕組みを理解するためには、「ブロックチェーン」と「コンセンサス・アルゴリズム」を理解する必要があります。
この書き方だと紛らわしいのですが、一般的に「ブロックチェーン」と言ったときにはその技術に付随する「コンセンサス・アルゴリズム」まで含めて「ブロックチェーン」と呼んでいる気がしますが、次にご説明する(狭義の)「ブロックチェーン」が本来のブロックチェーンという理解で良いはず。
狭義のブロックチェーンのことを「ブロックチェーン」、コンセンサス・アルゴリズムまで含めた広義のブロックチェーンのことを「ブロックチェーン技術」と呼ぶ方が良いのかな…?
(狭義の)ブロックチェーン
ハッシュ関数による出力は、入力が少しでも異なると大きく異なるというものでした。
これを利用すると、データの改ざんが検知できます。
もしAさんからBさんへ送ったデータXが途中で改ざんされた場合、AさんがXから作成したハッシュ値とBさんが受け取ったX'から作成したハッシュ値はまったく違う値となり、XとX'を比較することでBさんは間違ったデータを受け取ったことがわかります。
ブロックチェーンではこのことを利用します。
(1)AさんからBさんにXというデータを送ったあとに、(2)AさんからBさんにYというデータを送ることを考えましょう。
ネットワークの参加者は「(1)のあとに(2)があった」ということを合意して、この情報を同期する必要があります。
「AさんからBさんにXを送りました」という情報が記載されたデータ(たとえばテキストファイル)のハッシュ値を計算し、これを次の「AさんからBさんにYを送りました」という情報が記載されたデータに一緒に記載しておきます。

すると、もし(1)の情報がXからX'に改ざんされていたとすると、(2)の情報と一緒に記載されたハッシュ値は、まったく違う値になっています。
このように、「(1)のあとに(2)があった」=「(2)の前は(1)だった」という事実は、「(2)の情報+(1)のハッシュ値」という組を考えることで、(1)のハッシュ値によって正誤が判断できます。
同じことを続けて、いくつかのデータ転送を記載したデータをひとまとまりとして扱い、各まとまりには1つ前のまとまりのハッシュ値も一緒に記載していきます。
こうすることで、過去のある時点で改ざんがあれば、ハッシュ値の違いによりそれは不正なデータであることが判断できます。

このひとまとまりのことを「ブロック」と呼び、ブロックがハッシュ値によって鎖(チェーン)のように連なることから、このブロックの連なったデータ群のことを(狭義の)「ブロックチェーン」と呼びます。
過去のある時点でブロックの内容を改ざんすると、そのあとに続くブロックに記載された(すでに正しいと合意された)ハッシュ値が、そしてその次のブロックに記載された(すでに正しいと合意された)ハッシュ値が、…とどんどんハッシュ値が変わっていきます。
ですので、もしどこかの時点でブロックの内容を改ざんするとすれば、そのあとのすべてのブロックを改ざんする必要が出てきます。
ブロックの生成が簡単であればこのような改ざんも可能なのですが、そうは問屋がおろさないというのが次の「コンセンサス・アルゴリズム」です。
コンセンサス・アルゴリズム
実用されている(狭義の)ブロックチェーンを使った合意形成の仕組み(コンセンサス・アルゴリズム)はいくつかありますが、今回はBitcoinで採用されているPoW(Proof of Work:計算量による証明)がどんなものか見ていきましょう。
生成されたブロックが正しいかどうか、ネットワーク参加者が計算により判断するというのがPoWというコンセンサス・アルゴリズムです。
もう少し具体的には次のような流れで、あるブロックの次のブロック生成が承認されます。
(1)ネットワーク内のマイナー(採掘者)と呼ばれる参加者が、ブロックに記載されたハッシュ値から、次ブロック生成のための条件を満たすパラメータ(「ナンス」という)を計算で見つけ出す。
(2)マイナーは見つけたナンスを含む新しいブロックを、ネットワークの参加者全員に知らせる。
(3)新しいブロックを受け取った各ネットワーク参加者は、自分の持つブロックに記載された情報から受け取った新ブロックに含まれるナンスが正当か判断する。
(4)各ネットワーク参加者は、(3)のナンスが正当であれば自分のローカルディスクにあるブロックチェーンに、受け取った新ブロックを追加する。
このように、条件を満たす計算問題を解き、その結果の正誤によってネットワーク参加者が合意形成します。
ブロック生成の条件は、計算に一定時間(たとえば10分間)かかるように動的に調整されています。
このことにより、「過去のある時点でブロック内容を改ざんするために、それ以降のブロックすべてを改ざんする」というのは膨大な時間がかかり現実的にはほぼ不可能となります。
この計算(マイニング)には膨大なCPUパワーが必要となるので、ブロックを生成すると報酬(仮想通貨ならその通貨のコイン)をマイナーに与える仕組みになっています。
ただ働きだとこんな計算は誰もしませんが、この報酬制度によりマイナーがちゃんと存在するように考えられています。
(参考)
・Bitcoinの仕組み(Bitcoinの仕組み)
・ブロックチェーンの仕組み 〜初心者のためのわかりやすい解説〜(Blockchain Biz)
・プルーフオブワーク(PoW)の仕組みを知らずにビットコインは語れない(ZOOM)
・分散ネットワークでの合意を可能にしたコンセンサスアルゴリズム「プルーフ・オブ・ワーク」(Blockchain Biz)
まとめ
ブロックチェーンが何ものかというのをまとめると、分散ネットワークにおける合意形成の仕組みのひとつで、
(1)ひとまとまりのデータ集合である「ブロック」がハッシュ値によりつながったものを(狭義の)「ブロックチェーン」と呼ぶ。
(2)ハッシュ値のチェーンでつながる次ブロックは、PoWなどの「コンセンサス・アルゴリズム」により合意されたものが採用される。
こんな感じですね。
本でまったりとブロックチェーンのお勉強をしていこうかなと思います。
まず手初めに、今回は以前読んだ「ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術」
ブロックチェーンって何?
ブロックチェーンは、「ハッシュ関数を用いた、分散ネットワークにおける合意形成の仕組み」です。
以下ではこの内容をご説明していきます。
ブロックチェーンのはじまり
2008年11月、有名な仮想通貨ビットコインに関する一報の論文が、正体不明の人物(または団体)サトシ・ナカモトにより暗号技術のメーリングリストで発表されました。ここに含まれていたのが、ブロックチェーンの概念でした。
そして、2009年1月には、上記の論文をもとにしたビットコインのソフトウェアが配布され、運用がはじまりました。
ブロックチェーンのはじまりは仮想通貨ビットコインを可能とする技術の一要素でした。しかし理解がすすむにつれ、仮想通貨(もしくは暗号通貨)以外にも「ブロックチェーン」という技術が有用であることがわかり、「ブロックチェーン」そのものが研究されるようになりました。
そもそもの問題意識
分散ネットワークでの合意形成ってどうすればうまくいくだろう?という疑問への一つの回答がブロックチェーンという考え方です。
分散ネットワークでは、ネットワークに参加する全員が同じデータを持っていて同期します。
たとえばAさんからBさんにXというデータを送ると、この情報がネットワークの参加者全員に共有(同期)されます。
でもこれ、同じデータを持っているはずのCさんとDさんで、先ほどのデータ転送の情報が違っていたらどうでしょう?
Cさんの持つ情報:AさんからBさんにXというデータを送りました。
Dさんの持つ情報:AさんからBさんにYというデータを送りました。
これではどちらが正しいかわからなくて困ってしまいます。
こういうことは、ネットワーク内で同期するときに失敗したり、誰かが情報を改ざんすることで起こり得ることです。
このように同期すべき情報の食い違いが起きたとき、どの情報が正しいかを合意するにはどうすれば良いでしょうか?
これに対し、ブロックチェーンという技術ではハッシュ関数というものを用いて解決します。
ハッシュ関数
関数というのは、何かしらの入力を一定のルールに基づいて加工して出力するための、「一定のルール」の部分のことを言います。
ハッシュ関数がどんなルールかというと、以下の条件を満たすようなルールです。
(このような条件を満たせば、具体的なルールは何でも良いです)
(1)入力に対し、ランダムな(ランダムっぽい)値を出力する。
(2)入力aと入力bが少しでも異なると、出力の値は大きく異なるものになる。
(3)入力がどんなものでも、出力は一定の長さのデータ列になる。
(4)入力と出力が1対1対応する。
(入力aの出力cと入力bの出力dがあったとき、どんなa,bに対してもc≠dとなる)
ただし(4)については、現実的には“概ね”1対1となる関数が採用されています。
(入力a,bに対して出力c=dとなる確率が非常に小さいものが使われています)
実用されているハッシュ関数はいくつかありますが、たとえばSHA-1というものでやると、こんな感じになります。
今回は、「perorin」と書いたテキストファイルを入力として、この「テキストファイル」に対してSHA-1という規格のルールで加工した出力(ハッシュ値)を見てみます。
入力データ(テキストファイル)に対して、


「7b64a8408882dc4c5c54de8e8d9d2a86e1347e58」という値が出力として生成されました。

Windowsの標準機能でできますので、ご興味のある方は参考に挙げておいたリンク先あたりを参照しながらお試しあれ。
やることは、
ファイル作成→コマンドプロンプトを開く→certutil -hashfile [ファイルフルパス] [ハッシュアルゴリズム] を実行
というだけです。
(参考)
・ハッシュ関数(Wikipedia)
・原理から学ぶネットワーク・セキュリティ 第4回 ハッシュ関数(日経 xTECH)
・windows標準でMD5などのハッシュ値を出力(Qiita)
ブロックチェーンによる問題の解決
さて、問題にもどると、ブロックチェーンでは「同期すべき情報はどれが正しいか?」という合意形成のために、先ほどご説明したハッシュ関数を使用します。
ブロックチェーンによる合意形成の仕組みを理解するためには、「ブロックチェーン」と「コンセンサス・アルゴリズム」を理解する必要があります。
この書き方だと紛らわしいのですが、一般的に「ブロックチェーン」と言ったときにはその技術に付随する「コンセンサス・アルゴリズム」まで含めて「ブロックチェーン」と呼んでいる気がしますが、次にご説明する(狭義の)「ブロックチェーン」が本来のブロックチェーンという理解で良いはず。
狭義のブロックチェーンのことを「ブロックチェーン」、コンセンサス・アルゴリズムまで含めた広義のブロックチェーンのことを「ブロックチェーン技術」と呼ぶ方が良いのかな…?
(狭義の)ブロックチェーン
ハッシュ関数による出力は、入力が少しでも異なると大きく異なるというものでした。
これを利用すると、データの改ざんが検知できます。
もしAさんからBさんへ送ったデータXが途中で改ざんされた場合、AさんがXから作成したハッシュ値とBさんが受け取ったX'から作成したハッシュ値はまったく違う値となり、XとX'を比較することでBさんは間違ったデータを受け取ったことがわかります。
ブロックチェーンではこのことを利用します。
(1)AさんからBさんにXというデータを送ったあとに、(2)AさんからBさんにYというデータを送ることを考えましょう。
ネットワークの参加者は「(1)のあとに(2)があった」ということを合意して、この情報を同期する必要があります。
「AさんからBさんにXを送りました」という情報が記載されたデータ(たとえばテキストファイル)のハッシュ値を計算し、これを次の「AさんからBさんにYを送りました」という情報が記載されたデータに一緒に記載しておきます。

すると、もし(1)の情報がXからX'に改ざんされていたとすると、(2)の情報と一緒に記載されたハッシュ値は、まったく違う値になっています。
このように、「(1)のあとに(2)があった」=「(2)の前は(1)だった」という事実は、「(2)の情報+(1)のハッシュ値」という組を考えることで、(1)のハッシュ値によって正誤が判断できます。
同じことを続けて、いくつかのデータ転送を記載したデータをひとまとまりとして扱い、各まとまりには1つ前のまとまりのハッシュ値も一緒に記載していきます。
こうすることで、過去のある時点で改ざんがあれば、ハッシュ値の違いによりそれは不正なデータであることが判断できます。

このひとまとまりのことを「ブロック」と呼び、ブロックがハッシュ値によって鎖(チェーン)のように連なることから、このブロックの連なったデータ群のことを(狭義の)「ブロックチェーン」と呼びます。
過去のある時点でブロックの内容を改ざんすると、そのあとに続くブロックに記載された(すでに正しいと合意された)ハッシュ値が、そしてその次のブロックに記載された(すでに正しいと合意された)ハッシュ値が、…とどんどんハッシュ値が変わっていきます。
ですので、もしどこかの時点でブロックの内容を改ざんするとすれば、そのあとのすべてのブロックを改ざんする必要が出てきます。
ブロックの生成が簡単であればこのような改ざんも可能なのですが、そうは問屋がおろさないというのが次の「コンセンサス・アルゴリズム」です。
コンセンサス・アルゴリズム
実用されている(狭義の)ブロックチェーンを使った合意形成の仕組み(コンセンサス・アルゴリズム)はいくつかありますが、今回はBitcoinで採用されているPoW(Proof of Work:計算量による証明)がどんなものか見ていきましょう。
生成されたブロックが正しいかどうか、ネットワーク参加者が計算により判断するというのがPoWというコンセンサス・アルゴリズムです。
もう少し具体的には次のような流れで、あるブロックの次のブロック生成が承認されます。
(1)ネットワーク内のマイナー(採掘者)と呼ばれる参加者が、ブロックに記載されたハッシュ値から、次ブロック生成のための条件を満たすパラメータ(「ナンス」という)を計算で見つけ出す。
(2)マイナーは見つけたナンスを含む新しいブロックを、ネットワークの参加者全員に知らせる。
(3)新しいブロックを受け取った各ネットワーク参加者は、自分の持つブロックに記載された情報から受け取った新ブロックに含まれるナンスが正当か判断する。
(4)各ネットワーク参加者は、(3)のナンスが正当であれば自分のローカルディスクにあるブロックチェーンに、受け取った新ブロックを追加する。
このように、条件を満たす計算問題を解き、その結果の正誤によってネットワーク参加者が合意形成します。
ブロック生成の条件は、計算に一定時間(たとえば10分間)かかるように動的に調整されています。
このことにより、「過去のある時点でブロック内容を改ざんするために、それ以降のブロックすべてを改ざんする」というのは膨大な時間がかかり現実的にはほぼ不可能となります。
この計算(マイニング)には膨大なCPUパワーが必要となるので、ブロックを生成すると報酬(仮想通貨ならその通貨のコイン)をマイナーに与える仕組みになっています。
ただ働きだとこんな計算は誰もしませんが、この報酬制度によりマイナーがちゃんと存在するように考えられています。
(参考)
・Bitcoinの仕組み(Bitcoinの仕組み)
・ブロックチェーンの仕組み 〜初心者のためのわかりやすい解説〜(Blockchain Biz)
・プルーフオブワーク(PoW)の仕組みを知らずにビットコインは語れない(ZOOM)
・分散ネットワークでの合意を可能にしたコンセンサスアルゴリズム「プルーフ・オブ・ワーク」(Blockchain Biz)
まとめ
ブロックチェーンが何ものかというのをまとめると、分散ネットワークにおける合意形成の仕組みのひとつで、
(1)ひとまとまりのデータ集合である「ブロック」がハッシュ値によりつながったものを(狭義の)「ブロックチェーン」と呼ぶ。
(2)ハッシュ値のチェーンでつながる次ブロックは、PoWなどの「コンセンサス・アルゴリズム」により合意されたものが採用される。
こんな感じですね。