tmake LNWatcher inherit AddressSynchronizer - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 88c6eeb9667c1d8609cd8ec9170cb1b115fb08eb DIR parent 78896897cbb0678e2983582714484b163902d998 HTML Author: ThomasV <thomasv@electrum.org> Date: Wed, 21 Nov 2018 17:00:01 +0100 make LNWatcher inherit AddressSynchronizer Diffstat: M electrum/lnwatcher.py | 35 ++++++++++++++----------------- M electrum/lnworker.py | 15 +++++++-------- 2 files changed, 23 insertions(+), 27 deletions(-) --- DIR diff --git a/electrum/lnwatcher.py b/electrum/lnwatcher.py t@@ -35,20 +35,18 @@ class TxMinedDepth(IntEnum): FREE = auto() -class LNWatcher(PrintError): +class LNWatcher(AddressSynchronizer): # TODO if verifier gets an incorrect merkle proof, that tx will never verify!! # similarly, what if server ignores request for merkle proof? # maybe we should disconnect from server in these cases verbosity_filter = 'W' def __init__(self, network: 'Network'): - self.network = network - self.config = network.config path = os.path.join(network.config.path, "watcher_db") storage = WalletStorage(path) - self.addr_sync = AddressSynchronizer(storage) - self.addr_sync.diagnostic_name = lambda: 'LnWatcherAS' - self.addr_sync.start_network(network) + AddressSynchronizer.__init__(self, storage) + self.config = network.config + self.start_network(network) self.lock = threading.RLock() self.watched_addresses = set() self.channel_info = storage.get('channel_info', {}) # access with 'lock' t@@ -99,7 +97,7 @@ class LNWatcher(PrintError): def write_to_disk(self): # FIXME: json => every update takes linear instead of constant disk write with self.lock: - storage = self.addr_sync.storage + storage = self.storage storage.put('channel_info', self.channel_info) # self.sweepstore sweepstore = {} t@@ -121,13 +119,12 @@ class LNWatcher(PrintError): @log_exceptions async def on_network_update(self, event, *args): if event in ('verified', 'wallet_updated'): - wallet = args[0] - if wallet != self.addr_sync: + if args[0] != self: return - if not self.addr_sync.synchronizer: + if not self.synchronizer: self.print_error("synchronizer not set yet") return - if not self.addr_sync.synchronizer.is_up_to_date(): + if not self.synchronizer.is_up_to_date(): return with self.lock: channel_info_items = list(self.channel_info.items()) t@@ -137,21 +134,21 @@ class LNWatcher(PrintError): def watch_address(self, addr): with self.lock: self.watched_addresses.add(addr) - self.addr_sync.add_address(addr) + self.add_address(addr) async def check_onchain_situation(self, funding_outpoint): txid, index = funding_outpoint.split(':') - ctx_candidate_txid = self.addr_sync.spent_outpoints[txid].get(int(index)) + ctx_candidate_txid = self.spent_outpoints[txid].get(int(index)) is_spent = ctx_candidate_txid is not None self.network.trigger_callback('channel_txo', funding_outpoint, is_spent) if not is_spent: return - ctx_candidate = self.addr_sync.transactions.get(ctx_candidate_txid) + ctx_candidate = self.transactions.get(ctx_candidate_txid) if ctx_candidate is None: return #self.print_error("funding outpoint {} is spent by {}" # .format(funding_outpoint, ctx_candidate_txid)) - conf = self.addr_sync.get_tx_height(ctx_candidate_txid).conf + conf = self.get_tx_height(ctx_candidate_txid).conf # only care about confirmed and verified ctxs. TODO is this necessary? if conf == 0: return t@@ -189,12 +186,12 @@ class LNWatcher(PrintError): local_height = self.network.get_local_height() self.print_error(funding_outpoint, 'iterating over encumbered txs') for e_tx in list(encumbered_sweep_txns): - conflicts = self.addr_sync.get_conflicting_transactions(e_tx.tx.txid(), e_tx.tx, include_self=True) + conflicts = self.get_conflicting_transactions(e_tx.tx.txid(), e_tx.tx, include_self=True) conflict_mined_depth = self.get_deepest_tx_mined_depth_for_txids(conflicts) if conflict_mined_depth != TxMinedDepth.DEEP: keep_watching_this = True if conflict_mined_depth == TxMinedDepth.FREE: - tx_height = self.addr_sync.get_tx_height(prev_txid).height + tx_height = self.get_tx_height(prev_txid).height if tx_height == TX_HEIGHT_LOCAL: continue num_conf = local_height - tx_height + 1 t@@ -222,7 +219,7 @@ class LNWatcher(PrintError): return keep_watching_this async def broadcast_or_log(self, funding_outpoint, e_tx): - height = self.addr_sync.get_tx_height(e_tx.tx.txid()).height + height = self.get_tx_height(e_tx.tx.txid()).height if height != TX_HEIGHT_LOCAL: return try: t@@ -245,7 +242,7 @@ class LNWatcher(PrintError): def get_tx_mined_depth(self, txid: str): if not txid: return TxMinedStatus.FREE - tx_mined_depth = self.addr_sync.get_tx_height(txid) + tx_mined_depth = self.get_tx_height(txid) height, conf = tx_mined_depth.height, tx_mined_depth.conf if conf > 100: return TxMinedDepth.DEEP DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py t@@ -243,10 +243,10 @@ class LNWorker(PrintError): Returns tuple (mined_deep_enough, num_confirmations). """ assert chan.get_state() in ["OPEN", "OPENING"] - addr_sync = self.network.lnwatcher.addr_sync - conf = addr_sync.get_tx_height(chan.funding_outpoint.txid).conf + lnwatcher = self.network.lnwatcher + conf = lnwatcher.get_tx_height(chan.funding_outpoint.txid).conf if conf > 0: - block_height, tx_pos = addr_sync.get_txpos(chan.funding_outpoint.txid) + block_height, tx_pos = lnwatcher.get_txpos(chan.funding_outpoint.txid) assert tx_pos >= 0 chan.short_channel_id_predicted = calc_short_channel_id(block_height, tx_pos, chan.funding_outpoint.output_index) if conf >= chan.constraints.funding_txn_minimum_depth > 0: t@@ -279,10 +279,9 @@ class LNWorker(PrintError): # since short_channel_id could be changed while saving. with self.lock: channels = list(self.channels.values()) - addr_sync = self.network.lnwatcher.addr_sync + lnwatcher = self.network.lnwatcher if event in ('verified', 'wallet_updated'): - wallet = args[0] - if wallet != addr_sync: + if args[0] != lnwatcher: return for chan in channels: if chan.get_state() == "OPENING": t@@ -300,11 +299,11 @@ class LNWorker(PrintError): return if event == 'fee': await peer.bitcoin_fee_update(chan) - conf = addr_sync.get_tx_height(chan.funding_outpoint.txid).conf + conf = lnwatcher.get_tx_height(chan.funding_outpoint.txid).conf peer.on_network_update(chan, conf) elif chan.get_state() == 'FORCE_CLOSING': txid = chan.force_close_tx().txid() - height = addr_sync.get_tx_height(txid).height + height = lnwatcher.get_tx_height(txid).height self.print_error("force closing tx", txid, "height", height) if height == TX_HEIGHT_LOCAL: self.print_error('REBROADCASTING CLOSING TX')