forked from vbuterin/pybitcointools
-
Notifications
You must be signed in to change notification settings - Fork 0
SImple, common-sense Bitcoin-themed Python ECC library
License
trentrussell/pybitcointools
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
# Pybitcointools, Python library for Bitcoin signatures and transactions, fork supporting Clams ### About the Clam fork: This is trentrussell's fork of vbuterin's pybitcointools with added support for Clams. The original comments of Vitalik start with the "Advantages" section below. Disclaimer: The clam code does not seem to work consistently. Sometimes signed transactions look correct and can be decoded, but clamd refuses to send them. However, if you keep recreating and resigning the transaction, it eventually works in the few test cases I have tried. If someone can discover the problem and fix it, please do so and fork or create a PR. Use at your own risk! ### Clam example usage: Here is how to get a clam address from a private key or public key. > from bitcoin import * > privwif = "5KCB6mNiMjjd6mSNQsqsxSbzMedpzqEoq5BTdBBbPi9Tw5EuMvW" > priv = decode_privkey(privwif,get_privkey_format(privwif)) > privkey_to_clamaddress(priv) 'xAryp2xAD1pQcVk75XiYKqaktRmeGpV2Eh' > pub = privtopub(priv) > pubtoclamaddr(pub) 'xAryp2xAD1pQcVk75XiYKqaktRmeGpV2Eh' Here is how to make and sign a clam transaction without speech: > ins1 = [{'output': u'90a6e34d1ef8aea717fa4d760f21db74827c57a13a7857330fe17f1976f5f92f:0', 'value': 500000, 'address': u'xAryp2xAD1pQcVk75XiYKqaktRmeGpV2Eh'}] > outs1 = [{'value': 400000, 'address': 'xQ5y6UKx7MtGSBkwaJvFVpWbVTBAD3p9Jv'}] > tx1 = mkclamtx(ins1,outs1) > tx1 '0100000039cfd555012ff9f576197fe10f3357783aa1577c8274db210f764dfa17a7aef81e4de3a6900000000000ffffffff01801a0600000000001976a914ad1ca1df4a2dec9e71c75936b6efa2e118ddd78b88ac00000000' > stx1 = clamsign(tx1,0,privwif) > stx1 '0100000039cfd555012ff9f576197fe10f3357783aa1577c8274db210f764dfa17a7aef81e4de3a690000000008b48304502210086b3b336d220f5cecf2fd08048529659bba5f1446dedca91d84ad6c032ea9b4302201a8ef01f5def7b08614fc04acf4d87b6ea991d9a0942eb700bae0f3e6360ab88014104aa4d663beda361b3b01dc447d2535199045d124fcff8f49b48da4a47b0dbe1990bb70ba48865e0da828c214223cd344427ad870b46d076e48df32f4d4b2de3f9ffffffff01801a0600000000001976a914ad1ca1df4a2dec9e71c75936b6efa2e118ddd78b88ac00000000' Here is how to make and sign a clam transaction with speech: > ins2 = [{'output': u'90a6e34d1ef8aea717fa4d760f21db74827c57a13a7857330fe17f1976f5f92f:1', 'value': 400000, 'address': u'xAryp2xAD1pQcVk75XiYKqaktRmeGpV2Eh'}] > outs2 = [{'value': 300000, 'address': 'xQ5y6UKx7MtGSBkwaJvFVpWbVTBAD3p9Jv'}] > tx2 = mkclamspeechtx("This is where the speech is.",ins2,outs2) > tx2 '0200000087d2d555012ff9f576197fe10f3357783aa1577c8274db210f764dfa17a7aef81e4de3a6900100000000ffffffff01e0930400000000001976a914ad1ca1df4a2dec9e71c75936b6efa2e118ddd78b88ac000000001c5468697320697320776865726520746865207370656563682069732e' > stx2 = clamsign(tx2,0,privwif) > stx2 '0200000087d2d555012ff9f576197fe10f3357783aa1577c8274db210f764dfa17a7aef81e4de3a690010000008b483045022100f665aa68b28797aea7b47093214195d5e9357dcd8e35c1b76d9111561c613d4c022060af9fa1855761d3e1226eb7b040875e4348abc919889d8429f12308db6b64d5014104aa4d663beda361b3b01dc447d2535199045d124fcff8f49b48da4a47b0dbe1990bb70ba48865e0da828c214223cd344427ad870b46d076e48df32f4d4b2de3f9ffffffff01e0930400000000001976a914ad1ca1df4a2dec9e71c75936b6efa2e118ddd78b88ac000000001c5468697320697320776865726520746865207370656563682069732e' ### 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 * 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 * 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 * 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
About
SImple, common-sense Bitcoin-themed Python ECC library
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published
Languages
- Python 100.0%