Ejemplo n.º 1
0
def create_parser():
    codes = network_codes()
    parser = argparse.ArgumentParser(
        description=(
            'Cache look-up information into a Keychain for use with tx. '
            'Useful for hiearchical keys with many children.'),
        epilog=('Known networks codes:\n  ' + ', '.join(
            ['%s (%s)' % (i, full_network_name_for_netcode(i))
             for i in codes])))
    parser.add_argument('-n',
                        "--netcode",
                        help='specify network by netcode',
                        choices=codes,
                        default="BTC")
    parser.add_argument(
        '-m',
        "--multisig",
        metavar="sigcount",
        type=int,
        help='multisig, with this many signatures need to unencumber the funds'
    )
    parser.add_argument('keychain',
                        help='the keychain file (SQLite3 formatted)')
    parser.add_argument('subkey_paths',
                        help='subkey paths (example: 0H/2/15-20)')
    parser.add_argument(
        'key',
        nargs="+",
        help='a hierarchical wallet key string (public suffices)')
    return parser
Ejemplo n.º 2
0
def create_parser():
    codes = network_codes()
    parser = argparse.ArgumentParser(
        description='Create or verify a text signature using bitcoin standards',
        epilog=('Known networks codes:\n  ' + ', '.join([
            '%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes
        ])))
    parser.add_argument('-n',
                        "--network",
                        help='specify network (default: BTC = Bitcoin)',
                        default='BTC',
                        choices=codes)

    subparsers = parser.add_subparsers(dest="command")

    sign = subparsers.add_parser('sign',
                                 help='sign a message with a private key')
    sign.add_argument('WIF', help='the WIF to sign the message with')
    add_read_msg_arguments(sign, "signed")

    verify = subparsers.add_parser('verify')
    verify.add_argument('signature', help='the signature to verify')
    verify.add_argument('address',
                        nargs="?",
                        help='the address to verify against')
    add_read_msg_arguments(verify, "verified")

    return parser
Ejemplo n.º 3
0
    def test_is_wif_valid(self):
        WIFS = [
            "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn",
            "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf",
            "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4",
            "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH"
        ]

        for wif in WIFS:
            self.assertEqual(is_wif_valid(wif), "BTC")
            a = wif[:-1] + chr(ord(wif[-1]) + 1)
            self.assertEqual(is_wif_valid(a), None)

        from pycoin.networks.registry import network_for_netcode
        NETWORK_NAMES = network_codes()
        for netcode in NETWORK_NAMES:
            network = network_for_netcode(netcode)
            if not getattr(network, "key", None):
                continue
            for se in range(1, 10):
                key = network.key(secret_exponent=se,
                                  generator=secp256k1_generator)
                for tv in [True, False]:
                    wif = key.wif(use_uncompressed=tv)
                    self.assertEqual(
                        is_wif_valid(wif, allowable_netcodes=[netcode]),
                        netcode)
                    a = wif[:-1] + chr(ord(wif[-1]) + 1)
                    self.assertEqual(
                        is_wif_valid(a, allowable_netcodes=[netcode]), None)
Ejemplo n.º 4
0
    def test_is_wif_valid(self):
        WIFS = [
            "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn",
            "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf",
            "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4",
            "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH"
        ]

        for wif in WIFS:
            self.assertEqual(BTC.parse.wif(wif).wif(), wif)
            a = wif[:-1] + chr(ord(wif[-1]) + 1)
            self.assertIsNone(BTC.parse.wif(a))

        NETWORK_NAMES = network_codes()
        for netcode in NETWORK_NAMES:
            network = network_for_netcode(netcode)
            if not getattr(network, "Key", None):
                continue
            for se in range(1, 10):
                key = network.Key(secret_exponent=se)
                for tv in [True, False]:
                    wif = key.wif(is_compressed=tv)
                    self.assertEqual(network.parse.wif(wif).wif(), wif)
                    a = wif[:-1] + chr(ord(wif[-1]) + 1)
                    self.assertIsNone(network.parse.wif(a))
