lnwallet/channel: use proper commitment output sorting

This commit is contained in:
Conner Fromknecht 2019-06-05 08:35:06 +02:00
parent a627c65d65
commit b26b88a1e2
No known key found for this signature in database
GPG Key ID: E7D737B67FA592C7

@ -2411,7 +2411,13 @@ func (lc *LightningChannel) createCommitmentTx(c *commitment,
// We'll now add all the HTLC outputs to the commitment transaction. // We'll now add all the HTLC outputs to the commitment transaction.
// Each output includes an off-chain 2-of-2 covenant clause, so we'll // Each output includes an off-chain 2-of-2 covenant clause, so we'll
// need the objective local/remote keys for this particular commitment // need the objective local/remote keys for this particular commitment
// as well. // as well. For any non-dust HTLCs that are manifested on the commitment
// transaction, we'll also record its CLTV which is required to sort the
// commitment transaction below. The slice is initially sized to the
// number of existing outputs, since any outputs already added are
// commitment outputs and should correspond to zero values for the
// purposes of sorting.
cltvs := make([]uint32, len(commitTx.TxOut))
for _, htlc := range filteredHTLCView.ourUpdates { for _, htlc := range filteredHTLCView.ourUpdates {
if htlcIsDust(false, c.isOurs, c.feePerKw, if htlcIsDust(false, c.isOurs, c.feePerKw,
htlc.Amount.ToSatoshis(), c.dustLimit) { htlc.Amount.ToSatoshis(), c.dustLimit) {
@ -2422,6 +2428,7 @@ func (lc *LightningChannel) createCommitmentTx(c *commitment,
if err != nil { if err != nil {
return err return err
} }
cltvs = append(cltvs, htlc.Timeout)
} }
for _, htlc := range filteredHTLCView.theirUpdates { for _, htlc := range filteredHTLCView.theirUpdates {
if htlcIsDust(true, c.isOurs, c.feePerKw, if htlcIsDust(true, c.isOurs, c.feePerKw,
@ -2433,6 +2440,7 @@ func (lc *LightningChannel) createCommitmentTx(c *commitment,
if err != nil { if err != nil {
return err return err
} }
cltvs = append(cltvs, htlc.Timeout)
} }
// Set the state hint of the commitment transaction to facilitate // Set the state hint of the commitment transaction to facilitate
@ -2446,7 +2454,7 @@ func (lc *LightningChannel) createCommitmentTx(c *commitment,
// Sort the transactions according to the agreed upon canonical // Sort the transactions according to the agreed upon canonical
// ordering. This lets us skip sending the entire transaction over, // ordering. This lets us skip sending the entire transaction over,
// instead we'll just send signatures. // instead we'll just send signatures.
txsort.InPlaceSort(commitTx) InPlaceCommitSort(commitTx, cltvs)
// Next, we'll ensure that we don't accidentally create a commitment // Next, we'll ensure that we don't accidentally create a commitment
// transaction which would be invalid by consensus. // transaction which would be invalid by consensus.