ブロックチェーンを理解するために行ったこと


KIT Advent Calender 3日目 元気よくやっていきましょう。

ブロックチェーン技術はエンジニアであれば一度は触ってみたいものだと思います。
難しそう!というイメージがつきがちなブロックチェーンですが、なんとか「#ブロックチェーンなんもわからん」程度まで理解できるようになった僕の軌跡をお伝えしようと思います。
言語はC#に寄っています。

bitcoin のソースコードを読みにいく

https://github.com/bitcoin/bitcoin

結果:挫折した

そもそもC++に慣れ親しんでないというのもあって「さーてどこから読めば良いのかな」状態だったのと、ブロックチェーンに関する用語がわからないので名前だけでどのようなクラスなのか判断出来なかった。

MinChain ライブラリのソースコードと資料を読み漁る

竹井悠人氏が教育用として公開されているMinChainVS2017リリース記念勉強会のアーカイブスライドをとにかく見て読んで使った。

結果:ブロックチェーンに使われている技術用語(Merkle Root Hash や Nonce や UTXO)の意味と処理の流れ、通信の流れが大体理解できた。

MinChain や資料がとても分かりやすく書いてあり、1~2週間の短期間でかなり理解が進んだと思います。特にネットワーク関連の知見が得られたのが凄く大きかったです。

Programming The Blockchain in C# を読んだ。

C# 用 Bitcoin ライブラリの NBitcoin を使って学習するドキュメントで、分かりやすい図解とユーモアが含まれた文章のおかげで学習意欲を失わずに進めることができました。

結果:トランザクションの部分が詳しく理解できたのと、ウォレット部分の知見を得ることができました。

トランザクションインプットとトランザクションアウトプットの関係、「おつりのアウトプットを作る」ことが理解出来たのは大きかったですね。

『ゼロから創る暗号通貨』と Mastering Bitcoin を読みながらコードを書く

そろそろ学んだことをコードに落とそう!ということで、濵津誠氏の『ゼロから創る暗号通貨』とMinChainを参考にC#で作ってみた。
章に関連する部分の理解を Mastering Bitcoin と Bitcoin のソースコード、テストコードで補った。

それがこれ

結果:なぜこういった実装がされているのかを突き詰めた感覚を得ることが出来ました。なぜ Merkle root Hash を使うのか、 Block ではなく Block Header をマイニングするのかやDifficulty がありなぜ変動するのかという色々な疑問が一気に解消されました。

その他みた資料

学習の補助として用いた資料の一覧です。
* Bitcoin Developer
トランザクションやブロックの中身、Difficulty の計算の調査に
* Recommended Elliptic Curve Domain Parameters
secp256k1 とはどんなパラメータなのかを調べるために
* Bouncy Castle For CSharp
開発に利用するために
* Bitcoin WIki
Proof of Work の仕組み調査
* NEO
C#実装の実際に動いている暗号通貨を見てみようと思ったので。

まとめ

さっくりと書いてしまいましたが、こうしてみるとかなりの数の資料を読み漁った感じがしますね。でもやはりコードを実際に考えて書いてみるのが一番理解に繋がるなぁと思いました。
今後の学習としてはオレオレ Mastering Bitcoin を書くつもりです。
これから(C#で) ビットコインを学習したいという方の参考になれば嬉しいです。