Ejemplo n.º 5
0
Archivo: ku.py Proyecto: ctengiz/pycoin
def ku(args, parser):
    fallback_network = network_for_netcode(args.network
                                           or get_current_netcode())
    parse_networks = [fallback_network] + [
        network_for_netcode(netcode) for netcode in network_codes()
    ]
    if args.network:
        parse_networks = [network_for_netcode(args.network)]

    override_network = None
    if args.override_network:
        # Override the network value, so we can take the same xpubkey and view what
        # the values would be on each other network type.
        override_network = network_for_netcode(args.override_network)

    def parse_stdin():
        return [
            item for item in sys.stdin.readline().strip().split(' ')
            if len(item) > 0
        ]

    output_key_set = set(args.brief or [])
    if args.wallet:
        output_key_set.add("wallet_key")
    elif args.wif:
        output_key_set.add("wif_uncompressed" if args.uncompressed else "wif")
    elif args.address:
        output_key_set.add("address" +
                           ("_uncompressed" if args.uncompressed else ""))

    items = args.item if len(args.item) > 0 else parse_stdin()

    for item in items:
        key = parse_key(item, parse_networks)
        if key is None:
            print("can't parse %s" % item, file=sys.stderr)
            continue

        if override_network:
            key = key.override_network(override_network)

        display_network = override_network or key._network or fallback_network

        if hasattr(key, "subkeys"):
            key_iter = key.subkeys(args.subkey)
        else:
            key_iter = [key]
        for key in key_iter:
            if args.public:
                key = key.public_copy()

            output_dict, output_order = create_output(item, key,
                                                      output_key_set)

            generate_output(args, output_dict, output_order)
Ejemplo n.º 6
0
def create_parser():
    codes = network_codes()
    EPILOG = ('Known networks codes:\n  ' +
              ', '.join(['%s (%s)' % (i, full_network_name_for_netcode(i)) for i in codes]))

    parser = argparse.ArgumentParser(
        description="Compile or disassemble scripts.",
        epilog=EPILOG)

    parser.add_argument('-n', "--network", default=get_current_netcode(), choices=codes,
                        help=('Network code (environment variable PYCOIN_DEFAULT_NETCODE '
                              'or "BTC"=Bitcoin mainnet if unset'))

    parser.add_argument("argument", nargs="+", help='script to compile. To dump hex, prefix with 0x')

    return parser
Ejemplo n.º 7
0
def create_parser():
    codes = network_codes()
    parser = argparse.ArgumentParser(
        description=(
            'Cache look-up information into a Keychain for use with tx. '
            'Useful for hiearchical keys with many children.'),
        epilog=('Known networks codes:\n  ' +
                ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes]))
    )
    parser.add_argument('-n', "--netcode", help='specify network by netcode', choices=codes, default="BTC")
    parser.add_argument('-m', "--multisig", metavar="sigcount", type=int,
                        help='multisig, with this many signatures need to unencumber the funds')
    parser.add_argument('keychain', help='the keychain file (SQLite3 formatted)')
    parser.add_argument('subkey_paths', help='subkey paths (example: 0H/2/15-20)')
    parser.add_argument('key', nargs="+", help='a hierarchical wallet key string (public suffices)')
    return parser
