def _parse_transaction(self, tx, block_height=None, get_input_values=True): t = Transaction.parse_hex(tx['hex'], strict=False, network=self.network) t.confirmations = tx.get('confirmations') t.block_hash = tx.get('blockhash') t.status = 'unconfirmed' for i in t.inputs: if i.prev_txid == b'\x00' * 32: i.script_type = 'coinbase' continue if get_input_values: txi = self.proxy.getrawtransaction(i.prev_txid.hex(), 1) i.value = int(round(float(txi['vout'][i.output_n_int]['value']) / self.network.denominator)) for o in t.outputs: o.spent = None if not block_height and t.block_hash: block_height = self.proxy.getblock(t.block_hash, 1)['height'] t.block_height = block_height if not t.confirmations and block_height is not None: if not self.latest_block: self.latest_block = self.blockcount() t.confirmations = (self.latest_block - block_height) + 1 if t.confirmations or block_height: t.status = 'confirmed' t.verified = True t.version = tx['version'].to_bytes(4, 'big') t.version_int = tx['version'] t.date = None if 'time' not in tx else datetime.utcfromtimestamp(tx['time']) t.update_totals() return t
def _parse_transaction(self, tx, block_height=None, get_input_values=True): t = Transaction.parse_hex(tx['hex'], strict=False, network=self.network) t.confirmations = None if 'confirmations' not in tx else tx[ 'confirmations'] if t.confirmations or block_height: t.status = 'confirmed' t.verified = True for i in t.inputs: if i.prev_txid == b'\x00' * 32: i.script_type = 'coinbase' continue if get_input_values: txi = self.proxy.getrawtransaction(i.prev_txid.hex(), 1) i.value = int( round( float(txi['vout'][i.output_n_int]['value']) / self.network.denominator)) for o in t.outputs: o.spent = None t.block_height = block_height t.version = tx['version'].to_bytes(4, 'big') t.date = datetime.utcfromtimestamp(tx['blocktime']) t.update_totals() return t
def gettransaction(self, txid, block_height=None): res = self.compose_request('get_tx', txid) tx = res['data'] rawtx = tx['tx_hex'] t = Transaction.parse_hex(rawtx, strict=False, network=self.network) input_total = 0 output_total = 0 if not t.coinbase: for n, i in enumerate(t.inputs): i.value = int(round(float(tx['inputs'][n]['value']) * self.units, 0)) input_total += i.value for o in t.outputs: o.spent = None output_total += o.value if not t.block_height and tx['confirmations']: t.block_height = self.getblock(tx['blockhash'], False, 1, 1)['height'] t.block_hash = tx['blockhash'] t.rawtx = bytes.fromhex(rawtx) t.size = tx['size'] t.network = self.network t.locktime = tx['locktime'] t.input_total = input_total t.output_total = output_total t.fee = 0 if t.input_total: t.fee = t.input_total - t.output_total t.confirmations = tx['confirmations'] if tx['confirmations']: t.status = 'confirmed' t.date = datetime.utcfromtimestamp(tx['time']) else: t.status = 'unconfirmed' t.date = None return t
def _parse_transaction(self, tx, strict=True): status = 'unconfirmed' if tx['confirmations']: status = 'confirmed' t = Transaction.parse_hex(tx['hex'], strict=False, network=self.network) if not t.txid == tx['hash']: if strict: raise ClientError('Received transaction has different txid') else: t.txid = tx['hash'] _logger.warning('Received transaction has different txid') t.locktime = tx['locktime'] t.network = self.network t.fee = tx['fee'] t.date = datetime.utcfromtimestamp(tx['time']) if tx['time'] else None t.confirmations = tx['confirmations'] t.block_height = tx['height'] if tx['height'] > 0 else None t.block_hash = tx['block'] t.status = status if not t.coinbase: for i in t.inputs: i.value = tx['inputs'][t.inputs.index(i)]['coin']['value'] for o in t.outputs: o.spent = None t.update_totals() return t
def gettransaction(self, txid): variables = {'id': txid, 'hex': None} tx = self.compose_request(path_type='explorer', variables=variables) t = Transaction.parse_hex(tx['hex'], strict=False, network=self.network) variables = {'t': txid} tx_api = self.compose_request('txinfo', path_type='api', variables=variables) for n, i in enumerate(t.inputs): if i.script_type != 'coinbase': i.value = int(round(tx_api['inputs'][n]['amount'] * self.units, 0)) else: i.value = 0 t.coinbase = True for n, o in enumerate(t.outputs): o.spent = None if tx['confirmations']: t.status = 'confirmed' else: t.status = 'unconfirmed' t.date = datetime.utcfromtimestamp(tx['time']) t.block_height = tx_api['block'] t.block_hash = tx['blockhash'] t.confirmations = tx['confirmations'] t.rawtx = bytes.fromhex(tx['hex']) t.size = tx['size'] t.network = self.network t.locktime = tx['locktime'] t.version = tx['version'].to_bytes(4, 'big') t.output_total = int(round(tx_api['total_output'] * self.units, 0)) t.input_total = t.output_total t.fee = 0 if t.input_total: t.fee = t.input_total - t.output_total return t
def sendrawtransaction(self, rawtx): res = self.compose_request('broadcast', variables={'tx': rawtx}, method='post') txid = '' if 'success' in res and res['success']: t = Transaction.parse_hex(rawtx, strict=False, network=self.network) txid = t.txid return {'txid': txid, 'response_dict': res}
def gettransaction(self, txid): tx = self.compose_request('txs', txid, variables={'includeHex': 'true'}) t = Transaction.parse_hex(tx['hex'], strict=False, network=self.network) if tx['confirmations']: t.status = 'confirmed' t.date = datetime.strptime(tx['confirmed'][:19], "%Y-%m-%dT%H:%M:%S") else: t.status = 'unconfirmed' t.confirmations = tx['confirmations'] t.block_height = tx['block_height'] if tx['block_height'] > 0 else None t.fee = tx['fees'] t.rawtx = bytes.fromhex(tx['hex']) t.size = int(len(tx['hex']) / 2) t.network = self.network t.input_total = 0 if len(t.inputs) != len(tx['inputs']): raise ClientError( "Invalid number of inputs provided. Raw tx: %d, blockcypher: %d" % (len(t.inputs), len(tx['inputs']))) for n, i in enumerate(t.inputs): if not t.coinbase and not ( tx['inputs'][n]['output_index'] == i.output_n_int and tx['inputs'][n]['prev_hash'] == i.prev_txid.hex()): raise ClientError( "Transaction inputs do not match raw transaction") if 'output_value' in tx['inputs'][n]: if not t.coinbase: i.value = tx['inputs'][n]['output_value'] t.input_total += i.value if len(t.outputs) != len(tx['outputs']): raise ClientError( "Invalid number of outputs provided. Raw tx: %d, blockcypher: %d" % (len(t.outputs), len(tx['outputs']))) for n, o in enumerate(t.outputs): if 'spent_by' in tx['outputs'][n]: o.spent = True o.spending_txid = tx['outputs'][n]['spent_by'] return t
def gettransaction(self, txid, latest_block=None): tx = self.compose_request('rawtx', txid) rawtx = self.getrawtransaction(txid) t = Transaction.parse_hex(rawtx, strict=False, network=self.network) input_total = 0 for n, i in enumerate(t.inputs): if 'prev_out' in tx['inputs'][n]: i.value = 0 if not tx['inputs'][n]['prev_out'] else tx[ 'inputs'][n]['prev_out']['value'] input_total += i.value for n, o in enumerate(t.outputs): o.spent = tx['out'][n]['spent'] if 'block_height' in tx and tx['block_height']: if not latest_block: latest_block = self.blockcount() t.status = 'confirmed' t.date = datetime.utcfromtimestamp(tx['time']) t.block_height = tx['block_height'] t.confirmations = 1 if latest_block > t.block_height: t.confirmations = latest_block - t.block_height else: t.status = 'unconfirmed' t.confirmations = 0 t.date = None t.rawtx = bytes.fromhex(rawtx) t.size = tx['size'] t.network_name = self.network t.locktime = tx['lock_time'] t.version_int = tx['ver'] t.version = tx['ver'].to_bytes(4, 'big') t.input_total = input_total t.fee = 0 if t.input_total: t.fee = t.input_total - t.output_total return t
s = Script(sc) print("\nScript %s" % s) print("Evaluate: %s" % s.evaluate()) print("Stack after evaluation: %s" % s.stack) script = '493046022100cf4d7571dd47a4d47f5cb767d54d6702530a3555726b27b6ac56117f5e7808fe0221008cbb42233bb04d7f28a' \ '715cf7c938e238afde90207e9d103dd9018e12cb7180e03' s = Script.parse(script) print("\nScript hex %s" % script) print("Parsed script: %s" % s) print( "\nVerify input 0 of transaction c8ea60ae943d84a8620a4ce3d3e12813293cdc48f6811dbc1c30578dfd1b2717" ) traw = '010000000182406edfc43449e2f94097867316cbc631dfdf9dc57dcc125297b0b59d3a2eda240000008b483045022100e05371e4d640d351d62699573811d93858b057eb01852d6c0b45d21d0ee90bb102201dc0b5ae1fee4dc1e7787e5cbbba2021387f52a9368856386931d4f8d9bdd938014104c4b7a7f7bb2c899f4aeab75b41567c040ae79506d43ee72f650c95b6319e47402f0ba88d1c5a294d075885442679dc24882ea37c31e0dbc82cfd51ed185d7e94ffffffff02ab4b0000000000001976a914ee493bd17ae7fa7fdabe4adb2b861ad7a8b954ad88acc5a5e70b000000001976a9147ddb236e7877d5040e2a59e4be544c65934e573a88ac00000000' t = Transaction.parse_hex(traw) i = t.inputs[0] transaction_hash_input_0 = transaction_hash = t.signature_hash(i.index_n) s = Script.parse(i.unlocking_script + i.script_code) print("Validation script input 0: %s" % s) print("Evaluate: %s" % s.evaluate(transaction_hash_input_0)) print("\nCreate redeemscript:") key1 = '5JruagvxNLXTnkksyLMfgFgf3CagJ3Ekxu5oGxpTm5mPfTAPez3' key2 = '5JX3qAwDEEaapvLXRfbXRMSiyRgRSW9WjgxeyJQWwBugbudCwsk' key3 = '5JjHVMwJdjPEPQhq34WMUhzLcEd4SD7HgZktEh8WHstWcCLRceV' keylist = [Key(k) for k in [key1, key2, key3]] print("Keys: %s" % keylist) redeemscript = Script(keys=keylist, sigs_required=2, script_types=['multisig']) print("Redeemscript hex: %s" % redeemscript.serialize().hex()) print("Redeemscript: %s" % redeemscript)