バナナでもわかる話

開設当初は計量経済学・統計学が専門の大学院生でした。今はデータを扱うお仕事をしています。統計学・経済学・投資理論・マーケティング等々に関する勉強・解説ブログ。ときどき趣味も。極力数式は使わずイメージで説明出来るよう心掛けていますが、時々暴走します。

ビットコインとプルーフオブワーク

今まで何度かビットコインとブロックチェーンの仕組みについて説明してきました。
bananarian.hatenablog.com

しかし、今までの話で、説明の都合上一つ省略していたことがあって、

何かの間違いでチェーンが同時に二つ承認されてしまったらどうするの?という問題です。

今回はその話をします。



プルーフオブワーク

今までの復習をしておくと、
要はビットコインの仕組みは、一番早く条件に合うハッシュ値を見つけたマイナー(マイニングする人)のブロックが他のマイナーの承認のもと認められ、ブロックチェーンに組み込まれるというものでした。


しかし、もし通信に問題が発生し、二種類のブロックチェーンが並立したら何が起こるでしょうか。
条件を満たすブロックチェーンが複数現れたら??

この場合は、最もチェーンの長いブロックチェーンが採用されるという仕組みをもって解決しています。



つまりこういう状況です。

f:id:bananarian:20181001012940p:plain


もう少し正確に言うと、最も多くの参加者から承認をもらったチェーンが採用されるという仕組みです。
チェーンが長いほうが必然的に承認数は増えるので、このような状況になります。


この解決法をもってビットコインは機能しており、これをPoW(プルーフオブワーク)と呼んだりします。




プルーフオブワークの問題点

このプルーフオブワーク、良い仕組みのように思えますが、問題点もあります。

51%問題

より多くの参加者から承認をもらうということはこれはつまり多数決です。多数決ということは、一人、もしくは一団体が参加者の51%を占めてしまえば自由に操作できてしまうということになります。これは割と深刻な問題なので、改善余地ありです。

分岐の不確実性

このPoWでは、長いほうのチェーンが採用されるので、短いほうは切り捨てられます。もし、短いほうのチェーンには記録されていて、長いほうのチェーンには記録されていない契約があったとしたら、その情報が喪失することになります。これも結構まずいですね。ただ起こる確率は低いみたいです。



このようなプルーフオブワークの問題点を解決する目的で、様々なブロックチェーンの正当性を保つアルゴリズムが開発されていて、これらを一まとめにコンセンサスアルゴリズムと呼んだりします。

最近だと、プルーフオブステイクなんかも有名ですが、この辺のコンセンサスアルゴリズムは今後の発展に期待という印象です。

ビットコインとビザンチン将軍問題

前回はビットコインの仕組みに関する話をしました。

bananarian.hatenablog.com

 

 

ビットコインはP2Pという仕組みで動いていますが、単なるP2Pではなく、そこにブロックチェーンの仕組みを導入することで、既存のP2Pの問題点を解消したという点で、優れたシステムであると言われており、だからこそ他のビジネスに応用できないかという議論が現在盛んにおこなわれています。

 

この、既存のP2Pの問題点の一つにビザンチン将軍問題というものがあるので、教養のを付けるという意味合もこめて説明しておきます。

 

 

 

 

P2Pネットワーク復習

詳しくは前記事を見ていただきたいのですが、一応ここでもざっと復習。

ITについて何も知らなくてもわかる「P2Pとは何か」 - バナナでもわかる話

 

要は、何か一つの権限の大きいサーバーが重要な情報を管理するのではなく、各ユーザーがバラバラに重要な情報を管理する分散型方式

 

それがP2Pでした。

 

ビザンチン問題とは何か

ここでP2Pのシステムの状況を考えてみてください(ビットコインの仕組みではなく、P2Pです。)

 

P2Pは皆で情報を管理しているので、中の情報をいじることの出来る参加者が大量にいることになります。

 

ここで、もし、その参加者の中に、悪意を持ったユーザーがいるとしたらどうなるでしょう。

 

