Bitcoin Coreを読む その1
動機
Bitcoin Core の概要を理解する。自分で拡張できるようになる。
Bitcoin Core で使われている C++のシンタックスやコーディングスタイルについて理解する。
前提
bitcoin coreの v0.17.0
読むための戦略
存在するであろうモジュールについて予測を立てる
大枠のリポジトリの構造を把握する
モジュールを発見し、モジュールの概要・連携を把握する
モジュールごとに調査する
存在するであろうモジュールについて予測を立てる
スクリプトのパースや実行をするモジュール
P2Pネットワークのモジュール
wallet のモジュール
マイニングのための計算をするモジュール
secp256k1 のモジュール(以前jsへの移植実装を見たのであるはず)
トランザクションデータのストレージへの保管などを管理するモジュール
ブロックを構成するモジュール
トランザクションを構成するモジュール
マークルツリーのモジュール
ブルームフィルターのモジュール
うーん、思いつくのはこんなもんかな。
大枠のリポジトリの構造を把握する
code: bitcoin
├── build-aux/ autoconf や autobuild 関係のファイルを置く場所?
├── depends/ ビルド環境や依存する外部のpackageの取得に関するファイルが有るぽい
├── share/ モジュール間で共有するファイルなどがある?アイコン画像やconfigのサンプルファイルなどがおいてある
├── src/ ソースコードがある
├── test/ テストコードがある。Pythonで書いてある。
├── contrib/ 開発用のツール類がおていあるぽい。
├── doc/ セットアップ方法、実装されているフィーチャーなどのドキュメントがある
├── INSTALL.md doc/build-*.md を見ろよ!って書いてある
├── libbitcoinconsensus.pc.in よくわからない
├── CONTRIBUTING.md コントリビュートの仕方
├── Makefile.am
├── README.md
├── autogen.sh
├── configure.ac
└── COPYING
ざっくり doc/ を見てみる
せっかくドキュメントがあるので、まずはそこから読んでいくのがお行儀が良い気がします。
code: doc/
├── man/ man コマンドのためのドキュメントかな
├── release-notes/ リリースノートですね
├── Doxyfile.in Doxygen というドキュメントシステムを使っているぽいですね。その設定ファイルのようです。
├── README.md README ですね
├── README_osx.md dmg の生成等に関するメモ
├── README_windows.txt windowsでのexeの動かし方?
├── REST-interface.md REST API のドキュメント
├── assets-attribution.md
├── benchmarking.md ベンチマークのとり方
├── bips.md 取り込まれた BIP の一覧
├── bitcoin_logo_doxygen.png
├── build-freebsd.md 以下 build-*.md はプラットフォームごとのビルド手順ですね
├── build-netbsd.md
├── build-openbsd.md
├── build-osx.md
├── build-unix.md
├── build-windows.md
├── dependencies.md 依存している外部ライブラリやミドルウェアのリスト
├── descriptors.md Output Descripter のドキュメント
├── developer-notes.md コーディングスタイルなど開発のガイドラインが書いてます
├── dnsseed-policy.md dns seed のポリシー。
├── files.md トップレベルにあるファイルの説明
├── fuzzing.md fuzzy なテストのドキュメント?
├── gitian-building.md gitian のドキュメント
├── init.md 起動スクリプトの配置に関するドキュメント
├── reduce-traffic.md ノード運用時の通信量を減らすためのドキュメント
├── release-notes.md リリースノート
├── release-process.md リリース手順
├── shared-libraries.md
├── tor.md
├── translation_process.md
├── translation_strings_policy.md
├── travis-ci.md
└── zmq.md
以下気になるものをピックアップします
developer-notes.md
Various coding styles have been used during the history of the codebase, and the result is not very consistent.
これまでの経緯の中で様々なコーディングスタイルが使われてきました。その結果あまり一貫性がありません。
サトシナカモトの実装を引き継いでコミュニティで開発してきたという経緯がありますので、仕方ないですね。でも、C++に慣れていない人には扱いにくいコードベースではありそうです。
コーディングスタイルについてはまた別でゆっくり見ていきたいです。
Doxyfile.in
mac なら homebrew で doxygenをインストールして、make docs すればドキュメントが生成されます.
code: shell
$ brew install doxygen
$ make docs
$ open doc/doxygen/html/index.html
https://gyazo.com/f1ec4303385ae09fceb7886ffd6fa2bc
ゆるっとコードをながめる
src/bitcoind.cpp
ここにmain関数があります。AppInitクラスがパラメータのパースや初期化をやっているようです。
src/init.cpp
具体的な初期化処理はこちらに書いてあるぽいです。長いので読んでませんが;
src/chainparams.cpp
mainnet, testnet, regtest 等のチェーンのパラメータがハードコーディングされてるぽいですね。DNS Seed もここに書いてあります。
src/chain.h
init.cppのincludeを見ていたら気になるファイルが。chain.h これはきっと強いやつ。
チェーン自体のデータ構造とシリアライズに関する処理が記述されているようです。
chainを見つけたとなるとblock, transaction のデータ構造も見つけたいですね。
と chain.h の include を見てたらありました。
src/primitives/block.h, src/primitives/transaction.h