Ejemplo n.º 8
0
    def test_is_public_private_bip32_valid(self):
        from pycoin.networks.registry import network_for_netcode
        NETWORK_NAMES = network_codes()
        WALLET_KEYS = ["foo", "1", "2", "3", "4", "5"]

        # not all networks support BIP32 yet
        for netcode in "BTC XTN DOGE".split():
            network = network_for_netcode(netcode)
            BIP32Node = network.ui._bip32node_class
            for wk in WALLET_KEYS:
                wallet = BIP32Node.from_master_secret(secp256k1_generator,
                                                      wk.encode("utf8"))
                text = wallet.wallet_key(as_private=True)
                self.assertEqual(
                    is_private_bip32_valid(text,
                                           allowable_netcodes=NETWORK_NAMES),
                    netcode)
                self.assertEqual(
                    is_public_bip32_valid(text,
                                          allowable_netcodes=NETWORK_NAMES),
                    None)
                a = text[:-1] + chr(ord(text[-1]) + 1)
                self.assertEqual(
                    is_private_bip32_valid(a,
                                           allowable_netcodes=NETWORK_NAMES),
                    None)
                self.assertEqual(
                    is_public_bip32_valid(a, allowable_netcodes=NETWORK_NAMES),
                    None)
                text = wallet.wallet_key(as_private=False)
                self.assertEqual(
                    is_private_bip32_valid(text,
                                           allowable_netcodes=NETWORK_NAMES),
                    None)
                self.assertEqual(
                    is_public_bip32_valid(text,
                                          allowable_netcodes=NETWORK_NAMES),
                    netcode)
                a = text[:-1] + chr(ord(text[-1]) + 1)
                self.assertEqual(
                    is_private_bip32_valid(a,
                                           allowable_netcodes=NETWORK_NAMES),
                    None)
                self.assertEqual(
                    is_public_bip32_valid(a, allowable_netcodes=NETWORK_NAMES),
                    None)
Ejemplo n.º 9
0
def ku(args, parser):
    generator = secp256k1_generator

    fallback_network = network_for_netcode(args.network
                                           or get_current_netcode())
    parse_networks = [
        network_for_netcode(netcode) for netcode in network_codes()
    ]
    if args.network:
        parse_networks = [network_for_netcode(args.network)]

    override_network = None
    if args.override_network:
        # Override the network value, so we can take the same xpubkey and view what
        # the values would be on each other network type.
        override_network = network_for_netcode(args.override_network)

    def parse_stdin():
        return [
            item for item in sys.stdin.readline().strip().split(' ')
            if len(item) > 0
        ]

    items = args.item if len(args.item) > 0 else parse_stdin()

    for item in items:
        key_network, key = parse_key(item, parse_networks, generator)
        if key is None:
            print("can't parse %s" % item, file=sys.stderr)
            continue

        display_network = override_network or key_network or fallback_network

        for key in key.subkeys(args.subkey or ""):
            if args.public:
                key = key.public_copy()

            output_dict, output_order = create_output(item, key,
                                                      display_network)

            generate_output(args, output_dict, output_order)
Ejemplo n.º 10
0
def create_parser():
    codes = network_codes()
    parser = argparse.ArgumentParser(
        description='Create or verify a text signature using bitcoin standards',
        epilog=('Known networks codes:\n  ' +
                ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes]))
    )
    parser.add_argument('-n', "--network", help='specify network (default: BTC = Bitcoin)',
                        default='BTC', choices=codes)

    subparsers = parser.add_subparsers(dest="command")

    sign = subparsers.add_parser('sign', help='sign a message with a private key')
    sign.add_argument('WIF', help='the WIF to sign the message with')
    add_read_msg_arguments(sign, "signed")

    verify = subparsers.add_parser('verify')
    verify.add_argument('signature', help='the signature to verify')
    verify.add_argument('address', nargs="?", help='the address to verify against')
    add_read_msg_arguments(verify, "verified")

    return parser
