1.ネットワーク
1.ネットワーク接続概要
1.Bitcoin Coreを起動
2.他のノードのIPを求め、DNSシードに接続する DNSシードはBitcoinノードのIPアドレスリストを提供するDNSサーバです。mainnet/testnet用に複数のシードが存在する
3.DNSシードは新しい接続を受け入れられるフルノードのIPアドレスを返信する
4.ノードはそのアドレスを使ってネットワーク上の他のノードと接続する。
5.この時、Bitcoin Coreはそのノード情報をディスクのDBに保存する

図1:ネットワーク接続概要
・以降はDB上のノード情報を用いて接続する
・11秒以内にコネクションが確立できなければ再びDNSシードに問合せる
・障害などによってDNSシードにすらアクセスできない場合を考慮しIPアドレスと ポート番号のリストもハードコードされており、DNSシードに60秒以内に応答がない場合はこのIPアドレスへの接続を試みる。
2.ハンドシェイク
ローカルノードとリモートノードがお互いのversionメッセージを取得。
その後のメッセージの送信は両者のバージョンのうち小さい方のバージョンに合わせて行われる。

図2:ハンドシェイク
ハンドシェイクが終了すると他のメッセージを送信できるようになる。
(ex:edderメッセージでネットワーク上のノード情報を取得)
3.Initaial Block Downroad(IBD)
ネットワークに接続後に最新のブロックまでブロックチェーンのデータのダウンロードを開始する。

図3:初期ブロックダウンロード
getheaderメッセージではそのペイロードにどの時点から(Header Hashes)どの時点までのブロックを要求するか(Stopping Hash)セットしますがIBDではHeader Hashesにローカルノードが保持する最新ブロック(この場合はジェネシスブロック)のハッシュをStopping Hashに0x00...00をセットして送信する。
getheaderによるブロックヘッダの取得とgetaddによるブロックデータの取得は並行して行われる。
4.ブロックのブロードキャスト
図4:ブロックのブロードキャスト
フルノードに対するブロックリレーとSPVノードに対するブロックリレーは方法が異なる。
新しいブロックを受信したフルノードはブロックの検証を行い問題がなければ上記の方法でブロックをリレーする。
