コード例 #1
0
ファイル: bitcoind.py プロジェクト: rvrsh3ll/bitcoinlib
    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
コード例 #2
0
 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
コード例 #3
0
 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
コード例 #4
0
ファイル: bcoin.py プロジェクト: rvrsh3ll/bitcoinlib
 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
コード例 #5
0
 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
コード例 #6
0
ファイル: bcoin.py プロジェクト: rvrsh3ll/bitcoinlib
 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}
コード例 #7
0
ファイル: blockcypher.py プロジェクト: rvrsh3ll/bitcoinlib
 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
コード例 #8
0
 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
コード例 #9
0
ファイル: scripts.py プロジェクト: rvrsh3ll/bitcoinlib
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)