意図的におかしな情報を流したり、情報を改竄したりすることも出来てしまうわけです。

 

これをビザンチン将軍問題と言うわけです。何でビザンチン将軍とかいうよくわからん人が登場してくるのかについてを次に説明します。

 

ビザンチン将軍問題

 

大昔のヨーロッパ、そこにあったビザンツ帝国の話です。

 

ある日、ビザンツ帝国は、ある都市Aを攻め落とそうと考え、ビザンツ帝国傘下の9人の将軍に依頼しました。

 

その際、綿密な事前調査の末、次のことが分かりました。

 

都市Aは、将軍9人が協力した場合は攻め落とせるが、一人でも欠けた場合は手痛い反撃を受けるだろう。

 

そしてその事前調査を受けた9人の将軍は、自分の領土と兵士の状況も考えた上で、各人が「攻めるべき」「やめておくべき」かの決断を下しますが、もし9人で攻める場合は、都市Aが力をつける前に早急に攻めねばなりまません。

 

しかし、現代ではスマホやら電話やらインターネットやらで簡単にやり取りが出来ますが、この時代はそんなものはありませんし、移動手段も限られているため、9人全員で話し合いを開くなんてことも一苦労です。

 

 

そこで、次の方法を取りました。

 

 

まず、各将軍が「攻めるべき」か「やめておくべき」かを決める

f:id:bananarian:20180927190631p:plain

 

そして、伝達者を使って他の将軍たちに自分の意思を伝えます

f:id:bananarian:20180927192522p:plain

何かこの構造P2Pに似てませんか?

 

 

そして、各将軍は次のように意思決定するよう事前に取り決めをしておきます。

 

「多数決の結果、多数派となった意見に全員で従う」

 

つまり、攻めるべきが5人いたら、9人全員で攻める

やめるべきが5人とか6人とかいたら9人全員で攻めるのをやめる

 

 

しかし、ここで注意しなければならないのは、各将軍は将軍同士で直接話し合ったわけではなく、「伝達者を介して聞いている」という点です。

 

 

つまり、例えば真ん中にいる将軍5が次のような伝達を行ったとします。

f:id:bananarian:20180927193854p:plain

 

これは、真ん中の将軍5が将軍1~4には「攻めるべき」と伝え、将軍6~9には「やめるべき」と伝えている例です。

 

この状態だと、

左側の将軍1~4は「攻めるべき」が5票、「やめるべき」が4票で「9人全員で攻める」という意思決定に決まったと勘違いします

一方

右側の将軍6~9は「やめるべき」が5票、「攻めるべき」が4票で「9人全員で攻めない」という意思決定に決まったと勘違いします

 

 

この結果、将軍1~4のみが進軍し、ビザンツ帝国は敗北します。

 

悪意のある参加者(将軍5)によって、契約がゆがめられるという結果になりました。

 

 

これをビザンチン将軍問題と呼んだわけですね。

 

 

ビザンチン将軍問題を回避したブロックチェーン

ビットコインの仕組みでこの状況が発生しないことは皆さんもう大丈夫ですね。

ビットコインの仕組みでは、最も早く条件が満たされたブロックが全員に共有されるため、取引契約におかしな結果が介在したり、一部のユーザーにだけ改竄された異なる情報が伝わるというような余地がありません。

 

こういう点で既存のP2Pよりも優れた仕組みであるというわけです。

 

この話、ゲーム理論でより深く説明したり理解することが出来そうですね。

今度気が向いたときにゲーム理論と絡めてもう一度ビザンチン将軍問題の話を記事にしてみようかなあ。

 

 

 

 

ビットコインは何故改竄不可能なのか

前回はビットコインとブロックチェーンの仕組みについて説明しました。

bananarian.hatenablog.com



今回は、前回の話を踏まえたうえで、じゃあ何故

「ビットコイン取引の改竄は不可能だ」

と言われているのかという話をします。



取引を改竄する

