lnwallet: update internal co-op close flow to support musig2 keyspend
In this commit, we update the co-op close flow to support the new musig2 keyspend flow. We'll use some new functional options to allow a caller to pass in an active musig2 session. If this is present, then we'll use that to complete the musig2 flow by signing with a partial signature, and then ultimately combining the signatures at the end.
This commit is contained in:
6 files changed
+816
-150
No files matched your search
@@ -0,0 +1,109 @@
|
||||
package chancloser
|
||||
|
||||
import (
|
||||
"github.com/btcsuite/btcd/btcec/v2/schnorr/musig2"
|
||||
"github.com/btcsuite/btcd/btcutil"
|
||||
"github.com/btcsuite/btcd/chaincfg/chainhash"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/input"
|
||||
"github.com/lightningnetwork/lnd/lnwallet"
|
||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
)
|
||||
|
||||
// CoopFeeEstimator is used to estimate the fee of a co-op close transaction.
|
||||
type CoopFeeEstimator interface {
|
||||
// EstimateFee estimates an _absolute_ fee for a co-op close transaction
|
||||
// given the local+remote tx outs (for the co-op close transaction),
|
||||
// channel type, and ideal fee rate. If a passed TxOut is nil, then
|
||||
// that indicates that an output is dust on the co-op close transaction
|
||||
// _before_ fees are accounted for.
|
||||
EstimateFee(chanType channeldb.ChannelType,
|
||||
localTxOut, remoteTxOut *wire.TxOut,
|
||||
idealFeeRate chainfee.SatPerKWeight) btcutil.Amount
|
||||
}
|
||||
|
||||
// Channel abstracts away from the core channel state machine by exposing an
|
||||
// interface that requires only the methods we need to carry out the channel
|
||||
// closing process.
|
||||
type Channel interface {
|
||||
// ChannelPoint returns the channel point of the target channel.
|
||||
ChannelPoint() *wire.OutPoint
|
||||
|
||||
// MarkCoopBroadcasted persistently marks that the channel close
|
||||
// transaction has been broadcast.
|
||||
MarkCoopBroadcasted(*wire.MsgTx, bool) error
|
||||
|
||||
// IsInitiator returns true we are the initiator of the channel.
|
||||
IsInitiator() bool
|
||||
|
||||
// ShortChanID returns the scid of the channel.
|
||||
ShortChanID() lnwire.ShortChannelID
|
||||
|
||||
// ChanType returns the channel type of the channel.
|
||||
ChanType() channeldb.ChannelType
|
||||
|
||||
// FundingTxOut returns the funding output of the channel.
|
||||
FundingTxOut() *wire.TxOut
|
||||
|
||||
// AbsoluteThawHeight returns the absolute thaw height of the channel.
|
||||
// If the channel is pending, or an unconfirmed zero conf channel, then
|
||||
// an error should be returned.
|
||||
AbsoluteThawHeight() (uint32, error)
|
||||
|
||||
// LocalBalanceDust returns true if when creating a co-op close
|
||||
// transaction, the balance of the local party will be dust after
|
||||
// accounting for any anchor outputs.
|
||||
LocalBalanceDust() bool
|
||||
|
||||
// RemoteBalanceDust returns true if when creating a co-op close
|
||||
// transaction, the balance of the remote party will be dust after
|
||||
// accounting for any anchor outputs.
|
||||
RemoteBalanceDust() bool
|
||||
|
||||
// RemoteUpfrontShutdownScript returns the upfront shutdown script of
|
||||
// the remote party. If the remote party didn't specify such a script,
|
||||
// an empty delivery address should be returned.
|
||||
RemoteUpfrontShutdownScript() lnwire.DeliveryAddress
|
||||
|
||||
// CreateCloseProposal creates a new co-op close proposal in the form
|
||||
// of a valid signature, the chainhash of the final txid, and our final
|
||||
// balance in the created state.
|
||||
CreateCloseProposal(proposedFee btcutil.Amount, localDeliveryScript []byte,
|
||||
remoteDeliveryScript []byte,
|
||||
closeOpt ...lnwallet.ChanCloseOpt) (input.Signature, *chainhash.Hash,
|
||||
btcutil.Amount, error)
|
||||
|
||||
// CompleteCooperativeClose persistently "completes" the cooperative
|
||||
// close by producing a fully signed co-op close transaction.
|
||||
CompleteCooperativeClose(localSig, remoteSig input.Signature,
|
||||
localDeliveryScript, remoteDeliveryScript []byte,
|
||||
proposedFee btcutil.Amount, closeOpt ...lnwallet.ChanCloseOpt,
|
||||
) (*wire.MsgTx, btcutil.Amount, error)
|
||||
}
|
||||
|
||||
// MusigSession is an interface that abstracts away the details of the musig2
|
||||
// session details. A session is used to generate the necessary closing options
|
||||
// needed to close a channel cooperatively.
|
||||
type MusigSession interface {
|
||||
// ProposalClosingOpts generates the set of closing options needed to
|
||||
// generate a new musig2 proposal signature.
|
||||
ProposalClosingOpts() ([]lnwallet.ChanCloseOpt, error)
|
||||
|
||||
// CombineClosingOpts returns the options that should be used when
|
||||
// combining the final musig partial signature. The method also maps
|
||||
// the lnwire partial signatures into an input.Signature that can be
|
||||
// used more generally.
|
||||
CombineClosingOpts(localSig, remoteSig lnwire.PartialSig,
|
||||
) (input.Signature, input.Signature, []lnwallet.ChanCloseOpt, error)
|
||||
|
||||
// ClosingNonce generates the nonce we'll use to generate the musig2
|
||||
// partial signatures for the co-op close transaction.
|
||||
ClosingNonce() (*musig2.Nonces, error)
|
||||
|
||||
// InitRemoteNonce saves the remote nonce the party sent during their
|
||||
// shutdown message so it can be used later to generate and verify
|
||||
// signatures.
|
||||
InitRemoteNonce(nonce *musig2.Nonces)
|
||||
}
|
||||
Reference in new issue
Block a user