mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-31 17:31:36 +00:00
synchronizer: disconnect from server if cannot deserialize txn
This commit is contained in:
parent
7b8114f865
commit
5313591c28
2 changed files with 17 additions and 13 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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('<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:
|
||||
|
@ -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):
|
||||
|
|
Loading…
Add table
Reference in a new issue