From b3e26cc757a2f6d96cda41c100e9607daab50c02 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Wed, 8 Jun 2016 17:33:21 +0200 Subject: [PATCH] Merge #8083: Add support for dnsseeds with option to filter by servicebits 2d83013d Add support for dnsseeds with option to filter by servicebits (Jonas Schnelli) --- src/chainparams.cpp | 9 +++++++++ src/chainparams.h | 7 +++++-- src/net.cpp | 5 +++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 49d25760d..c289f4f26 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -19,6 +19,14 @@ #include "chainparamsseeds.h" +std::string CDNSSeedData::getHost(uint64_t requiredServiceBits) const { + //use default host for non-filter-capable seeds or if we use the default service bits (NODE_NETWORK) + if (!supportsServiceBitsFiltering || requiredServiceBits == NODE_NETWORK) + return host; + + return strprintf("x%x.%s", requiredServiceBits, host); +} + static CBlock CreateGenesisBlock(const char* pszTimestamp, const CScript& genesisOutputScript, uint32_t nTime, uint32_t nNonce, uint32_t nBits, int32_t nVersion, const CAmount& genesisReward) { CMutableTransaction txNew; @@ -328,6 +336,7 @@ public: vFixedSeeds.clear(); vSeeds.clear(); + // nodes with support for servicebits filtering should be at the top vSeeds.push_back(CDNSSeedData("dashdot.io", "testnet-seed.dashdot.io")); vSeeds.push_back(CDNSSeedData("masternode.io", "test.dnsseed.masternode.io")); diff --git a/src/chainparams.h b/src/chainparams.h index 973c7c9eb..ed1d1abca 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -13,9 +13,12 @@ #include -struct CDNSSeedData { +class CDNSSeedData { +public: std::string name, host; - CDNSSeedData(const std::string &strName, const std::string &strHost) : name(strName), host(strHost) {} + bool supportsServiceBitsFiltering; + std::string getHost(uint64_t requiredServiceBits) const; + CDNSSeedData(const std::string &strName, const std::string &strHost, bool supportsServiceBitsFilteringIn = false) : name(strName), host(strHost), supportsServiceBitsFiltering(supportsServiceBitsFilteringIn) {} }; struct SeedSpec6 { diff --git a/src/net.cpp b/src/net.cpp index 5d78fb1d5..6bbb43937 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1528,12 +1528,13 @@ void CConnman::ThreadDNSAddressSeed() } else { std::vector vIPs; std::vector vAdd; - if (LookupHost(seed.host.c_str(), vIPs, 0, true)) + ServiceFlags requiredServiceBits = NODE_NETWORK; + if (LookupHost(seed.getHost(requiredServiceBits).c_str(), vIPs, 0, true)) { BOOST_FOREACH(const CNetAddr& ip, vIPs) { int nOneDay = 24*3600; - CAddress addr = CAddress(CService(ip, Params().GetDefaultPort()), NODE_NETWORK); + CAddress addr = CAddress(CService(ip, Params().GetDefaultPort()), requiredServiceBits); addr.nTime = GetTime() - 3*nOneDay - GetRand(4*nOneDay); // use a random age between 3 and 7 days old vAdd.push_back(addr); found++;