mirror of
https://github.com/lightningnetwork/lnd.git
synced 2024-11-19 01:43:16 +01:00
116 lines
3.8 KiB
Go
116 lines
3.8 KiB
Go
package input
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/btcsuite/btcd/btcec/v2"
|
|
"github.com/btcsuite/btcd/txscript"
|
|
"github.com/lightningnetwork/lnd/lnutils"
|
|
)
|
|
|
|
// ErrUnknownScriptType is returned when an unknown script type is encountered.
|
|
var ErrUnknownScriptType = errors.New("unknown script type")
|
|
|
|
// ScriptPath is used to indicate the spending path of a given script. Possible
|
|
// paths include: timeout, success, revocation, and others.
|
|
type ScriptPath uint8
|
|
|
|
const (
|
|
// ScriptPathTimeout is a script path that can be taken only after a
|
|
// timeout has elapsed.
|
|
ScriptPathTimeout ScriptPath = iota
|
|
|
|
// ScriptPathSuccess is a script path that can be taken only with some
|
|
// secret data.
|
|
ScriptPathSuccess
|
|
|
|
// ScriptPathRevocation is a script path used when a contract has been
|
|
// breached.
|
|
ScriptPathRevocation
|
|
|
|
// ScriptPathDelay is a script path used when a contract has relative
|
|
// delay that must elapse before it can be swept.
|
|
ScriptPathDelay
|
|
)
|
|
|
|
// ScriptDescriptor is an interface that abstracts over the various ways a
|
|
// pkScript can be spent from an output. This supports both normal p2wsh
|
|
// (witness script, etc.), and also tapscript paths which have distinct
|
|
// tapscript leaves.
|
|
type ScriptDescriptor interface {
|
|
// PkScript is the public key script that commits to the final
|
|
// contract.
|
|
PkScript() []byte
|
|
|
|
// WitnessScriptToSign returns the witness script that we'll use when
|
|
// signing for the remote party, and also verifying signatures on our
|
|
// transactions. As an example, when we create an outgoing HTLC for the
|
|
// remote party, we want to sign their success path.
|
|
//
|
|
// TODO(roasbeef): break out into HTLC specific desc? or Branching Desc
|
|
// w/ the below?
|
|
WitnessScriptToSign() []byte
|
|
|
|
// WitnessScriptForPath returns the witness script for the given
|
|
// spending path. An error is returned if the path is unknown. This is
|
|
// useful as when constructing a control block for a given path, one
|
|
// also needs witness script being signed.
|
|
WitnessScriptForPath(path ScriptPath) ([]byte, error)
|
|
}
|
|
|
|
// TapscriptDescriptor is a super-set of the normal script multiplexer that
|
|
// adds in taproot specific details such as the control block, or top-level tap
|
|
// tweak.
|
|
type TapscriptDescriptor interface {
|
|
ScriptDescriptor
|
|
|
|
// CtrlBlockForPath returns the control block for the given spending
|
|
// path. For unknown paths, an error is returned.
|
|
CtrlBlockForPath(path ScriptPath) (*txscript.ControlBlock, error)
|
|
|
|
// TapTweak returns the top-level taproot tweak for the script.
|
|
TapTweak() []byte
|
|
|
|
// TapScriptTree returns the underlying tapscript tree.
|
|
TapScriptTree() *txscript.IndexedTapScriptTree
|
|
|
|
// Tree returns the underlying ScriptTree.
|
|
Tree() ScriptTree
|
|
}
|
|
|
|
// ScriptTree holds the contents needed to spend a script within a tapscript
|
|
// tree.
|
|
type ScriptTree struct {
|
|
// InternalKey is the internal key of the Taproot output key.
|
|
InternalKey *btcec.PublicKey
|
|
|
|
// TaprootKey is the key that will be used to generate the taproot
|
|
// output.
|
|
TaprootKey *btcec.PublicKey
|
|
|
|
// TapscriptTree is the full tapscript tree that also includes the
|
|
// control block needed to spend each of the leaves.
|
|
TapscriptTree *txscript.IndexedTapScriptTree
|
|
|
|
// TapscriptTreeRoot is the root hash of the tapscript tree.
|
|
TapscriptRoot []byte
|
|
}
|
|
|
|
// PkScript is the public key script that commits to the final contract.
|
|
func (s *ScriptTree) PkScript() []byte {
|
|
// Script building can never internally return an error, so we ignore
|
|
// the error to simplify the interface.
|
|
pkScript, _ := PayToTaprootScript(s.TaprootKey)
|
|
return pkScript
|
|
}
|
|
|
|
// TapTweak returns the top-level taproot tweak for the script.
|
|
func (s *ScriptTree) TapTweak() []byte {
|
|
return lnutils.ByteSlice(s.TapscriptTree.RootNode.TapHash())
|
|
}
|
|
|
|
// TapScriptTree returns the underlying tapscript tree.
|
|
func (s *ScriptTree) TapScriptTree() *txscript.IndexedTapScriptTree {
|
|
return s.TapscriptTree
|
|
}
|