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.
251psbt_offline.unloadwallet()253def do_test(self, comment, pattern, privmap, treefn):254nkeys = len(privmap)255keys = random.sample(self.keys, nkeys * 4)256self.do_test_addr(comment, pattern, privmap, treefn, keys[0:nkeys])257self.do_test_sendtoaddress(comment, pattern, privmap, treefn, keys[0:nkeys], keys[nkeys:2*nkeys])258self.do_test_psbt(comment, pattern, privmap, treefn, keys[2*nkeys:3*nkeys], keys[3*nkeys:4*nkeys])260def generate_test_keys(self):261xprvs = [ExtendedPrivateKey.generate() for _ in range(0, 13)]262return [{263"xprv": xprv.to_string(),264"xpub": xprv.pubkey().to_string(),265"pubs": [compute_xonly_pubkey(xprv.derive_path(f"m/{i}").key.get_bytes())[0].hex() for i in range(0, 4)]266} for xprv in xprvs]268def run_test(self):269self.keys = self.generate_test_keys()270self.nodes[0].createwallet(wallet_name="boring")271self.boring = self.nodes[0].get_wallet_rpc("boring")273self.log.info("Mining blocks...")274gen_addr = self.boring.getnewaddress()275self.generatetoaddress(self.nodes[0], 101, gen_addr, sync_fun=self.no_op)277self.do_test(278"tr(XPRV)",279"tr($1/*)",280[True],281lambda k1: (key(k1), [])282)283self.do_test(284"tr(H,XPRV)",285"tr($H,pk($1/*))",286[True],287lambda k1: (key(H_POINT), [pk(k1)])288)289self.do_test(290"wpkh(XPRV)",291"wpkh($1/*)",292[True],293None294)295self.do_test(296"tr(XPRV,{H,{H,XPUB}})",297"tr($1/*,{pk($H),{pk($H),pk($2/*)}})",298[True, False],299lambda k1, k2: (key(k1), [pk(H_POINT), [pk(H_POINT), pk(k2)]])300)301self.do_test(302"wsh(multi(1,XPRV,XPUB))",303"wsh(multi(1,$1/*,$2/*))",304[True, False],305None306)307self.do_test(308"tr(XPRV,{XPUB,XPUB})",309"tr($1/*,{pk($2/*),pk($2/*)})",310[True, False],311lambda k1, k2: (key(k1), [pk(k2), pk(k2)])312)313self.do_test(314"tr(XPRV,{{XPUB,H},{H,XPUB}})",315"tr($1/*,{{pk($2/*),pk($H)},{pk($H),pk($2/*)}})",316[True, False],317lambda k1, k2: (key(k1), [[pk(k2), pk(H_POINT)], [pk(H_POINT), pk(k2)]])318)319self.do_test(320"tr(XPUB,{{H,{H,XPUB}},{H,{H,{H,XPRV}}}})",321"tr($1/*,{{pk($H),{pk($H),pk($2/*)}},{pk($H),{pk($H),{pk($H),pk($3/*)}}}})",322[False, False, True],323lambda k1, k2, k3: (key(k1), [[pk(H_POINT), [pk(H_POINT), pk(k2)]], [pk(H_POINT), [pk(H_POINT), [pk(H_POINT), pk(k3)]]]])324)325self.do_test(326"tr(XPRV,{XPUB,{{XPUB,{H,H}},{{H,H},XPUB}}})",327"tr($1/*,{pk($2/*),{{pk($2/*),{pk($H),pk($H)}},{{pk($H),pk($H)},pk($2/*)}}})",328[True, False],329lambda k1, k2: (key(k1), [pk(k2), [[pk(k2), [pk(H_POINT), pk(H_POINT)]], [[pk(H_POINT), pk(H_POINT)], pk(k2)]]])330)331self.do_test(332"tr(H,multi_a(1,XPRV))",333"tr($H,multi_a(1,$1/*))",334[True],335lambda k1: (key(H_POINT), [multi_a(1, [k1])])336)337self.do_test(338"tr(H,sortedmulti_a(1,XPRV,XPUB))",339"tr($H,sortedmulti_a(1,$1/*,$2/*))",340[True, False],341lambda k1, k2: (key(H_POINT), [multi_a(1, [k1, k2], True)])342)343self.do_test(344"tr(H,{H,multi_a(1,XPUB,XPRV)})",345"tr($H,{pk($H),multi_a(1,$1/*,$2/*)})",346[False, True],347lambda k1, k2: (key(H_POINT), [pk(H_POINT), [multi_a(1, [k1, k2])]])348)349self.do_test(350"tr(H,sortedmulti_a(1,XPUB,XPRV,XPRV))",351"tr($H,sortedmulti_a(1,$1/*,$2/*,$3/*))",352[False, True, True],353lambda k1, k2, k3: (key(H_POINT), [multi_a(1, [k1, k2, k3], True)])354)355self.do_test(356"tr(H,multi_a(2,XPRV,XPUB,XPRV))",357"tr($H,multi_a(2,$1/*,$2/*,$3/*))",358[True, False, True],359lambda k1, k2, k3: (key(H_POINT), [multi_a(2, [k1, k2, k3])])360)361self.do_test(362"tr(XPUB,{{XPUB,{XPUB,sortedmulti_a(2,XPRV,XPUB,XPRV)}})",363"tr($2/*,{pk($2/*),{pk($2/*),sortedmulti_a(2,$1/*,$2/*,$3/*)}})",364[True, False, True],365lambda k1, k2, k3: (key(k2), [pk(k2), [pk(k2), multi_a(2, [k1, k2, k3], True)]])366)367rnd_pos = random.randrange(MAX_PUBKEYS_PER_MULTI_A)368self.do_test(369"tr(XPUB,multi_a(1,H...,XPRV,H...))",370"tr($2/*,multi_a(1" + (",$H" * rnd_pos) + ",$1/*" + (",$H" * (MAX_PUBKEYS_PER_MULTI_A - 1 - rnd_pos)) + "))",371[True, False],372lambda k1, k2: (key(k2), [multi_a(1, ([H_POINT] * rnd_pos) + [k1] + ([H_POINT] * (MAX_PUBKEYS_PER_MULTI_A - 1 - rnd_pos)))])373)374self.do_test(375"rawtr(XPRV)",376"rawtr($1/*)",377[True],378lambda k1: key(k1)379)381if __name__ == '__main__':382WalletTaprootTest(__file__).main()
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.