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#!/usr/bin/env python32# Copyright (c) 2018-present The Bitcoin Core developers3# Distributed under the MIT software license, see the accompanying4# file COPYING or http://www.opensource.org/licenses/mit-license.php.6import os7import sys8import argparse9import json11def perform_pre_checks():12mock_result_path = os.path.join(os.getcwd(), "mock_result")13if os.path.isfile(mock_result_path):14with open(mock_result_path, "r") as f:15mock_result = f.read()16if mock_result[0]:17sys.stdout.write(mock_result[2:])18sys.exit(int(mock_result[0]))20def enumerate(args):21sys.stdout.write(json.dumps([{"fingerprint": "00000001", "type": "trezor", "model": "trezor_t"}]))23def getdescriptors(args):24xpub = "tpubD6NzVbkrYhZ4WaWSyoBvQwbpLkojyoTZPRsgXELWz3Popb3qkjcJyJUGLnL4qHHoQvao8ESaAstxYSnhyswJ76uZPStJRJCTKvosUCJZL5B"26sys.stdout.write(json.dumps({27"receive": [28"pkh([00000001/44h/1h/" + args.account + "']" + xpub + "/0/*)#aqllu46s",29"sh(wpkh([00000001/49h/1h/" + args.account + "']" + xpub + "/0/*))#5dh56mgg",30"wpkh([00000001/84h/1h/" + args.account + "']" + xpub + "/0/*)#h62dxaej",31"tr([00000001/86h/1h/" + args.account + "']" + xpub + "/0/*)#pcd5w87f"32],33"internal": [34"pkh([00000001/44h/1h/" + args.account + "']" + xpub + "/1/*)#v567pq2g",35"sh(wpkh([00000001/49h/1h/" + args.account + "']" + xpub + "/1/*))#pvezzyah",36"wpkh([00000001/84h/1h/" + args.account + "']" + xpub + "/1/*)#xw0vmgf2",37"tr([00000001/86h/1h/" + args.account + "']" + xpub + "/1/*)#svg4njw3"39]40}))43def displayaddress(args):44if args.fingerprint != "00000001":45return sys.stdout.write(json.dumps({"error": "Unexpected fingerprint", "fingerprint": args.fingerprint}))47expected_desc = {48"wpkh([00000001/84h/1h/0h/0/0]02c97dc3f4420402e01a113984311bf4a1b8de376cac0bdcfaf1b3ac81f13433c7)#3te6hhy7": "bcrt1qm90ugl4d48jv8n6e5t9ln6t9zlpm5th68x4f8g",49"sh(wpkh([00000001/49h/1h/0h/0/0]02c97dc3f4420402e01a113984311bf4a1b8de376cac0bdcfaf1b3ac81f13433c7))#kz9y5w82": "2N2gQKzjUe47gM8p1JZxaAkTcoHPXV6YyVp",50"pkh([00000001/44h/1h/0h/0/0]02c97dc3f4420402e01a113984311bf4a1b8de376cac0bdcfaf1b3ac81f13433c7)#q3pqd8wh": "n1LKejAadN6hg2FrBXoU1KrwX4uK16mco9",51"tr([00000001/86h/1h/0h/0/0]c97dc3f4420402e01a113984311bf4a1b8de376cac0bdcfaf1b3ac81f13433c7)#puqqa90m": "tb1phw4cgpt6cd30kz9k4wkpwm872cdvhss29jga2xpmftelhqll62mscq0k4g",52"wpkh([00000001/84h/1h/0h/0/1]03a20a46308be0b8ded6dff0a22b10b4245c587ccf23f3b4a303885be3a524f172)#aqpjv5xr": "wrong_address",53}54if args.desc not in expected_desc:55return sys.stdout.write(json.dumps({"error": "Unexpected descriptor", "desc": args.desc}))57return sys.stdout.write(json.dumps({"address": expected_desc[args.desc]}))59def signtx(args):60if args.fingerprint != "00000001":61return sys.stdout.write(json.dumps({"error": "Unexpected fingerprint", "fingerprint": args.fingerprint}))63with open(os.path.join(os.getcwd(), "mock_psbt"), "r") as f:64mock_psbt = f.read()66if args.fingerprint == "00000001" :67sys.stdout.write(json.dumps({68"psbt": mock_psbt,69"complete": True70}))71else:72sys.stdout.write(json.dumps({"psbt": args.psbt}))74parser = argparse.ArgumentParser(prog='./signer.py', description='External signer mock')75parser.add_argument('--fingerprint')76parser.add_argument('--chain', default='main')77parser.add_argument('--stdin', action='store_true')79subparsers = parser.add_subparsers(description='Commands', dest='command')80subparsers.required = True82parser_enumerate = subparsers.add_parser('enumerate', help='list available signers')83parser_enumerate.set_defaults(func=enumerate)85parser_getdescriptors = subparsers.add_parser('getdescriptors')86parser_getdescriptors.set_defaults(func=getdescriptors)87parser_getdescriptors.add_argument('--account', metavar='account')89parser_displayaddress = subparsers.add_parser('displayaddress', help='display address on signer')90parser_displayaddress.add_argument('--desc', metavar='desc')91parser_displayaddress.set_defaults(func=displayaddress)93parser_signtx = subparsers.add_parser('signtx')94parser_signtx.add_argument('psbt', metavar='psbt')96parser_signtx.set_defaults(func=signtx)98if not sys.stdin.isatty():99buffer = sys.stdin.read()100if buffer and buffer.rstrip() != "":101sys.argv.extend(buffer.rstrip().split(" "))103args = parser.parse_args()105perform_pre_checks()107args.func(args)
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.