前回のブロックチェーンの仕組みの説明では次のような図を使っていました。
f:id:bananarian:20180923233821p:plain


例えばこの時、改竄するとは次のような事を言います。
f:id:bananarian:20180926005122p:plain
過去の取引を別の取引に改竄しています。




しかし、前回の記事を思い出してもらうとわかりますが、ハッシュ値には満たさなければいけない条件がありました!!
前回の画像を参照するならこれですね。
f:id:bananarian:20180923231409p:plain


そういうわけなので全てのブロックのハッシュ値は、条件を満たしたものであるわけですが、

改竄すると、図から明らかなように、出力されるハッシュ値が変わるはずです。
f:id:bananarian:20180926010240p:plain


出力されるハッシュ値が変わるということは、条件を満たさなくなってしまいます。そのため、条件を満たすようになるまで再度ナンスを設定しないと正当なブロックとして承認されなくなります。

つまり、改竄したブロックから最新のブロックまで順番に、またナンスを探し直す必要があるわけです!!


よって、ブロックを改竄するには過去のものから遡る必要が生じて、メチャメチャ時間がかかる上に、その間にもビットコイン取引はどんどん進行します。それにも追いつかなければいけなくなります。


つまり、こういった状況もあって、改竄は理論上は可能だけど、事実上無理!!となるわけです。

IT初心者でもわかるビットコイン取引とブロックチェーンの仕組み

ビットコインの仕組みを説明しようのコーナーやってきます。

ちなみに前記事はこちらになります。適宜参照してください。
ビットコインの仕組みを徹底解説するカテゴリー始めます - バナナでもわかる話

【初心者向け】ビットコインシステムとハッシュ値 - バナナでもわかる話

ITについて何も知らなくてもわかる「P2Pとは何か」 - バナナでもわかる話


それでは満を持してブロックチェーンの仕組みの概要を説明しようと思います。




登場人物紹介

今回は、登場する人が多いので適当に名前を付けておきます。

まず、仮想的にビットコインを取引する「太郎君」「次郎君」「三郎君」がいるとします。

それとは別に、ビットコインの取引を記録したり管理する人として「管さん」「理さん」「録さん」がいるとします。つまり今こういう状態です。


f:id:bananarian:20180923223620p:plain



実際にビットコインについて調べたことのある人なら、こういった方がわかりやすいかもしれません。

ここで言う管理者とは「マイニングをする人」を指します。


更にネットワークの全ての参加者はP2Pネットワークで情報を交換します。
ITについて何も知らなくてもわかる「P2Pとは何か」 - バナナでもわかる話



ビットコイン取引例

では、実際に取引を行った場合にネットワークではどういうやりとりが行われているか確認しましょう。


「太郎君」が「次郎君」に対して1ビットコインを送金するとします。
f:id:bananarian:20180923224452p:plain


すると、次のような取引1が発生しますね。
取引1:[太郎君から次郎君へ1ビットコインの送金が行われた]


この取引1という情報は、P2Pによって全ての管理者に送られます。
f:id:bananarian:20180923225342p:plain
ここで、取引である以上、この取引1は改竄されないよう保存しなければいけないわけです。



まず、各管理者は、ハッシュ関数過去の取引情報と、今受け取った取引1乱数を利用して、事前に決められた条件に合うようなハッシュ値を生成します。最初に条件に合うものを見つけた人のハッシュ値が、全員の確認作業の後に、記録用として採用されます。
【初心者向け】ビットコインシステムとハッシュ値 - バナナでもわかる話

f:id:bananarian:20180923231409p:plain
f:id:bananarian:20180923231959p:plain

これによって出来た取引の保存情報を、ブロックと呼びます。



以上の経緯で、取引1は全ての管理者のなかで、同じ形式で保存されることとなります。


スポンサーリンク

ブロックチェーン

はい。この仕組みのどこにブロックチェーンの仕組みが機能しているのか説明していきますね。


