def get_tx(self, txhash): tx = None for psbt_in in self.psbt.inputs: if psbt_in.non_witness_utxo and psbt_in.non_witness_utxo.sha256 == uint256_from_str( binascii.unhexlify(txhash)[::-1]): tx = psbt_in.non_witness_utxo if not tx: raise ValueError("TX {} not found in PSBT".format(txhash)) t = proto.TransactionType() t.version = tx.nVersion t.lock_time = tx.nLockTime for vin in tx.vin: i = t.inputs.add() i.prev_hash = ser_uint256(vin.prevout.hash)[::-1] i.prev_index = vin.prevout.n i.script_sig = vin.scriptSig i.sequence = vin.nSequence for vout in tx.vout: o = t.bin_outputs.add() o.amount = vout.nValue o.script_pubkey = vout.scriptPubKey return t
def get_tx(self, txhash): data = self.fetch_json(self.url, 'tx', txhash) t = proto_types.TransactionType() t.version = data['version'] t.lock_time = data['locktime'] for vin in data['vin']: i = t.inputs.add() if 'coinbase' in vin.keys(): i.prev_hash = b"\0" * 32 i.prev_index = 0xffffffff # signed int -1 i.script_sig = binascii.unhexlify(vin['coinbase']) i.sequence = vin['sequence'] else: i.prev_hash = binascii.unhexlify(vin['txid']) i.prev_index = vin['vout'] i.script_sig = binascii.unhexlify(vin['scriptSig']['hex']) i.sequence = vin['sequence'] for vout in data['vout']: o = t.bin_outputs.add() o.amount = int(Decimal(str(vout['value'])) * 100000000) o.script_pubkey = binascii.unhexlify(vout['scriptPubKey']['hex']) dip2_type = data.get("type", 0) if t.version == 3 and dip2_type != 0: # It's a DIP2 special TX with payload if dip2_type == DashTxType.SPEC_CB_TX: data["extraPayload"] = serialize_cbTx(data) elif dip2_type == DashTxType.LELANTUS_JSPLIT: data["extraPayload"] = serialize_Lelantus(data) else: raise NotImplementedError( "Only spending of V3 coinbase outputs has been inplemented. " "Please file an issue at https://github.com/firoorg/firo-masternode-tool/issues containing " "the tx type=" + str(dip2_type)) data["extraPayloadSize"] = len(data["extraPayload"]) >> 1 if "extraPayloadSize" not in data or "extraPayload" not in data: raise ValueError("Payload data missing in DIP2 transaction") if data["extraPayloadSize"] * 2 != len(data["extraPayload"]): raise ValueError( "extra_data_len (%d) does not match calculated length (%d)" % (data["extraPayloadSize"], len(data["extraPayload"]) * 2)) t.extra_data = dash_utils.num_to_varint( data["extraPayloadSize"]) + bytes.fromhex(data["extraPayload"]) # KeepKey firmware doesn't understand the split of version and type, so let's mimic the # old serialization format t.version |= dip2_type << 16 return t
def get_tx(self, txhash): data = self.fetch_json(self.url, 'tx', txhash) t = proto_types.TransactionType() t.version = data['version'] t.lock_time = data['locktime'] for vin in data['vin']: i = t.inputs.add() if 'coinbase' in vin.keys(): i.prev_hash = b"\0"*32 i.prev_index = 0xffffffff # signed int -1 i.script_sig = binascii.unhexlify(vin['coinbase']) i.sequence = vin['sequence'] else: i.prev_hash = binascii.unhexlify(vin['txid']) i.prev_index = vin['vout'] i.script_sig = binascii.unhexlify(vin['scriptSig']['hex']) i.sequence = vin['sequence'] for vout in data['vout']: o = t.bin_outputs.add() o.amount = int(Decimal(str(vout['value'])) * 100000000) o.script_pubkey = binascii.unhexlify(vout['scriptPubKey']['hex']) dip2_type = data.get("type", 0) if t.version == 3 and dip2_type != 0: # It's a DIP2 special TX with payload if "extraPayloadSize" not in data or "extraPayload" not in data: raise ValueError("Payload data missing in DIP2 transaction") if data["extraPayloadSize"] * 2 != len(data["extraPayload"]): raise ValueError( "extra_data_len (%d) does not match calculated length (%d)" % (data["extraPayloadSize"], len(data["extraPayload"]) * 2) ) t.extra_data = gewel_utils.num_to_varint(data["extraPayloadSize"]) + bytes.fromhex( data["extraPayload"] ) # KeepKey firmware doesn't understand the split of version and type, so let's mimic the # old serialization format t.version |= dip2_type << 16 return t