Ejemplo n.º 11
0
def create_parser():
    codes = network_codes()
    parser = argparse.ArgumentParser(
        description='Crypto coin utility ku ("key utility") to show'
        ' information about Bitcoin or other cryptocoin data structures.',
        epilog=('Known networks codes:\n  ' +
                ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes]))
    )
    parser.add_argument('-w', "--wallet", help='show just Bitcoin wallet key', action='store_true')
    parser.add_argument('-W', "--wif", help='show just Bitcoin WIF', action='store_true')
    parser.add_argument('-a', "--address", help='show just Bitcoin address', action='store_true')
    parser.add_argument(
        '-u', "--uncompressed", help='show output in uncompressed form', action='store_true')
    parser.add_argument(
        '-P', "--public", help='only show public version of wallet keys', action='store_true')

    parser.add_argument('-j', "--json", help='output as JSON', action='store_true')

    parser.add_argument('-b', "--brief", nargs="*", help='brief output; display a single field')

    parser.add_argument('-s', "--subkey", help='subkey path (example: 0H/2/15-20)', default="")
    parser.add_argument('-n', "--network", help='specify network', choices=codes)
    parser.add_argument(
        "--override-network", help='override detected network type', default=None, choices=codes)

    parser.add_argument(
        'item', nargs="*", help='a BIP0032 wallet key string;'
        ' a WIF;'
        ' a bitcoin address;'
        ' an SEC (ie. a 66 hex chars starting with 02, 03 or a 130 hex chars starting with 04);'
        ' the literal string "create" to create a new wallet key using strong entropy sources;'
        ' P:wallet passphrase (NOT RECOMMENDED);'
        ' H:wallet passphrase in hex (NOT RECOMMENDED);'
        ' E:electrum value (either a master public, master private, or initial data);'
        ' secret_exponent (in decimal or hex);'
        ' x,y where x,y form a public pair (y is a number or one of the strings "even" or "odd");'
        ' hash160 (as 40 hex characters).'
        ' If this argument is missing, input data will be read from stdin.')
    return parser
Ejemplo n.º 12
0
    def test_is_wif_valid(self):
        WIFS = ["KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn",
                "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf",
                "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4",
                "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH"]

        for wif in WIFS:
            self.assertEqual(BTC.parse.wif(wif).wif(), wif)
            a = wif[:-1] + chr(ord(wif[-1])+1)
            self.assertIsNone(BTC.parse.wif(a))

        NETWORK_NAMES = network_codes()
        for netcode in NETWORK_NAMES:
            network = network_for_netcode(netcode)
            if not getattr(network, "Key", None):
                continue
            for se in range(1, 10):
                key = network.Key(secret_exponent=se)
                for tv in [True, False]:
                    wif = key.wif(is_compressed=tv)
                    self.assertEqual(network.parse.wif(wif).wif(), wif)
                    a = wif[:-1] + chr(ord(wif[-1])+1)
                    self.assertIsNone(network.parse.wif(a))
Ejemplo n.º 13
0
    def test_is_wif_valid(self):
        WIFS = ["KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU73sVHnoWn",
                "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAnchuDf",
                "KwDiBf89QgGbjEhKnhXJuH7LrciVrZi3qYjgd9M7rFU74NMTptX4",
                "5HpHagT65TZzG1PH3CSu63k8DbpvD8s5ip4nEB3kEsreAvUcVfH"]

        for wif in WIFS:
            self.assertEqual(is_wif_valid(wif, allowable_netcodes=NETCODES), "BTC")
            a = wif[:-1] + chr(ord(wif[-1])+1)
            self.assertEqual(is_wif_valid(a), None)

        from pycoin.networks.registry import network_for_netcode
        NETWORK_NAMES = network_codes()
        for netcode in NETWORK_NAMES:
            network = network_for_netcode(netcode)
            if not getattr(network, "key", None):
                continue
            for se in range(1, 10):
                key = network.key(secret_exponent=se)
                for tv in [True, False]:
                    wif = key.wif(use_uncompressed=tv)
                    self.assertEqual(is_wif_valid(wif, allowable_netcodes=[netcode]), netcode)
                    a = wif[:-1] + chr(ord(wif[-1])+1)
                    self.assertEqual(is_wif_valid(a, allowable_netcodes=[netcode]), None)
