ビットコインのプロトコルに対応するノードはフルノードと呼ばれる全取引データを保持するノードとSPV(Simplified Payment Vertification)と呼ばれるブロックヘッダと自分に関連するデータのみを保持する軽量ノードがある
Bitcoin Coreはフルノード
ブロックのヘッダのみをダウンロードし、必要に応じてフルノードにトランザクションを要求するクライアントでSPVノードと呼ぶ
■ネットワークの発見
最初はDNSシードに問い合わせにいく
– seed.bitcoin.sipa.be
– denseed.bitcoin.dashjr.org
– eed.bitcoinstats.com
– seed.bitcoin.jonasschnelli.ch
DNSシードに問い合わせると、新しい接続を受け入れられるフルノードのIPアドレスが1つ以上返ってくる
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ dig seed.bitcoin.sipa.be
; <<>> DiG 9.9.5-3ubuntu0.19-Ubuntu <<>> seed.bitcoin.sipa.be
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34073
;; flags: qr rd ra; QUERY: 1, ANSWER: 25, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;seed.bitcoin.sipa.be. IN A
;; ANSWER SECTION:
seed.bitcoin.sipa.be. 3599 IN A 104.248.20.174
seed.bitcoin.sipa.be. 3599 IN A 79.124.17.204
seed.bitcoin.sipa.be. 3599 IN A 5.135.186.15
seed.bitcoin.sipa.be. 3599 IN A 104.171.172.17
seed.bitcoin.sipa.be. 3599 IN A 94.130.207.23
seed.bitcoin.sipa.be. 3599 IN A 138.201.56.109
seed.bitcoin.sipa.be. 3599 IN A 73.255.112.134
seed.bitcoin.sipa.be. 3599 IN A 93.115.89.76
seed.bitcoin.sipa.be. 3599 IN A 108.11.187.129
seed.bitcoin.sipa.be. 3599 IN A 116.203.136.157
seed.bitcoin.sipa.be. 3599 IN A 15.164.169.200
seed.bitcoin.sipa.be. 3599 IN A 47.74.245.182
seed.bitcoin.sipa.be. 3599 IN A 74.98.242.97
seed.bitcoin.sipa.be. 3599 IN A 212.170.100.71
seed.bitcoin.sipa.be. 3599 IN A 59.110.18.37
seed.bitcoin.sipa.be. 3599 IN A 193.30.123.209
seed.bitcoin.sipa.be. 3599 IN A 217.125.246.37
seed.bitcoin.sipa.be. 3599 IN A 185.2.101.192
seed.bitcoin.sipa.be. 3599 IN A 94.26.190.7
seed.bitcoin.sipa.be. 3599 IN A 123.134.246.100
seed.bitcoin.sipa.be. 3599 IN A 78.47.168.239
seed.bitcoin.sipa.be. 3599 IN A 23.175.0.212
seed.bitcoin.sipa.be. 3599 IN A 5.2.194.97
seed.bitcoin.sipa.be. 3599 IN A 91.178.131.108
seed.bitcoin.sipa.be. 3599 IN A 173.212.207.249
;; Query time: 271 msec
;; SERVER: 10.0.2.3#53(10.0.2.3)
;; WHEN: Thu Oct 31 15:16:59 UTC 2019
;; MSG SIZE rcvd: 449
他のノードとの接続はディスク上のDBに保存する
プロトコルバージョンのサポート
vagrant@vagrant-ubuntu-trusty-64:~/bitcoin$ bitcoin-cli getnetworkinfo
{
"version": 170100,
"subversion": "/Satoshi:0.17.1/",
"protocolversion": 70015,
"localservices": "000000000000040d",
"localrelay": true,
"timeoffset": 0,
"networkactive": true,
"connections": 3,
"networks": [
{
"name": "ipv4",
"limited": false,
"reachable": true,
"proxy": "",
"proxy_randomize_credentials": false
},
{
"name": "ipv6",
"limited": false,
"reachable": true,
"proxy": "",
"proxy_randomize_credentials": false
},
{
"name": "onion",
"limited": true,
"reachable": false,
"proxy": "",
"proxy_randomize_credentials": false
}
],
"relayfee": 0.00001000,
"incrementalfee": 0.00001000,
"localaddresses": [
],
"warnings": ""
}
コマンドがversionとverackのメッセージを使ってハンドシェイクを行う
相手のノードのバージョンとuser agentが表示され、ハンドシェイクが完了
ブロックチェーンの同期が終わったあとは、ブロードキャストされたブロックを受診してブロックチェーンを更新