From 3f733328179ac4770571bc1b54c3d7b5739db0e4 Mon Sep 17 00:00:00 2001 From: Janus Date: Tue, 19 Jun 2018 15:13:48 +0200 Subject: [PATCH] ln: don't break channel when failing htlc --- lib/lnbase.py | 16 ++++++++-------- lib/tests/test_lnhtlc.py | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/lnbase.py b/lib/lnbase.py index bbdcd918f..bf45626b5 100644 --- a/lib/lnbase.py +++ b/lib/lnbase.py @@ -1153,17 +1153,17 @@ class Peer(PrintError): done, pending = await asyncio.wait([fulfill_coro, failure_coro], return_when=FIRST_COMPLETED) if failure_coro.done(): - m.fail_htlc(htlc) - # TODO receive their commitment here - - # TODO find out why the following block fails with "not enough htlc signatures" sig_64, htlc_sigs = m.sign_next_commitment() - assert len(htlc_sigs) == 0 - self.send_message(gen_msg("commitment_signed", channel_id=chan.channel_id, signature=sig_64, num_htlcs=0)) - + self.send_message(gen_msg("commitment_signed", channel_id=chan.channel_id, signature=sig_64, num_htlcs=1, htlc_signature=htlc_sigs[0])) + while (await self.commitment_signed[chan.channel_id].get())["htlc_signature"] != b"": + self.revoke(m) + await self.receive_revoke(m) + m.fail_htlc(htlc) + sig_64, htlc_sigs = m.sign_next_commitment() + self.send_message(gen_msg("commitment_signed", channel_id=chan.channel_id, signature=sig_64, num_htlcs=0)) await self.receive_revoke(m) - self.revoke(m) fulfill_coro.cancel() + self.lnworker.save_channel(m.state) return failure_coro.result() if fulfill_coro.done(): failure_coro.cancel() diff --git a/lib/tests/test_lnhtlc.py b/lib/tests/test_lnhtlc.py index d639263c1..1a912cc2f 100644 --- a/lib/tests/test_lnhtlc.py +++ b/lib/tests/test_lnhtlc.py @@ -202,6 +202,7 @@ class TestLNBaseHTLCStateMachine(unittest.TestCase): aliceRevocation2, _ = alice_channel.revoke_current_commitment() aliceSig2, aliceHtlcSigs2 = alice_channel.sign_next_commitment() + self.assertEqual(aliceHtlcSigs2, [], "alice should generate no htlc signatures") bob_channel.receive_revocation(aliceRevocation2)