Bitcoin Core 31.99.0
P2P Digital Currency
asmap.cpp
Go to the documentation of this file.
1// Copyright (c) The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <bench/bench.h>
6#include <netbase.h>
7#include <netgroup.h>
8#include <node/data/ip_asn.dat.h>
9#include <random.h>
10#include <util/asmap.h>
11
12#include <algorithm>
13#include <array>
14#include <cassert>
15#include <span>
16#include <string>
17
18static void BenchGetMappedAS(benchmark::Bench& bench, std::span<const CNetAddr> addrs, bool check = true)
19{
20 std::span<const std::byte> asmap{node::data::ip_asn};
21 assert(!asmap.empty() && CheckStandardAsmap(asmap));
22 auto netgroupman{NetGroupManager::WithEmbeddedAsmap(asmap)};
23
24 bench.batch(addrs.size()).run([&] {
25 for (const CNetAddr& addr : addrs) {
26 // The embedded ASMap file might change over time and cause some
27 // addresses to become unmapped. We check the mapping to ensure
28 // the addresses are actually mapped.
29 assert((netgroupman.GetMappedAS(addr) > 0) == check);
30 }
31 });
32}
33
34static CNetAddr LookupAddr(const std::string& address) { return LookupHost(address, /*fAllowLookup=*/false).value(); }
35
37{
38 std::vector<CNetAddr> addrs{LookupAddr("9.9.9.9")};
39 BenchGetMappedAS(bench, addrs);
40}
41
43{
44 std::vector<CNetAddr> addrs{LookupAddr("2620:fe::fe")};
45 BenchGetMappedAS(bench, addrs);
46}
47
49{
50 std::vector<CNetAddr> addrs{LookupAddr("1.1.1.1")};
51 BenchGetMappedAS(bench, addrs);
52}
53
55{
56 std::vector<CNetAddr> addrs{LookupAddr("2606:4700:4700::1111")};
57 BenchGetMappedAS(bench, addrs);
58}
59
61{
62 std::vector<CNetAddr> addrs{LookupAddr("8.8.8.8")};
63 BenchGetMappedAS(bench, addrs);
64}
65
67{
68 std::vector<CNetAddr> addrs{LookupAddr("2001:4860:4860::8888")};
69 BenchGetMappedAS(bench, addrs);
70}
71
73{
74 // Reserved as per RFC 5737 (unmapped)
75 std::vector<CNetAddr> addrs{LookupAddr("203.0.113.0")};
76 BenchGetMappedAS(bench, addrs, /*check=*/false);
77}
78
80{
81 // Reserved as per RFC 9637 (unmapped)
82 std::vector<CNetAddr> addrs{LookupAddr("3fff::1")};
83 BenchGetMappedAS(bench, addrs, /*check=*/false);
84}
85
87{
88 // A list of 25 IPv4 and 25 IPv6 addresses randomly sampled across
89 // 50 ASNs to have a mix of different lookup times. These have been
90 // masked to /24 and /64 respectively. Some of these could become
91 // unmapped when updating the embedded ASMap file, which will cause
92 // the benchmarks to assert and the IPs will need to be changed out.
93 std::array addrs{
94 LookupAddr("5.8.10.1"),
95 LookupAddr("14.53.20.1"),
96 LookupAddr("34.86.160.1"),
97 LookupAddr("67.68.205.1"),
98 LookupAddr("68.163.58.1"),
99 LookupAddr("69.138.189.1"),
100 LookupAddr("72.211.58.1"),
101 LookupAddr("73.124.158.1"),
102 LookupAddr("77.179.43.1"),
103 LookupAddr("80.79.125.1"),
104 LookupAddr("81.217.170.1"),
105 LookupAddr("82.216.149.1"),
106 LookupAddr("84.52.201.1"),
107 LookupAddr("87.184.174.1"),
108 LookupAddr("90.221.151.1"),
109 LookupAddr("95.31.136.1"),
110 LookupAddr("99.234.174.1"),
111 LookupAddr("105.98.199.1"),
112 LookupAddr("146.190.174.1"),
113 LookupAddr("154.16.157.1"),
114 LookupAddr("172.81.183.1"),
115 LookupAddr("173.24.74.1"),
116 LookupAddr("195.99.226.1"),
117 LookupAddr("213.197.14.1"),
118 LookupAddr("220.255.248.1"),
119
120 LookupAddr("2001:16a2:c0b0:58b7::1"),
121 LookupAddr("2001:67c:e60:c0c::1"),
122 LookupAddr("2001:99a:213:27f0::1"),
123 LookupAddr("2001:9e8:894b:be00::1"),
124 LookupAddr("2406:2d40:1ebc:3508::1"),
125 LookupAddr("2600:1015:a020:1e00::1"),
126 LookupAddr("2600:1700:4228:a800::1"),
127 LookupAddr("2601:603:5000:3309::1"),
128 LookupAddr("2601:cd:ce01:9610::1"),
129 LookupAddr("2603:800c:25f0:8350::1"),
130 LookupAddr("2604:3d09:f89:d100::1"),
131 LookupAddr("2607:fb90:236f:821f::1"),
132 LookupAddr("2800:2331:5440:ba3::1"),
133 LookupAddr("2a00:16e0:1012:c108::1"),
134 LookupAddr("2a00:23c6:9d44:7801::1"),
135 LookupAddr("2a00:79c0:609:4900::1"),
136 LookupAddr("2a01:4f8:13a:1f8d::1"),
137 LookupAddr("2a01:e0a:8a3:ab90::1"),
138 LookupAddr("2a02:810b:449e:c900::1"),
139 LookupAddr("2a02:8308:20d:e800::1"),
140 LookupAddr("2a0a:ef40:331:4401::1"),
141 LookupAddr("2a0c:5a86:a002:e700::1"),
142 LookupAddr("2a10:3781:1d7:1::1"),
143 LookupAddr("2a12:26c0:3303:a100::1"),
144 LookupAddr("2a12:a800:2:1::1"),
145 };
146
147 FastRandomContext rng{/*fDeterministic=*/true};
148 std::ranges::shuffle(addrs, rng);
149
150 BenchGetMappedAS(bench, addrs, /*check=*/true);
151}
152
static CNetAddr LookupAddr(const std::string &address)
Definition: asmap.cpp:34
static void ASMapGetMappedASUnmappedv4(benchmark::Bench &bench)
Definition: asmap.cpp:72
static void ASMapGetMappedASQuad9v4(benchmark::Bench &bench)
Definition: asmap.cpp:36
static void ASMapGetMappedASCloudflarev4(benchmark::Bench &bench)
Definition: asmap.cpp:48
static void BenchGetMappedAS(benchmark::Bench &bench, std::span< const CNetAddr > addrs, bool check=true)
Definition: asmap.cpp:18
static void ASMapGetMappedASUnmappedv6(benchmark::Bench &bench)
Definition: asmap.cpp:79
static void ASMapGetMappedASCloudflarev6(benchmark::Bench &bench)
Definition: asmap.cpp:54
static void ASMapGetMappedASGooglev4(benchmark::Bench &bench)
Definition: asmap.cpp:60
BENCHMARK(ASMapGetMappedASQuad9v4)
static void ASMapGetMappedASGooglev6(benchmark::Bench &bench)
Definition: asmap.cpp:66
static void ASMapGetMappedASMulti(benchmark::Bench &bench)
Definition: asmap.cpp:86
static void ASMapGetMappedASQuad9v6(benchmark::Bench &bench)
Definition: asmap.cpp:42
Network address.
Definition: netaddress.h:113
Fast randomness source.
Definition: random.h:386
static NetGroupManager WithEmbeddedAsmap(std::span< const std::byte > asmap)
Definition: netgroup.h:24
Main entry point to nanobench's benchmarking facility.
Definition: nanobench.h:633
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition: nanobench.h:1292
Bench & batch(T b) noexcept
Sets the batch size.
Definition: nanobench.h:1316
T check(T ptr)
std::vector< CNetAddr > LookupHost(const std::string &name, unsigned int nMaxSolutions, bool fAllowLookup, DNSLookupFn dns_lookup_function)
Resolve a host string to its corresponding network addresses.
Definition: netbase.cpp:173
bool CheckStandardAsmap(const std::span< const std::byte > data)
Provides a safe interface for validating ASMap data before use.
Definition: asmap.cpp:308
assert(!tx.IsCoinBase())