URI: 
       trestructure channel_reestablish, resend funding_locked if needed - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 82e8bcebb671f7d59d610f80ca7b336f0262d4f9
   DIR parent 8e753f998a0e107ae1b6b4fe54381ceb811421c3
  HTML Author: ThomasV <thomasv@electrum.org>
       Date:   Sat,  2 Feb 2019 12:06:12 +0100
       
       restructure channel_reestablish, resend funding_locked if needed
       
       Diffstat:
         M electrum/lnbase.py                  |      44 +++++++++++++------------------
         M electrum/lnworker.py                |       2 +-
       
       2 files changed, 19 insertions(+), 27 deletions(-)
       ---
   DIR diff --git a/electrum/lnbase.py b/electrum/lnbase.py
       t@@ -652,6 +652,15 @@ class Peer(PrintError):
                    raise Exception(f'reserve too high: {remote_reserve_sat}, funding_sat: {funding_sat}')
                return remote_reserve_sat
        
       +    def on_channel_reestablish(self, payload):
       +        chan_id = payload["channel_id"]
       +        self.print_error("Received channel_reestablish", bh2u(chan_id))
       +        chan = self.channels.get(chan_id)
       +        if not chan:
       +            self.print_error("Warning: received unknown channel_reestablish", bh2u(chan_id))
       +            return
       +        self.channel_reestablished[chan_id].set_result(payload)
       +
            @log_exceptions
            async def reestablish_channel(self, chan: Channel):
                await self.initialized.wait()
       t@@ -667,19 +676,8 @@ class Peer(PrintError):
                    next_local_commitment_number=chan.config[LOCAL].ctn+1,
                    next_remote_revocation_number=chan.config[REMOTE].ctn
                )
       -        await self.channel_reestablished[chan_id]
       +        channel_reestablish_msg = await self.channel_reestablished[chan_id]
                chan.set_state('OPENING')
       -        if chan.config[LOCAL].funding_locked_received and chan.short_channel_id:
       -            self.mark_open(chan)
       -        self.network.trigger_callback('channel', chan)
       -
       -    def on_channel_reestablish(self, payload):
       -        chan_id = payload["channel_id"]
       -        self.print_error("Received channel_reestablish", bh2u(chan_id))
       -        chan = self.channels.get(chan_id)
       -        if not chan:
       -            print("Warning: received unknown channel_reestablish", bh2u(chan_id))
       -            return
        
                def try_to_get_remote_to_force_close_with_their_latest():
                    self.print_error("trying to get remote to force close", bh2u(chan_id))
       t@@ -688,8 +686,6 @@ class Peer(PrintError):
                                              next_local_commitment_number=0,
                                              next_remote_revocation_number=0
                                              )
       -
       -        channel_reestablish_msg = payload
                # compare remote ctns
                remote_ctn = int.from_bytes(channel_reestablish_msg["next_local_commitment_number"], 'big')
                if remote_ctn != chan.config[REMOTE].ctn + 1:
       t@@ -711,8 +707,6 @@ class Peer(PrintError):
                            ctn=remote_ctn,
                        )
                        self.revoke(chan)
       -                self.channel_reestablished[chan_id].set_result(True)
       -                return
                    else:
                        self.print_error("expected local ctn {}, got {}".format(chan.config[LOCAL].ctn, local_ctn))
                        # TODO iff their ctn is lower than ours, we should force close instead
       t@@ -729,25 +723,22 @@ class Peer(PrintError):
                        # FIXME ...what now?
                        try_to_get_remote_to_force_close_with_their_latest()
                        return
       +        if remote_ctn == chan.config[LOCAL].ctn+1 == 1 and chan.short_channel_id:
       +            self.send_funding_locked(chan)
                # checks done
       -        self.channel_reestablished[chan_id].set_result(True)
       +        if chan.config[LOCAL].funding_locked_received and chan.short_channel_id:
       +            self.mark_open(chan)
       +        self.network.trigger_callback('channel', chan)
        
       -    def funding_locked(self, chan: Channel):
       +    def send_funding_locked(self, chan: Channel):
                channel_id = chan.channel_id
                per_commitment_secret_index = RevocationStore.START_INDEX - 1
                per_commitment_point_second = secret_to_pubkey(int.from_bytes(
                    get_per_commitment_secret_from_seed(chan.config[LOCAL].per_commitment_secret_seed, per_commitment_secret_index), 'big'))
                # note: if funding_locked was not yet received, we might send it multiple times
                self.send_message("funding_locked", channel_id=channel_id, next_per_commitment_point=per_commitment_point_second)
       -        if chan.config[LOCAL].funding_locked_received:
       +        if chan.config[LOCAL].funding_locked_received and chan.short_channel_id:
                    self.mark_open(chan)
       -        else:
       -            # only when not testing since this is an issue
       -            # only with lnd and the test uses electrum
       -            if not get_config().debug_lightning:
       -                self.print_error("remote hasn't sent funding_locked, disconnecting (should reconnect again shortly)")
       -                self.close_and_cleanup()
       -                self.network.trigger_callback('channel', chan)
        
            def on_funding_locked(self, payload):
                channel_id = payload['channel_id']
       t@@ -822,6 +813,7 @@ class Peer(PrintError):
                print("SENT CHANNEL ANNOUNCEMENT")
        
            def mark_open(self, chan: Channel):
       +        assert chan.short_channel_id is not None
                if chan.get_state() == "OPEN":
                    return
                # NOTE: even closed channels will be temporarily marked "OPEN"
   DIR diff --git a/electrum/lnworker.py b/electrum/lnworker.py
       t@@ -379,7 +379,7 @@ class LNWorker(PrintError):
                            continue
                        # this results in the channel being marked OPEN
                        peer = self.peers[chan.node_id]
       -                peer.funding_locked(chan)
       +                peer.send_funding_locked(chan)
                    elif chan.get_state() == "OPEN":
                        peer = self.peers.get(chan.node_id)
                        if peer is None: