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) 2017-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 <key.h>6#include <key_io.h>7#include <node/context.h>8#include <script/script.h>9#include <script/solver.h>10#include <script/signingprovider.h>11#include <test/util/setup_common.h>12#include <wallet/types.h>13#include <wallet/wallet.h>14#include <wallet/test/util.h>16#include <boost/test/unit_test.hpp>18using namespace util::hex_literals;20namespace wallet {21BOOST_FIXTURE_TEST_SUITE(ismine_tests, BasicTestingSetup)23BOOST_AUTO_TEST_CASE(ismine_standard)24{25CKey keys[2];26CPubKey pubkeys[2];27for (int i = 0; i < 2; i++) {28keys[i].MakeNewKey(true);29pubkeys[i] = keys[i].GetPubKey();30}32CKey uncompressedKey = GenerateRandomKey(/*compressed=*/false);33CPubKey uncompressedPubkey = uncompressedKey.GetPubKey();34std::unique_ptr<interfaces::Chain>& chain = m_node.chain;36CScript scriptPubKey;37bool result;39// P2PK compressed - Descriptor40{41CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());42std::string desc_str = "pk(" + EncodeSecret(keys[0]) + ")";44auto spk_manager = CreateDescriptor(keystore, desc_str, true);46scriptPubKey = GetScriptForRawPubKey(pubkeys[0]);47result = spk_manager->IsMine(scriptPubKey);48BOOST_CHECK(result);49}51// P2PK uncompressed - Descriptor52{53CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());54std::string desc_str = "pk(" + EncodeSecret(uncompressedKey) + ")";56auto spk_manager = CreateDescriptor(keystore, desc_str, true);58scriptPubKey = GetScriptForRawPubKey(uncompressedPubkey);59result = spk_manager->IsMine(scriptPubKey);60BOOST_CHECK(result);61}63// P2PKH compressed - Descriptor64{65CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());66std::string desc_str = "pkh(" + EncodeSecret(keys[0]) + ")";68auto spk_manager = CreateDescriptor(keystore, desc_str, true);70scriptPubKey = GetScriptForDestination(PKHash(pubkeys[0]));71result = spk_manager->IsMine(scriptPubKey);72BOOST_CHECK(result);73}75// P2PKH uncompressed - Descriptor76{77CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());78std::string desc_str = "pkh(" + EncodeSecret(uncompressedKey) + ")";80auto spk_manager = CreateDescriptor(keystore, desc_str, true);82scriptPubKey = GetScriptForDestination(PKHash(uncompressedPubkey));83result = spk_manager->IsMine(scriptPubKey);84BOOST_CHECK(result);85}87// P2SH - Descriptor88{89CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());90std::string desc_str = "sh(pkh(" + EncodeSecret(keys[0]) + "))";92auto spk_manager = CreateDescriptor(keystore, desc_str, true);94CScript redeemScript = GetScriptForDestination(PKHash(pubkeys[0]));95scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));96result = spk_manager->IsMine(scriptPubKey);97BOOST_CHECK(result);98}100// (P2PKH inside) P2SH inside P2SH (invalid) - Descriptor101{102CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());103std::string desc_str = "sh(sh(" + EncodeSecret(keys[0]) + "))";105auto spk_manager = CreateDescriptor(keystore, desc_str, false);106BOOST_CHECK_EQUAL(spk_manager, nullptr);107}109// (P2PKH inside) P2SH inside P2WSH (invalid) - Descriptor110{111CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());112std::string desc_str = "wsh(sh(" + EncodeSecret(keys[0]) + "))";114auto spk_manager = CreateDescriptor(keystore, desc_str, false);115BOOST_CHECK_EQUAL(spk_manager, nullptr);116}118// P2WPKH inside P2WSH (invalid) - Descriptor119{120CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());121std::string desc_str = "wsh(wpkh(" + EncodeSecret(keys[0]) + "))";123auto spk_manager = CreateDescriptor(keystore, desc_str, false);124BOOST_CHECK_EQUAL(spk_manager, nullptr);125}127// (P2PKH inside) P2WSH inside P2WSH (invalid) - Descriptor128{129CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());130std::string desc_str = "wsh(wsh(" + EncodeSecret(keys[0]) + "))";132auto spk_manager = CreateDescriptor(keystore, desc_str, false);133BOOST_CHECK_EQUAL(spk_manager, nullptr);134}136// P2WPKH compressed - Descriptor137{138CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());139std::string desc_str = "wpkh(" + EncodeSecret(keys[0]) + ")";141auto spk_manager = CreateDescriptor(keystore, desc_str, true);143scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));144result = spk_manager->IsMine(scriptPubKey);145BOOST_CHECK(result);146}148// P2WPKH uncompressed (invalid) - Descriptor149{150CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());151std::string desc_str = "wpkh(" + EncodeSecret(uncompressedKey) + ")";153auto spk_manager = CreateDescriptor(keystore, desc_str, false);154BOOST_CHECK_EQUAL(spk_manager, nullptr);155}157// scriptPubKey multisig - Descriptor158{159CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());160std::string desc_str = "multi(2," + EncodeSecret(uncompressedKey) + "," + EncodeSecret(keys[1]) + ")";162auto spk_manager = CreateDescriptor(keystore, desc_str, true);164scriptPubKey = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});165result = spk_manager->IsMine(scriptPubKey);166BOOST_CHECK(result);167}169// P2SH multisig - Descriptor170{171CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());173std::string desc_str = "sh(multi(2," + EncodeSecret(uncompressedKey) + "," + EncodeSecret(keys[1]) + "))";175auto spk_manager = CreateDescriptor(keystore, desc_str, true);177CScript redeemScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});178scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));179result = spk_manager->IsMine(scriptPubKey);180BOOST_CHECK(result);181}183// P2WSH multisig with compressed keys - Descriptor184{185CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());187std::string desc_str = "wsh(multi(2," + EncodeSecret(keys[0]) + "," + EncodeSecret(keys[1]) + "))";189auto spk_manager = CreateDescriptor(keystore, desc_str, true);191CScript redeemScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});192scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(redeemScript));193result = spk_manager->IsMine(scriptPubKey);194BOOST_CHECK(result);195}197// P2WSH multisig with uncompressed key (invalid) - Descriptor198{199CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());201std::string desc_str = "wsh(multi(2," + EncodeSecret(uncompressedKey) + "," + EncodeSecret(keys[1]) + "))";203auto spk_manager = CreateDescriptor(keystore, desc_str, false);204BOOST_CHECK_EQUAL(spk_manager, nullptr);205}207// P2WSH multisig wrapped in P2SH - Descriptor208{209CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());211std::string desc_str = "sh(wsh(multi(2," + EncodeSecret(keys[0]) + "," + EncodeSecret(keys[1]) + ")))";213auto spk_manager = CreateDescriptor(keystore, desc_str, true);215CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});216CScript redeemScript = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));217scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));218result = spk_manager->IsMine(scriptPubKey);219BOOST_CHECK(result);220}222// Combo - Descriptor223{224CWallet keystore(chain.get(), "", CreateMockableWalletDatabase());226std::string desc_str = "combo(" + EncodeSecret(keys[0]) + ")";228auto spk_manager = CreateDescriptor(keystore, desc_str, true);230// Test P2PK231result = spk_manager->IsMine(GetScriptForRawPubKey(pubkeys[0]));232BOOST_CHECK(result);234// Test P2PKH235result = spk_manager->IsMine(GetScriptForDestination(PKHash(pubkeys[0])));236BOOST_CHECK(result);238// Test P2SH (combo descriptor does not describe P2SH)239CScript redeemScript = GetScriptForDestination(PKHash(pubkeys[0]));240scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));241result = spk_manager->IsMine(scriptPubKey);242BOOST_CHECK(!result);244// Test P2WPKH245scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));246result = spk_manager->IsMine(scriptPubKey);247BOOST_CHECK(result);249// P2SH-P2WPKH output250redeemScript = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0]));
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.