/pybitcointools

SImple, common-sense Bitcoin-themed Python ECC library

Primary LanguagePythonOtherNOASSERTION

Pybitcointools, Python library for Bitcoin signatures and transactions

Advantages:

  • Functions have a simple interface, inputting and outputting in standard formats
  • No classes
  • Many functions can be taken out and used individually
  • Supports binary, hex and base58
  • Transaction deserialization format almost compatible with BitcoinJS
  • Electrum and BIP0032 support
  • Make and publish a transaction all in a single command line instruction
  • Includes non-bitcoin-specific conversion and JSON utilities

Disadvantages:

  • Not a full node, has no idea what blocks are
  • Relies on centralized service (blockchain.info) for blockchain operations, although operations do have backups (eligius, blockr.io)

Example usage (best way to learn :) ):

> from bitcoin import *
> priv = sha256('some big long brainwallet password')
> priv
'57c617d9b4e1f7af6ec97ca2ff57e94a28279a7eedd4d12a99fa11170e94f5a4'
> pub = privtopub(priv)
> pub
'0420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9'
> addr = pubtoaddr(pub)
> addr
'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'
> h = history(addr)
> h
[{'output': u'97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0', 'value': 50000, 'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'}, {'output': u'4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1', 'value': 50000, 'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'}]
> outs = [{'value': 90000, 'address': '16iw1MQ1sy1DtRPYw3ao1bCamoyBJtRB4t'}]
> tx = mktx(h,outs)
> tx
'01000000025e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f7970000000000ffffffff71d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c0100000000ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000'
> tx2 = sign(tx,0,priv)
> tx2
'01000000025e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f797000000008b483045022100dd29d89a28451febb990fb1dafa21245b105140083ced315ebcdea187572b3990220713f2e554f384d29d7abfedf39f0eb92afba0ef46f374e49d43a728a0ff6046e01410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffff71d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c0100000000ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000'
> tx3 = sign(tx2,1,priv)
> tx3
'01000000025e46552eb977f908fa8b3ee9d2943a8fa6d96c3b768a5f250ce485acd8c7f797000000008b483045022100dd29d89a28451febb990fb1dafa21245b105140083ced315ebcdea187572b3990220713f2e554f384d29d7abfedf39f0eb92afba0ef46f374e49d43a728a0ff6046e01410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffff71d1abe4352100d4d837ca96c1a16947b5444f0f3e0bc645c430f704bb06c84c010000008c4930460221008bbaaaf172adfefc3a1315dc7312c88645832ff76d52e0029d127e65bbeeabe1022100fdeb89658d503cf2737cedb4049e5070f689c50a9b6c85997d49e0787938f93901410420f34c2786b4bae593e22596631b025f3ff46e200fc1d4b52ef49bbdc2ed00b26c584b7e32523fb01be2294a1f8a5eb0cf71a203cc034ced46ea92a8df16c6e9ffffffff01905f0100000000001976a9143ec6c3ed8dfc3ceabcc1cbdb0c5aef4e2d02873c88ac00000000'
> pushtx(tx3)
'Transaction Submitted'

Or using the pybtctool command line interface:

@vub: pybtctool random_electrum_seed
484ccb566edb66c65dd0fd2e4d90ef65

@vub: pybtctool electrum_privkey 484ccb566edb66c65dd0fd2e4d90ef65 0 0
593240c2205e7b7b5d7c13393b7c9553497854b75c7470b76aeca50cd4a894d7

@vub: pybtctool electrum_mpk 484ccb566edb66c65dd0fd2e4d90ef65
484e42865b8e9a6ea8262fd1cde666b557393258ed598d842e563ad9e5e6c70a97e387eefdef123c1b8b4eb21fe210c6216ad7cc1e4186fbbba70f0e2c062c25

@vub: pybtctool bip32_master_key 21456t243rhgtucyadh3wgyrcubw3grydfbng
xprv9s21ZrQH143K2napkeoHT48gWmoJa89KCQj4nqLfdGybyWHP9Z8jvCGzuEDv4ihCyoed7RFPNbc9NxoSF7cAvH9AaNSvepUaeqbSpJZ4rbT

