Bitcoin Coreを読む その2 〜bitcoind の起動〜
https://gyazo.com/d04124fb2f5b42743b53df5cd0c9e55b
bitcoindの起動の流れ
main関数
bitcoins.cpp L184
手続き
SetupEnvironment
Util.cpp L1174
メモリ管理で、M_ARENA_MAXというオプションを指定しているときに、32bitマシンだったらこのオプションを1にセットしてしまう。
言語設定関連の処理
noui_connect
noui.cpp L52
UI関連の初期化処理??詳しく追ってないです。
AppInit
Bitcoin.cpp L57
初期化処理の本体
手続き
SetupSserverArgs
パラメータのパース
util.hで定義されている gArgs にパラメータをセットする。
Help の表示が要求されていたら表示する処理。
fs::is_directory(GetDataDir(false))
データディレクトリがあるか
コンフィグファイルがあるか
起動するチェーンが正しく指定されているか
-testnetか-regtest
オプション指定の書式のチェック
InitLoging
ログオブジェクトの初期化
ログの出力先のオプションを解釈して、ログオブジェクトに値をセットする
InitParameterInteraction
ショートハンド系のパラメータが指定されていた時に、この処理で、実際のパラメータをセットし直している。
bitcoind では -server=true がデフォ値なので、セットしている
AppInitBasicSetup
Step1: setup
init.cpp L877
ターミナルからの停止シグナルなどを受け取ったときのハンドラの設定
AppInitParameterInteraction
init.cpp L927
Step2: parameter interactions
概要
オプションで与えられた値を実際にブログラムから参照される変数などに格納している
ブロックの保管ディレクトリのチェック
-prune オプションがある場合は -txindex が使えないので、そのアサーション
-bind と -whitebind は -listen=0といいしょに使えないよっていうアサーション
Listen は外部からの接続を受け付ける数
nMaxConnectionsを初期化
最大の接続数かな?
Step3: parameter-to-internal-flags
-debug モードの初期化
regtestモードでの、mempoolとblockindexのチェック
Mempool関連のオプションの読み込み
AppInitSanityCheck
Step4: sanity check
楕円曲線の初期化
Sanity Check
Bitcoin coreが必要なライブラリ等が揃って正常に起動しているかチェックする
チェックに成功したら、データディレクトリをロックする(排他制御かな)
非デーモン起動の初期化
AppInitLockDataDirectory
デーモン化したらもう一度datadirecotryのロックを確認する。
なんで?
AppInitMain
Step4a: application initialization
ロガーの初期化処理
この処理ログの初期化のところに持っていけないのかな、、?
ログをシュリンクするかのオプションの解釈
アプリケーションの初期化の設定をログに出力
InitSignatureCache();
InitScriptExecutionCache();
スクリプトのチェック用のスレッドを生成
CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
このあたりよくわかってないけど、スレッドを起動しているぽい
RegisterAllCoreRPCCommands(tableRPC);
RPCコマンドの登録
-server オプションが指定されている場合、AppInitSevers() を実行する
RPCサーバを起動する
Step5: verify wallet database integrity
g_wallet_init_interface.Verify()
Walletが使えるかの検証処理?詳しくは追っていません。
Step6: network initialization
g_connmanのセットアップ
Connection managerのこと?
CConnman net.h で定義されてる
責務は?
名前からコネクションをよしなにするんだとは思うけど。
PeerLogicValidationのリセット
PeerLogicValidationの責務は?
-uacommentのしょり
UserAgentに任意のコメントを追加できるぽい
バージョン文字列の処理
onlynetの処理
自ノードから外部ノードに繋ぐときのプロトコルを指定できるぽい
DNSの設定
詳細未確認
Proxyの設定
内容未確認
どういう時にProxy使うの?
onion
ネットワーク系のパラメーターの初期化
-listen
-discover
-blocksonly
-externalip
自身が外部から参照される時に使われるアドレス
-maxuploadtarget
Step7: load block chain
パラメータの初期化
-reindex
-reindex-chainstate
-dbcache
-txindex
-maxmempool
リセット系の処理
UnloadBlockIndex()
Pcoinstigp.reset()
pcoinsdbview
pcoinscatcher
pblocktree
LoadBlockIndex
DBからindexをロードする。
手続き
LoadBlockIndexDB validation.cpp L3877
pblocktreeとは
BlockTreeDBのポインタ
手続き
g_chainstateからblockindexを読みだせなかったら失敗
Genesisブロックが間違えていないか検証
プルーンモードか判定
プルーンモードじゃなくするには -reindex する必要がある
Genesis Blockの検証
Genesisブロックをロードする
validation.cpp L4324 bool CChainState::LoadGenesisBlock(const CChainParams& chainparams)
手続き
LOCK(cs_main)
このLOCKはマクロ?
mapblockIndex.count(chainparams.GenesisBLock().GetHash())
mapblockIndexとは
std::unorderd_map 的なやつのtypedefなやつ
chainparams.GenesisBlock()
疑問
ここで言っているblockindexとは何か?ロードするとはどういうことか?
Step8: start indexers
Step9: load wallet
Step10: data directory maintenance
Step11: import blocks
Step12: start node
Step13: finished