def test_op_checklocktimeverify(): prev_txn_hash = Hash('6eae1e03964799c4e29039db459ea4fad4df57c2b06f730b60032a48fb075620') txn_input = TransactionInput(prev_txn_hash, 0, Script(""), 1) addr = "1HJiL6AYYmtkbJzC9bxAorznWijwNK5Z8E" out_script_pub_key = Script.build_p2pkh( utils.address_to_key_hash(addr)[1]) txn_output = TransactionOutput(9000, out_script_pub_key) # Create the txn txn = Transaction(Transaction.DEFAULT_TRANSACTION_VERSION, [txn_input], [txn_output], 367987) # This is one more (367988) so it should fail s = Script("0x749d05 OP_CHECKLOCKTIMEVERIFY") si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.valid # This is negative, so it should fail s = Script("0xfff74d05 OP_CHECKLOCKTIMEVERIFY") si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.valid # This is one less (367986) so it should pass s = Script("0x729d05 OP_CHECKLOCKTIMEVERIFY") si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.stop # Now reformulate the txn so that the input is finalized txn_input.sequence_num = 0xffffffff si.run_script(s) assert not si.valid # The last check is if there are mismatching notions of locktime txn_input.sequence_num = 1 txn.lock_time = 500000001 si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.valid
def test_txn(): txn_str = "0100000001205607fb482a03600b736fb0c257dfd4faa49e45db3990e2c4994796031eae6e000000008b483045022100ed84be709227397fb1bc13b749f235e1f98f07ef8216f15da79e926b99d2bdeb02206ff39819d91bc81fecd74e59a721a38b00725389abb9cbecb42ad1c939fd8262014104e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbefffffffff0128230000000000001976a914f1fd1dc65af03c30fe743ac63cef3a120ffab57d88ac00000000" # nopep8 tx = Transaction.from_hex(txn_str) output_address = "1P4X54WbgeVKAnbKziaGP5n9b6Qvc9R8RZ" assert tx.output_index_for_address(output_address) == 0 assert not tx.output_index_for_address("1CmzK6oqWMwdyo4J7f2vkQTd6uu1RwtERP") addrs = tx.get_addresses() assert len(addrs['inputs']) == 1 assert len(addrs['outputs']) == 1 assert addrs['inputs'] == [["1NKxQnbtKDdL6BY1UaKdrzCxQHfn3TQnqZ"]] assert addrs['outputs'] == [[output_address]] txn_str = "0100000002cb246d110b6087cd3b5e3d3b7a74505ea995721208ddfc15b6b3b718271e0b41010000006b48304502201f2cf747f9f8e3f770bef848e6787c9fca31e3086c390e505c1339936a15a78f022100a9e5f761162b8a4387c4009ce9469e92302fda68afe85371181b6e13b84f052d01210339e1274cd66db3dbe23e4def7ae9eb81644c15347cf0b39c741fb947c8ef1f12ffffffffb828405fca4f578073fe02bb00e999407bbaa3f5556f4c3571fd5fef28e47de8010000006a47304402206b7a8851fb2284201f31854bc857a8e1a1c4d5dbd19efe76d89d2c02083ff397022029a231c2750005b5ec4c437a8fa7163eaffe02e5fb51d9b8bb5edc5bb88040720121036744acff73b223a6f04190b60a980f8de1ed0271bba92144850e90c1af489fb3ffffffff0232530000000000001976a9146037aac7480f0fa0c7740560a7bf2f37ec17597988acb0ad01000000000017a914ef5a22f491632b2f18c59352dd64fa4ec346a8118700000000" # nopep8 tx = Transaction.from_hex(txn_str) output_address = "19mkZEZinQ77SrXbzxd5QJksikQFmfUNfo" assert tx.output_index_for_address(output_address) == 0 output_address = "3PWbQBs5YDbmFCe5RdDjzqApJxs25Apvnd" assert tx.output_index_for_address(output_address) == 1 addrs = tx.get_addresses() assert len(addrs['inputs']) == 2 assert len(addrs['outputs']) == 2 assert addrs['inputs'] == [["16R5HjRwvsd5NdriQW6bBJsCFrAdqhPC1g"], ["18HMSYbh3PbXfxL6f6Cy9FjCK7AC4tB2ZX"]] assert addrs['outputs'] == [["19mkZEZinQ77SrXbzxd5QJksikQFmfUNfo"], ["3PWbQBs5YDbmFCe5RdDjzqApJxs25Apvnd"]]
def test_txn(): txn_str = "0100000001205607fb482a03600b736fb0c257dfd4faa49e45db3990e2c4994796031eae6e000000008b483045022100ed84be709227397fb1bc13b749f235e1f98f07ef8216f15da79e926b99d2bdeb02206ff39819d91bc81fecd74e59a721a38b00725389abb9cbecb42ad1c939fd8262014104e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbefffffffff0128230000000000001976a914f1fd1dc65af03c30fe743ac63cef3a120ffab57d88ac00000000" # nopep8 tx = Transaction.from_hex(txn_str) output_address = "1P4X54WbgeVKAnbKziaGP5n9b6Qvc9R8RZ" assert tx.output_index_for_address(output_address) == 0 assert not tx.output_index_for_address( "1CmzK6oqWMwdyo4J7f2vkQTd6uu1RwtERP") addrs = tx.get_addresses() assert len(addrs['inputs']) == 1 assert len(addrs['outputs']) == 1 assert addrs['inputs'] == [["1NKxQnbtKDdL6BY1UaKdrzCxQHfn3TQnqZ"]] assert addrs['outputs'] == [[output_address]] txn_str = "0100000002cb246d110b6087cd3b5e3d3b7a74505ea995721208ddfc15b6b3b718271e0b41010000006b48304502201f2cf747f9f8e3f770bef848e6787c9fca31e3086c390e505c1339936a15a78f022100a9e5f761162b8a4387c4009ce9469e92302fda68afe85371181b6e13b84f052d01210339e1274cd66db3dbe23e4def7ae9eb81644c15347cf0b39c741fb947c8ef1f12ffffffffb828405fca4f578073fe02bb00e999407bbaa3f5556f4c3571fd5fef28e47de8010000006a47304402206b7a8851fb2284201f31854bc857a8e1a1c4d5dbd19efe76d89d2c02083ff397022029a231c2750005b5ec4c437a8fa7163eaffe02e5fb51d9b8bb5edc5bb88040720121036744acff73b223a6f04190b60a980f8de1ed0271bba92144850e90c1af489fb3ffffffff0232530000000000001976a9146037aac7480f0fa0c7740560a7bf2f37ec17597988acb0ad01000000000017a914ef5a22f491632b2f18c59352dd64fa4ec346a8118700000000" # nopep8 tx = Transaction.from_hex(txn_str) output_address = "19mkZEZinQ77SrXbzxd5QJksikQFmfUNfo" assert tx.output_index_for_address(output_address) == 0 output_address = "3PWbQBs5YDbmFCe5RdDjzqApJxs25Apvnd" assert tx.output_index_for_address(output_address) == 1 addrs = tx.get_addresses() assert len(addrs['inputs']) == 2 assert len(addrs['outputs']) == 2 assert addrs['inputs'] == [["16R5HjRwvsd5NdriQW6bBJsCFrAdqhPC1g"], ["18HMSYbh3PbXfxL6f6Cy9FjCK7AC4tB2ZX"]] assert addrs['outputs'] == [["19mkZEZinQ77SrXbzxd5QJksikQFmfUNfo"], ["3PWbQBs5YDbmFCe5RdDjzqApJxs25Apvnd"]]
def test_op_checklocktimeverify(): prev_txn_hash = Hash( '6eae1e03964799c4e29039db459ea4fad4df57c2b06f730b60032a48fb075620') txn_input = TransactionInput(prev_txn_hash, 0, Script(""), 1) addr = "1HJiL6AYYmtkbJzC9bxAorznWijwNK5Z8E" out_script_pub_key = Script.build_p2pkh(utils.address_to_key_hash(addr)[1]) txn_output = TransactionOutput(9000, out_script_pub_key) # Create the txn txn = Transaction(Transaction.DEFAULT_TRANSACTION_VERSION, [txn_input], [txn_output], 367987) # This is one more (367988) so it should fail s = Script("0x749d05 OP_CHECKLOCKTIMEVERIFY") si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.valid # This is negative, so it should fail s = Script("0xfff74d05 OP_CHECKLOCKTIMEVERIFY") si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.valid # This is one less (367986) so it should pass s = Script("0x729d05 OP_CHECKLOCKTIMEVERIFY") si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.stop # Now reformulate the txn so that the input is finalized txn_input.sequence_num = 0xffffffff si.run_script(s) assert not si.valid # The last check is if there are mismatching notions of locktime txn_input.sequence_num = 1 txn.lock_time = 500000001 si = ScriptInterpreter(txn=txn, input_index=0, sub_script=out_script_pub_key) si.run_script(s) assert not si.valid
def test_op_checkmultisig(): txn = Transaction.from_hex("01000000010506344de69d47e432eb0174500d6e188a9e63c1e84a9e8796ec98c99b7559f701000000fdfd00004730440220695a28c42daa23c13e192e36a20d03a2a79994e0fe1c3c6b612d0ae23743064602200ca19003e7c1ce0cecb0bbfba9a825fc3b83cf54e4c3261cd15f080d24a8a5b901483045022100aa9096ce71995c24545694f20ab0482099a98c99b799c706c333c521e51db66002206578f023fa46f4a863a6fa7f18b95eebd1a91fcdf6ce714e8795d902bd6b682b014c69522102b66fcb1064d827094685264aaa90d0126861688932eafbd1d1a4ba149de3308b21025cab5e31095551582630f168280a38eb3a62b0b3e230b20f8807fc5463ccca3c21021098babedb3408e9ac2984adcf2a8e4c48e56a785065893f76d0fa0ff507f01053aeffffffff01c8af0000000000001976a91458b7a60f11a904feef35a639b6048de8dd4d9f1c88ac00000000") # nopep8 sig_script = txn.inputs[0].script redeem_script = Script(sig_script.ast[-1][-1]) script_pub_key = Script.build_p2sh(redeem_script.hash160()) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=redeem_script) si.run_script(sig_script) assert len(si.stack) == 4 si.run_script(script_pub_key) assert len(si.stack) == 4 assert si.stack[-1] is True assert si.valid si._op_verify() # This will do the OP_CHECKMULTISIG si.run_script(redeem_script) assert len(si.stack) == 1 assert si.stack[0] is True assert si.valid assert len(si.stack) == 1
def test_op_checkmultisig(): txn = Transaction.from_hex( "01000000010506344de69d47e432eb0174500d6e188a9e63c1e84a9e8796ec98c99b7559f701000000fdfd00004730440220695a28c42daa23c13e192e36a20d03a2a79994e0fe1c3c6b612d0ae23743064602200ca19003e7c1ce0cecb0bbfba9a825fc3b83cf54e4c3261cd15f080d24a8a5b901483045022100aa9096ce71995c24545694f20ab0482099a98c99b799c706c333c521e51db66002206578f023fa46f4a863a6fa7f18b95eebd1a91fcdf6ce714e8795d902bd6b682b014c69522102b66fcb1064d827094685264aaa90d0126861688932eafbd1d1a4ba149de3308b21025cab5e31095551582630f168280a38eb3a62b0b3e230b20f8807fc5463ccca3c21021098babedb3408e9ac2984adcf2a8e4c48e56a785065893f76d0fa0ff507f01053aeffffffff01c8af0000000000001976a91458b7a60f11a904feef35a639b6048de8dd4d9f1c88ac00000000" ) # nopep8 sig_script = txn.inputs[0].script redeem_script = Script(sig_script.ast[-1][-1]) script_pub_key = Script.build_p2sh(redeem_script.hash160()) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=redeem_script) si.run_script(sig_script) assert len(si.stack) == 4 si.run_script(script_pub_key) assert len(si.stack) == 4 assert si.stack[-1] is True assert si.valid si._op_verify() # This will do the OP_CHECKMULTISIG si.run_script(redeem_script) assert len(si.stack) == 1 assert si.stack[0] is True assert si.valid assert len(si.stack) == 1
def txn_from_json(txn_json): inputs = [] for i in txn_json['inputs']: if 'output_hash' in i: outpoint = Hash(i['output_hash']) script = Script(bytes.fromhex(i['script_signature_hex'])) # Do this to test script de/serialization script._disassemble() inp = TransactionInput(outpoint, i['output_index'], script, i['sequence']) else: # Coinbase txn, we pass in a block version of 1 since the # coinbase script from api.chain.com already has the # height in there. Don't want our stuff to repack it in. inp = CoinbaseInput(txn_json['block_height'], bytes.fromhex(i['coinbase']), i['sequence'], 1) inputs.append(inp) outputs = [] for o in txn_json['outputs']: scr = Script(bytes.fromhex(o['script_hex'])) scr._disassemble() out = TransactionOutput(o['value'], scr) outputs.append(out) txn = Transaction(Transaction.DEFAULT_TRANSACTION_VERSION, inputs, outputs, txn_json['lock_time']) return txn
def set_txn_side_effect_for_hd_discovery(self): # For each used account, there are at least 2 calls required: # 1 for the first DISCOVERY_INCREMENT payout addresses and 1 # for the first DISCOVERY_INCREMENT change # addresses. Depending on the number of used addresses for the # account, this will change. effects = [] n = self._num_used_accounts if n == 0: n = 1 for acct_num in range(n): for change in [0, 1]: num_used = self._num_used_addresses[acct_num][change] r = math.ceil((num_used + HDAccount.GAP_LIMIT) / self.address_increment) k = 'change_addresses' if change else 'payout_addresses' addr_list = self._acct_keys[acct_num][k] if change: metadata = dict(block=234790 + r, block_hash=Hash("000000000000000007d57f03ebe36dbe4f87ab2f340e93b45999ab249b6dc0df"), confirmations=23890 - r) else: metadata = dict(block=None, block_hash=None, confirmations=0) if r == 0: r = 1 for i in range(r): start = i * self.address_increment end = (i + 1) * self.address_increment addr_range = range(start, end) out = TransactionOutput(value=100000, script=Script.build_p2pkh( address_to_key_hash( addr_list[i])[1])) dummy_txn = Transaction(1, [], [out], 0) m = MockTxnDict(num_used=num_used, addr_range=addr_range, addr_list=addr_list, used_value=[dict(metadata=metadata, transaction=dummy_txn)], unused_value=[]) effects.append(m) self.get_transactions.side_effect = effects return len(effects)
def test_is_p2pkh_sig(): t = Transaction.from_hex("0100000001205607fb482a03600b736fb0c257dfd4faa49e45db3990e2c4994796031eae6e000000008b483045022100ed84be709227397fb1bc13b749f235e1f98f07ef8216f15da79e926b99d2bdeb02206ff39819d91bc81fecd74e59a721a38b00725389abb9cbecb42ad1c939fd8262014104e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbefffffffff0128230000000000001976a914f1fd1dc65af03c30fe743ac63cef3a120ffab57d88ac00000000") # nopep8 assert t.inputs[0].script.is_p2pkh_sig() sig_info = t.inputs[0].script.extract_sig_info() assert bytes_to_str(sig_info['public_key']) == '04e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbef' # nopep8 input_addresses = t.inputs[0].script.get_addresses() assert len(input_addresses) == 1 assert input_addresses[0] == '1NKxQnbtKDdL6BY1UaKdrzCxQHfn3TQnqZ'
def from_bytes(b): """ Deserializes a byte stream into a WalletTransaction. Args: b (bytes): byte stream starting with the version. Returns: tuple: First element of the tuple is the WalletTransaction, second is the remainder of the byte stream. """ t, b1 = Transaction.from_bytes() return WalletTransaction.from_transaction(t), b1
def test_op_checksig(): # This is from the same example as in test_signing.py txn = Transaction.from_hex( "0100000001205607fb482a03600b736fb0c257dfd4faa49e45db3990e2c4994796031eae6e000000001976a914e9f061ff2c9885c7b137de35e416cbd5d3e1087c88acffffffff0128230000000000001976a914f1fd1dc65af03c30fe743ac63cef3a120ffab57d88ac00000000" ) # nopep8 pub_key_hex = "0x04e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbef" # nopep8 sig_hex = "0x3045022100ed84be709227397fb1bc13b749f235e1f98f07ef8216f15da79e926b99d2bdeb02206ff39819d91bc81fecd74e59a721a38b00725389abb9cbecb42ad1c939fd826201" # nopep8 s = Script("%s %s OP_CHECKSIG" % (sig_hex, pub_key_hex)) prev_script_pub_key = Script.build_p2pkh( utils.address_to_key_hash("1NKxQnbtKDdL6BY1UaKdrzCxQHfn3TQnqZ")[1]) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 1 assert si.stack[0] is True s = Script("%s %s OP_CHECKSIGVERIFY" % (sig_hex, pub_key_hex)) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 0 assert not si.stop # Try it once more with an incorrect sig pub_key_hex = "0x04e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbef" # nopep8 sig_hex = "0x3045022100ed84be709227397fc1bc13b749f235e1f98f07ef8216f15da79e926b99d2bdeb02206ff39819d91bc81fecd74e59a721a38b00725389abb9cbecb42ad1c939fd826201" # nopep8 s = Script("%s %s OP_CHECKSIG" % (sig_hex, pub_key_hex)) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 1 assert si.stack[0] is False s = Script("%s %s OP_CHECKSIGVERIFY" % (sig_hex, pub_key_hex)) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 0 assert si.stop
def test_op_checksig(): # This is from the same example as in test_signing.py txn = Transaction.from_hex("0100000001205607fb482a03600b736fb0c257dfd4faa49e45db3990e2c4994796031eae6e000000001976a914e9f061ff2c9885c7b137de35e416cbd5d3e1087c88acffffffff0128230000000000001976a914f1fd1dc65af03c30fe743ac63cef3a120ffab57d88ac00000000") # nopep8 pub_key_hex = "0x04e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbef" # nopep8 sig_hex = "0x3045022100ed84be709227397fb1bc13b749f235e1f98f07ef8216f15da79e926b99d2bdeb02206ff39819d91bc81fecd74e59a721a38b00725389abb9cbecb42ad1c939fd826201" # nopep8 s = Script("%s %s OP_CHECKSIG" % (sig_hex, pub_key_hex)) prev_script_pub_key = Script.build_p2pkh(utils.address_to_key_hash( "1NKxQnbtKDdL6BY1UaKdrzCxQHfn3TQnqZ")[1]) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 1 assert si.stack[0] is True s = Script("%s %s OP_CHECKSIGVERIFY" % (sig_hex, pub_key_hex)) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 0 assert not si.stop # Try it once more with an incorrect sig pub_key_hex = "0x04e674caf81eb3bb4a97f2acf81b54dc930d9db6a6805fd46ca74ac3ab212c0bbf62164a11e7edaf31fbf24a878087d925303079f2556664f3b32d125f2138cbef" # nopep8 sig_hex = "0x3045022100ed84be709227397fc1bc13b749f235e1f98f07ef8216f15da79e926b99d2bdeb02206ff39819d91bc81fecd74e59a721a38b00725389abb9cbecb42ad1c939fd826201" # nopep8 s = Script("%s %s OP_CHECKSIG" % (sig_hex, pub_key_hex)) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 1 assert si.stack[0] is False s = Script("%s %s OP_CHECKSIGVERIFY" % (sig_hex, pub_key_hex)) si = ScriptInterpreter(txn=txn, input_index=0, sub_script=prev_script_pub_key) si.run_script(s) assert len(si.stack) == 0 assert si.stop
def mine_work(work_msg, enonce1, enonce2_size): """ Mine the work using a CPU to find a valid solution. Loop until the CPU finds a valid solution of the given work. Todo: Slow down the click echo when on a 21BC. Args: work_msg (WorkNotification): the work given by the pool API enonce1 (bytes): extra nonce required to make the coinbase transaction enonce2_size (int): size of the extra nonce 2 in bytes """ pool_target = utils.bits_to_target(work_msg.bits_pool) for enonce2_num in range(0, 2 ** (enonce2_size * 8)): enonce2 = enonce2_num.to_bytes(enonce2_size, byteorder="big") cb_txn, _ = Transaction.from_bytes( work_msg.coinb1 + enonce1 + enonce2 + work_msg.coinb2) cb = CompactBlock(work_msg.height, work_msg.version, Hash(work_msg.prev_block_hash), work_msg.ntime, work_msg.nbits, # lower difficulty work for testing work_msg.merkle_edge, cb_txn) row_counter = 0 for nonce in range(0xffffffff): if nonce % 6e3 == 0: logger.info(click.style(u'█', fg='green'), nl=False) row_counter += 1 if row_counter > 40: row_counter = 0 logger.info("") cb.block_header.nonce = nonce h = cb.block_header.hash.to_int('little') if h < pool_target: share = Share( enonce2=enonce2, nonce=nonce, work_id=work_msg.work_id, otime=int(time.time())) # adds a new line at the end of progress bar logger.info("") return share logger.info("Exhausted enonce1 space. Changing enonce2")
def mine_work(work_msg, enonce1, enonce2_size): """ Mine the work using a CPU to find a valid solution. Loop until the CPU finds a valid solution of the given work. Todo: Slow down the click echo when on a 21BC. Args: work_msg (WorkNotification): the work given by the pool API enonce1 (bytes): extra nonce required to make the coinbase transaction enonce2_size (int): size of the extra nonce 2 in bytes """ pool_target = utils.bits_to_target(work_msg.bits_pool) for enonce2_num in range(0, 2**(enonce2_size * 8)): enonce2 = enonce2_num.to_bytes(enonce2_size, byteorder="big") cb_txn, _ = Transaction.from_bytes(work_msg.coinb1 + enonce1 + enonce2 + work_msg.coinb2) cb = CompactBlock( work_msg.height, work_msg.version, Hash(work_msg.prev_block_hash), work_msg.ntime, work_msg.nbits, # lower difficulty work for testing work_msg.merkle_edge, cb_txn) row_counter = 0 for nonce in range(0xffffffff): if nonce % 6e3 == 0: logger.info(click.style(u'█', fg='green'), nl=False) row_counter += 1 if row_counter > 40: row_counter = 0 logger.info("") cb.block_header.nonce = nonce h = cb.block_header.hash.to_int('little') if h < pool_target: share = Share(enonce2=enonce2, nonce=nonce, work_id=work_msg.work_id, otime=int(time.time())) # adds a new line at the end of progress bar logger.info("") return share logger.info("Exhausted enonce1 space. Changing enonce2")
def set_txn_side_effect_for_index(self, account_index, address_index, change): dummy_txn = Transaction(1, [], [], 0) metadata = dict(block_height=234790, block_hash=Hash("000000000000000007d57f03ebe36dbe4f87ab2f340e93b45999ab249b6dc0df"), confirmations=23890) k = 'change_addresses' if change else 'payout_addresses' addr_list = self._acct_keys[account_index][k] mtd = MockTxnDict(num_used=address_index + 1, addr_range=range(address_index, address_index + 1), addr_list=addr_list, used_value=[dict(metadata=metadata, transaction=dummy_txn)], unused_value=[]) self.get_transactions.side_effect = [mtd]
def from_bytes(b): """ Creates a Block from a serialized byte stream. Args: b (bytes): The byte stream, starting with the block version. Returns: block, b (tuple): A tuple. The first item is the deserialized block and the second is the remainder of the byte stream. """ bh, b = BlockHeader.from_bytes(b) num_txns, b = unpack_compact_int(b) txns = [] for i in range(num_txns): t, b = Transaction.from_bytes(b) txns.append(t) return Block.from_blockheader(bh, txns), b
def redeem_payment(self, price, request_headers, **kwargs): """Validate the transaction and broadcast it to the blockchain.""" raw_tx = request_headers[OnChain.http_payment_data] logger.debug('[BitServ] Receieved transaction: {}'.format(raw_tx)) # verify txn is above dust limit if price < OnChain.DUST_LIMIT: raise PaymentBelowDustLimitError( 'Payment amount is below dust limit ({} Satoshi)'.format( OnChain.DUST_LIMIT)) try: payment_tx = Transaction.from_hex(raw_tx) except: raise InvalidPaymentParameterError('Invalid transaction hex.') # Find the output with the merchant's address payment_index = payment_tx.output_index_for_address( kwargs.get('address', self.address)) if payment_index is None: raise InvalidPaymentParameterError('Not paid to merchant.') # Verify that the payment is made for the correct amount if payment_tx.outputs[payment_index].value != price: raise InsufficientPaymentError('Incorrect payment amount.') # Synchronize the next block of code to manage its atomicity with self.lock: # Verify that we haven't seen this transaction before if self.db.lookup(str(payment_tx.hash)): raise DuplicatePaymentError('Payment already used.') else: self.db.create(str(payment_tx.hash), price) try: # Broadcast payment to network txid = self.provider.broadcast_transaction(raw_tx) logger.debug('[BitServ] Broadcasted: ' + txid) except Exception as e: # Roll back the database entry if the broadcast fails self.db.delete(str(payment_tx.hash)) raise TransactionBroadcastError(str(e)) return True
def redeem_payment(self, price, request_headers, **kwargs): """Validate the transaction and broadcast it to the blockchain.""" raw_tx = request_headers[OnChain.http_payment_data] logger.debug('[BitServ] Receieved transaction: {}'.format(raw_tx)) # verify txn is above dust limit if price < OnChain.DUST_LIMIT: raise PaymentBelowDustLimitError( 'Payment amount is below dust limit ({} Satoshi)'.format(OnChain.DUST_LIMIT)) try: payment_tx = Transaction.from_hex(raw_tx) except: raise InvalidPaymentParameterError('Invalid transaction hex.') # Find the output with the merchant's address payment_index = payment_tx.output_index_for_address(kwargs.get('address', self.address)) if payment_index is None: raise InvalidPaymentParameterError('Not paid to merchant.') # Verify that the payment is made for the correct amount if payment_tx.outputs[payment_index].value != price: raise InsufficientPaymentError('Incorrect payment amount.') # Synchronize the next block of code to manage its atomicity with self.lock: # Verify that we haven't seen this transaction before if self.db.lookup(str(payment_tx.hash)): raise DuplicatePaymentError('Payment already used.') else: self.db.create(str(payment_tx.hash), price) try: # Broadcast payment to network txid = self.provider.broadcast_transaction(raw_tx) logger.debug('[BitServ] Broadcasted: ' + txid) except Exception as e: # Roll back the database entry if the broadcast fails self.db.delete(str(payment_tx.hash)) raise TransactionBroadcastError(str(e)) return True
def from_hex(h): return WalletTransaction.from_transaction(Transaction.from_hex(h))
mnemonic=wallet_data['master_seed']) provider = TwentyOneProvider() def execute(wallet_method): methodToCall = getattr(wallet, wallet_method) result = json.dumps({wallet_method: methodToCall()}) print(result) # Loop through methods del sys.argv[0] if sys.argv[0] == 'sign': pubkey = HDPublicKey.from_hex(sys.argv[1]) server_privkey = wallet.get_private_for_public(pubkey) tx = Transaction.from_hex(sys.argv[2]) script = Script.from_hex(sys.argv[3]) for i, inp in enumerate(tx.inputs): tx.sign_input(i, Transaction.SIG_HASH_ALL, server_privkey, script) tx_id = provider.broadcast_transaction(tx.to_hex()) print(json.dumps({'tx_id': tx_id, 'hex': tx.to_hex()})) else: for arg in sys.argv: if arg == 'USD': rate = Price(wallet.balance())._get_usd_rate() print(rate) elif ':' in arg: address = arg.split(':')[1].strip()
def txn_from_json(txn_json): """ Returns a new Transaction from a JSON-serialized transaction Args: txn_json: JSON with the following format: { "hash": "0bf0de38c26195919179f...", "block_hash": "000000000000000...", "block_height": 303404, "block_time": "2014-05-30T23:54:55Z", "chain_received_at": "2015-08-13T10:52:21.718Z", "confirmations": 69389, "lock_time": 0, "inputs": [ { "transaction_hash": "0bf0de38c2619...", "output_hash": "b84a66c46e24fe71f9...", "output_index": 0, "value": 300000, "addresses": [ "3L7dKYQGNoZub928CJ8NC2WfrM8U8GGBjr" ], "script_signature": "03046022100de7b67b9...", "script_signature_hex": "00493046022100de7b...", "sequence": 4294967295 } ], "outputs": [ { "transaction_hash": "0bf0de38c261959...", "output_index": 0, "value": 290000, "addresses": [ "1K4nPxBMy6sv7jssTvDLJWk1ADHBZEoUVb" ], "script": "OP_DUP OP_HASH160 c629680b8d...", "script_hex": "76a914c629680b8d13...", "script_type": "pubkeyhash", "required_signatures": 1, "spent": false, "spending_transaction": null } ], "fees": 10000, "amount": 290000 }, Transaction.DEFAULT_TRANSACTION_VERSION Returns: two1.bitcoin.Transaction: a deserialized transaction derived from the provided json. """ inputs = [] outputs = [] addr_keys = set() for i in txn_json["inputs"]: if 'coinbase' in i: inputs.append( CoinbaseInput(height=txn_json["block_height"] or 0, raw_script=bytes.fromhex(i['coinbase']), sequence=i['sequence'], block_version=1)) else: # Script length etc. are not returned so we need to # prepend that. script, _ = Script.from_bytes( pack_var_str(bytes.fromhex(i["script_signature_hex"]))) inputs.append( TransactionInput(Hash(i["output_hash"]), i["output_index"], script, i["sequence"])) if "addresses" in i: addr_keys.add(i["addresses"][0]) for i in txn_json["outputs"]: script, _ = Script.from_bytes( pack_var_str(bytes.fromhex(i["script_hex"]))) outputs.append(TransactionOutput(i["value"], script)) if "addresses" in i: addr_keys.add(i["addresses"][0]) txn = Transaction(Transaction.DEFAULT_TRANSACTION_VERSION, inputs, outputs, txn_json["lock_time"]) return txn, addr_keys
def txn_from_json(txn_json): """ Returns a new Transaction from a JSON-serialized transaction Args: txn_json: JSON with the following format: { "hash": "0bf0de38c26195919179f...", "block_hash": "000000000000000...", "block_height": 303404, "block_time": "2014-05-30T23:54:55Z", "chain_received_at": "2015-08-13T10:52:21.718Z", "confirmations": 69389, "lock_time": 0, "inputs": [ { "transaction_hash": "0bf0de38c2619...", "output_hash": "b84a66c46e24fe71f9...", "output_index": 0, "value": 300000, "addresses": [ "3L7dKYQGNoZub928CJ8NC2WfrM8U8GGBjr" ], "script_signature": "03046022100de7b67b9...", "script_signature_hex": "00493046022100de7b...", "sequence": 4294967295 } ], "outputs": [ { "transaction_hash": "0bf0de38c261959...", "output_index": 0, "value": 290000, "addresses": [ "1K4nPxBMy6sv7jssTvDLJWk1ADHBZEoUVb" ], "script": "OP_DUP OP_HASH160 c629680b8d...", "script_hex": "76a914c629680b8d13...", "script_type": "pubkeyhash", "required_signatures": 1, "spent": false, "spending_transaction": null } ], "fees": 10000, "amount": 290000 }, Transaction.DEFAULT_TRANSACTION_VERSION Returns: two1.bitcoin.Transaction: a deserialized transaction derived from the provided json. """ inputs = [] outputs = [] addr_keys = set() for i in sorted(txn_json["vin"], key=lambda i: i["n"]): if 'coinbase' in i: inputs.append( CoinbaseInput(height=0, raw_script=bytes.fromhex(i['coinbase']), sequence=i['sequence'], block_version=1)) else: script = Script.from_hex(i["scriptSig"]["hex"]) inputs.append( TransactionInput(Hash(i["txid"]), i["vout"], script, i["sequence"])) if "addr" in i: addr_keys.add(i["addr"]) for o in sorted(txn_json["vout"], key=lambda o: o["n"]): script = Script.from_hex(o["scriptPubKey"]["hex"]) value = int( decimal.Decimal(str(o["value"])) * decimal.Decimal('1e8')) outputs.append(TransactionOutput(value, script)) if "addresses" in o["scriptPubKey"]: for a in o["scriptPubKey"]["addresses"]: addr_keys.add(a) txn = Transaction(Transaction.DEFAULT_TRANSACTION_VERSION, inputs, outputs, txn_json["locktime"]) assert txn.hash == Hash(txn_json['txid']) return txn, addr_keys
def from_hex(h): return WalletTransaction.from_transaction( Transaction.from_hex(h))