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.
251BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");252subnet = LookupSubNet("1.2.3.4/255.255.255.254");253BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/31");254subnet = LookupSubNet("1.2.3.4/255.255.255.252");255BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/30");256subnet = LookupSubNet("1.2.3.4/255.255.255.248");257BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/29");258subnet = LookupSubNet("1.2.3.4/255.255.255.240");259BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/28");260subnet = LookupSubNet("1.2.3.4/255.255.255.224");261BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/27");262subnet = LookupSubNet("1.2.3.4/255.255.255.192");263BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/26");264subnet = LookupSubNet("1.2.3.4/255.255.255.128");265BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/25");266subnet = LookupSubNet("1.2.3.4/255.255.255.0");267BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/24");268subnet = LookupSubNet("1.2.3.4/255.255.254.0");269BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.2.0/23");270subnet = LookupSubNet("1.2.3.4/255.255.252.0");271BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/22");272subnet = LookupSubNet("1.2.3.4/255.255.248.0");273BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/21");274subnet = LookupSubNet("1.2.3.4/255.255.240.0");275BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/20");276subnet = LookupSubNet("1.2.3.4/255.255.224.0");277BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/19");278subnet = LookupSubNet("1.2.3.4/255.255.192.0");279BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/18");280subnet = LookupSubNet("1.2.3.4/255.255.128.0");281BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/17");282subnet = LookupSubNet("1.2.3.4/255.255.0.0");283BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/16");284subnet = LookupSubNet("1.2.3.4/255.254.0.0");285BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/15");286subnet = LookupSubNet("1.2.3.4/255.252.0.0");287BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/14");288subnet = LookupSubNet("1.2.3.4/255.248.0.0");289BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/13");290subnet = LookupSubNet("1.2.3.4/255.240.0.0");291BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/12");292subnet = LookupSubNet("1.2.3.4/255.224.0.0");293BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/11");294subnet = LookupSubNet("1.2.3.4/255.192.0.0");295BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/10");296subnet = LookupSubNet("1.2.3.4/255.128.0.0");297BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/9");298subnet = LookupSubNet("1.2.3.4/255.0.0.0");299BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");300subnet = LookupSubNet("1.2.3.4/254.0.0.0");301BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/7");302subnet = LookupSubNet("1.2.3.4/252.0.0.0");303BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/6");304subnet = LookupSubNet("1.2.3.4/248.0.0.0");305BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/5");306subnet = LookupSubNet("1.2.3.4/240.0.0.0");307BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/4");308subnet = LookupSubNet("1.2.3.4/224.0.0.0");309BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/3");310subnet = LookupSubNet("1.2.3.4/192.0.0.0");311BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/2");312subnet = LookupSubNet("1.2.3.4/128.0.0.0");313BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/1");314subnet = LookupSubNet("1.2.3.4/0.0.0.0");315BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");317subnet = LookupSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");318BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/128");319subnet = LookupSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");320BOOST_CHECK_EQUAL(subnet.ToString(), "1::/16");321subnet = LookupSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");322BOOST_CHECK_EQUAL(subnet.ToString(), "::/0");323// Invalid netmasks (with 1-bits after 0-bits)324subnet = LookupSubNet("1.2.3.4/255.255.232.0");325BOOST_CHECK(!subnet.IsValid());326subnet = LookupSubNet("1.2.3.4/255.0.255.255");327BOOST_CHECK(!subnet.IsValid());328subnet = LookupSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");329BOOST_CHECK(!subnet.IsValid());330}332BOOST_AUTO_TEST_CASE(netbase_getgroup)333{334auto netgroupman{NetGroupManager::NoAsmap()}; // use /16335BOOST_CHECK(netgroupman.GetGroup(ResolveIP("127.0.0.1")) == std::vector<unsigned char>({0})); // Local -> !Routable()336BOOST_CHECK(netgroupman.GetGroup(ResolveIP("257.0.0.1")) == std::vector<unsigned char>({0})); // !Valid -> !Routable()337BOOST_CHECK(netgroupman.GetGroup(ResolveIP("10.0.0.1")) == std::vector<unsigned char>({0})); // RFC1918 -> !Routable()338BOOST_CHECK(netgroupman.GetGroup(ResolveIP("169.254.1.1")) == std::vector<unsigned char>({0})); // RFC3927 -> !Routable()339BOOST_CHECK(netgroupman.GetGroup(ResolveIP("1.2.3.4")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // IPv4340BOOST_CHECK(netgroupman.GetGroup(ResolveIP("::FFFF:0:102:304")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6145341BOOST_CHECK(netgroupman.GetGroup(ResolveIP("64:FF9B::102:304")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6052342BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2002:102:304:9999:9999:9999:9999:9999")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC3964343BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2001:0:9999:9999:9999:9999:FEFD:FCFB")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC4380344BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2001:470:abcd:9999:9999:9999:9999:9999")) == std::vector<unsigned char>({(unsigned char)NET_IPV6, 32, 1, 4, 112, 175})); //he.net345BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2001:2001:9999:9999:9999:9999:9999:9999")) == std::vector<unsigned char>({(unsigned char)NET_IPV6, 32, 1, 32, 1})); //IPv6347// baz.net sha256 hash: 12929400eb4607c4ac075f087167e75286b179c693eb059a01774b864e8fe505348std::vector<unsigned char> internal_group = {NET_INTERNAL, 0x12, 0x92, 0x94, 0x00, 0xeb, 0x46, 0x07, 0xc4, 0xac, 0x07};349BOOST_CHECK(netgroupman.GetGroup(CreateInternal("baz.net")) == internal_group);350}352BOOST_AUTO_TEST_CASE(netbase_parsenetwork)353{354BOOST_CHECK_EQUAL(ParseNetwork("ipv4"), NET_IPV4);355BOOST_CHECK_EQUAL(ParseNetwork("ipv6"), NET_IPV6);356BOOST_CHECK_EQUAL(ParseNetwork("onion"), NET_ONION);357BOOST_CHECK_EQUAL(ParseNetwork("cjdns"), NET_CJDNS);359BOOST_CHECK_EQUAL(ParseNetwork("IPv4"), NET_IPV4);360BOOST_CHECK_EQUAL(ParseNetwork("IPv6"), NET_IPV6);361BOOST_CHECK_EQUAL(ParseNetwork("ONION"), NET_ONION);362BOOST_CHECK_EQUAL(ParseNetwork("CJDNS"), NET_CJDNS);364// "tor" as a network specification was deprecated in 60dc8e4208 in favor of365// "onion" and later removed.366BOOST_CHECK_EQUAL(ParseNetwork("tor"), NET_UNROUTABLE);367BOOST_CHECK_EQUAL(ParseNetwork("TOR"), NET_UNROUTABLE);369BOOST_CHECK_EQUAL(ParseNetwork(":)"), NET_UNROUTABLE);370BOOST_CHECK_EQUAL(ParseNetwork("oniÖn"), NET_UNROUTABLE);371BOOST_CHECK_EQUAL(ParseNetwork("\xfe\xff"), NET_UNROUTABLE);372BOOST_CHECK_EQUAL(ParseNetwork(""), NET_UNROUTABLE);373}375BOOST_AUTO_TEST_CASE(netpermissions_test)376{377bilingual_str error;378NetWhitebindPermissions whitebindPermissions;379NetWhitelistPermissions whitelistPermissions;380ConnectionDirection connection_direction;382// Detect invalid white bind383BOOST_CHECK(!NetWhitebindPermissions::TryParse("", whitebindPermissions, error));384BOOST_CHECK(error.original.find("Cannot resolve -whitebind address") != std::string::npos);385BOOST_CHECK(!NetWhitebindPermissions::TryParse("127.0.0.1", whitebindPermissions, error));386BOOST_CHECK(error.original.find("Need to specify a port with -whitebind") != std::string::npos);387BOOST_CHECK(!NetWhitebindPermissions::TryParse("", whitebindPermissions, error));389// If no permission flags, assume backward compatibility390BOOST_CHECK(NetWhitebindPermissions::TryParse("1.2.3.4:32", whitebindPermissions, error));391BOOST_CHECK(error.empty());392BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);393BOOST_CHECK(NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));394NetPermissions::ClearFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);395BOOST_CHECK(!NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));396BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);397NetPermissions::AddFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);398BOOST_CHECK(NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));400// Can set one permission401BOOST_CHECK(NetWhitebindPermissions::TryParse("[email protected]:32", whitebindPermissions, error));402BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter);403BOOST_CHECK(NetWhitebindPermissions::TryParse("@1.2.3.4:32", whitebindPermissions, error));404BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);406NetWhitebindPermissions noban, noban_download, download_noban, download;408// "noban" implies "download"409BOOST_REQUIRE(NetWhitebindPermissions::TryParse("[email protected]:32", noban, error));410BOOST_CHECK_EQUAL(noban.m_flags, NetPermissionFlags::NoBan);411BOOST_CHECK(NetPermissions::HasFlag(noban.m_flags, NetPermissionFlags::Download));412BOOST_CHECK(NetPermissions::HasFlag(noban.m_flags, NetPermissionFlags::NoBan));414// "noban,download" is equivalent to "noban"415BOOST_REQUIRE(NetWhitebindPermissions::TryParse("noban,[email protected]:32", noban_download, error));416BOOST_CHECK_EQUAL(noban_download.m_flags, noban.m_flags);418// "download,noban" is equivalent to "noban"419BOOST_REQUIRE(NetWhitebindPermissions::TryParse("download,[email protected]:32", download_noban, error));420BOOST_CHECK_EQUAL(download_noban.m_flags, noban.m_flags);422// "download" excludes (does not imply) "noban"423BOOST_REQUIRE(NetWhitebindPermissions::TryParse("[email protected]:32", download, error));424BOOST_CHECK_EQUAL(download.m_flags, NetPermissionFlags::Download);425BOOST_CHECK(NetPermissions::HasFlag(download.m_flags, NetPermissionFlags::Download));426BOOST_CHECK(!NetPermissions::HasFlag(download.m_flags, NetPermissionFlags::NoBan));428// Happy path, can parse flags429BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,[email protected]:32", whitebindPermissions, error));430// forcerelay should also activate the relay permission431BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::ForceRelay | NetPermissionFlags::Relay);432BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,[email protected]:32", whitebindPermissions, error));433BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan);434BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,forcerelay,[email protected]:32", whitebindPermissions, error));435BOOST_CHECK(NetWhitebindPermissions::TryParse("[email protected]:32", whitebindPermissions, error));436BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::All);438// Allow dups439BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,noban,[email protected]:32", whitebindPermissions, error));440BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan | NetPermissionFlags::Download); // "noban" implies "download"442// Allow empty443BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,,[email protected]:32", whitebindPermissions, error));444BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan);445BOOST_CHECK(NetWhitebindPermissions::TryParse(",@1.2.3.4:32", whitebindPermissions, error));446BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);447BOOST_CHECK(NetWhitebindPermissions::TryParse(",,@1.2.3.4:32", whitebindPermissions, error));448BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);450BOOST_CHECK(!NetWhitebindPermissions::TryParse("out,[email protected]:32", whitebindPermissions, error));451BOOST_CHECK(error.original.find("whitebind may only be used for incoming connections (\"out\" was passed)") != std::string::npos);453// Detect invalid flag454BOOST_CHECK(!NetWhitebindPermissions::TryParse("bloom,forcerelay,[email protected]:32", whitebindPermissions, error));455BOOST_CHECK(error.original.find("Invalid P2P permission") != std::string::npos);457// Check netmask error458BOOST_CHECK(!NetWhitelistPermissions::TryParse("bloom,forcerelay,[email protected]:32", whitelistPermissions, connection_direction, error));459BOOST_CHECK(error.original.find("Invalid netmask specified in -whitelist") != std::string::npos);461// Happy path for whitelist parsing462BOOST_CHECK(NetWhitelistPermissions::TryParse("[email protected]", whitelistPermissions, connection_direction, error));463BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::NoBan);464BOOST_CHECK(NetPermissions::HasFlag(whitelistPermissions.m_flags, NetPermissionFlags::NoBan));466BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,[email protected]/32", whitelistPermissions, connection_direction, error));467BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::ForceRelay | NetPermissionFlags::NoBan | NetPermissionFlags::Relay);468BOOST_CHECK(error.empty());469BOOST_CHECK_EQUAL(whitelistPermissions.m_subnet.ToString(), "1.2.3.4/32");470BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay,[email protected]/32", whitelistPermissions, connection_direction, error));471BOOST_CHECK(NetWhitelistPermissions::TryParse("in,[email protected]", whitelistPermissions, connection_direction, error));472BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::In);473BOOST_CHECK(NetWhitelistPermissions::TryParse("out,[email protected]", whitelistPermissions, connection_direction, error));474BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::Out);475BOOST_CHECK(NetWhitelistPermissions::TryParse("in,out,[email protected]", whitelistPermissions, connection_direction, error));476BOOST_CHECK_EQUAL(connection_direction, ConnectionDirection::Both);478const auto strings = NetPermissions::ToStrings(NetPermissionFlags::All);479BOOST_CHECK_EQUAL(strings.size(), 7U);480BOOST_CHECK(std::find(strings.begin(), strings.end(), "bloomfilter") != strings.end());481BOOST_CHECK(std::find(strings.begin(), strings.end(), "forcerelay") != strings.end());482BOOST_CHECK(std::find(strings.begin(), strings.end(), "relay") != strings.end());483BOOST_CHECK(std::find(strings.begin(), strings.end(), "noban") != strings.end());484BOOST_CHECK(std::find(strings.begin(), strings.end(), "mempool") != strings.end());485BOOST_CHECK(std::find(strings.begin(), strings.end(), "download") != strings.end());486BOOST_CHECK(std::find(strings.begin(), strings.end(), "addr") != strings.end());487}489BOOST_AUTO_TEST_CASE(netbase_dont_resolve_strings_with_embedded_nul_characters)490{491BOOST_CHECK(LookupHost("127.0.0.1"s, false).has_value());492BOOST_CHECK(!LookupHost("127.0.0.1\0"s, false).has_value());493BOOST_CHECK(!LookupHost("127.0.0.1\0example.com"s, false).has_value());494BOOST_CHECK(!LookupHost("127.0.0.1\0example.com\0"s, false).has_value());496BOOST_CHECK(LookupSubNet("1.2.3.0/24"s).IsValid());497BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0"s).IsValid());498BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0example.com"s).IsValid());499BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0example.com\0"s).IsValid());500BOOST_CHECK(LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"s).IsValid());
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.