まず、今回の例で言うとブロックとブロックチェーンは以下のような構造になっています。
f:id:bananarian:20180923233821p:plain



過去に作ったブロックがどんどん引き継がれて、鎖のような形になるため、この仕組みをブロックチェーンと呼ぶわけですね。
ちなみに図にあるナンスとは、条件を満たすよう管理者さん達が頑張って生成してたやつです。

このナンスを生成して、条件を満たすナッシュ値を探す作業を「マイニング」と呼ぶわけですね。




以上これが、ビットコイン取引とその背後にあるブロックチェーンの大雑把な仕組みです。

そんなに難しくないんじゃないかなと思います。



でも、よくブロックチェーンは不正改竄が出来ないとか、安全な仕組みだーなんて言われる理由がこの説明ではわかりませんね。
(勘の良いひとならわかるかもしれません。)



次回はよく言われるところのブロックチェーンの利点が、どういう理由から語られているのかといったところを説明しようと思います。そういえば三郎君活躍しませんでしたね。

ITについて何も知らなくてもわかる「P2Pとは何か」

ビットコインの仕組みについて詳しく説明するということで、記事を書いておりますが
bananarian.hatenablog.com


今回はP2P(ピアツーピア)です。


ビットコインの情報のやり取りは基本的にはこのP2Pによって行われているんですね。

そういうわけで今回はP2Pについて説明します。


P2Pのイメージ

今回の記事はIT初心者を対象にしているので、イメージで説明しますね。


部活や会社、何らかの団体みたいなものを想像してください。


例えば、強豪校の部活だったりすると、監督の権限がメチャメチャ強くて、監督が全てを決定する、逆に監督がいなくなったら全く回らなくなるような部活もあったりします。

会社であれば、社長が言うことが絶対のワンマン経営の会社なんかもあったりします。
f:id:bananarian:20180922121309p:plain



一方、大学のサークルであったり、若者の多いベンチャー企業などだと、大きな上下関係や、権限の偏りなどが少なく、皆がそれぞれ同等の役割を担う団体もあったりします。
f:id:bananarian:20180922121745p:plain



P2Pは後者のイメージです。

要はP2Pじゃない管理方法は、

「サーバー」という強い権限のあるボスがいて、そのボスが仕組みの重要な部分を管理します。これをP2P型と区別してクライアント・サーバー型と呼びます。先ほどの図に名前を付けるならこんな感じ。
f:id:bananarian:20180922123554p:plain

こんな感じの構造なので、サーバーが潰れたらシステムがダウンします。スマホゲームのサバ落ちとかはこのサーバーが潰れている状態です。





一方でP2Pの方は強い権限を持つものがいません。こんな感じのイメージですね。
f:id:bananarian:20180922125045p:plain



つまり、P2Pは、ピア同士が必要な情報を分散して共有しあっているという感じです。
そのため、一つのピアが潰れたとしても、システム全体としては大きな問題が無く機能します。


P2Pの種類


P2Pにも種類があって、先ほどのようなP2PはピュアP2Pと呼ばれます。
f:id:bananarian:20180922125045p:plain



一方で次のようなものをハイブリッドP2Pと呼びます。
f:id:bananarian:20180922130427p:plain

強い権限があるわけではありませんが、各ピアについて詳しいサーバーを置いたP2Pです。
このピアはオンラインかどうか、あの情報はどのピアが持っているのかといった情報を管理することで、システムを効率的にしています。




P2Pのメリットデメリット

メリット
・まず、鯖落ちのリスクが格段に下がります。
・更に、ユーザー同士の繋がりを拡張するのが容易です。要はピアを増やせばよいだけなので、そういう点でシステムを拡張することが容易になります。


デメリット
・一方で、情報についての秘匿性がなくなります。
・また、システムの中にある情報を完全に削除したり、追跡したりすることが難しくなります。



こんな感じのメリットがあるため、P2Pは情報共有や同時作業に適していると言えます。スカイプなんかもP2Pです。

RとPythonでハッシュ値を出力する方法