@vub: pybtctool bip32_ckd xprv9s21ZrQH143K2napkeoHT48gWmoJa89KCQj4nqLfdGybyWHP9Z8jvCGzuEDv4ihCyoed7RFPNbc9NxoSF7cAvH9AaNSvepUaeqbSpJZ4rbT 0
xprv9vfzYrpwo7QHFdtrcvsSCTrBESFPUf1g7NRvayy1QkEfUekpDKLfqvHjgypF5w3nAvnwPjtQUNkyywWNkLbiUS95khfHCzJXFkLEdwRepbw 

@vub: pybtctool bip32_privtopub xprv9s21ZrQH143K2napkeoHT48gWmoJa89KCQj4nqLfdGybyWHP9Z8jvCGzuEDv4ihCyoed7RFPNbc9NxoSF7cAvH9AaNSvepUaeqbSpJZ4rbT
xpub661MyMwAqRbcFGfHrgLHpC5R4odnyasAZdefbDkHBcWarJcXh6SzTzbUkWuhnP142ZFdKdAJSuTSaiGDYjvm7bCLmA8DZqksYjJbYmcgrYF

The -s option lets you read arguments from the command line

@vub: pybtctool sha256 'some big long brainwallet password' | pybtctool -s privtoaddr | pybtctool -s history
[{'output': u'97f7c7d8ac85e40c255f8a763b6cd9a68f3a94d2e93e8bfa08f977b92e55465e:0', 'value': 50000, 'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'}, {'output': u'4cc806bb04f730c445c60b3e0f4f44b54769a1c196ca37d8d4002135e4abd171:1', 'value': 50000, 'address': u'1CQLd3bhw4EzaURHbKCwM5YZbUQfA4ReY6'}]
@vub: pybtctool random_electrum_seed | pybtctool -s electrum_privkey 0 0
593240c2205e7b7b5d7c13393b7c9553497854b75c7470b76aeca50cd4a894d7

The -b option lets you read binary data as an argument

@vub: pybtctool sha256 123 | pybtctool -s changebase 16 256 | pybtctool -b changebase 256 16
a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae30a

The -j option lets you read json from the command line (-J to split a json list into multiple arguments)

@vub: pybtctool unspent 1FxkfJQLJTXpW6QmxGT6oF43ZH959ns8Cq | pybtctool -j select 200000001 | pybtctool -j mksend 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P:20000 1FxkfJQLJTXpW6QmxGT6oF43ZH959ns8Cq 1000 | pybtctool -s signall 805cd74ca322633372b9bfb857f3be41db0b8de43a3c44353b238c0acff9d523
0100000003d5001aae8358ae98cb02c1b6f9859dc1ac3dbc1e9cc88632afeb7b7e3c510a49000000008b4830450221009e03bb6122437767e2ca785535824f4ed13d2ebbb9fa4f9becc6d6f4e1e217dc022064577353c08d8d974250143d920d3b963b463e43bbb90f3371060645c49266b90141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff1529d655dff6a0f6c9815ee835312fb3ca4df622fde21b6b9097666e9284087d010000008a473044022035dd67d18b575ebd339d05ca6ffa1d27d7549bd993aeaf430985795459fc139402201aaa162cc50181cee493870c9479b1148243a33923cb77be44a73ca554a4e5d60141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff23d5f9cf0a8c233b35443c3ae48d0bdb41bef357b8bfb972336322a34cd75c80010000008b483045022014daa5c5bbe9b3e5f2539a5cd8e22ce55bc84788f946c5b3643ecac85b4591a9022100a4062074a1df3fa0aea5ef67368d0b1f0eaac520bee6e417c682d83cd04330450141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff02204e0000000000001976a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ac5b3c4411000000001976a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac00000000

Fun stuff with json:

@vub: pybtctool history 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P | pybtctool -j multiaccess value | pybtctool -j sum
625216206372

