tln: avoid dust sends breaking channel, avoid inline functions - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 9c442586b2680e260bec0267b4d5b42b1f3606d1 DIR parent d0798c336fe59322bcbeec5e3da2acff7b850f0a HTML Author: Janus <ysangkok@gmail.com> Date: Tue, 24 Jul 2018 19:31:00 +0200 ln: avoid dust sends breaking channel, avoid inline functions Diffstat: M electrum/lnbase.py | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) --- DIR diff --git a/electrum/lnbase.py b/electrum/lnbase.py t@@ -884,12 +884,15 @@ class Peer(PrintError): self.revoke(chan) + commitment_signed_msg = await self.commitment_signed[chan.channel_id].get() + fulfill_coro = asyncio.ensure_future(self.update_fulfill_htlc[chan.channel_id].get()) failure_coro = asyncio.ensure_future(self.update_fail_htlc[chan.channel_id].get()) done, pending = await asyncio.wait([fulfill_coro, failure_coro], return_when=FIRST_COMPLETED) if failure_coro.done(): sig_64, htlc_sigs = chan.sign_next_commitment() + # TODO this is wrong when the htlc is dust self.send_message(gen_msg("commitment_signed", channel_id=chan.channel_id, signature=sig_64, num_htlcs=1, htlc_signature=htlc_sigs[0])) self.revoke(chan) while (await self.commitment_signed[chan.channel_id].get())["htlc_signature"] != b"": t@@ -903,9 +906,9 @@ class Peer(PrintError): fulfill_coro.cancel() self.lnworker.save_channel(chan) return failure_coro.result() - if fulfill_coro.done(): - failure_coro.cancel() - update_fulfill_htlc_msg = fulfill_coro.result() + + failure_coro.cancel() + update_fulfill_htlc_msg = fulfill_coro.result() preimage = update_fulfill_htlc_msg["payment_preimage"] chan.receive_htlc_settle(preimage, int.from_bytes(update_fulfill_htlc_msg["id"], "big")) t@@ -923,12 +926,6 @@ class Peer(PrintError): await self.receive_revoke(chan) - if commitment_signed_msg["htlc_signature"] == b"": - # this happens when we send dust amounts - print("CHANNEL WILL BREAK") # TODO - else: - commitment_signed_msg = await self.commitment_signed[chan.channel_id].get() - self.lnworker.save_channel(chan) return bh2u(preimage) t@@ -943,8 +940,9 @@ class Peer(PrintError): per_commitment_secret=rev.per_commitment_secret, next_per_commitment_point=rev.next_per_commitment_point)) - async def receive_commitment(self, m): - commitment_signed_msg = await self.commitment_signed[m.channel_id].get() + async def receive_commitment(self, m, commitment_signed_msg=None): + if commitment_signed_msg is None: + commitment_signed_msg = await self.commitment_signed[m.channel_id].get() data = commitment_signed_msg["htlc_signature"] htlc_sigs = [data[i:i+64] for i in range(0, len(data), 64)] m.receive_new_commitment(commitment_signed_msg["signature"], htlc_sigs) t@@ -993,17 +991,13 @@ class Peer(PrintError): commit_coro = asyncio.ensure_future(self.commitment_signed[chan.channel_id].get()) _done, _pending = await asyncio.wait([revoke_coro, commit_coro], return_when=FIRST_COMPLETED) - def process_commit(commitment_signed_msg): - data = commitment_signed_msg["htlc_signature"] - htlc_sigs = [data[i:i+64] for i in range(0, len(data), 64)] - chan.receive_new_commitment(commitment_signed_msg["signature"], htlc_sigs) def process_revoke(revoke_and_ack_msg): chan.receive_revocation(RevokeAndAck(revoke_and_ack_msg["per_commitment_secret"], revoke_and_ack_msg["next_per_commitment_point"])) if commit_coro.done(): # this branch is taken with lnd after a fee update (initiated by us, of course) - # TODO process_commit(commit_coro.result()) + # TODO await process_commit(chan, commit_coro.result()) await asyncio.wait([revoke_coro]) process_revoke(revoke_coro.result()) self.revoke(chan) t@@ -1017,7 +1011,7 @@ class Peer(PrintError): process_revoke(revoke_coro.result()) await asyncio.wait([commit_coro]) - process_commit(commit_coro.result()) + await self.receive_commitment(chan, commit_coro.result()) self.revoke(chan) self.lnworker.save_channel(chan) t@@ -1031,6 +1025,7 @@ class Peer(PrintError): self.commitment_signed[channel_id].put_nowait(payload) def on_update_fulfill_htlc(self, payload): + self.print_error("update_fulfill") channel_id = payload["channel_id"] self.update_fulfill_htlc[channel_id].put_nowait(payload)