tsynchronizer: disconnect from server if cannot deserialize txn - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 5313591c28b942b118f572b83b97a786c398503a DIR parent 7b8114f865f644c5611c3bb849c4f4fc6ce9e376 HTML Author: SomberNight <somber.night@protonmail.com> Date: Fri, 15 Feb 2019 17:22:24 +0100 synchronizer: disconnect from server if cannot deserialize txn Diffstat: M electrum/synchronizer.py | 22 +++++++++++++--------- M electrum/transaction.py | 8 ++++---- 2 files changed, 17 insertions(+), 13 deletions(-) --- DIR diff --git a/electrum/synchronizer.py b/electrum/synchronizer.py t@@ -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 t@@ -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) DIR diff --git a/electrum/transaction.py b/electrum/transaction.py t@@ -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: t@@ -159,8 +159,8 @@ class BCDataStream(object): elif size == 255: size = self._read_num('<Q') return size - except IndexError: - raise SerializationError("attempt to read past end of buffer") + except IndexError as e: + raise SerializationError("attempt to read past end of buffer") from e def write_compact_size(self, size): if size < 0: t@@ -182,7 +182,7 @@ class BCDataStream(object): (i,) = struct.unpack_from(format, self.input, self.read_cursor) self.read_cursor += struct.calcsize(format) except Exception as e: - raise SerializationError(e) + raise SerializationError(e) from e return i def _write_num(self, format, num):