Ejemplo n.º 14
0
def create_parser():
    codes = network_codes()
    parser = argparse.ArgumentParser(
        description='Crypto coin utility ku ("key utility") to show'
        ' information about Bitcoin or other cryptocoin data structures.',
        epilog=('Known networks codes:\n  ' + ', '.join([
            '%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes
        ])))
    parser.add_argument('-w',
                        "--wallet",
                        help='show just Bitcoin wallet key',
                        action='store_true')
    parser.add_argument('-W',
                        "--wif",
                        help='show just Bitcoin WIF',
                        action='store_true')
    parser.add_argument('-a',
                        "--address",
                        help='show just Bitcoin address',
                        action='store_true')
    parser.add_argument('-u',
                        "--uncompressed",
                        help='show output in uncompressed form',
                        action='store_true')
    parser.add_argument('-P',
                        "--public",
                        help='only show public version of wallet keys',
                        action='store_true')

    parser.add_argument('-j',
                        "--json",
                        help='output as JSON',
                        action='store_true')

    parser.add_argument('-b',
                        "--brief",
                        nargs="*",
                        help='brief output; display a single field')

    parser.add_argument('-s',
                        "--subkey",
                        help='subkey path (example: 0H/2/15-20)')
    parser.add_argument('-n',
                        "--network",
                        help='specify network',
                        choices=codes)
    parser.add_argument("--override-network",
                        help='override detected network type',
                        default=None,
                        choices=codes)

    parser.add_argument(
        'item',
        nargs="*",
        help='a BIP0032 wallet key string;'
        ' a WIF;'
        ' a bitcoin address;'
        ' an SEC (ie. a 66 hex chars starting with 02, 03 or a 130 hex chars starting with 04);'
        ' the literal string "create" to create a new wallet key using strong entropy sources;'
        ' P:wallet passphrase (NOT RECOMMENDED);'
        ' H:wallet passphrase in hex (NOT RECOMMENDED);'
        ' E:electrum value (either a master public, master private, or initial data);'
        ' secret_exponent (in decimal or hex);'
        ' x,y where x,y form a public pair (y is a number or one of the strings "even" or "odd");'
        ' hash160 (as 40 hex characters).'
        ' If this argument is missing, input data will be read from stdin.')
    return parser
