diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py index f327669fa..27f03563c 100644 --- a/electrum/synchronizer.py +++ b/electrum/synchronizer.py @@ -39,6 +39,9 @@ if TYPE_CHECKING: from .address_synchronizer import AddressSynchronizer +class SynchronizerFailure(Exception): pass + + def history_status(h): if not h: return None @@ -194,18 +197,19 @@ class Synchronizer(SynchronizerBase): raise tx = Transaction(result) try: - tx.deserialize() - except Exception: - self.print_msg("cannot deserialize transaction, skipping", tx_hash) - return + tx.deserialize() # see if raises + except Exception as e: + # possible scenarios: + # 1: server is sending garbage + # 2: there is a bug in the deserialization code + # 3: there was a segwit-like upgrade that changed the tx structure + # that we don't know about + raise SynchronizerFailure(f"cannot deserialize transaction {tx_hash}") from e if tx_hash != tx.txid(): - self.print_error("received tx does not match expected txid ({} != {})" - .format(tx_hash, tx.txid())) - return + raise SynchronizerFailure(f"received tx does not match expected txid ({tx_hash} != {tx.txid()})") tx_height = self.requested_tx.pop(tx_hash) self.wallet.receive_tx_callback(tx_hash, tx, tx_height) - self.print_error("received tx %s height: %d bytes: %d" % - (tx_hash, tx_height, len(tx.raw))) + self.print_error(f"received tx {tx_hash} height: {tx_height} bytes: {len(tx.raw)}") # callbacks self.wallet.network.trigger_callback('new_transaction', self.wallet, tx) diff --git a/electrum/transaction.py b/electrum/transaction.py index 32d2e4cca..d29aba4c4 100644 --- a/electrum/transaction.py +++ b/electrum/transaction.py @@ -125,7 +125,7 @@ class BCDataStream(object): self.read_cursor += length return result except IndexError: - raise SerializationError("attempt to read past end of buffer") + raise SerializationError("attempt to read past end of buffer") from None def can_read_more(self) -> bool: if not self.input: @@ -159,8 +159,8 @@ class BCDataStream(object): elif size == 255: size = self._read_num('