lnwallet/chanvalidate: update ValidateChannel to recognize taproot chans

This commit is contained in:
Olaoluwa Osuntokun 2023-01-19 19:35:11 -08:00
parent b38f9000d5
commit c9fc508083
No known key found for this signature in database
GPG Key ID: 3BBD59E99B280306
2 changed files with 39 additions and 21 deletions

View File

@ -186,10 +186,14 @@ func Validate(ctx *Context) (*wire.OutPoint, error) {
// If we reach this point, then all other checks have succeeded, so
// we'll now attempt a full Script VM execution to ensure that we're
// able to close the channel using this initial state.
prevFetcher := txscript.NewCannedPrevOutputFetcher(
ctx.MultiSigPkScript, fundingValue,
)
commitTx := ctx.CommitCtx.FullySignedCommitTx
hashCache := txscript.NewTxSigHashes(commitTx, prevFetcher)
vm, err := txscript.NewEngine(
ctx.MultiSigPkScript, ctx.CommitCtx.FullySignedCommitTx,
0, txscript.StandardVerifyFlags, nil, nil, fundingValue,
txscript.NewCannedPrevOutputFetcher(ctx.MultiSigPkScript, 0),
ctx.MultiSigPkScript, commitTx, 0, txscript.StandardVerifyFlags,
nil, hashCache, fundingValue, prevFetcher,
)
if err != nil {
return nil, err

View File

@ -2433,16 +2433,23 @@ func (l *LightningWallet) ValidateChannel(channelState *channeldb.OpenChannel,
if err != nil {
return err
}
signedCommitTx, err := channel.getSignedCommitTx()
if err != nil {
return err
}
localKey := channelState.LocalChanCfg.MultiSigKey.PubKey
remoteKey := channelState.RemoteChanCfg.MultiSigKey.PubKey
// We'll also need the multi-sig witness script itself so the
// chanvalidate package can check it for correctness against the
// funding transaction, and also commitment validity.
localKey := channelState.LocalChanCfg.MultiSigKey.PubKey
remoteKey := channelState.RemoteChanCfg.MultiSigKey.PubKey
var fundingScript []byte
if channelState.ChanType.IsTaproot() {
fundingScript, _, err = input.GenTaprootFundingScript(
localKey, remoteKey, int64(channel.Capacity),
)
if err != nil {
return err
}
} else {
witnessScript, err := input.GenMultiSigScript(
localKey.SerializeCompressed(),
remoteKey.SerializeCompressed(),
@ -2450,10 +2457,20 @@ func (l *LightningWallet) ValidateChannel(channelState *channeldb.OpenChannel,
if err != nil {
return err
}
pkScript, err := input.WitnessScriptHash(witnessScript)
fundingScript, err = input.WitnessScriptHash(witnessScript)
if err != nil {
return err
}
}
signedCommitTx, err := channel.getSignedCommitTx()
if err != nil {
return err
}
commitCtx := &chanvalidate.CommitmentContext{
Value: channel.Capacity,
FullySignedCommitTx: signedCommitTx,
}
// Finally, we'll pass in all the necessary context needed to fully
// validate that this channel is indeed what we expect, and can be
@ -2462,12 +2479,9 @@ func (l *LightningWallet) ValidateChannel(channelState *channeldb.OpenChannel,
Locator: &chanvalidate.OutPointChanLocator{
ChanPoint: channelState.FundingOutpoint,
},
MultiSigPkScript: pkScript,
MultiSigPkScript: fundingScript,
FundingTx: fundingTx,
CommitCtx: &chanvalidate.CommitmentContext{
Value: channel.Capacity,
FullySignedCommitTx: signedCommitTx,
},
CommitCtx: commitCtx,
})
if err != nil {
return err