Ejemplo n.º 15
0
def create_parser():
    codes = network_codes()
    EPILOG = ('Files are binary by default unless they end with the suffix ".hex". ' +
              'Known networks codes:\n  ' +
              ', '.join(['%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes]))

    parser = argparse.ArgumentParser(
        description="Manipulate bitcoin (or alt coin) transactions.",
        epilog=EPILOG)

    parser.add_argument('-t', "--transaction-version", type=range_int(0, 255, "version"),
                        help='Transaction version, either 1 (default) or 3 (not yet supported).')

    parser.add_argument('-l', "--lock-time", type=parse_locktime, help='Lock time; either a block'
                        'index, or a date/time (example: "2014-01-01T15:00:00"')

    parser.add_argument('-n', "--network", default=get_current_netcode(), choices=codes,
                        help=('Default network code (environment variable PYCOIN_DEFAULT_NETCODE '
                              'or "BTC"=Bitcoin mainnet if unset'))

    parser.add_argument('-a', "--augment", action='store_true',
                        help='augment tx by adding any missing spendable metadata by fetching'
                             ' inputs from cache and/or web services')

    parser.add_argument('-s', "--verbose-signature", action='store_true',
                        help='Display technical signature details.')

    parser.add_argument("-i", "--fetch-spendables", metavar="address", action="append",
                        help='Add all unspent spendables for the given bitcoin address. This information'
                        ' is fetched from web services. With no outputs, incoming spendables will be printed.')

    parser.add_argument("-I", "--dump-inputs", action='store_true', help='Dump inputs to this transaction.')

    parser.add_argument(
        "-k", "--keychain", default=":memory:",
        help="path to keychain file for hierarchical key hints (SQLite3 file created with keychain tool)")

    parser.add_argument(
        "-K", "--key-paths", default="",
        help="Key path hints to search hiearachical private keys (example: 0/0H/0-20)")

    parser.add_argument('-f', "--private-key-file", metavar="path-to-private-keys", action="append", default=[],
                        help='file containing WIF or BIP0032 private keys. If file name ends with .gpg, '
                        '"gpg -d" will be invoked automatically. File is read one line at a time, and if '
                        'the file contains only one WIF per line, it will also be scanned for a bitcoin '
                        'address, and any addresses found will be assumed to be public keys for the given'
                        ' private key.',
                        type=argparse.FileType('r'))

    parser.add_argument('-g', "--gpg-argument", help='argument to pass to gpg (besides -d).', default='')

    parser.add_argument("--remove-tx-in", metavar="tx_in_index_to_delete", action="append", type=int,
                        help='remove a tx_in')

    parser.add_argument("--remove-tx-out", metavar="tx_out_index_to_delete", action="append", type=int,
                        help='remove a tx_out')

    parser.add_argument("--replace-input-script", metavar="tx_in_script_slash_hex", action="append", default=[],
                        type=parse_script_index_hex, help='replace an input script: arg looks like "1/796a"')

    parser.add_argument('-F', "--fee", help='fee, in satoshis, to pay on transaction, or '
                        '"standard" to auto-calculate. This is only useful if the "split pool" '
                        'is used; otherwise, the fee is automatically set to the unclaimed funds.',
                        default="standard", metavar="transaction-fee", type=parse_fee)

    parser.add_argument('-C', "--cache", help='force the resultant transaction into the transaction cache.'
                        ' Mostly for testing.', action='store_true'),

    parser.add_argument("--db", help='force the transaction expressed by the given hex '
                        'into a RAM-based transaction cache. Mostly for testing.', action="append"),

    parser.add_argument('-u', "--show-unspents", action='store_true',
                        help='show TxOut items for this transaction in Spendable form.')

    parser.add_argument('-b', "--bitcoind-url",
                        help='URL to bitcoind instance to validate against (http://user:pass@host:port).')

    parser.add_argument('-o', "--output-file", metavar="path-to-output-file", type=argparse.FileType('wb'),
                        help='file to write transaction to. This supresses most other output.')

    parser.add_argument('-d', "--disassemble", action='store_true',
                        help='Disassemble scripts.')

    parser.add_argument("--pdb", action="store_true", help='Enter PDB debugger on each script instruction.')

    parser.add_argument("--trace", action='store_true', help='Trace scripts.')

    parser.add_argument('-p', "--pay-to-script", metavar="pay-to-script", action="append",
                        help='a hex version of a script required for a pay-to-script'
                        'input (a bitcoin address that starts with 3)')

    parser.add_argument("--signature", metavar="known-good-signature", action="append",
                        help='a hex version of a signature that will be used if useful')

    parser.add_argument("--sec", metavar="known-sec", action="append",
                        help='a hex version of an SEC that will be used if useful')

    parser.add_argument('-P', "--pay-to-script-file", metavar="pay-to-script-file", nargs=1,
                        type=argparse.FileType('r'), help='a file containing hex scripts '
                        '(one per line) corresponding to pay-to-script inputs')

    parser.add_argument("--dump-signatures", action="store_true",
                        help="print signatures (for use with --signature)")

    parser.add_argument("--dump-secs", action="store_true",
                        help="print secs (for use with --sec)")

    parser.add_argument("--coinbase", type=str, help="add an input as a coinbase from the given address")

    parser.add_argument("argument", nargs="*", help='generic argument: can be a hex transaction id '
                        '(exactly 64 characters) to be fetched from cache or a web service;'
                        ' a transaction as a hex string; a path name to a transaction to be loaded;'
                        ' a spendable 4-tuple of the form tx_id/tx_out_idx/script_hex/satoshi_count '
                        'to be added to TxIn list; an address/satoshi_count to be added to the TxOut '
                        'list; an address or script to be added to the TxOut list and placed in the '
                        '"split pool".')

    return parser
Ejemplo n.º 16
0
def ku(args, parser):
    fallback_network = network_for_netcode(args.network or get_current_netcode())
    parse_networks = [fallback_network] + [network_for_netcode(netcode) for netcode in network_codes()]
    if args.network:
        parse_networks = [network_for_netcode(args.network)]

    override_network = None
    if args.override_network:
        # Override the network value, so we can take the same xpubkey and view what
        # the values would be on each other network type.
        override_network = network_for_netcode(args.override_network)

    def parse_stdin():
        return [item for item in sys.stdin.readline().strip().split(' ') if len(item) > 0]

    output_key_set = set(args.brief or [])
    if args.wallet:
        output_key_set.add("wallet_key")
    elif args.wif:
        output_key_set.add("wif_uncompressed" if args.uncompressed else "wif")
    elif args.address:
        output_key_set.add("address" + ("_uncompressed" if args.uncompressed else ""))

    items = args.item if len(args.item) > 0 else parse_stdin()

    for item in items:
        key_network, key = parse_key(item, parse_networks)
        if key is None:
            print("can't parse %s" % item, file=sys.stderr)
            continue

        display_network = override_network or key_network or fallback_network

        if hasattr(key, "subkeys"):
            key_iter = key.subkeys(args.subkey)
        else:
            key_iter = [key]
        for key in key_iter:
            if args.public:
                key = key.public_copy()

            output_dict, output_order = create_output(item, key, display_network, output_key_set)

            generate_output(args, output_dict, output_order)
Ejemplo n.º 17
0
def create_parser():
    codes = network_codes()
    EPILOG = (
        'Files are binary by default unless they end with the suffix ".hex". '
        + 'Known networks codes:\n  ' + ', '.join([
            '%s (%s)' % (i, network_for_netcode(i).full_name()) for i in codes
        ]))

    parser = argparse.ArgumentParser(
        description="Manipulate bitcoin (or alt coin) transactions.",
        epilog=EPILOG)

    parser.add_argument(
        '-t',
        "--transaction-version",
        type=range_int(0, 255, "version"),
        help='Transaction version, either 1 (default) or 3 (not yet supported).'
    )

    parser.add_argument(
        '-l',
        "--lock-time",
        type=parse_locktime,
        help='Lock time; either a block'
        'index, or a date/time (example: "2014-01-01T15:00:00"')

    parser.add_argument(
        '-n',
        "--network",
        default=get_current_netcode(),
        choices=codes,
        help=(
            'Default network code (environment variable PYCOIN_DEFAULT_NETCODE '
            'or "BTC"=Bitcoin mainnet if unset'))

    parser.add_argument(
        '-a',
        "--augment",
        action='store_true',
        help='augment tx by adding any missing spendable metadata by fetching'
        ' inputs from cache and/or web services')

    parser.add_argument('-s',
                        "--verbose-signature",
                        action='store_true',
                        help='Display technical signature details.')

    parser.add_argument(
        "-i",
        "--fetch-spendables",
        metavar="address",
        action="append",
        help=
        'Add all unspent spendables for the given bitcoin address. This information'
        ' is fetched from web services. With no outputs, incoming spendables will be printed.'
    )

    parser.add_argument("-I",
                        "--dump-inputs",
                        action='store_true',
                        help='Dump inputs to this transaction.')

    parser.add_argument(
        "-k",
        "--keychain",
        default=":memory:",
        help=
        "path to keychain file for hierarchical key hints (SQLite3 file created with keychain tool)"
    )

    parser.add_argument(
        "-K",
        "--key-paths",
        default="",
        help=
        "Key path hints to search hiearachical private keys (example: 0/0H/0-20)"
    )

    parser.add_argument(
        '-f',
        "--private-key-file",
        metavar="path-to-private-keys",
        action="append",
        default=[],
        help=
        'file containing WIF or BIP0032 private keys. If file name ends with .gpg, '
        '"gpg -d" will be invoked automatically. File is read one line at a time, and if '
        'the file contains only one WIF per line, it will also be scanned for a bitcoin '
        'address, and any addresses found will be assumed to be public keys for the given'
        ' private key.',
        type=argparse.FileType('r'))

    parser.add_argument('-g',
                        "--gpg-argument",
                        help='argument to pass to gpg (besides -d).',
                        default='')

    parser.add_argument("--remove-tx-in",
                        metavar="tx_in_index_to_delete",
                        action="append",
                        type=int,
                        help='remove a tx_in')

    parser.add_argument("--remove-tx-out",
                        metavar="tx_out_index_to_delete",
                        action="append",
                        type=int,
                        help='remove a tx_out')

    parser.add_argument(
        "--replace-input-script",
        metavar="tx_in_script_slash_hex",
        action="append",
        default=[],
        type=parse_script_index_hex,
        help='replace an input script: arg looks like "1/796a"')

    parser.add_argument(
        '-F',
        "--fee",
        help='fee, in satoshis, to pay on transaction, or '
        '"standard" to auto-calculate. This is only useful if the "split pool" '
        'is used; otherwise, the fee is automatically set to the unclaimed funds.',
        default="standard",
        metavar="transaction-fee",
        type=parse_fee)

    parser.add_argument(
        '-C',
        "--cache",
        help='force the resultant transaction into the transaction cache.'
        ' Mostly for testing.',
        action='store_true'),

    parser.add_argument(
        "--db",
        help='force the transaction expressed by the given hex '
        'into a RAM-based transaction cache. Mostly for testing.',
        action="append"),

    parser.add_argument(
        '-u',
        "--show-unspents",
        action='store_true',
        help='show TxOut items for this transaction in Spendable form.')

    parser.add_argument(
        '-b',
        "--bitcoind-url",
        help=
        'URL to bitcoind instance to validate against (http://user:pass@host:port).'
    )

    parser.add_argument(
        '-o',
        "--output-file",
        metavar="path-to-output-file",
        type=argparse.FileType('wb'),
        help='file to write transaction to. This supresses most other output.')

    parser.add_argument('-d',
                        "--disassemble",
                        action='store_true',
                        help='Disassemble scripts.')

    parser.add_argument("--pdb",
                        action="store_true",
                        help='Enter PDB debugger on each script instruction.')

    parser.add_argument("--trace", action='store_true', help='Trace scripts.')

    parser.add_argument(
        '-p',
        "--pay-to-script",
        metavar="pay-to-script",
        action="append",
        help='a hex version of a script required for a pay-to-script'
        'input (a bitcoin address that starts with 3)')

    parser.add_argument(
        "--signature",
        metavar="known-good-signature",
        action="append",
        help='a hex version of a signature that will be used if useful')

    parser.add_argument(
        "--sec",
        metavar="known-sec",
        action="append",
        help='a hex version of an SEC that will be used if useful')

    parser.add_argument('-P',
                        "--pay-to-script-file",
                        metavar="pay-to-script-file",
                        nargs=1,
                        type=argparse.FileType('r'),
                        help='a file containing hex scripts '
                        '(one per line) corresponding to pay-to-script inputs')

    parser.add_argument("--dump-signatures",
                        action="store_true",
                        help="print signatures (for use with --signature)")

    parser.add_argument("--dump-secs",
                        action="store_true",
                        help="print secs (for use with --sec)")

    parser.add_argument(
        "--coinbase",
        type=str,
        help="add an input as a coinbase from the given address")

    parser.add_argument(
        "argument",
        nargs="*",
        help='generic argument: can be a hex transaction id '
        '(exactly 64 characters) to be fetched from cache or a web service;'
        ' a transaction as a hex string; a path name to a transaction to be loaded;'
        ' a spendable 4-tuple of the form tx_id/tx_out_idx/script_hex/satoshi_count '
        'to be added to TxIn list; an address/satoshi_count to be added to the TxOut '
        'list; an address or script to be added to the TxOut list and placed in the '
        '"split pool".')

    return parser