Ameba Ownd

アプリで簡単、無料ホームページ作成

ハッタリからはじめよ - bluff driven -

少しだけ易しいMastering Bitcoin【第1〜3章】

2018.08.22 15:25

Bitcoinの技術面を学ぶにはこれしかないと言われているほどの名著Mastering Bitcoin を今更読んだので、自分の中での復習を兼ねてところどころ解説付きでまとめを書いていきます。


元の本ではサラッと流されているところもしっかり解説するつもりでお節介に書いたので初学者の人には分かりやすいかもしれません。


日本語版PDFはここで無料公開されているので翻訳者の方々への感謝を常に感じながら読みました。


無料公開版ということもあって誤字脱字もたまにあったりするので、

しっかり製本されたものが読みたいという方はAmazonで買って読むことをお勧めします。


第1章 イントロダクション 

15分で読めるので実際に読んだ方が早いです。


・ビットコインとは何か

・ビットコインの歴史

・ビットコインを使う、送る/受け取るって具体的にどうやるの?イメージしたい!


といった内容が書かれています。


第2章 ビットコインの仕組み


この章ではBitcoinの大まかな仕組みを概観していきます。


ビットコインの台帳(データベースのこと、ブロックチェーンと呼ばれる)は「誰から(インプット)誰に(アウトプット)どれだけのbitcoinが送られた」ということ(トランザクション)を永遠に記録し続けるだけのもの」です。


以下の画像[ブロックチェーンのブロックの中身外観]のイメージです。

この台帳の全てのデータを持つPCがフルノードと呼ばれます。

フルノードがAPIとして台帳情報を公開しているサービスがblock chain explorerと呼ばれ(Bitcoinブロックチェーンの中身データ検索サイトみたいなもの)、ここで検索するとフルノードでなくても(誰でも)全ての台帳情報が見れます。


送金(トランザクション)が起こる仕組みを順番に見ていきます。


①自分のBitcoin残高参照

(当然ですが、そもそもBitcoinを持っていないと送金できないので)

ウォレットはまず、自分のBitcoinアドレスにアウトプットされている過去のトランザクションのうち、インプットにまだ使われていないトランザクションをフルノード(これまでの台帳を全て持っているどこかのPC)に”一つずつ”探しに行く


②トランザクションのインプット部分の作成

見つけた自分のアドレスへのアウトプットが、作ろうとしているトランザクション(自分のアドレスからの送金)額に対して足りていれば、(足りていなければ何個も小額の未使用トランザクションをかき集めに行く)生成するトランザクションのインプットに入れる。

③トランザクションのアウトプット部分の作成

「送金額」と「送金先アドレス」をアウトプットに入れる


④ お釣りトランザクションの作成とマイナー手数料の決定

②でいれたインプットの額がアウトプットの額よりも多い場合はその差分をお釣りとして自分に戻すために、自分へのアウトプットも同時に作成する。この時、自分へのお釣りを少し少なくすると、その分がマイナーへの手数料になる。


⑤作成したトランザクションをブロックチェーンネットワークに送信

ブロックチェーンネットワーク(沢山の隣接ノード)にそのトランザクションを送信し、リレー方式で全てのノードに伝搬していく。


⑥ブロックチェーンネットワークのノードが受け取る

新規のトランザクションを受け取ったノードは、そのトランザクションが正当なものか検証[第8章で説明]し、それをそれぞれのノードが持つ未検証トランザクションプールに貯める。

(送金先の人のウォレットも1つのノードなのでこのトランザクションを受け取って、⑤のトランザクションがブロックチェーンネットワークに投げられたことは分かる。ただし、まだブロックに書き込まれてはいない)


⑦マイナーの存在

これまでの処理と並行してマイナーが新しいブロックを生成するために常に、ハッシュ関数の計算をしている。(生成されるbitcoinとブロックに入れるトランザクションの手数料を自分に送金するトランザクションを作れることによって報酬がもらえることがインセンティブ)


⑧マイナーがトランザクションを検証し、ブロックに入れる

ハッシュ関数計算競争の結果、最初に正解を見つけてブロックを生成したマイナーが、未検証トランザクションプールから優先度順にトランザクションを取ってそれぞれ検証[第8章で説明]してブロックに入れ、そのブロックをビットコインネットワーク上に放出し、それを他のマイナーが検証することでまた次のブロックの生成が始まる


⑨時間とともにトランザクションの信頼度向上

新しいブロックは直前のブロックを前提にしている(ハッシュチェーンと呼ばれる)ため、あるブロックを改ざんするためには、それ以降のブロックを全て改ざんしなければならない。よって、ブロックが後に続けば続くほど、そのブロックを改ざんするのが難しくなり、信頼度が上がる。一般的にはそのブロック以降に6回のブロックが積み重なれば信頼できる、つまり、この時点で、送られたBitcoinの所有権が正式に移転する(ファイナリティが得られる)とされています。(そのブロックの上に積みあがったブロックの数を確認数という)


※そのブロックがgenesisブロック(一番最初のブロック)から積み上がった何番目のブロックかを Block Height、そのブロック以降に何個のブロックが積み上がっているかを Block Depth

という。(以下の画像のイメージ)


という流れでBitcoinのトランザクションは起こります。

正直何言ってるかわからない場合は気にせず次の章に進んでください。次の章からここで出てきた各要素について細かく解説して行くので、読み進めるうちに分かります。


第3章 ビットコインクライアント


・BitcoinリファレンスクライアントであるBitcoin Core("Satoshiクライアント")  (bitcoind) を使ってみよう

・コマンドラインからのBitcoin Core JSON-RPC APIを使ってみよう

ウォレット使ってみたり、ビットコインブロックチェーン内にあるデータ見てみる


・このbitcoind以外にもBitcoinネットワークと通信するためのBitcoin クライアントやライブラリがたくさんある

例)

コマンドラインでbxコマンドで使用可能なbitcoin explorer

c + で使用可能なlib bitcoin

pythonで使用可能な pycoin, Vitalik Buterin によって書かれた pybitcointools

goで使用可能なbtcd

など


といった内容が書かれています。

この章で書かれているBitcoin Coreを使ってみる(全Bitcoinデータをローカルにダウンロードする)のは、尋常じゃないストレージ容量のPCを持ってる人以外は、やめておきましょう。笑

読むだけでも十分勉強になります。



ここで覚えておくべき用語としては、

ブロックハッシュ 

トランザクションが含まれることになったブロックのハッシュ値

ブロックインデックス 

含まれることになったトランザクションがブロックの中の何番目のトランザクションとして入っているかを表した値

くらいかと思います。


<この時点での僕の疑問点>

・ハッシュ関数計算の正解を見つけてブロックを生成したマイナーは、それをブロックチェーンネットワークに送る前に次のブロックを生成しておく(つまりフライングをする)ことができるので、永遠に同じマイナーが勝ち続けることが可能なのでは?


→ 

第8章やEthereumの記事で言及する予定ですが、「ブロック生成間隔が短い(ブロック生成速度が速い)ほど、ここでいう"フライングできる時間"の"ブロック生成をする時間"に占める割合が大きくなる」ので、ブロック生成に成功したマイナーが次もブロック生成競争に勝てる確率が高くなります。


Bitcoinの場合は、ブロック生成間隔が10分であるため大きな影響はないとされています。


続き↓