@vub: pybtctool history 1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P | pybtctool -j count
6198

Listing of main commands:

  • privkey_to_pubkey : (privkey) -> pubkey

  • privtopub : (privkey) -> pubkey

  • pubkey_to_address : (pubkey) -> address

  • pubtoaddr : (pubkey) -> address

  • privkey_to_address : (privkey) -> address

  • privtoaddr : (privkey) -> address

  • add : (key1, key2) -> key1 + key2 (works on privkeys or pubkeys)

  • multiply : (pubkey, privkey) -> returns pubkey * privkey

  • ecdsa_sign : (message, privkey) -> sig

  • ecdsa_verify : (message, sig, pubkey) -> True/False

  • ecdsa_recover : (message, sig) -> pubkey

  • random_key : () -> privkey

  • random_electrum_seed : () -> electrum seed

  • random_elec2_seed : () -> electrum seed

  • random_bip39_seed :

  • random_bip39_mn :

  • random_mini_key : () -> 30 character mini private key

  • electrum_stretch : (seed) -> secret exponent

  • electrum_privkey : (seed or secret exponent, i, type) -> privkey

  • electrum_mpk : (seed or secret exponent) -> master public key

  • electrum_pubkey : (seed or secexp or mpk) -> pubkey

  • elec1_mn_decode :

  • elec1_mn_encode :

  • elec2_mn_decode :

  • elec2_mn_encode :

  • random_elec2_seed :

  • bip32_master_key : (seed) -> bip32 master key

  • bip32_ckd : (private or public bip32 key, i) -> child key

  • bip32_privtopub : (private bip32 key) -> public bip32 key

  • bip32_extract_key : (private or public bip32_key) -> privkey or pubkey

  • bip32_path : (private or public bip32 key) -> child priv or pubkey at path "m/1H/2'/3.pub"

  • parse_bip32_path : bip32_path -> array of depths

  • bip39_to_mn : (entropy) -> bip39 mnemonic (lang = english, japanese, spanish, french, chinese_traditional, chinese_simplified)

  • bip39_to_seed : (bip39 mnemonic) -> hex seed (for bip32)

  • bip39_to_entropy : (bip39 mnemonic) -> input entropy

  • bip39_check : check mnemonic is bip39 compliant

  • bip39_detect_lang : detect language of bip39 mnemonic

  • random_bip39_mn : random mnemonic

  • deserialize : (hex or bin transaction) -> JSON tx

  • serialize : (JSON tx) -> hex or bin tx

  • mktx : (inputs, outputs) -> tx

  • mksend : (inputs, outputs, change_addr, fee) -> tx

  • sign : (tx, i, privkey) -> tx with index i signed with privkey

  • multisign : (tx, i, script, privkey) -> signature

  • apply_multisignatures: (tx, i, script, sigs) -> tx with index i signed with sigs

  • scriptaddr : (script) -> P2SH address

  • mk_multisig_script : (pubkeys, k, n) -> k-of-n multisig script from pubkeys

  • verify_tx_input : (tx, i, script, sig, pub) -> True/False

  • tx_hash : (hex or bin tx) -> hash

  • history : (address1, address2, etc) -> outputs to those addresses

  • unspent : (address1, address2, etc) -> unspent outputs to those addresses

  • fetchtx : (txash) -> tx if present

  • pushtx : (hex or bin tx) -> tries to push to blockchain.info/pushtx

  • access : (json list/object, prop) -> desired property of that json object

  • multiaccess : (json list, prop) -> like access, but mapped across each list element

  • slice : (json list, start, end) -> given slice of the list

  • count : (json list) -> number of elements

  • sum : (json list) -> sum of all values

  • get_block_coinbase : Return block's coinbase field (if any)

  • bip44_address :

  • mk_opreturn : (ascii message, hex Tx) -> adds msg as an OP_RETURN to hex Tx

BLOCKCHAIN DECODING/ENCODING:


signedtx = encode_file("filename_in_pybitcointools_rootdir.jpg", privkey_to_sign_with)
pushtx(signedtx, 'testnet', source='blockr')

