mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-27 07:23:25 +00:00
ln: don't corrupt channels storage when multiple funding_locked are received
This commit is contained in:
parent
3f73332817
commit
83c60441cf
2 changed files with 13 additions and 9 deletions
|
@ -948,10 +948,10 @@ class Peer(PrintError):
|
||||||
local_ctn = int.from_bytes(channel_reestablish_msg["next_remote_revocation_number"], 'big')
|
local_ctn = int.from_bytes(channel_reestablish_msg["next_remote_revocation_number"], 'big')
|
||||||
if local_ctn != chan.local_state.ctn:
|
if local_ctn != chan.local_state.ctn:
|
||||||
raise Exception("expected local ctn {}, got {}".format(chan.local_state.ctn, local_ctn))
|
raise Exception("expected local ctn {}, got {}".format(chan.local_state.ctn, local_ctn))
|
||||||
our = channel_reestablish_msg["my_current_per_commitment_point"]
|
their = channel_reestablish_msg["my_current_per_commitment_point"]
|
||||||
their = chan.remote_state.last_per_commitment_point
|
our = chan.remote_state.last_per_commitment_point
|
||||||
if their is None:
|
if our is None:
|
||||||
their = chan.remote_state.next_per_commitment_point
|
our = chan.remote_state.next_per_commitment_point
|
||||||
if our != their:
|
if our != their:
|
||||||
raise Exception("Remote PCP mismatch: {} {}".format(bh2u(our), bh2u(their)))
|
raise Exception("Remote PCP mismatch: {} {}".format(bh2u(our), bh2u(their)))
|
||||||
self.channel_state[chan_id] = 'OPENING'
|
self.channel_state[chan_id] = 'OPENING'
|
||||||
|
@ -973,11 +973,13 @@ class Peer(PrintError):
|
||||||
chan = self.channels.get(channel_id)
|
chan = self.channels.get(channel_id)
|
||||||
if not chan:
|
if not chan:
|
||||||
raise Exception("Got unknown funding_locked", channel_id)
|
raise Exception("Got unknown funding_locked", channel_id)
|
||||||
short_channel_id = chan.short_channel_id
|
if not chan.local_state.funding_locked_received:
|
||||||
new_remote_state = chan.remote_state._replace(next_per_commitment_point=payload["next_per_commitment_point"], last_per_commitment_point=chan.remote_state.next_per_commitment_point)
|
our_next_point = chan.remote_state.next_per_commitment_point
|
||||||
new_local_state = chan.local_state._replace(funding_locked_received = True)
|
their_next_point = payload["next_per_commitment_point"]
|
||||||
chan = chan._replace(short_channel_id=short_channel_id, remote_state=new_remote_state, local_state=new_local_state)
|
new_remote_state = chan.remote_state._replace(next_per_commitment_point=their_next_point, last_per_commitment_point=our_next_point)
|
||||||
self.lnworker.save_channel(chan)
|
new_local_state = chan.local_state._replace(funding_locked_received = True)
|
||||||
|
chan = chan._replace(remote_state=new_remote_state, local_state=new_local_state)
|
||||||
|
self.lnworker.save_channel(chan)
|
||||||
if chan.short_channel_id:
|
if chan.short_channel_id:
|
||||||
self.mark_open(chan)
|
self.mark_open(chan)
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,8 @@ class LNWorker(PrintError):
|
||||||
self.channels[openchannel.channel_id] = openchannel
|
self.channels[openchannel.channel_id] = openchannel
|
||||||
for node_id, peer in self.peers.items():
|
for node_id, peer in self.peers.items():
|
||||||
peer.channels = self.channels_for_peer(node_id)
|
peer.channels = self.channels_for_peer(node_id)
|
||||||
|
if openchannel.remote_state.next_per_commitment_point == openchannel.remote_state.last_per_commitment_point:
|
||||||
|
raise Exception("Tried to save channel with next_point == last_point, this should not happen")
|
||||||
dumped = serialize_channels(self.channels)
|
dumped = serialize_channels(self.channels)
|
||||||
self.wallet.storage.put("channels", dumped)
|
self.wallet.storage.put("channels", dumped)
|
||||||
self.wallet.storage.write()
|
self.wallet.storage.write()
|
||||||
|
|
Loading…
Add table
Reference in a new issue