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) 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 <util/asmap.h>7#include <bench/bench.h>8#include <netaddress.h>9#include <netbase.h>10#include <netgroup.h>11#include <node/data/ip_asn.dat.h>12#include <random.h>13#include <util/check.h>15#include <algorithm>16#include <array>17#include <cstddef>18#include <optional>19#include <span>20#include <string>21#include <vector>23static void BenchGetMappedAS(benchmark::Bench& bench, std::span<const CNetAddr> addrs, bool check = true)24{25std::span<const std::byte> asmap{node::data::ip_asn};26assert(!asmap.empty() && CheckStandardAsmap(asmap));27auto netgroupman{NetGroupManager::WithEmbeddedAsmap(asmap)};29bench.batch(addrs.size()).run([&] {30for (const CNetAddr& addr : addrs) {31// The embedded ASMap file might change over time and cause some32// addresses to become unmapped. We check the mapping to ensure33// the addresses are actually mapped.34assert((netgroupman.GetMappedAS(addr) > 0) == check);35}36});37}39static CNetAddr LookupAddr(const std::string& address) { return LookupHost(address, /*fAllowLookup=*/false).value(); }41static void ASMapGetMappedASQuad9v4(benchmark::Bench& bench)42{43std::vector<CNetAddr> addrs{LookupAddr("9.9.9.9")};44BenchGetMappedAS(bench, addrs);45}47static void ASMapGetMappedASQuad9v6(benchmark::Bench& bench)48{49std::vector<CNetAddr> addrs{LookupAddr("2620:fe::fe")};50BenchGetMappedAS(bench, addrs);51}53static void ASMapGetMappedASCloudflarev4(benchmark::Bench& bench)54{55std::vector<CNetAddr> addrs{LookupAddr("1.1.1.1")};56BenchGetMappedAS(bench, addrs);57}59static void ASMapGetMappedASCloudflarev6(benchmark::Bench& bench)60{61std::vector<CNetAddr> addrs{LookupAddr("2606:4700:4700::1111")};62BenchGetMappedAS(bench, addrs);63}65static void ASMapGetMappedASGooglev4(benchmark::Bench& bench)66{67std::vector<CNetAddr> addrs{LookupAddr("8.8.8.8")};68BenchGetMappedAS(bench, addrs);69}71static void ASMapGetMappedASGooglev6(benchmark::Bench& bench)72{73std::vector<CNetAddr> addrs{LookupAddr("2001:4860:4860::8888")};74BenchGetMappedAS(bench, addrs);75}77static void ASMapGetMappedASUnmappedv4(benchmark::Bench& bench)78{79// Reserved as per RFC 5737 (unmapped)80std::vector<CNetAddr> addrs{LookupAddr("203.0.113.0")};81BenchGetMappedAS(bench, addrs, /*check=*/false);82}84static void ASMapGetMappedASUnmappedv6(benchmark::Bench& bench)85{86// Reserved as per RFC 9637 (unmapped)87std::vector<CNetAddr> addrs{LookupAddr("3fff::1")};88BenchGetMappedAS(bench, addrs, /*check=*/false);89}91static void ASMapGetMappedASMulti(benchmark::Bench& bench)92{93// A list of 25 IPv4 and 25 IPv6 addresses randomly sampled across94// 50 ASNs to have a mix of different lookup times. These have been95// masked to /24 and /64 respectively. Some of these could become96// unmapped when updating the embedded ASMap file, which will cause97// the benchmarks to assert and the IPs will need to be changed out.98std::array addrs{99LookupAddr("5.8.10.1"),100LookupAddr("14.53.20.1"),101LookupAddr("34.86.160.1"),102LookupAddr("67.68.205.1"),103LookupAddr("68.163.58.1"),104LookupAddr("69.138.189.1"),105LookupAddr("72.211.58.1"),106LookupAddr("73.124.158.1"),107LookupAddr("77.179.43.1"),108LookupAddr("80.79.125.1"),109LookupAddr("81.217.170.1"),110LookupAddr("82.216.149.1"),111LookupAddr("84.52.201.1"),112LookupAddr("87.184.174.1"),113LookupAddr("90.221.151.1"),114LookupAddr("95.31.136.1"),115LookupAddr("99.234.174.1"),116LookupAddr("105.98.199.1"),117LookupAddr("146.190.174.1"),118LookupAddr("154.16.157.1"),119LookupAddr("172.81.183.1"),120LookupAddr("173.24.74.1"),121LookupAddr("195.99.226.1"),122LookupAddr("213.197.14.1"),123LookupAddr("220.255.248.1"),125LookupAddr("2001:16a2:c0b0:58b7::1"),126LookupAddr("2001:67c:e60:c0c::1"),127LookupAddr("2001:99a:213:27f0::1"),128LookupAddr("2001:9e8:894b:be00::1"),129LookupAddr("2406:2d40:1ebc:3508::1"),130LookupAddr("2600:1015:a020:1e00::1"),131LookupAddr("2600:1700:4228:a800::1"),132LookupAddr("2601:603:5000:3309::1"),133LookupAddr("2601:cd:ce01:9610::1"),134LookupAddr("2603:800c:25f0:8350::1"),135LookupAddr("2604:3d09:f89:d100::1"),136LookupAddr("2607:fb90:236f:821f::1"),137LookupAddr("2800:2331:5440:ba3::1"),138LookupAddr("2a00:16e0:1012:c108::1"),139LookupAddr("2a00:23c6:9d44:7801::1"),140LookupAddr("2a00:79c0:609:4900::1"),141LookupAddr("2a01:4f8:13a:1f8d::1"),142LookupAddr("2a01:e0a:8a3:ab90::1"),143LookupAddr("2a02:810b:449e:c900::1"),144LookupAddr("2a02:8308:20d:e800::1"),145LookupAddr("2a0a:ef40:331:4401::1"),146LookupAddr("2a0c:5a86:a002:e700::1"),147LookupAddr("2a10:3781:1d7:1::1"),148LookupAddr("2a12:26c0:3303:a100::1"),149LookupAddr("2a12:a800:2:1::1"),150};152FastRandomContext rng{/*fDeterministic=*/true};153std::ranges::shuffle(addrs, rng);155BenchGetMappedAS(bench, addrs, /*check=*/true);156}158BENCHMARK(ASMapGetMappedASQuad9v4);159BENCHMARK(ASMapGetMappedASQuad9v6);160BENCHMARK(ASMapGetMappedASCloudflarev4);161BENCHMARK(ASMapGetMappedASCloudflarev6);162BENCHMARK(ASMapGetMappedASGooglev4);163BENCHMARK(ASMapGetMappedASGooglev6);164BENCHMARK(ASMapGetMappedASUnmappedv4);165BENCHMARK(ASMapGetMappedASUnmappedv6);166BENCHMARK(ASMapGetMappedASMulti);
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.