with open('tunguska.png', 'wb') as fo:
    fo.write(decode_file("93532aa557c00bbe7abcade3423a59a2de971379365a3d5e8581fa6c8b8d7df4", network='testnet'))


TRANSACTION-RELATED:
~~~~~~~~~~~~~~~~~~~~~~~~

    > txh = '0100000003d5001aae8358ae98cb02c1b6f9859dc1ac3dbc1e9cc88632afeb7b7e3c510a49000000008b4830450221009e03bb6122437767e2ca785535824f4ed13d2ebbb9fa4f9becc6d6f4e1e217dc022064577353c08d8d974250143d920d3b963b463e43bbb90f3371060645c49266b90141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff1529d655dff6a0f6c9815ee835312fb3ca4df622fde21b6b9097666e9284087d010000008a473044022035dd67d18b575ebd339d05ca6ffa1d27d7549bd993aeaf430985795459fc139402201aaa162cc50181cee493870c9479b1148243a33923cb77be44a73ca554a4e5d60141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff23d5f9cf0a8c233b35443c3ae48d0bdb41bef357b8bfb972336322a34cd75c80010000008b483045022014daa5c5bbe9b3e5f2539a5cd8e22ce55bc84788f946c5b3643ecac85b4591a9022100a4062074a1df3fa0aea5ef67368d0b1f0eaac520bee6e417c682d83cd04330450141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff02204e0000000000001976a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ac5b3c4411000000001976a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac00000000'
    > txo = deserialize(txh)
    > txh_plus_opreturn = mk_opreturn("My ASCII message!", txh)
    > txh_plus_opreturn
    '0100000003d5001aae8358ae98cb02c1b6f9859dc1ac3dbc1e9cc88632afeb7b7e3c510a49000000008b4830450221009e03bb6122437767e2ca785535824f4ed13d2ebbb9fa4f9becc6d6f4e1e217dc022064577353c08d8d974250143d920d3b963b463e43bbb90f3371060645c49266b90141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff1529d655dff6a0f6c9815ee835312fb3ca4df622fde21b6b9097666e9284087d010000008a473044022035dd67d18b575ebd339d05ca6ffa1d27d7549bd993aeaf430985795459fc139402201aaa162cc50181cee493870c9479b1148243a33923cb77be44a73ca554a4e5d60141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff23d5f9cf0a8c233b35443c3ae48d0bdb41bef357b8bfb972336322a34cd75c80010000008b483045022014daa5c5bbe9b3e5f2539a5cd8e22ce55bc84788f946c5b3643ecac85b4591a9022100a4062074a1df3fa0aea5ef67368d0b1f0eaac520bee6e417c682d83cd04330450141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47ffffffff03204e0000000000001976a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ac5b3c4411000000001976a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac0000000000000000396a3773696d6f6e20736179732073696d6f6e20736179732073696d6f6e20736179732073696d6f6e20736179732073696d6f6e20736179732000000000'

    > der_sigs = der_extract(txo)
    > der_sigs
     ['30450221009e03bb6122437767e2ca785535824f4ed13d2ebbb9fa4f9becc6d6f4e1e217dc022064577353c08d8d974250143d920d3b963b463e43bbb90f3371060645c49266b901', 3044022035dd67d18b575ebd339d05ca6ffa1d27d7549bd993aeaf430985795459fc139402201aaa162cc50181cee493870c9479b1148243a33923cb77be44a73ca554a4e5d601', 3045022014daa5c5bbe9b3e5f2539a5cd8e22ce55bc84788f946c5b3643ecac85b4591a9022100a4062074a1df3fa0aea5ef67368d0b1f0eaac520bee6e417c682d83cd043304501']

    > deserialize_der(der_sigs[0])
    (71472023862640473060809994352042629425574428600918189916883944970132289361884L,  133376868517818274990276330524947331990L,  0)

     > deserialize_der(der_sigs[0])
    (71472023862640473060809994352042629425574428600918189916883944970132289361884L,  133376868517818274990276330524947331990L,  0)

    > extract_tx_outpoints(txo)
    ['490a513c7e7bebaf3286c89c1ebc3dacc19d85f9b6c102cb98ae5883ae1a00d5:0',  '7d0884926e6697906b1be2fd22f64dcab32f3135e85e81c9f6a0f6df55d62915:1',  '805cd74ca322633372b9bfb857f3be41db0b8de43a3c44353b238c0acff9d523:1']


    > get_script(txh, 'ins')
    ['4830450221009e03bb6122437767e2ca785535824f4ed13d2ebbb9fa4f9becc6d6f4e1e217dc022064577353c08d8d974250143d920d3b963b463e43bbb90f3371060645c49266b90141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47',  '473044022035dd67d18b575ebd339d05ca6ffa1d27d7549bd993aeaf430985795459fc139402201aaa162cc50181cee493870c9479b1148243a33923cb77be44a73ca554a4e5d60141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47', '483045022014daa5c5bbe9b3e5f2539a5cd8e22ce55bc84788f946c5b3643ecac85b4591a9022100a4062074a1df3fa0aea5ef67368d0b1f0eaac520bee6e417c682d83cd04330450141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47']

    > get_script(txh, 'outs')
    ['76a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ac', '76a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac']

    > get_script(txh)
    {'ins':  ['4830450221009e03bb6122437767e2ca785535824f4ed13d2ebbb9fa4f9becc6d6f4e1e217dc022064577353c08d8d974250143d920d3b963b463e43bbb90f3371060645c49266b90141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47', '473044022035dd67d18b575ebd339d05ca6ffa1d27d7549bd993aeaf430985795459fc139402201aaa162cc50181cee493870c9479b1148243a33923cb77be44a73ca554a4e5d60141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47', '483045022014daa5c5bbe9b3e5f2539a5cd8e22ce55bc84788f946c5b3643ecac85b4591a9022100a4062074a1df3fa0aea5ef67368d0b1f0eaac520bee6e417c682d83cd04330450141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47'], 'outs': ['76a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ac', '76a914a41d15ae657ad3bfd0846771a34d7584c37d54a288ac']}

    > get_scriptpubkey('45138cc9dd17b13950230cd64d75891df829ec9b4b3e8aa3b9d2efbb3710965e:0')  # txid:idx
    '76a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ac'

    > get_scriptpubkey(txh, 0)  # or Tx hex, index   
    '76a914dd6cce9f255a8cc17bda8ba0373df8e861cb866e88ac'

