Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
501BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0"s).IsValid());502BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0example.com"s).IsValid());503BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0example.com\0"s).IsValid());504}506// Since CNetAddr (un)ser is tested separately in net_tests.cpp here we only507// try a few edge cases for port, service flags and time.509static const std::vector<CAddress> fixture_addresses({510CAddress{511CService(CNetAddr(in6_addr(COMPAT_IN6ADDR_LOOPBACK_INIT)), 0 /* port */),512NODE_NONE,513NodeSeconds{0x4966bc61s}, /* Fri Jan 9 02:54:25 UTC 2009 */514},515CAddress{516CService(CNetAddr(in6_addr(COMPAT_IN6ADDR_LOOPBACK_INIT)), 0x00f1 /* port */),517NODE_NETWORK,518NodeSeconds{0x83766279s}, /* Tue Nov 22 11:22:33 UTC 2039 */519},520CAddress{521CService(CNetAddr(in6_addr(COMPAT_IN6ADDR_LOOPBACK_INIT)), 0xf1f2 /* port */),522static_cast<ServiceFlags>(NODE_WITNESS | NODE_COMPACT_FILTERS | NODE_NETWORK_LIMITED),523NodeSeconds{0xffffffffs}, /* Sun Feb 7 06:28:15 UTC 2106 */524},525});527// fixture_addresses should equal to this when serialized in V1 format.528// When this is unserialized from V1 format it should equal to fixture_addresses.529static constexpr const char* stream_addrv1_hex =530"03" // number of entries532"61bc6649" // time, Fri Jan 9 02:54:25 UTC 2009533"0000000000000000" // service flags, NODE_NONE534"00000000000000000000000000000001" // address, fixed 16 bytes (IPv4 embedded in IPv6)535"0000" // port537"79627683" // time, Tue Nov 22 11:22:33 UTC 2039538"0100000000000000" // service flags, NODE_NETWORK539"00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)540"00f1" // port542"ffffffff" // time, Sun Feb 7 06:28:15 UTC 2106543"4804000000000000" // service flags, NODE_WITNESS | NODE_COMPACT_FILTERS | NODE_NETWORK_LIMITED544"00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)545"f1f2"; // port547// fixture_addresses should equal to this when serialized in V2 format.548// When this is unserialized from V2 format it should equal to fixture_addresses.549static constexpr const char* stream_addrv2_hex =550"03" // number of entries552"61bc6649" // time, Fri Jan 9 02:54:25 UTC 2009553"00" // service flags, COMPACTSIZE(NODE_NONE)554"02" // network id, IPv6555"10" // address length, COMPACTSIZE(16)556"00000000000000000000000000000001" // address557"0000" // port559"79627683" // time, Tue Nov 22 11:22:33 UTC 2039560"01" // service flags, COMPACTSIZE(NODE_NETWORK)561"02" // network id, IPv6562"10" // address length, COMPACTSIZE(16)563"00000000000000000000000000000001" // address564"00f1" // port566"ffffffff" // time, Sun Feb 7 06:28:15 UTC 2106567"fd4804" // service flags, COMPACTSIZE(NODE_WITNESS | NODE_COMPACT_FILTERS | NODE_NETWORK_LIMITED)568"02" // network id, IPv6569"10" // address length, COMPACTSIZE(16)570"00000000000000000000000000000001" // address571"f1f2"; // port573BOOST_AUTO_TEST_CASE(caddress_serialize_v1)574{575DataStream s{};577s << CAddress::V1_NETWORK(fixture_addresses);578BOOST_CHECK_EQUAL(HexStr(s), stream_addrv1_hex);579}581BOOST_AUTO_TEST_CASE(caddress_unserialize_v1)582{583std::vector<CAddress> addresses_unserialized;585SpanReader{ParseHex(stream_addrv1_hex)} >> CAddress::V1_NETWORK(addresses_unserialized);586BOOST_CHECK(fixture_addresses == addresses_unserialized);587}589BOOST_AUTO_TEST_CASE(caddress_serialize_v2)590{591DataStream s{};593s << CAddress::V2_NETWORK(fixture_addresses);594BOOST_CHECK_EQUAL(HexStr(s), stream_addrv2_hex);595}597BOOST_AUTO_TEST_CASE(caddress_unserialize_v2)598{599std::vector<CAddress> addresses_unserialized;601SpanReader{ParseHex(stream_addrv2_hex)} >> CAddress::V2_NETWORK(addresses_unserialized);602BOOST_CHECK(fixture_addresses == addresses_unserialized);603}605BOOST_AUTO_TEST_CASE(isbadport)606{607BOOST_CHECK(IsBadPort(1));608BOOST_CHECK(IsBadPort(22));609BOOST_CHECK(IsBadPort(6000));611BOOST_CHECK(!IsBadPort(80));612BOOST_CHECK(!IsBadPort(443));613BOOST_CHECK(!IsBadPort(8333));615// Check all possible ports and ensure we only flag the expected amount as bad616std::list<int> ports(std::numeric_limits<uint16_t>::max());617std::iota(ports.begin(), ports.end(), 1);618BOOST_CHECK_EQUAL(std::ranges::count_if(ports, IsBadPort), 85);619}622BOOST_AUTO_TEST_CASE(asmap_test_vectors)623{624// Randomly generated encoded ASMap with 128 ranges, up to 20-bit AS numbers.625constexpr auto ASMAP_DATA{626"fd38d50f7d5d665357f64bba6bfc190d6078a7e68e5d3ac032edf47f8b5755f87881bfd3633d9aa7c1fa279b3"627"6fe26c63bbc9de44e0f04e5a382d8e1cddbe1c26653bc939d4327f287e8b4d1f8aff33176787cb0ff7cb28e3f"628"daef0f8f47357f801c9f7ff7a99f7f9c9f99de7f3156ae00f23eb27a303bc486aa3ccc31ec19394c2f8a53ddd"629"ea3cc56257f3b7e9b1f488be9c1137db823759aa4e071eef2e984aaf97b52d5f88d0f373dd190fe45e06efef1"630"df7278be680a73a74c76db4dd910f1d30752c57fe2bc9f079f1a1e1b036c2a69219f11c5e11980a3fa51f4f82"631"d36373de73b1863a8c27e36ae0e4f705be3d76ecff038a75bc0f92ba7e7f6f4080f1c47c34d095367ecf4406c"632"1e3bbc17ba4d6f79ea3f031b876799ac268b1e0ea9babf0f9a8e5f6c55e363c6363df46afc696d7afceaf49b6"633"e62df9e9dc27e70664cafe5c53df66dd0b8237678ada90e73f05ec60e6f6e96c3cbb1ea2f9dece115d5bdba10"634"33e53662a7d72a29477b5beb35710591d3e23e5f0379baea62ffdee535bcdf879cbf69b88d7ea37c8015381cf"635"63dc33d28f757a4a5e15d6a08"_hex};637// Construct NetGroupManager with this data.638auto netgroup{NetGroupManager::WithEmbeddedAsmap(ASMAP_DATA)};639BOOST_CHECK(netgroup.UsingASMap());641// Check some randomly-generated IPv6 addresses in it (biased towards the very beginning and642// very end of the 128-bit range).643BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("0:1559:183:3728:224c:65a5:62e6:e991", false)), 961340);644BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("d0:d493:faa0:8609:e927:8b75:293c:f5a4", false)), 961340);645BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("2a0:26f:8b2c:2ee7:c7d1:3b24:4705:3f7f", false)), 693761);646BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("a77:7cd4:4be5:a449:89f2:3212:78c6:ee38", false)), 0);647BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("1336:1ad6:2f26:4fe3:d809:7321:6e0d:4615", false)), 672176);648BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("1d56:abd0:a52f:a8d5:d5a7:a610:581d:d792", false)), 499880);649BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("378e:7290:54e5:bd36:4760:971c:e9b9:570d", false)), 0);650BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("406c:820b:272a:c045:b74e:fc0a:9ef2:cecc", false)), 248495);651BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("46c2:ae07:9d08:2d56:d473:2bc7:57e3:20ac", false)), 248495);652BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("50d2:3db6:52fa:2e7:12ec:5bc4:1bd1:49f9", false)), 124471);653BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("53e1:1812:ffa:dccf:f9f2:64be:75fa:795", false)), 539993);654BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("544d:eeba:3990:35d1:ad66:f9a3:576d:8617", false)), 374443);655BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("6a53:40dc:8f1d:3ffa:efeb:3aa3:df88:b94b", false)), 435070);656BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("87aa:d1c9:9edb:91e7:aab1:9eb9:baa0:de18", false)), 244121);657BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("9f00:48fa:88e3:4b67:a6f3:e6d2:5cc1:5be2", false)), 862116);658BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("c49f:9cc6:86ad:ba08:4580:315e:dbd1:8a62", false)), 969411);659BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("dff5:8021:61d:b17d:406d:7888:fdac:4a20", false)), 969411);660BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("e888:6791:2960:d723:bcfd:47e1:2d8c:599f", false)), 824019);661BOOST_CHECK_EQUAL(netgroup.GetMappedAS(*LookupHost("ffff:d499:8c4b:4941:bc81:d5b9:b51e:85a8", false)), 824019);662}664BOOST_AUTO_TEST_SUITE_END()
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.