aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/seeds/README.md4
-rw-r--r--src/chainparams.cpp26
-rw-r--r--src/chainparams.h11
-rw-r--r--src/net.cpp27
-rw-r--r--src/protocol.h10
5 files changed, 39 insertions, 39 deletions
diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md
index 139c03181f..6dc277f298 100644
--- a/contrib/seeds/README.md
+++ b/contrib/seeds/README.md
@@ -4,7 +4,9 @@ Utility to generate the seeds.txt list that is compiled into the client
(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)).
Be sure to update `PATTERN_AGENT` in `makeseeds.py` to include the current version,
-and remove old versions as necessary.
+and remove old versions as necessary (at a minimum when GetDesireableServiceFlags
+changes its default return value, as those are the services which seeds are added
+to addrman with).
The seeds compiled into the release are created from sipa's DNS seed data, like this:
diff --git a/src/chainparams.cpp b/src/chainparams.cpp
index 97a6c346ab..39757baf9e 100644
--- a/src/chainparams.cpp
+++ b/src/chainparams.cpp
@@ -124,13 +124,17 @@ public:
assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
- // Note that of those with the service bits flag, most only support a subset of possible options
- vSeeds.emplace_back("seed.bitcoin.sipa.be", true); // Pieter Wuille, only supports x1, x5, x9, and xd
- vSeeds.emplace_back("dnsseed.bluematt.me", true); // Matt Corallo, only supports x9
- vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org", false); // Luke Dashjr
- vSeeds.emplace_back("seed.bitcoinstats.com", true); // Christian Decker, supports x1 - xf
- vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch", true); // Jonas Schnelli, only supports x1, x5, x9, and xd
- vSeeds.emplace_back("seed.btc.petertodd.org", true); // Peter Todd, only supports x1, x5, x9, and xd
+ // Note that of those which support the service bits prefix, most only support a subset of
+ // possible options.
+ // This is fine at runtime as we'll fall back to using them as a oneshot if they dont support the
+ // service bits we want, but we should get them updated to support all service bits wanted by any
+ // release ASAP to avoid it where possible.
+ vSeeds.emplace_back("seed.bitcoin.sipa.be"); // Pieter Wuille, only supports x1, x5, x9, and xd
+ vSeeds.emplace_back("dnsseed.bluematt.me"); // Matt Corallo, only supports x9
+ vSeeds.emplace_back("dnsseed.bitcoin.dashjr.org"); // Luke Dashjr
+ vSeeds.emplace_back("seed.bitcoinstats.com"); // Christian Decker, supports x1 - xf
+ vSeeds.emplace_back("seed.bitcoin.jonasschnelli.ch"); // Jonas Schnelli, only supports x1, x5, x9, and xd
+ vSeeds.emplace_back("seed.btc.petertodd.org"); // Peter Todd, only supports x1, x5, x9, and xd
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
@@ -229,10 +233,10 @@ public:
vFixedSeeds.clear();
vSeeds.clear();
// nodes with support for servicebits filtering should be at the top
- vSeeds.emplace_back("testnet-seed.bitcoin.jonasschnelli.ch", true);
- vSeeds.emplace_back("seed.tbtc.petertodd.org", true);
- vSeeds.emplace_back("seed.testnet.bitcoin.sprovoost.nl", true);
- vSeeds.emplace_back("testnet-seed.bluematt.me", false);
+ vSeeds.emplace_back("testnet-seed.bitcoin.jonasschnelli.ch");
+ vSeeds.emplace_back("seed.tbtc.petertodd.org");
+ vSeeds.emplace_back("seed.testnet.bitcoin.sprovoost.nl");
+ vSeeds.emplace_back("testnet-seed.bluematt.me"); // Just a static list of stable node(s), only supports x9
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,111);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,196);
diff --git a/src/chainparams.h b/src/chainparams.h
index ecfe1a0ac3..d478da9891 100644
--- a/src/chainparams.h
+++ b/src/chainparams.h
@@ -14,12 +14,6 @@
#include <memory>
#include <vector>
-struct CDNSSeedData {
- std::string host;
- bool supportsServiceBitsFiltering;
- CDNSSeedData(const std::string &strHost, bool supportsServiceBitsFilteringIn) : host(strHost), supportsServiceBitsFiltering(supportsServiceBitsFilteringIn) {}
-};
-
struct SeedSpec6 {
uint8_t addr[16];
uint16_t port;
@@ -71,7 +65,8 @@ public:
bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; }
/** Return the BIP70 network string (main, test or regtest) */
std::string NetworkIDString() const { return strNetworkID; }
- const std::vector<CDNSSeedData>& DNSSeeds() const { return vSeeds; }
+ /** Return the list of hostnames to look up for DNS seeds */
+ const std::vector<std::string>& DNSSeeds() const { return vSeeds; }
const std::vector<unsigned char>& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; }
const std::string& Bech32HRP() const { return bech32_hrp; }
const std::vector<SeedSpec6>& FixedSeeds() const { return vFixedSeeds; }
@@ -85,7 +80,7 @@ protected:
CMessageHeader::MessageStartChars pchMessageStart;
int nDefaultPort;
uint64_t nPruneAfterHeight;
- std::vector<CDNSSeedData> vSeeds;
+ std::vector<std::string> vSeeds;
std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
std::string bech32_hrp;
std::string strNetworkID;
diff --git a/src/net.cpp b/src/net.cpp
index 682f47bff2..8111390749 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -136,7 +136,7 @@ static std::vector<CAddress> convertSeed6(const std::vector<SeedSpec6> &vSeedsIn
for (const auto& seed_in : vSeedsIn) {
struct in6_addr ip;
memcpy(&ip, seed_in.addr, sizeof(ip));
- CAddress addr(CService(ip, seed_in.port), NODE_NETWORK);
+ CAddress addr(CService(ip, seed_in.port), GetDesirableServiceFlags(NODE_NONE));
addr.nTime = GetTime() - GetRand(nOneWeek) - nOneWeek;
vSeedsOut.push_back(addr);
}
@@ -1577,19 +1577,6 @@ void MapPort(bool)
-static std::string GetDNSHost(const CDNSSeedData& data, ServiceFlags* requiredServiceBits)
-{
- //use default host for non-filter-capable seeds or if we use the default service bits (NODE_NETWORK)
- if (!data.supportsServiceBitsFiltering || *requiredServiceBits == NODE_NETWORK) {
- *requiredServiceBits = NODE_NETWORK;
- return data.host;
- }
-
- // See chainparams.cpp, most dnsseeds only support one or two possible servicebits hostnames
- return strprintf("x%x.%s", *requiredServiceBits, data.host);
-}
-
-
void CConnman::ThreadDNSAddressSeed()
{
// goal: only query DNS seeds if address need is acute
@@ -1612,22 +1599,22 @@ void CConnman::ThreadDNSAddressSeed()
}
}
- const std::vector<CDNSSeedData> &vSeeds = Params().DNSSeeds();
+ const std::vector<std::string> &vSeeds = Params().DNSSeeds();
int found = 0;
LogPrintf("Loading addresses from DNS seeds (could take a while)\n");
- for (const CDNSSeedData &seed : vSeeds) {
+ for (const std::string &seed : vSeeds) {
if (interruptNet) {
return;
}
if (HaveNameProxy()) {
- AddOneShot(seed.host);
+ AddOneShot(seed);
} else {
std::vector<CNetAddr> vIPs;
std::vector<CAddress> vAdd;
ServiceFlags requiredServiceBits = GetDesirableServiceFlags(NODE_NONE);
- std::string host = GetDNSHost(seed, &requiredServiceBits);
+ std::string host = strprintf("x%x.%s", requiredServiceBits, seed);
CNetAddr resolveSource;
if (!resolveSource.SetInternal(host)) {
continue;
@@ -1643,6 +1630,10 @@ void CConnman::ThreadDNSAddressSeed()
found++;
}
addrman.Add(vAdd, resolveSource);
+ } else {
+ // We now avoid directly using results from DNS Seeds which do not support service bit filtering,
+ // instead using them as a oneshot to get nodes with our desired service bits.
+ AddOneShot(seed);
}
}
}
diff --git a/src/protocol.h b/src/protocol.h
index 452b5b28ce..43d8ac067a 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -291,7 +291,15 @@ enum ServiceFlags : uint64_t {
* unless they set NODE_NETWORK_LIMITED and we are out of IBD, in which
* case NODE_NETWORK_LIMITED suffices).
*
- * Thus, generally, avoid calling with peerServices == NODE_NONE.
+ * Thus, generally, avoid calling with peerServices == NODE_NONE, unless
+ * state-specific flags must absolutely be avoided. When called with
+ * peerServices == NODE_NONE, the returned desirable service flags are
+ * guaranteed to not change dependant on state - ie they are suitable for
+ * use when describing peers which we know to be desirable, but for which
+ * we do not have a confirmed set of service flags.
+ *
+ * If the NODE_NONE return value is changed, contrib/seeds/makeseeds.py
+ * should be updated appropriately to filter for the same nodes.
*/
static ServiceFlags GetDesirableServiceFlags(ServiceFlags services) {
return ServiceFlags(NODE_NETWORK | NODE_WITNESS);