multi: add p2tr tapscript signing capabilities

This commit is contained in:
Oliver Gugger committed 2022-03-24 18:02:39 +01:00
1 parent 5109c55721
commit 78db46be7e
7 files changed
+445 -104

No files matched your search

+28
View File
@@ -5,6 +5,7 @@ import (
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcec/v2/ecdsa"
"github.com/btcsuite/btcd/btcec/v2/schnorr"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/btcutil/hdkeychain"
"github.com/btcsuite/btcd/chaincfg/chainhash"
@@ -356,6 +357,33 @@ func (b *BtcWallet) SignOutputRaw(tx *wire.MsgTx,
return nil, err
}
// In case of a taproot output any signature is always a Schnorr
// signature, based on the new tapscript sighash algorithm.
if txscript.IsPayToTaproot(signDesc.Output.PkScript) {
sigHashes := txscript.NewTxSigHashes(
tx, signDesc.PrevOutputFetcher,
)
leaf := txscript.TapLeaf{
LeafVersion: txscript.BaseLeafVersion,
Script: witnessScript,
}
rawSig, err := txscript.RawTxInTapscriptSignature(
tx, sigHashes, signDesc.InputIndex,
signDesc.Output.Value, signDesc.Output.PkScript,
leaf, signDesc.HashType, privKey,
)
if err != nil {
return nil, err
}
sig, err := schnorr.ParseSignature(rawSig)
if err != nil {
return nil, err
}
return sig, nil
}
// TODO(roasbeef): generate sighash midstate if not present?
amt := signDesc.Output.Value