pull down to refresh

As I continue to explore the code base for Bitcoin, I come back to the way that node peers are discovered for consensus. This is a foundational aspect of Bitcoin - validating blocks and agreeing on their hash values. I have discovered the DNS Seeds that are hardcoded into Bitcoin Core, which reveals the hostnames and some personal names of obviously some trusted and prominent developers. This may be the single most centralized and trustful aspect of Bitcoin. What's interesting to me is that there are a very small handful of hostnames that underpin the entire consensus framework.
What is your take on this potential centralized vulnerability?
$ grep vSeeds.emplace_back src/kernel/chainparams.cpp | sed 's/^\ \{1,\}//' | rev | sort -t";" -k2,2 | rev
vSeeds.emplace_back("dummySeed.invalid.");
vSeeds.emplace_back("seed.bitcoin.sipa.be."); // Pieter Wuille, only supports x1, x5, x9, and xd
vSeeds.emplace_back("dnsseed.emzy.de."); // Stephan Oeste
vSeeds.emplace_back("testnet-seed.bluematt.me."); // Just a static list of stable node(s), only supports x9
vSeeds.emplace_back("dnsseed.bluematt.me."); // Matt Corallo, only supports x9
vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org."); // Luke Dashjr
vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch."); // Jonas Schnelli, only supports x1, x5, x9, and xd
vSeeds.emplace_back("testnet-seed.bitcoin.jonasschnelli.ch.");
vSeeds.emplace_back("seed.bitcoin.sprovoost.nl."); // Sjors Provoost
vSeeds.emplace_back("seed.signet.bitcoin.sprovoost.nl.");
vSeeds.emplace_back("seed.testnet.bitcoin.sprovoost.nl.");
vSeeds.emplace_back("seed.bitcoinstats.com."); // Christian Decker, supports x1 - xf
vSeeds.emplace_back("seed.btc.petertodd.net."); // Peter Todd, only supports x1, x5, x9, and xd
vSeeds.emplace_back("seed.tbtc.petertodd.net.");
vSeeds.emplace_back("seed.bitcoin.wiz.biz."); // Jason Maurice
vSeeds.emplace_back("v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333");
vSeeds.emplace_back("178.128.221.177");
I'ts not part of consensus, just a way to find initial peers (other nodes). Originally instead of this there was single hardcoded IRC channel on single IRC server (#bitcoin on Freenode). Any user can use addnode= to manually add different peer from the start and then that peer will be used to discover other peers too (and if you help setting up node to your friend, it's good idea to addnode= your node in config for him).
But it's good that you are going through code, don't trust - verify!
reply
I appreciate the historical context indicating how peers were initially discovered through IRC.
reply
It's used to find initial peers, after that it's no longer used since your peers tell you about their peers. So it's just for bootstrapping the peer database.
You can always connect manually to a known peer for bootstrapping.
So imo, it looks worse than it is. I don't see another way to achieve the same thing as effectively.
reply
Beginning to clarify for me. Thanks. So this seeds the peering database with trusted nodes, but it is not necessarily a centralized attack vector.
reply
I went through each of these hostnames, pinging them, then doing a WHOIS lookup to determine the Autonomous System (AS) number, which informs which network the host routes to. Ping however will only grab one IP from a list of possible IP Addresses. It turns out that most of these hostnames point to numerous IP addresses. Which makes perfect sense for fault tolerance, geographic dispersion, and redundancy reasons. The next step I listed all IP addresses tied to each seed hostname:
$ dig +short a seed.bitcoin.sipa.be
93.81.254.159
173.241.227.243
5.45.74.50
68.219.242.34
121.226.58.95
136.244.19.126
31.164.160.162
209.204.29.18
51.15.11.99
18.198.16.76
216.82.38.46
92.43.187.34
54.91.248.109
18.217.35.153
31.188.245.244
18.222.149.135
35.205.117.63
37.60.240.209
188.68.53.44
37.60.234.45
73.117.132.138
35.237.144.170
62.24.76.122
109.86.60.33
179.228.234.7
To get a better feel for these IP addresses, I wrote a script to collect various data points on each of these IP addresses. Here is the result of the first hostname:
Hostname              IP Address       Reverse IP
seed.bitcoin.sipa.be  104.62.136.12    104-62-136-12.lightspeed.mssnks.sbcglobal.net
seed.bitcoin.sipa.be  134.122.100.130
seed.bitcoin.sipa.be  108.44.152.24    pool-108-44-152-24.clppva.fios.verizon.net
seed.bitcoin.sipa.be  86.104.228.41
seed.bitcoin.sipa.be  185.231.220.189  swinglicious.com
seed.bitcoin.sipa.be  68.219.242.34
seed.bitcoin.sipa.be  188.166.72.55
seed.bitcoin.sipa.be  65.109.85.139    static.139.85.109.65.clients.your-server.de
seed.bitcoin.sipa.be  109.173.126.157  broadband-109-173-126-157.ip.moscow.rt.ru
seed.bitcoin.sipa.be  195.56.63.11
seed.bitcoin.sipa.be  167.235.110.208  static.208.110.235.167.clients.your-server.de
seed.bitcoin.sipa.be  185.70.43.193    185-70-43-193.protonmail.ch
seed.bitcoin.sipa.be  18.162.156.95    ec2-18-162-156-95.ap-east-1.compute.amazonaws.com
seed.bitcoin.sipa.be  172.234.95.35    172-234-95-35.ip.linodeusercontent.com
seed.bitcoin.sipa.be  69.181.240.40    c-69-181-240-40.hsd1.ca.comcast.net
seed.bitcoin.sipa.be  62.54.183.27
seed.bitcoin.sipa.be  195.201.86.117   static.117.86.201.195.clients.your-server.de
seed.bitcoin.sipa.be  62.210.88.131    23ce2d6f-677d-476e-883f-9d322bdbbc84.fr-par-1.baremetal.scw.cloud
seed.bitcoin.sipa.be  192.95.31.84     ns502652.ip-192-95-31.net
seed.bitcoin.sipa.be  5.253.18.218
seed.bitcoin.sipa.be  71.188.127.21    static-71-188-127-21.cmdnnj.fios.verizon.net
seed.bitcoin.sipa.be  5.189.144.87     m3087.contabo.host
seed.bitcoin.sipa.be  177.170.79.252   177-170-79-252.user.vivozap.com.br
seed.bitcoin.sipa.be  13.228.111.109   ec2-13-228-111-109.ap-southeast-1.compute.amazonaws.com
seed.bitcoin.sipa.be  185.152.138.74   static17.byfly.gomel.by
Just discovered https://bitnodes.io/ which has accomplished much of the initial goal of my project, which was to map the Bitcoin node network and track its growth over time.
reply