少し前にハッシュ値について記事を書きました。
bananarian.hatenablog.com




実はRとPythonを使ってハッシュ値を出力することも出来ます。

今回も「banana」を入力してハッシュ値を出してみます。


Rの場合

opensslパッケージというパッケージで簡単に出力することが出来ます。

install.packages("openssl")


opensslパッケージには様々なハッシュ関数が用意されており、sha1やmd5など有名なものもいくつかあります。

>library(openssl)
> sha1("banana")
[1] "250e77f12a5ab6972a0895d290c4792f0a326ea8"
> sha224("banana")
[1] "8f5901a4a0a2d72ff9882e63c08d4c32b3eaa3683b6e5bfc0ca03e86"
> sha256("banana")
[1] "b493d48364afe44d11c0165cf470a4164d1e2609911ef998be868d46ade3de4e"
> sha384("banana")
[1] "92f7818b31b9936b90a5178e811979ef3ba68a14b57e8362424d54446f31ad2a249e4306628ad33ccb28b3e9dc5e043e"
> sha512("banana")
[1] "f8e3183d38e6c51889582cb260ab825252f395b4ac8fb0e6b13e9a71f7c10a80d5301e4a949f2783cb0c20205f1d850f87045f4420ad2271c8fd5f0cd8944be3"
> sha2("banana", size = 256)
[1] "b493d48364afe44d11c0165cf470a4164d1e2609911ef998be868d46ade3de4e"
> md4("banana")
[1] "f1fbbfb6277cbf01e27d61238a72491a"
> md5("banana")
[1] "72b302bf297a228a75730123efef7c41"
> blake2b("banana")
[1] "d4afa3130126ddcc01bb49e1388b0fbc94c185d1a07a67046a5b66923c38e178f490bc9b91a7e41c2d670be3c8435e5914b5cb5ee0d0ff52d9a783f601b18794"
> blake2s("banana")
[1] "228c3a8526197e63044a1654a9407707d7e250a7ccac489d3cad024ce6cd9ad7"
> ripemd160("banana")
[1] "e8f92e55b15aec83f458cfee39dd4ffeb7f4b8ed"

Pythonの場合

デフォルトでhashlibというメソッドがあるので、これを利用します。

hasulibメソッドにある各ハッシュ関数に対応するモジュールを次のような形で使ってやれば、ハッシュ値が出力されます。

>>> import hashlib
>>> PW="banana"
>>> print("MD5のハッシュ値:", hashlib.md5(PW.encode("utf-8")).hexdigest() )
MD5のハッシュ値: 72b302bf297a228a75730123efef7c41
>>> print("sha384のハッシュ値:", hashlib.sha384(PW.encode("utf-8")).hexdigest() )
sha384のハッシュ値: 92f7818b31b9936b90a5178e811979ef3ba68a14b57e8362424d54446f31ad2a249e4306628ad33ccb28b3e9dc5e043e
>>> print("sha1のハッシュ値:", hashlib.sha1(PW.encode("utf-8")).hexdigest() )
sha1のハッシュ値: 250e77f12a5ab6972a0895d290c4792f0a326ea8
>>> print("sha224のハッシュ値:", hashlib.sha224(PW.encode("utf-8")).hexdigest() )
sha224のハッシュ値: 8f5901a4a0a2d72ff9882e63c08d4c32b3eaa3683b6e5bfc0ca03e86
>>> print("sha256のハッシュ値:", hashlib.sha256(PW.encode("utf-8")).hexdigest() )
sha256のハッシュ値: b493d48364afe44d11c0165cf470a4164d1e2609911ef998be868d46ade3de4e
>>> print("sha512のハッシュ値:", hashlib.sha512(PW.encode("utf-8")).hexdigest() )

こんな感じでRやPython等でも簡単に出力することが出来ます。

【初心者向け】ビットコインシステムとハッシュ値

ビットコインについて書いてきますということで、第一回の記事になります。
ビットコインの仕組みを徹底解説するカテゴリー始めます - バナナでもわかる話



