19#include <validation.h>
22constexpr uint32_t FUZZ_MAX_HEADERS_RESULTS{16};
26 std::vector<CNode*> m_connections;
29 HeadersSyncSetup(
const ChainType chain_type, TestOpts opts) : TestingSetup(chain_type, opts)
31 PeerManager::Options peerman_opts;
44 m_node.banman.get(), *m_node.chainman,
45 *m_node.mempool, *m_node.warnings, peerman_opts);
47 CConnman::Options options;
49 m_node.connman->Init(options);
53 void SendMessage(FuzzedDataProvider& fuzzed_data_provider, CSerializedNetMsg&& msg)
57void HeadersSyncSetup::ResetAndInitialize()
59 m_connections.clear();
60 auto& connman =
static_cast<ConnmanTestMsg&
>(*m_node.connman);
64 std::vector<ConnectionType> conn_types = {
70 for (
auto conn_type : conn_types) {
72 m_connections.push_back(
new CNode(
id++,
nullptr, addr, 0, 0, addr,
"", conn_type,
false, 0));
73 CNode& p2p_node = *m_connections.back();
83 connman.AddTestNode(p2p_node);
87void HeadersSyncSetup::SendMessage(FuzzedDataProvider& fuzzed_data_provider, CSerializedNetMsg&& msg)
89 auto& connman =
static_cast<ConnmanTestMsg&
>(*m_node.connman);
90 CNode& connection = *
PickValue(fuzzed_data_provider, m_connections);
92 connman.FlushSendBuffer(connection);
93 (void)connman.ReceiveMsgFrom(connection, std::move(msg));
96 connman.ProcessMessagesOnce(connection);
97 }
catch (
const std::ios_base::failure&) {
99 m_node.peerman->SendMessages(connection);
102CBlockHeader ConsumeHeader(FuzzedDataProvider& fuzzed_data_provider,
const uint256& prev_hash, uint32_t prev_nbits)
116 header.
nBits = prev_nbits;
118 arith_uint256 lower_target =
UintToArith256(uint256{
"0000000000000000000342190000000000000000000000000000000000000000"});
119 arith_uint256 upper_target =
UintToArith256(uint256{
"00000000ffff0000000000000000000000000000000000000000000000000000"});
121 header.
nBits = target.GetCompact();
129CBlock ConsumeBlock(FuzzedDataProvider& fuzzed_data_provider,
const uint256& prev_hash, uint32_t prev_nbits)
131 auto header = ConsumeHeader(fuzzed_data_provider, prev_hash, prev_nbits);
134 CBlock block{header};
135 CMutableTransaction tx;
138 tx.
vout[0].nValue = 0;
139 tx.
vin[0].scriptSig.resize(2);
140 block.
vtx.push_back(MakeTransactionRef(tx));
147HeadersSyncSetup* g_testing_setup;
154 .setup_validation_interface =
false,
157 g_testing_setup = setup.get();
175 g_testing_setup->ResetAndInitialize();
181 std::vector<CBlockHeader> all_headers;
184 auto finalized_block = [&]() {
192 fuzzed_data_provider,
195 std::vector<CBlock> headers;
196 headers.resize(FUZZ_MAX_HEADERS_RESULTS);
197 for (
CBlock& header : headers) {
198 header = ConsumeHeader(fuzzed_data_provider, base.
GetHash(), base.
nBits);
203 all_headers.insert(all_headers.end(), headers.begin(), headers.end());
206 g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
210 auto block = finalized_block();
213 all_headers.push_back(block);
216 g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
220 auto block = finalized_block();
222 all_headers.push_back(block);
225 g_testing_setup->SendMessage(fuzzed_data_provider, std::move(headers_msg));
arith_uint256 UintToArith256(const uint256 &a)
std::vector< CTransactionRef > vtx
const CBlock & GenesisBlock() const
CNode(NodeId id, std::shared_ptr< Sock > sock, const CAddress &addrIn, uint64_t nKeyedNetGroupIn, uint64_t nLocalHostNonceIn, const CService &addrBindIn, const std::string &addrNameIn, ConnectionType conn_type_in, bool inbound_onion, uint64_t network_key, CNodeOptions &&node_opts={})
std::atomic_bool fPauseSend
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
const CChainParams & GetParams() const
const arith_uint256 & MinimumChainWork() const
node::BlockManager m_blockman
Helper to initialize the global NodeClock, let a duration elapse, and reset it after use in a test.
Helper to initialize the global MockableSteadyClock, let a duration elapse, and reset it after use in...
static Mutex g_msgproc_mutex
Mutex for anything that is only accessed via the msg processing thread.
static std::unique_ptr< PeerManager > make(CConnman &connman, AddrMan &addrman, BanMan *banman, ChainstateManager &chainman, CTxMemPool &pool, node::Warnings &warnings, Options opts)
256-bit unsigned big integer.
@ BLOCK_RELAY
We use block-relay-only connections to help prevent against partition attacks.
@ OUTBOUND_FULL_RELAY
These are the default connections that we use to connect with the network.
@ INBOUND
Inbound connections are those initiated by a peer.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
CSerializedNetMsg Make(std::string msg_type, Args &&... args)
constexpr const char * HEADERS
The headers message sends one or more block headers to a node which previously requested certain head...
constexpr const char * CMPCTBLOCK
Contains a CBlockHeaderAndShortTxIDs object - providing a header and list of "short txids".
constexpr const char * BLOCK
The block message transmits a single serialized block.
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
constexpr TransactionSerParams TX_WITH_WITNESS
ServiceFlags
nServices flags
constexpr int PROTOCOL_VERSION
network protocol versioning
std::unique_ptr< T > MakeNoLogFileContext(const ChainType chain_type=ChainType::REGTEST, TestOpts opts={})
Make a test setup that has disk access to the debug.log file disabled.
NetEventsInterface * m_msgproc
std::vector< CTxOut > vout
uint32_t max_headers_result
bool ignore_incoming_txs
Whether this node is running in -blocksonly mode.
Testing setup that configures a complete environment.
#define WITH_LOCK(cs, code)
SeedRandomStateForTest(SeedRand::ZEROS)
NodeSeconds ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
void FinalizeHeader(CBlockHeader &header, const ChainstateManager &chainman)
arith_uint256 ConsumeArithUInt256InRange(FuzzedDataProvider &fuzzed_data_provider, const arith_uint256 &min, const arith_uint256 &max) noexcept
@ ZEROS
Seed with a compile time constant of zeros.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
#define NO_THREAD_SAFETY_ANALYSIS
constexpr auto TicksSinceEpoch(Timepoint t)
arith_uint256 CalculateClaimedHeadersWork(std::span< const CBlockHeader > headers)
Return the sum of the claimed work on a given set of headers.