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.
251hd_key = PickValue(fuzzed_data_provider, keys);252hd_chain.nVersion = version;253hd_chain.seed_id = hd_key.GetPubKey().GetID();254legacy_data.LoadHDChain(hd_chain);255added_chains++;256}258bool add_inactive_hd_chain{fuzzed_data_provider.ConsumeBool() && !keys.empty()};259if (add_inactive_hd_chain) {260CKey inactive_hd_key = PickValue(fuzzed_data_provider, keys);261hd_chain.nVersion = fuzzed_data_provider.ConsumeBool() ? CHDChain::VERSION_HD_CHAIN_SPLIT : CHDChain::VERSION_HD_BASE;262bool dup_chain = hd_key.IsValid() && std::equal(hd_key.begin(), hd_key.end(), inactive_hd_key.begin());263hd_chain.seed_id = inactive_hd_key.GetPubKey().GetID();264legacy_data.AddInactiveHDChain(hd_chain);265if (!dup_chain) added_chains++;266}268bool watch_only = false;269const auto pub_key = ConsumeDeserializable<CPubKey>(fuzzed_data_provider);270if (!pub_key || !pub_key->IsFullyValid()) return;271auto script_dest{GetScriptForDestination(WitnessV0KeyHash{*pub_key})};272if (fuzzed_data_provider.ConsumeBool()) {273script_dest = GetScriptForDestination(CTxDestination{PKHash(*pub_key)});274}275if (legacy_data.LoadWatchOnly(script_dest)) watch_only = true;277size_t added_script{0};278bool good_data{true};279LIMITED_WHILE (good_data && fuzzed_data_provider.ConsumeBool(), 30) {280CallOneOf(281fuzzed_data_provider,282[&] {283CKey key;284if (!keys.empty()) {285key = PickValue(fuzzed_data_provider, keys);286} else {287key = ConsumePrivateKey(fuzzed_data_provider, /*compressed=*/fuzzed_data_provider.ConsumeBool());288}289if (!key.IsValid()) return;290auto pub_key{key.GetPubKey()};291CScript script;292CallOneOf(293fuzzed_data_provider,294[&] {295script = GetScriptForDestination(CTxDestination{PKHash(pub_key)});296},297[&] {298script = GetScriptForDestination(WitnessV0KeyHash(pub_key));299},300[&] {301std::optional<CScript> script_opt{ConsumeDeserializable<CScript>(fuzzed_data_provider)};302if (!script_opt) {303good_data = false;304return;305}306script = script_opt.value();307}308);309if (fuzzed_data_provider.ConsumeBool()) script = GetScriptForDestination(ScriptHash(script));310if (!legacy_data.HaveCScript(CScriptID(script)) && legacy_data.AddCScript(script)) added_script++;311},312[&] {313CKey key;314if (!keys.empty()) {315key = PickValue(fuzzed_data_provider, keys);316} else {317key = ConsumePrivateKey(fuzzed_data_provider, /*compressed=*/fuzzed_data_provider.ConsumeBool());318}319if (!key.IsValid()) return;320const auto num_keys{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(1, MAX_PUBKEYS_PER_MULTISIG)};321std::vector<CPubKey> pubkeys;322pubkeys.emplace_back(key.GetPubKey());323for (size_t i = 1; i < num_keys; i++) {324if (fuzzed_data_provider.ConsumeBool()) {325pubkeys.emplace_back(key.GetPubKey());326} else {327CKey private_key{ConsumePrivateKey(fuzzed_data_provider, /*compressed=*/fuzzed_data_provider.ConsumeBool())};328if (!private_key.IsValid()) return;329pubkeys.emplace_back(private_key.GetPubKey());330}331}332if (pubkeys.size() < num_keys) return;333CScript multisig_script{GetScriptForMultisig(num_keys, pubkeys)};334if (!legacy_data.HaveCScript(CScriptID(multisig_script)) && legacy_data.AddCScript(multisig_script)) {335added_script++;336}337}338);339}341auto result{legacy_data.MigrateToDescriptor()};342assert(result);343if ((add_hd_chain && version >= CHDChain::VERSION_HD_CHAIN_SPLIT) || (!add_hd_chain && add_inactive_hd_chain)) {344added_chains *= 2;345}346size_t added_size{keys.size() + added_chains};347if (added_script > 0) {348assert(result->desc_spkms.size() >= added_size);349} else {350assert(result->desc_spkms.size() == added_size);351}352if (watch_only) assert(!result->watch_descs.empty());353if (!result->solvable_descs.empty()) assert(added_script > 0);354}356} // namespace357} // namespace wallet
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.