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.
1// Copyright (c) 2012-present The Bitcoin Core developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.5#include <addrman.h>6#include <bip324.h>7#include <chainparams.h>8#include <clientversion.h>9#include <common/args.h>10#include <compat/compat.h>11#include <net.h>12#include <net_processing.h>13#include <netaddress.h>14#include <netbase.h>15#include <netmessagemaker.h>16#include <node/protocol_version.h>17#include <serialize.h>18#include <span.h>19#include <streams.h>20#include <test/util/common.h>21#include <test/util/net.h>22#include <test/util/random.h>23#include <test/util/setup_common.h>24#include <test/util/validation.h>25#include <util/strencodings.h>26#include <util/string.h>27#include <validation.h>29#include <boost/test/unit_test.hpp>31#include <algorithm>32#include <cstdint>33#include <ios>34#include <memory>35#include <optional>36#include <string>38using namespace std::literals;39using namespace util::hex_literals;40using util::ToString;42BOOST_FIXTURE_TEST_SUITE(net_tests, RegTestingSetup)44BOOST_AUTO_TEST_CASE(cnode_listen_port)45{46// test default47uint16_t port{GetListenPort()};48BOOST_CHECK(port == Params().GetDefaultPort());49// test set port50uint16_t altPort = 12345;51BOOST_CHECK(gArgs.SoftSetArg("-port", ToString(altPort)));52port = GetListenPort();53BOOST_CHECK(port == altPort);54}56BOOST_AUTO_TEST_CASE(cnode_simple_test)57{58NodeId id = 0;60in_addr ipv4Addr;61ipv4Addr.s_addr = 0xa0b0c001;63CAddress addr = CAddress(CService(ipv4Addr, 7777), NODE_NETWORK);64std::string pszDest;66std::unique_ptr<CNode> pnode1 = std::make_unique<CNode>(id++,67/*sock=*/nullptr,68addr,69/*nKeyedNetGroupIn=*/0,70/*nLocalHostNonceIn=*/0,71CAddress(),72pszDest,73ConnectionType::OUTBOUND_FULL_RELAY,74/*inbound_onion=*/false,75/*network_key=*/0);76BOOST_CHECK(pnode1->IsFullOutboundConn() == true);77BOOST_CHECK(pnode1->IsManualConn() == false);78BOOST_CHECK(pnode1->IsBlockOnlyConn() == false);79BOOST_CHECK(pnode1->IsFeelerConn() == false);80BOOST_CHECK(pnode1->IsAddrFetchConn() == false);81BOOST_CHECK(pnode1->IsInboundConn() == false);82BOOST_CHECK(pnode1->m_inbound_onion == false);83BOOST_CHECK_EQUAL(pnode1->ConnectedThroughNetwork(), Network::NET_IPV4);85std::unique_ptr<CNode> pnode2 = std::make_unique<CNode>(id++,86/*sock=*/nullptr,87addr,88/*nKeyedNetGroupIn=*/1,89/*nLocalHostNonceIn=*/1,90CAddress(),91pszDest,92ConnectionType::INBOUND,93/*inbound_onion=*/false,94/*network_key=*/1);95BOOST_CHECK(pnode2->IsFullOutboundConn() == false);96BOOST_CHECK(pnode2->IsManualConn() == false);97BOOST_CHECK(pnode2->IsBlockOnlyConn() == false);98BOOST_CHECK(pnode2->IsFeelerConn() == false);99BOOST_CHECK(pnode2->IsAddrFetchConn() == false);100BOOST_CHECK(pnode2->IsInboundConn() == true);101BOOST_CHECK(pnode2->m_inbound_onion == false);102BOOST_CHECK_EQUAL(pnode2->ConnectedThroughNetwork(), Network::NET_IPV4);104std::unique_ptr<CNode> pnode3 = std::make_unique<CNode>(id++,105/*sock=*/nullptr,106addr,107/*nKeyedNetGroupIn=*/0,108/*nLocalHostNonceIn=*/0,109CAddress(),110pszDest,111ConnectionType::OUTBOUND_FULL_RELAY,112/*inbound_onion=*/false,113/*network_key=*/2);114BOOST_CHECK(pnode3->IsFullOutboundConn() == true);115BOOST_CHECK(pnode3->IsManualConn() == false);116BOOST_CHECK(pnode3->IsBlockOnlyConn() == false);117BOOST_CHECK(pnode3->IsFeelerConn() == false);118BOOST_CHECK(pnode3->IsAddrFetchConn() == false);119BOOST_CHECK(pnode3->IsInboundConn() == false);120BOOST_CHECK(pnode3->m_inbound_onion == false);121BOOST_CHECK_EQUAL(pnode3->ConnectedThroughNetwork(), Network::NET_IPV4);123std::unique_ptr<CNode> pnode4 = std::make_unique<CNode>(id++,124/*sock=*/nullptr,125addr,126/*nKeyedNetGroupIn=*/1,127/*nLocalHostNonceIn=*/1,128CAddress(),129pszDest,130ConnectionType::INBOUND,131/*inbound_onion=*/true,132/*network_key=*/3);133BOOST_CHECK(pnode4->IsFullOutboundConn() == false);134BOOST_CHECK(pnode4->IsManualConn() == false);135BOOST_CHECK(pnode4->IsBlockOnlyConn() == false);136BOOST_CHECK(pnode4->IsFeelerConn() == false);137BOOST_CHECK(pnode4->IsAddrFetchConn() == false);138BOOST_CHECK(pnode4->IsInboundConn() == true);139BOOST_CHECK(pnode4->m_inbound_onion == true);140BOOST_CHECK_EQUAL(pnode4->ConnectedThroughNetwork(), Network::NET_ONION);141}143BOOST_AUTO_TEST_CASE(cnetaddr_basic)144{145CNetAddr addr;147// IPv4, INADDR_ANY148addr = LookupHost("0.0.0.0", false).value();149BOOST_REQUIRE(!addr.IsValid());150BOOST_REQUIRE(addr.IsIPv4());152BOOST_CHECK(addr.IsBindAny());153BOOST_CHECK(addr.IsAddrV1Compatible());154BOOST_CHECK_EQUAL(addr.ToStringAddr(), "0.0.0.0");156// IPv4, INADDR_NONE157addr = LookupHost("255.255.255.255", false).value();158BOOST_REQUIRE(!addr.IsValid());159BOOST_REQUIRE(addr.IsIPv4());161BOOST_CHECK(!addr.IsBindAny());162BOOST_CHECK(addr.IsAddrV1Compatible());163BOOST_CHECK_EQUAL(addr.ToStringAddr(), "255.255.255.255");165// IPv4, casual166addr = LookupHost("12.34.56.78", false).value();167BOOST_REQUIRE(addr.IsValid());168BOOST_REQUIRE(addr.IsIPv4());170BOOST_CHECK(!addr.IsBindAny());171BOOST_CHECK(addr.IsAddrV1Compatible());172BOOST_CHECK_EQUAL(addr.ToStringAddr(), "12.34.56.78");174// IPv6, in6addr_any175addr = LookupHost("::", false).value();176BOOST_REQUIRE(!addr.IsValid());177BOOST_REQUIRE(addr.IsIPv6());179BOOST_CHECK(addr.IsBindAny());180BOOST_CHECK(addr.IsAddrV1Compatible());181BOOST_CHECK_EQUAL(addr.ToStringAddr(), "::");183// IPv6, casual184addr = LookupHost("1122:3344:5566:7788:9900:aabb:ccdd:eeff", false).value();185BOOST_REQUIRE(addr.IsValid());186BOOST_REQUIRE(addr.IsIPv6());188BOOST_CHECK(!addr.IsBindAny());189BOOST_CHECK(addr.IsAddrV1Compatible());190BOOST_CHECK_EQUAL(addr.ToStringAddr(), "1122:3344:5566:7788:9900:aabb:ccdd:eeff");192// IPv6, scoped/link-local. See https://tools.ietf.org/html/rfc4007193// We support non-negative decimal integers (uint32_t) as zone id indices.194// Normal link-local scoped address functionality is to append "%" plus the195// zone id, for example, given a link-local address of "fe80::1" and a zone196// id of "32", return the address as "fe80::1%32".197const std::string link_local{"fe80::1"};198const std::string scoped_addr{link_local + "%32"};199addr = LookupHost(scoped_addr, false).value();200BOOST_REQUIRE(addr.IsValid());201BOOST_REQUIRE(addr.IsIPv6());202BOOST_CHECK(!addr.IsBindAny());203BOOST_CHECK_EQUAL(addr.ToStringAddr(), scoped_addr);205// TORv2, no longer supported206BOOST_CHECK(!addr.SetSpecial("6hzph5hv6337r6p2.onion"));208// TORv3209const char* torv3_addr = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion";210BOOST_REQUIRE(addr.SetSpecial(torv3_addr));211BOOST_REQUIRE(addr.IsValid());212BOOST_REQUIRE(addr.IsTor());214BOOST_CHECK(!addr.IsI2P());215BOOST_CHECK(!addr.IsBindAny());216BOOST_CHECK(!addr.IsAddrV1Compatible());217BOOST_CHECK_EQUAL(addr.ToStringAddr(), torv3_addr);219// TORv3, broken, with wrong checksum220BOOST_CHECK(!addr.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscsad.onion"));222// TORv3, broken, with wrong version223BOOST_CHECK(!addr.SetSpecial("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscrye.onion"));225// TORv3, malicious226BOOST_CHECK(!addr.SetSpecial(std::string{227"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd\0wtf.onion", 66}));229// TOR, bogus length230BOOST_CHECK(!addr.SetSpecial(std::string{"mfrggzak.onion"}));232// TOR, invalid base32233BOOST_CHECK(!addr.SetSpecial(std::string{"mf*g zak.onion"}));235// I2P236const char* i2p_addr = "UDHDrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.I2P";237BOOST_REQUIRE(addr.SetSpecial(i2p_addr));238BOOST_REQUIRE(addr.IsValid());239BOOST_REQUIRE(addr.IsI2P());241BOOST_CHECK(!addr.IsTor());242BOOST_CHECK(!addr.IsBindAny());243BOOST_CHECK(!addr.IsAddrV1Compatible());244BOOST_CHECK_EQUAL(addr.ToStringAddr(), ToLower(i2p_addr));246// I2P, correct length, but decodes to less than the expected number of bytes.247BOOST_CHECK(!addr.SetSpecial("udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jn=.b32.i2p"));249// I2P, extra unnecessary padding250BOOST_CHECK(!addr.SetSpecial("udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna=.b32.i2p"));
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.