htlcswitch: check for signature owed in link

Previously the channel method FullySynced was used to decide whether to
send a new commit sig message. However, it could happen that FullySynced
was false, but that we didn't owe a commitment signature. Instead we
were waiting on the other party to send us a signature. If that
happened, we'd send out an empty commit sig. This commit modifies the
condition that triggers a new commit sig and fixes this deviation from
the spec.
This commit is contained in:
Joost Jager committed 2019-11-06 09:21:23 +01:00
1 parent 64f4421d6c
commit f59b4d62bf
3 files changed
+9 -31

No files matched your search

+2 -2
View File
@@ -1103,7 +1103,7 @@ out:
// update in some time, check to see if we have any
// pending updates we need to commit due to our
// commitment chains being desynchronized.
if l.channel.FullySynced() {
if !l.channel.OweCommitment(true) {
continue
}
@@ -1808,7 +1808,7 @@ func (l *channelLink) handleUpstreamMsg(msg lnwire.Message) {
// If both commitment chains are fully synced from our PoV,
// then we don't need to reply with a signature as both sides
// already have a commitment with the latest accepted.
if l.channel.FullySynced() {
if !l.channel.OweCommitment(true) {
return
}
+6 -8
View File
@@ -4699,11 +4699,10 @@ func TestChannelLinkNoEmptySig(t *testing.T) {
ctx.receiveRevAndAckAliceToBob()
ctx.sendRevAndAckBobToAlice()
// The situation now is that Alice still doesn't have her two htlcs on
// the local commit tx. Bob needs to send a new signature and Alice can
// only wait for that. However, Alice's log commit timer fires and Alice
// sends a commitment tx containing no updates. THIS SHOULD NOT HAPPEN!
ctx.receiveCommitSigAliceToBob(2)
// The commit txes are not in sync, but it is Bob's turn to send a new
// signature. We don't expect Alice to send out any message. This check
// allows some time for the log commit ticker to trigger for Alice.
ctx.assertNoMsgFromAlice(time.Second)
}
// TestChannelLinkBatchPreimageWrite asserts that a link will batch preimage
@@ -6109,9 +6108,8 @@ func TestChannelLinkReceiveEmptySig(t *testing.T) {
// Send RevokeAndAck Bob->Alice to ack the added htlc.
ctx.sendRevAndAckBobToAlice()
// No new updates to sign, Alice still sends out an empty sig. THIS
// SHOULD NOT HAPPEN!
ctx.receiveCommitSigAliceToBob(1)
// We received an empty commit sig, we accepted it, but there is nothing
// new to sign for us.
// No other messages are expected.
ctx.assertNoMsgFromAlice(time.Second)