electrum

Electrum Bitcoin wallet
git clone https://git.parazyd.org/electrum
Log | Files | Refs | Submodules

commit b5fd27c64c0254dcca9c9219cfd2cb3918542242
parent 82491ff083368fe57821998aeea7f5f4b1f4e5a8
Author: ThomasV <thomasv@electrum.org>
Date:   Thu,  7 Mar 2019 14:39:16 +0100

fix local/remote confusion in reestablish_channel

Diffstat:
Melectrum/lnpeer.py | 23++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py @@ -557,16 +557,16 @@ class Peer(PrintError): next_remote_revocation_number=0 ) # compare remote ctns - remote_ctn = int.from_bytes(channel_reestablish_msg["next_local_commitment_number"], 'big') - if remote_ctn != chan.config[REMOTE].ctn + 1: + their_next_local_ctn = int.from_bytes(channel_reestablish_msg["next_local_commitment_number"], 'big') + their_next_remote_ctn = int.from_bytes(channel_reestablish_msg["next_remote_revocation_number"], 'big') + if their_next_local_ctn != chan.config[REMOTE].ctn + 1: self.print_error("expected remote ctn {}, got {}".format(chan.config[REMOTE].ctn + 1, remote_ctn)) # TODO iff their ctn is lower than ours, we should force close instead try_to_get_remote_to_force_close_with_their_latest() return # compare local ctns - local_ctn = int.from_bytes(channel_reestablish_msg["next_remote_revocation_number"], 'big') - if local_ctn != chan.config[LOCAL].ctn: - if remote_ctn == chan.config[LOCAL].ctn + 1: + if chan.config[LOCAL].ctn != their_next_remote_ctn: + if chan.config[LOCAL].ctn == their_next_remote_ctn + 1: # A node: # if next_remote_revocation_number is equal to the # commitment number of the last revoke_and_ack @@ -574,11 +574,16 @@ class Peer(PrintError): # hasn't already received a closing_signed: # MUST re-send the revoke_and_ack. chan.config[LOCAL]=chan.config[LOCAL]._replace( - ctn=remote_ctn, + ctn=their_next_remote_ctn, ) - self.send_revoke_and_ack(chan) + last_secret, this_point, next_point, _ = chan.points() + self.send_message( + "revoke_and_ack", + channel_id=chan.channel_id, + per_commitment_secret=last_secret, + next_per_commitment_point=next_point) else: - self.print_error("expected local ctn {}, got {}".format(chan.config[LOCAL].ctn, local_ctn)) + self.print_error("expected local ctn {}, got {}".format(chan.config[LOCAL].ctn, their_next_remote_ctn)) # TODO iff their ctn is lower than ours, we should force close instead try_to_get_remote_to_force_close_with_their_latest() return @@ -593,7 +598,7 @@ 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: + if their_next_local_ctn == chan.config[LOCAL].ctn+1 == 1 and chan.short_channel_id: self.send_funding_locked(chan) # checks done if chan.config[LOCAL].funding_locked_received and chan.short_channel_id: