mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-01-19 05:45:21 +01:00
lnwallet: verify received commitment tx signature is valid
This commit is contained in:
parent
695a1e6c45
commit
8ca8eb60fb
@ -740,12 +740,63 @@ func (l *LightningWallet) handleFundingCounterPartySigs(msg *addCounterPartySigs
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point, wen calso record and verify their isgnature for our
|
// At this point, we can also record and verify their signature for our
|
||||||
// commitment transaction.
|
// commitment transaction.
|
||||||
pendingReservation.partialState.TheirCommitSig = msg.theirCommitmentSig
|
pendingReservation.theirCommitmentSig = msg.theirCommitmentSig
|
||||||
|
commitTx := pendingReservation.partialState.OurCommitTx
|
||||||
|
theirKey := pendingReservation.theirContribution.MultiSigKey
|
||||||
|
ourKey := pendingReservation.partialState.MultiSigKey
|
||||||
|
|
||||||
// TODO(roasbeef): verify
|
// Re-generate both the redeemScript and p2sh output. We sign the
|
||||||
//commitSig := msg.theirCommitmentSig
|
// redeemScript script, but include the p2sh output as the subscript
|
||||||
|
// for verification.
|
||||||
|
redeemScript := pendingReservation.partialState.FundingRedeemScript
|
||||||
|
p2sh, err := scriptHashPkScript(redeemScript)
|
||||||
|
if err != nil {
|
||||||
|
msg.err <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// First, we sign our copy of the commitment transaction ourselves.
|
||||||
|
ourCommitSig, err := txscript.RawTxInSignature(commitTx, 0, redeemScript,
|
||||||
|
txscript.SigHashAll, ourKey)
|
||||||
|
if err != nil {
|
||||||
|
msg.err <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next, create the spending scriptSig, and then verify that the script
|
||||||
|
// is complete, allowing us to spend from the funding transaction.
|
||||||
|
//
|
||||||
|
// When initially generating the redeemScript, we sorted the serialized
|
||||||
|
// public keys in descending order. So we do a quick comparison in order
|
||||||
|
// ensure the signatures appear on the Script Virual Machine stack in
|
||||||
|
// the correct order.
|
||||||
|
var scriptSig []byte
|
||||||
|
theirCommitSig := msg.theirCommitmentSig
|
||||||
|
if bytes.Compare(ourKey.PubKey().SerializeCompressed(), theirKey.SerializeCompressed()) == -1 {
|
||||||
|
scriptSig, err = spendMultiSig(redeemScript, theirCommitSig, ourCommitSig)
|
||||||
|
} else {
|
||||||
|
scriptSig, err = spendMultiSig(redeemScript, ourCommitSig, theirCommitSig)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
msg.err <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, create an instance of a Script VM, and ensure that the
|
||||||
|
// Script executes succesfully.
|
||||||
|
commitTx.TxIn[0].SignatureScript = scriptSig
|
||||||
|
vm, err := txscript.NewEngine(p2sh, commitTx, 0,
|
||||||
|
txscript.StandardVerifyFlags, nil)
|
||||||
|
if err != nil {
|
||||||
|
msg.err <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err := vm.Execute(); err != nil {
|
||||||
|
msg.err <- fmt.Errorf("counterparty's commitment signature is invalid: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Funding complete, this entry can be removed from limbo.
|
// Funding complete, this entry can be removed from limbo.
|
||||||
l.limboMtx.Lock()
|
l.limboMtx.Lock()
|
||||||
@ -757,7 +808,7 @@ func (l *LightningWallet) handleFundingCounterPartySigs(msg *addCounterPartySigs
|
|||||||
|
|
||||||
// Add the complete funding transaction to the DB, in it's open bucket
|
// Add the complete funding transaction to the DB, in it's open bucket
|
||||||
// which will be used for the lifetime of this channel.
|
// which will be used for the lifetime of this channel.
|
||||||
err := l.channelDB.PutOpenChannel(pendingReservation.partialState)
|
err = l.ChannelDB.PutOpenChannel(pendingReservation.partialState)
|
||||||
|
|
||||||
// TODO(roasbeef): broadcast now?
|
// TODO(roasbeef): broadcast now?
|
||||||
// * create goroutine, listens on blockconnected+blockdisconnected channels
|
// * create goroutine, listens on blockconnected+blockdisconnected channels
|
||||||
|
Loading…
Reference in New Issue
Block a user