Основной механизм на сегодняшний день - это dns-seed.
Заключается он в том, что у биткоин-кошелька жестко вшиты в код несколько доменных имен. Разрешая эти имена, клиент получает список адресов (довольно внушительный). Эти адреса и есть адреса биткоин-нод (естественно, это не все доступные адреса, а только "базовые"), уже от них он получает адреса других участников сети. Таким образом можно поддерживать список узлов актуальным, не изменяя при этом исходный код программы.
Вот эти доменные имена в коде:
// DNS seeds
// Each pair gives a source name and a seed name.
// The first name is used as information source for addrman.
// The second name should resolve to a list of seed addresses.
static const char *strMainNetDNSSeed[][2] = {
{"bitcoin.sipa.be", "seed.bitcoin.sipa.be"},
{"bluematt.me", "dnsseed.bluematt.me"},
{"dashjr.org", "dnsseed.bitcoin.dashjr.org"},
{"xf2.org", "bitseed.xf2.org"},
Вы сами можете проверить во что они резолвятся, выполнив команду nslookup:
nslookup seed.bitcoin.sipa.be
Кроме того, если по каким-то причинам dns-seed не сработал или отключен, то в исходники вшиты адреса биткоин-нод. Очевидно, предполагается, что хотя бы несколько из них будут онлайн.