commit e81ae1921b84fa7ce67e5e8dded92575bdbe5501
parent c046f2cc1c7741ff8e0b8da50cc1365120c20ba7
Author: SomberNight <somber.night@protonmail.com>
Date: Fri, 2 Aug 2019 21:00:18 +0200
lnpeer: reestablish_channel - discard unsigned remote updates
Diffstat:
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/electrum/lnhtlc.py b/electrum/lnhtlc.py
@@ -167,6 +167,25 @@ class HTLCManager:
if fee_update.ctns[LOCAL] is None and fee_update.ctns[REMOTE] <= self.ctn_latest(REMOTE):
fee_update.ctns[LOCAL] = self.ctn_latest(LOCAL) + 1
+ def discard_unsigned_remote_updates(self):
+ """Discard updates sent by the remote, that the remote itself
+ did not yet sign (i.e. there was no corresponding commitment_signed msg)
+ """
+ # htlcs
+ for htlc_id, ctns in list(self.log[REMOTE]['locked_in'].items()):
+ if ctns[LOCAL] > self.ctn_latest(LOCAL):
+ del self.log[REMOTE]['locked_in'][htlc_id]
+ del self.log[REMOTE]['adds'][htlc_id]
+ self.log[REMOTE]['next_htlc_id'] = max(self.log[REMOTE]['locked_in']) + 1
+ for log_action in ('settles', 'fails'):
+ for htlc_id, ctns in list(self.log[LOCAL][log_action].items()):
+ if ctns[LOCAL] > self.ctn_latest(LOCAL):
+ del self.log[LOCAL][log_action][htlc_id]
+ # fee updates
+ for i, fee_update in enumerate(list(self.log[REMOTE]['fee_updates'])):
+ if fee_update.ctns[LOCAL] > self.ctn_latest(LOCAL):
+ del self.log[REMOTE]['fee_updates'][i]
+
##### Queries re HTLCs:
def htlcs_by_direction(self, subject: HTLCOwner, direction: Direction,
diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py
@@ -692,6 +692,8 @@ class Peer(Logger):
return
chan.set_state('REESTABLISHING')
self.network.trigger_callback('channel', chan)
+ # BOLT-02: "A node [...] upon disconnection [...] MUST reverse any uncommitted updates sent by the other side"
+ chan.hm.discard_unsigned_remote_updates()
# ctns
oldest_unrevoked_local_ctn = chan.config[LOCAL].ctn
latest_local_ctn = chan.hm.ctn_latest(LOCAL)