def from_serialized(cls, serialized_tx, testnet=False): tx = CMutableTransaction.stream_deserialize(BytesIO(serialized_tx)) return BitcoinTransaction(tx, testnet)
def parse_tx(hex_tx): # NB: The deserialize function reads from a stream. raw_tx = BytesIO(binascii.unhexlify(hex_tx)) tx = CMutableTransaction.stream_deserialize(raw_tx) return tx
def confirm_bitcoin_tx_local(self, hash, sender_gid): """ Confirm bitcoin transaction using local bitcoind instance Usage: confirm_bitcoin_tx tx_id gid """ ## send transaction to local bitcond segments = self.segment_storage.get_by_transaction_id(hash) raw_tx = self.segment_storage.get_raw_tx(segments) ## pass hex string converted to bytes try : proxy1 = bitcoin.rpc.Proxy() raw_tx_bytes = x(raw_tx) tx = CMutableTransaction.stream_deserialize(BytesIO(raw_tx_bytes)) r1 = proxy1.sendrawtransaction(tx) except : print("Invalid Transaction! Could not send to network.") return ## try for 30 minutes to confirm the transaction for n in range(0, 30) : try : proxy2 = bitcoin.rpc.Proxy() r2 = proxy2.getrawtransaction(r1, True) ## send zero-conf message back to tx sender confirmations = r2.get('confirmations', 0) rObj = TxTennaSegment('', '', tx_hash=hash, block=confirmations) arg = str(sender_gid) + ' ' + rObj.serialize_to_json() self.do_send_private(arg) print("\nSent to GID: " + str(sender_gid) + ": Transaction " + hash + " added to the mempool.") break except IndexError: ## tx_id not yet in the global mempool, sleep for a minute and then try again sleep(60) continue ## wait for atleast one confirmation for m in range(0, 30): sleep(60) # sleep for a minute try : proxy3= bitcoin.rpc.Proxy() r3 = proxy3.getrawtransaction(r1, True) confirmations = r3.get('confirmations', 0) ## keep waiting until 1 or more confirmations if confirmations > 0: break except : ## unknown RPC error, but keep trying traceback.print_exc() if confirmations > 0 : ## send confirmations message back to tx sender if confirmations > 0 rObj = TxTennaSegment('', '', tx_hash=hash, block=confirmations) arg = str(sender_gid) + ' ' + rObj.serialize_to_json() self.do_send_private(arg) print("\nSent to GID: " + str(sender_gid) + ", Transaction " + hash + " confirmed in " + str(confirmations) + " blocks.") else : print("\CTransaction from GID: " + str(sender_gid) + ", Transaction " + hash + " not confirmed after 30 minutes.")