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) 2009-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 <addrdb.h>6#include <addrman.h>7#include <addrman_impl.h>8#include <blockencodings.h>9#include <blockfilter.h>10#include <chain.h>11#include <coins.h>12#include <common/args.h>13#include <compressor.h>14#include <consensus/merkle.h>15#include <key.h>16#include <merkleblock.h>17#include <net.h>18#include <netbase.h>19#include <netgroup.h>20#include <node/blockstorage.h>21#include <node/utxo_snapshot.h>22#include <primitives/block.h>23#include <protocol.h>24#include <psbt.h>25#include <pubkey.h>26#include <script/keyorigin.h>27#include <streams.h>28#include <test/fuzz/fuzz.h>29#include <test/fuzz/util.h>30#include <test/util/setup_common.h>31#include <undo.h>33#include <cstdint>34#include <exception>35#include <optional>36#include <stdexcept>38using kernel::CBlockFileInfo;39using node::SnapshotMetadata;41void initialize_deserialize()42{43static const auto testing_setup = MakeNoLogFileContext<>();44}46#define FUZZ_TARGET_DESERIALIZE(name, code) \47FUZZ_TARGET(name, .init = initialize_deserialize) \48{ \49try { \50code \51} catch (const invalid_fuzzing_input_exception&) { \52} \53}55namespace {57struct invalid_fuzzing_input_exception : public std::exception {58};60template <typename T, typename P>61T Deserialize(DataStream&& ds, const P& params)62{63T obj;64ds >> params(obj);65return obj;66}68template <typename T>69DataStream Serialize(const T& obj)70{71DataStream ds{};72ds << obj;73return ds;74}76template <typename T>77T Deserialize(DataStream ds)78{79T obj;80ds >> obj;81return obj;82}84template <typename T>85void DeserializeFromFuzzingInput(FuzzBufferType buffer, T&& obj)86{87try {88SpanReader{buffer} >> obj;89} catch (const std::ios_base::failure&) {90throw invalid_fuzzing_input_exception();91}92assert(buffer.empty() || !Serialize(obj).empty());93}95template <typename T>96T DeserializeConstructFromFuzzingInput(FuzzBufferType buffer)97{98try {99SpanReader reader{buffer};100T obj(deserialize, reader);101assert(buffer.empty() || !Serialize(obj).empty());102return obj;103} catch (const std::ios_base::failure&) {104throw invalid_fuzzing_input_exception();105}106}108template <typename T, typename P>109void AssertEqualAfterSerializeDeserialize(const T& obj, const P& params)110{111assert(Deserialize<T>(Serialize(params(obj)), params) == obj);112}113template <typename T>114void AssertEqualAfterSerializeDeserialize(const T& obj)115{116assert(Deserialize<T>(Serialize(obj)) == obj);117}119} // namespace121FUZZ_TARGET_DESERIALIZE(block_filter_deserialize, {122BlockFilter block_filter;123DeserializeFromFuzzingInput(buffer, block_filter);124})125FUZZ_TARGET(addr_info_deserialize, .init = initialize_deserialize)126{127FuzzedDataProvider fdp{buffer.data(), buffer.size()};128(void)ConsumeDeserializable<AddrInfo>(fdp, ConsumeDeserializationParams<CAddress::SerParams>(fdp));129}130FUZZ_TARGET_DESERIALIZE(block_file_info_deserialize, {131CBlockFileInfo block_file_info;132DeserializeFromFuzzingInput(buffer, block_file_info);133})134FUZZ_TARGET_DESERIALIZE(block_header_and_short_txids_deserialize, {135CBlockHeaderAndShortTxIDs block_header_and_short_txids;136DeserializeFromFuzzingInput(buffer, block_header_and_short_txids);137})138FUZZ_TARGET_DESERIALIZE(fee_rate_deserialize, {139CFeeRate fee_rate;140DeserializeFromFuzzingInput(buffer, fee_rate);141AssertEqualAfterSerializeDeserialize(fee_rate);142})143FUZZ_TARGET_DESERIALIZE(merkle_block_deserialize, {144CMerkleBlock merkle_block;145DeserializeFromFuzzingInput(buffer, merkle_block);146})147FUZZ_TARGET_DESERIALIZE(out_point_deserialize, {148COutPoint out_point;149DeserializeFromFuzzingInput(buffer, out_point);150AssertEqualAfterSerializeDeserialize(out_point);151})152FUZZ_TARGET_DESERIALIZE(partial_merkle_tree_deserialize, {153CPartialMerkleTree partial_merkle_tree;154DeserializeFromFuzzingInput(buffer, partial_merkle_tree);155})156FUZZ_TARGET_DESERIALIZE(pub_key_deserialize, {157CPubKey pub_key;158DeserializeFromFuzzingInput(buffer, pub_key);159AssertEqualAfterSerializeDeserialize(pub_key);160})161FUZZ_TARGET_DESERIALIZE(script_deserialize, {162CScript script;163DeserializeFromFuzzingInput(buffer, script);164})165FUZZ_TARGET_DESERIALIZE(tx_in_deserialize, {166CTxIn tx_in;167DeserializeFromFuzzingInput(buffer, tx_in);168AssertEqualAfterSerializeDeserialize(tx_in);169})170FUZZ_TARGET_DESERIALIZE(flat_file_pos_deserialize, {171FlatFilePos flat_file_pos;172DeserializeFromFuzzingInput(buffer, flat_file_pos);173AssertEqualAfterSerializeDeserialize(flat_file_pos);174})175FUZZ_TARGET_DESERIALIZE(key_origin_info_deserialize, {176KeyOriginInfo key_origin_info;177DeserializeFromFuzzingInput(buffer, key_origin_info);178AssertEqualAfterSerializeDeserialize(key_origin_info);179})180FUZZ_TARGET_DESERIALIZE(partially_signed_transaction_deserialize, {181PartiallySignedTransaction partially_signed_transaction = DeserializeConstructFromFuzzingInput<PartiallySignedTransaction>(buffer);182})183FUZZ_TARGET_DESERIALIZE(prefilled_transaction_deserialize, {184PrefilledTransaction prefilled_transaction;185DeserializeFromFuzzingInput(buffer, prefilled_transaction);186})187FUZZ_TARGET_DESERIALIZE(psbt_input_deserialize, {188PSBTInput psbt_input(0, Txid{}, 0);189DeserializeFromFuzzingInput(buffer, psbt_input);190})191FUZZ_TARGET_DESERIALIZE(psbt_output_deserialize, {192PSBTOutput psbt_output(0, 0, CScript());193DeserializeFromFuzzingInput(buffer, psbt_output);194})195FUZZ_TARGET_DESERIALIZE(block_deserialize, {196CBlock block;197DeserializeFromFuzzingInput(buffer, TX_WITH_WITNESS(block));198})199FUZZ_TARGET_DESERIALIZE(blocklocator_deserialize, {200CBlockLocator bl;201DeserializeFromFuzzingInput(buffer, bl);202})203FUZZ_TARGET_DESERIALIZE(blockmerkleroot, {204CBlock block;205DeserializeFromFuzzingInput(buffer, TX_WITH_WITNESS(block));206bool mutated;207BlockMerkleRoot(block, &mutated);208})209FUZZ_TARGET_DESERIALIZE(blockheader_deserialize, {210CBlockHeader bh;211DeserializeFromFuzzingInput(buffer, bh);212})213FUZZ_TARGET_DESERIALIZE(txundo_deserialize, {214CTxUndo tu;215DeserializeFromFuzzingInput(buffer, tu);216})217FUZZ_TARGET_DESERIALIZE(blockundo_deserialize, {218CBlockUndo bu;219DeserializeFromFuzzingInput(buffer, bu);220})221FUZZ_TARGET_DESERIALIZE(coins_deserialize, {222Coin coin;223DeserializeFromFuzzingInput(buffer, coin);224})225FUZZ_TARGET(netaddr_deserialize, .init = initialize_deserialize)226{227FuzzedDataProvider fdp{buffer.data(), buffer.size()};228const auto maybe_na{ConsumeDeserializable<CNetAddr>(fdp, ConsumeDeserializationParams<CNetAddr::SerParams>(fdp))};229if (!maybe_na) return;230const CNetAddr& na{*maybe_na};231if (na.IsAddrV1Compatible()) {232AssertEqualAfterSerializeDeserialize(na, CNetAddr::V1);233}234AssertEqualAfterSerializeDeserialize(na, CNetAddr::V2);235}236FUZZ_TARGET(service_deserialize, .init = initialize_deserialize)237{238FuzzedDataProvider fdp{buffer.data(), buffer.size()};239const auto ser_params{ConsumeDeserializationParams<CNetAddr::SerParams>(fdp)};240const auto maybe_s{ConsumeDeserializable<CService>(fdp, ser_params)};241if (!maybe_s) return;242const CService& s{*maybe_s};243if (s.IsAddrV1Compatible()) {244AssertEqualAfterSerializeDeserialize(s, CNetAddr::V1);245}246AssertEqualAfterSerializeDeserialize(s, CNetAddr::V2);247if (ser_params.enc == CNetAddr::Encoding::V1) {248assert(s.IsAddrV1Compatible());249}250}
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.