Also works for `get_scriptsig`

    > get_scriptsig(txh, 0)
    '4830450221009e03bb6122437767e2ca785535824f4ed13d2ebbb9fa4f9becc6d6f4e1e217dc022064577353c08d8d974250143d920d3b963b463e43bbb90f3371060645c49266b90141048ef80f6bd6b073407a69299c2ba89de48adb59bb9689a5ab040befbbebcfbb15d01b006a6b825121a0d2c546c277acb60f0bd3203bd501b8d67c7dba91f27f47'

    > get_scriptsig('45138cc9dd17b13950230cd64d75891df829ec9b4b3e8aa3b9d2efbb3710965e:0')   # txid:out idx
    '483045022100b5809dab5c6769877e96b3d01f3397e845eaf8fa3156e45a78b22f8c56c9ed790220748538a23636121fc231cf20303f73dd782c9a346061e6597d1d993f754e51180141042daa93315eebbe2cb9b5c3505df4c6fb6caca8b756786098567550d4820c09db988fe9997d049d687292f815ccd6e7fb5c1b1a91137999818d17c73d0f80aef9'

    > get_outpoints(txo) 
    ['490a513c7e7bebaf3286c89c1ebc3dacc19d85f9b6c102cb98ae5883ae1a00d5:0', '7d0884926e6697906b1be2fd22f64dcab32f3135e85e81c9f6a0f6df55d62915:1', '805cd74ca322633372b9bfb857f3be41db0b8de43a3c44353b238c0acff9d523:1']