ビットコインは、ブロックチェーンの仕組みによって

後からの不正改竄が事実上不可能である所に大きな特徴がある

と言われています。


その不正改竄が事実上不可能となる仕組みの根本の一つである仕組みに「ハッシュ関数」というものがあります。

そこで本記事では、ビットコインシステムを説明する前段として、ハッシュ値とは何かについて説明していきます。


ハッシュ値とは何か


何らかの会員制のウェブサイトを想像してみてください。

会員登録をする際、まず最初にパスワードを設定しますよね。


例えばパスワードを「banana」としたとします。

このパスワード、当然ウェブサイト側に保存されているわけですが、もし「banana」という文字列の状態のまま保存していたら、ちょっとしたハッカーがチョチョイとハッキングして、そのウェブサイトを管理しているサーバーにアクセスしてしまえば、簡単に盗むことが出来ちゃいます

そんでもってハッカー集団に、ああ、この人のパスワードは「banana」なんだなーとすぐにバレてしまいます。

なんなら、ハッカーではなく管理者側にも筒抜けです。
まあ管理者側が悪用するとはあまり思えませんが、それでも誰かにパスワードを知られているというのは嫌ですよね



そういうわけで、普通良心的な(まともな)ウェブサイトであれば、パスワードを「banana」のまま管理するようなことはしないわけです。



どう保存しているかというと、私たちが設定したパスワードを「ハッシュ値」という値に変換して保存しています。


こんな感じです。
f:id:bananarian:20180922013459p:plain

この「4b27f71097fc9e6e855b2c5c6b20a81c」がハッシュ値です。

管理者側は「4b27f71097fc9e6e855b2c5c6b20a81c」しかわかりませんし、「4b27f71097fc9e6e855b2c5c6b20a81c」から「banana」を特定するという逆の操作は難しくなります。


ちなみに、図からも明らかなように、この文字列をハッシュ値に変換する仕組みがハッシュ関数です。


※言うて「banana」程度の短い文字列なら総当たりすることでハッシュ値から直接パスワードを特定することが出来てしまいますし、簡単にハッシュ値から文字列を特定できてしまうハッシュ関数も存在します。そこで、より暗号を強度にする仕組みとして、実際にはsaltというランダムな文字列を追加生成して、ハッシュ化したり、何重にもハッシュ化することなどが行われています。


ハッシュ値を出して遊んでみる

ハッシュ関数にはたくさんの種類があります。インプットしたものが同じでも、関数が違えば当然違う結果が返ってきます。

以下のサイトでは、適当に文字を打ったら、それぞれのアルゴリズム(ハッシュ関数)でどんな値が返ってくるのかを確認することが出来るみたいです。
good-tool.net

ちょっと色々入力して遊んでみると理解が深まるかもしれません。

ビットコインの仕組みを徹底解説するカテゴリー始めます

この間、読者の方から

 

ビットコイン」や「ブロックチェーン」について関心があるので、その手の記事を書いてほしいというコメントを頂きました。ありがとうございます!

 

 

そこで、とりあえず手始めに、ビットコインという記事カテゴリーを作成して、

 

知識ゼロでも順番に理解できることを目標に、1回の記事の情報量を無理のない量に保った上で、丁寧に解説する形で続き物の記事を書いていこうと思います。

 

予定としては恐らく10~20記事になると思いますが、興味のある方は是非お越しください。

 

※例のごとく他のカテゴリーも当然並行して書いていくつもりなのでご心配なく笑

 

 

ちなみに記事のアクセス方法ですが、

PCサイトであればトップページの「その他」の中にカテゴリーが入っております。

f:id:bananarian:20180922002949p:plain

 

スマホの方に関しては、すみません。こんな感じの整った分類は行えていないので、ビットコインカテゴリーから辿ってください!

ビットコイン カテゴリーの記事一覧 - バナナでもわかる話

 

という感じで、これから書いていくので、興味のある方はご覧ください!