URI: 
       treestablish channels in network callback - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit df960700c9868177ed2f0337c211bb3569665ebb
   DIR parent 322acd93d95cc16fe114857005e614bc1f849858
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Fri, 22 Jun 2018 12:17:11 +0200
       
       reestablish channels in network callback
       
       Diffstat:
         M lib/lnbase.py                       |       5 ++---
         M lib/lnwatcher.py                    |      15 ++++++---------
         M lib/lnworker.py                     |      11 ++++++++++-
       
       3 files changed, 18 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/lib/lnbase.py b/lib/lnbase.py
       t@@ -790,8 +790,6 @@ class Peer(PrintError):
                msg = await self.read_message()
                self.process_message(msg)
                self.initialized.set_result(True)
       -        # reestablish channels
       -        [self.reestablish_channel(c) for c in self.channels.values() if self.lnworker.channel_state[c.channel_id] != "CLOSED"]
                # loop
                while True:
                    self.ping_if_required()
       t@@ -930,7 +928,8 @@ class Peer(PrintError):
                assert success, success
                return chan._replace(remote_state=chan.remote_state._replace(ctn=0),local_state=chan.local_state._replace(ctn=0, current_commitment_signature=remote_sig))
        
       -    def reestablish_channel(self, chan):
       +    async def reestablish_channel(self, chan):
       +        await self.initialized
                self.channel_state[chan.channel_id] = 'REESTABLISHING'
                self.network.trigger_callback('channel', chan)
                self.send_message(gen_msg("channel_reestablish",
   DIR diff --git a/lib/lnwatcher.py b/lib/lnwatcher.py
       t@@ -1,13 +1,12 @@
        from .util import PrintError
       -from .lnbase import Outpoint, funding_output_script
       +from .lnbase import funding_output_script
        from .bitcoin import redeem_script_to_address
        
        class LNWatcher(PrintError):
        
            def __init__(self, network, channel_state):
                self.network = network
       -        self.channel_state = channel_state
       -        self.channels ={}
       +        self.watched_channels = {}
        
            def parse_response(self, response):
                if response.get('error'):
       t@@ -15,10 +14,10 @@ class LNWatcher(PrintError):
                    return None, None
                return response['params'], response['result']
        
       -    def watch_channel(self, chan):
       +    def watch_channel(self, chan, callback):
                script = funding_output_script(chan.local_config, chan.remote_config)
                funding_address = redeem_script_to_address('p2wsh', script)
       -        self.channels[funding_address] = chan
       +        self.watched_channels[funding_address] = chan, callback
                self.network.subscribe_to_addresses([funding_address], self.on_address_status)
        
            def on_address_status(self, response):
       t@@ -33,7 +32,5 @@ class LNWatcher(PrintError):
                if not params:
                    return
                addr = params[0]
       -        chan = self.channels[addr]
       -        outpoints = [Outpoint(x["tx_hash"], x["tx_pos"]) for x in result]
       -        if chan.funding_outpoint not in outpoints:
       -            self.channel_state[chan.channel_id] = "CLOSED"
       +        chan, callback = self.watched_channels[addr]
       +        callback(chan, result)
   DIR diff --git a/lib/lnworker.py b/lib/lnworker.py
       t@@ -102,7 +102,7 @@ class LNWorker(PrintError):
                self.channel_state = {chan.channel_id: "DISCONNECTED" for chan in self.channels.values()}
                self.lnwatcher = LNWatcher(network, self.channel_state)
                for chan_id, chan in self.channels.items():
       -            self.lnwatcher.watch_channel(chan)
       +            self.lnwatcher.watch_channel(chan, self.on_channel_utxos)
                for host, port, pubkey in peer_list:
                    self.add_peer(host, int(port), pubkey)
                # wait until we see confirmations
       t@@ -153,6 +153,15 @@ class LNWorker(PrintError):
                    return chan
                return None
        
       +    def on_channel_utxos(self, chan, utxos):
       +        outpoints = [Outpoint(x["tx_hash"], x["tx_pos"]) for x in utxos]
       +        if chan.funding_outpoint not in outpoints:
       +            self.channel_state[chan.channel_id] = "CLOSED"
       +        elif self.channel_state[chan.channel_id] == 'DISCONNECTED':
       +            peer = self.peers[chan.node_id]
       +            coro = peer.reestablish_channel(chan)
       +            asyncio.run_coroutine_threadsafe(coro, self.network.asyncio_loop)
       +
            def on_network_update(self, event, *args):
                for chan in self.channels.values():
                    peer = self.peers[chan.node_id]