Closed contrun closed 4 months ago
This is fixed in https://github.com/nervosnetwork/cfn-node/pull/72. The solution was simply not to include any tlc whose state was ambiguous to both parties, and wait until the other party to send RevokeAndAck
message to confirm that this tlc is included in the commitment transaction. In the above example, when verifying Alice's CommitmentSigned
message has the correct partial signature, Bob should never include Bob_AddTlc
while building the commitment transaction.
The problem
It is crucial to have the same list of active tlcs while signing and verifying commitment transaction. Otherwise, we will build different args for commitment lock (active tlcs are part of commitment lock args), thus different messages while signing and verifying signatures.
In https://github.com/nervosnetwork/cfn-node/pull/72, I naively thought we can build the same active tlc list if we have received a
RevokeAndAck
message from the peer.Example error case where naive solution above fails
This is actually not true. Imagine the following case, say Alice's intention is to add tlc1 to Bob (by sending a
Alice_AddTlc
to Bob), and commit this tlc1 to a commitment transaction (by sending a commitment messageAlice_CommitmentSigned
). She can send the following messages to Bob.Bob, who unknowingly also wants to add a tlc2 to Alice. He sends two messages to Alice
Depending on the person, these events can have different orders. For example, it is possible for Alice to believe the events are in the following order.
If this is the case, she may believe that
Alice_AddTlc
should be added to her current commitment transaction (because it is before the eventAlice_CommitmentSigned
), whileBob_AddTlc
should be added to her next commitment transaction (because it is after the eventAlice_CommitmentSigned
).On the other hand, Bob may believe the events are in the following order
In this case, on receiving
Alice_CommitmentSigned
, Bob believes that bothBob_AddTlc
andAlice_AddTlc
should be included in Alice's current commitment transaction. Now we have different views for active tlcs for different person, thus we build different commitment transactions. It is the same for Alice to verify Bob'sCommitmenSigned
message.A possible solution
I think this problem can be solved by every time one person (say A) is verifying another person's (say B's) partial signature to a commitment transaction. A first constructs the commitment transaction as usual. If the partial signature to the commitment transaction is invalid, then there are two possibilities. Either B was cheating or B missed some tlc updates from A. If it is the later case, then A must have initiated some tlc update actions (e.g. offered a tlc to B or request to remove a tlc from B) within this period. So we can check A's local channel state to see if there are indeed this kind of actions. If there are, we can try to reconcile stateb updates between A and B. That is, we need to do the same thing as when A and B reestablish channel to make sure both A and B catch up with each other.
This seems to work. But we need to give some more thoughts over this, and pin down some security implications (if any).