From 22db29ee1d86278ac57fde460c6151cb68734468 Mon Sep 17 00:00:00 2001 From: Victor Shyba <victor1984@riseup.net> Date: Tue, 19 Mar 2019 23:02:27 -0300 Subject: [PATCH] use torba tx parsing on wallet server --- lbrynet/wallet/server/block_processor.py | 56 +++++++++++------------- lbrynet/wallet/server/db.py | 5 +-- lbrynet/wallet/server/tx.py | 18 +------- 3 files changed, 29 insertions(+), 50 deletions(-) diff --git a/lbrynet/wallet/server/block_processor.py b/lbrynet/wallet/server/block_processor.py index 508d4acc2..d1f514ec3 100644 --- a/lbrynet/wallet/server/block_processor.py +++ b/lbrynet/wallet/server/block_processor.py @@ -2,6 +2,8 @@ import hashlib import struct import msgpack + +from lbrynet.extras.wallet.transaction import Transaction, Output from torba.server.hash import hash_to_hex_str from torba.server.block_processor import BlockProcessor @@ -36,32 +38,31 @@ class LBRYBlockProcessor(BlockProcessor): undo_info = [] add_undo = undo_info.append update_inputs = set() - for tx, txid in txs: + for etx, txid in txs: update_inputs.clear() - if tx.has_claims: - for index, output in enumerate(tx.outputs): - claim = output.claim - if isinstance(claim, NameClaim): - add_undo(self.advance_claim_name_transaction(output, height, txid, index)) - elif isinstance(claim, ClaimUpdate): - update_input = self.db.get_update_input(claim, tx.inputs) - if update_input: - update_inputs.add(update_input) - add_undo(self.advance_update_claim(output, height, txid, index)) - else: - info = (hash_to_hex_str(txid), hash_to_hex_str(claim.claim_id),) - self.logger.error("REJECTED: {} updating {}".format(*info)) - elif isinstance(claim, ClaimSupport): - self.advance_support(claim, txid, index, height, output.value) + tx = Transaction(etx.serialize()) + for index, output in enumerate(tx.outputs): + if not output.is_claim: + continue + if output.script.is_claim_name: + add_undo(self.advance_claim_name_transaction(output, height, txid, index)) + elif output.script.is_update_claim: + update_input = self.db.get_update_input(unhexlify(output.claim_id)[::-1], tx.inputs) + if update_input: + update_inputs.add(update_input) + add_undo(self.advance_update_claim(output, height, txid, index)) + else: + info = (hash_to_hex_str(txid), output.claim_id,) + self.logger.error("REJECTED: {} updating {}".format(*info)) for txin in tx.inputs: if txin not in update_inputs: - abandoned_claim_id = self.db.abandon_spent(txin.prev_hash, txin.prev_idx) + abandoned_claim_id = self.db.abandon_spent(txin.txo_ref.hash, txin.txo_ref.position) if abandoned_claim_id: add_undo((abandoned_claim_id, self.db.get_claim_info(abandoned_claim_id))) return undo_info - def advance_update_claim(self, output, height, txid, nout): - claim_id = output.claim.claim_id + def advance_update_claim(self, output: Output, height, txid, nout): + claim_id = unhexlify(output.claim_id)[::-1] claim_info = self.claim_info_from_output(output, txid, nout, height) old_claim_info = self.db.get_claim_info(claim_id) self.db.put_claim_id_for_outpoint(old_claim_info.txid, old_claim_info.nout, None) @@ -73,8 +74,8 @@ class LBRYBlockProcessor(BlockProcessor): self.db.put_claim_id_for_outpoint(txid, nout, claim_id) return claim_id, old_claim_info - def advance_claim_name_transaction(self, output, height, txid, nout): - claim_id = claim_id_hash(txid, nout) + def advance_claim_name_transaction(self, output: Output, height, txid, nout): + claim_id = unhexlify(output.claim_id)[::-1] claim_info = self.claim_info_from_output(output, txid, nout, height) if claim_info.cert_id: self.db.put_claim_id_signed_by_cert_id(claim_info.cert_id, claim_id) @@ -132,17 +133,12 @@ class LBRYBlockProcessor(BlockProcessor): self.db.batched_flush_claims() return await super().flush(flush_utxos) - def advance_support(self, claim_support, txid, nout, height, amount): - # TODO: check for more controller claim rules, like takeover or ordering - pass - - def claim_info_from_output(self, output, txid, nout, height): - amount = output.value - address = self.coin.address_from_script(output.pk_script) - name, value, cert_id = output.claim.name, output.claim.value, None + def claim_info_from_output(self, output: Output, txid, nout, height): + address = self.coin.address_from_script(output.script.source) + name, value, cert_id = output.script.values['claim_name'], output.raw_claim, None assert txid and address cert_id = self._checksig(name, value, address) - return ClaimInfo(name, value, txid, nout, amount, address, height, cert_id) + return ClaimInfo(name, value, txid, nout, output.amount, address, height, cert_id) def _checksig(self, name, value, address): try: diff --git a/lbrynet/wallet/server/db.py b/lbrynet/wallet/server/db.py index 6ef9f5f9d..846953b4c 100644 --- a/lbrynet/wallet/server/db.py +++ b/lbrynet/wallet/server/db.py @@ -161,13 +161,12 @@ class LBRYDB(DB): self.logger.info("[+] Adding claim info for: {}".format(hash_to_hex_str(claim_id))) self.claim_cache[claim_id] = claim_info.serialized - def get_update_input(self, claim, inputs): - claim_id = claim.claim_id + def get_update_input(self, claim_id, inputs): claim_info = self.get_claim_info(claim_id) if not claim_info: return False for input in inputs: - if input.prev_hash == claim_info.txid and input.prev_idx == claim_info.nout: + if input.txo_ref.hash == claim_info.txid and input.txo_ref.position == claim_info.nout: return input return False diff --git a/lbrynet/wallet/server/tx.py b/lbrynet/wallet/server/tx.py index 20d90f30f..4dc86b1a4 100644 --- a/lbrynet/wallet/server/tx.py +++ b/lbrynet/wallet/server/tx.py @@ -1,21 +1,5 @@ from torba.server.tx import Deserializer -from lbrynet.wallet.server.opcodes import decode_claim_script -from lbrynet.wallet.server.model import TxClaimOutput, LBRYTx class LBRYDeserializer(Deserializer): - - def _read_output(self): - value = self._read_le_int64() - script = self._read_varbytes() # pk_script - claim = decode_claim_script(script) - claim = claim[0] if claim else None - return TxClaimOutput(value, script, claim) - - def read_tx(self): - return LBRYTx( - self._read_le_int32(), # version - self._read_inputs(), # inputs - self._read_outputs(), # outputs - self._read_le_uint32() # locktime - ) + pass