utxonursery: move spendable output structs to sweep package
This commit moves the output structs to a new package as a preparation for moving more logic into that package.
This commit is contained in:
parent
4c0ca37174
commit
9fcc7ee390
@ -20,6 +20,7 @@ import (
|
|||||||
"github.com/lightningnetwork/lnd/channeldb"
|
"github.com/lightningnetwork/lnd/channeldb"
|
||||||
"github.com/lightningnetwork/lnd/htlcswitch"
|
"github.com/lightningnetwork/lnd/htlcswitch"
|
||||||
"github.com/lightningnetwork/lnd/lnwallet"
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
|
"github.com/lightningnetwork/lnd/sweep"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -748,33 +749,6 @@ func (b *breachArbiter) handleBreachHandoff(breachEvent *ContractBreachEvent) {
|
|||||||
go b.exactRetribution(cfChan, retInfo)
|
go b.exactRetribution(cfChan, retInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SpendableOutput an interface which can be used by the breach arbiter to
|
|
||||||
// construct a transaction spending from outputs we control.
|
|
||||||
type SpendableOutput interface {
|
|
||||||
// Amount returns the number of satoshis contained within the output.
|
|
||||||
Amount() btcutil.Amount
|
|
||||||
|
|
||||||
// Outpoint returns the reference to the output being spent, used to
|
|
||||||
// construct the corresponding transaction input.
|
|
||||||
OutPoint() *wire.OutPoint
|
|
||||||
|
|
||||||
// WitnessType returns an enum specifying the type of witness that must
|
|
||||||
// be generated in order to spend this output.
|
|
||||||
WitnessType() lnwallet.WitnessType
|
|
||||||
|
|
||||||
// SignDesc returns a reference to a spendable output's sign descriptor,
|
|
||||||
// which is used during signing to compute a valid witness that spends
|
|
||||||
// this output.
|
|
||||||
SignDesc() *lnwallet.SignDescriptor
|
|
||||||
|
|
||||||
// BuildWitness returns a valid witness allowing this output to be
|
|
||||||
// spent, the witness should be attached to the transaction at the
|
|
||||||
// location determined by the given `txinIdx`.
|
|
||||||
BuildWitness(signer lnwallet.Signer, txn *wire.MsgTx,
|
|
||||||
hashCache *txscript.TxSigHashes,
|
|
||||||
txinIdx int) ([][]byte, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// breachedOutput contains all the information needed to sweep a breached
|
// breachedOutput contains all the information needed to sweep a breached
|
||||||
// output. A breached output is an output that we are now entitled to due to a
|
// output. A breached output is an output that we are now entitled to due to a
|
||||||
// revoked commitment transaction being broadcast.
|
// revoked commitment transaction being broadcast.
|
||||||
@ -852,7 +826,7 @@ func (bo *breachedOutput) BuildWitness(signer lnwallet.Signer, txn *wire.MsgTx,
|
|||||||
|
|
||||||
// Add compile-time constraint ensuring breachedOutput implements
|
// Add compile-time constraint ensuring breachedOutput implements
|
||||||
// SpendableOutput.
|
// SpendableOutput.
|
||||||
var _ SpendableOutput = (*breachedOutput)(nil)
|
var _ sweep.SpendableOutput = (*breachedOutput)(nil)
|
||||||
|
|
||||||
// retributionInfo encapsulates all the data needed to sweep all the contested
|
// retributionInfo encapsulates all the data needed to sweep all the contested
|
||||||
// funds within a channel whose contract has been breached by the prior
|
// funds within a channel whose contract has been breached by the prior
|
||||||
@ -963,13 +937,13 @@ func (b *breachArbiter) createJusticeTx(
|
|||||||
// outputs, while simultaneously computing the estimated weight of the
|
// outputs, while simultaneously computing the estimated weight of the
|
||||||
// transaction.
|
// transaction.
|
||||||
var (
|
var (
|
||||||
spendableOutputs []SpendableOutput
|
spendableOutputs []sweep.SpendableOutput
|
||||||
weightEstimate lnwallet.TxWeightEstimator
|
weightEstimate lnwallet.TxWeightEstimator
|
||||||
)
|
)
|
||||||
|
|
||||||
// Allocate enough space to potentially hold each of the breached
|
// Allocate enough space to potentially hold each of the breached
|
||||||
// outputs in the retribution info.
|
// outputs in the retribution info.
|
||||||
spendableOutputs = make([]SpendableOutput, 0, len(r.breachedOutputs))
|
spendableOutputs = make([]sweep.SpendableOutput, 0, len(r.breachedOutputs))
|
||||||
|
|
||||||
// The justice transaction we construct will be a segwit transaction
|
// The justice transaction we construct will be a segwit transaction
|
||||||
// that pays to a p2wkh output. Components such as the version,
|
// that pays to a p2wkh output. Components such as the version,
|
||||||
@ -1023,7 +997,7 @@ func (b *breachArbiter) createJusticeTx(
|
|||||||
// sweepSpendableOutputsTxn creates a signed transaction from a sequence of
|
// sweepSpendableOutputsTxn creates a signed transaction from a sequence of
|
||||||
// spendable outputs by sweeping the funds into a single p2wkh output.
|
// spendable outputs by sweeping the funds into a single p2wkh output.
|
||||||
func (b *breachArbiter) sweepSpendableOutputsTxn(txWeight int64,
|
func (b *breachArbiter) sweepSpendableOutputsTxn(txWeight int64,
|
||||||
inputs ...SpendableOutput) (*wire.MsgTx, error) {
|
inputs ...sweep.SpendableOutput) (*wire.MsgTx, error) {
|
||||||
|
|
||||||
// First, we obtain a new public key script from the wallet which we'll
|
// First, we obtain a new public key script from the wallet which we'll
|
||||||
// sweep the funds to.
|
// sweep the funds to.
|
||||||
@ -1085,7 +1059,7 @@ func (b *breachArbiter) sweepSpendableOutputsTxn(txWeight int64,
|
|||||||
// witness, and attaching it to the transaction. This function accepts
|
// witness, and attaching it to the transaction. This function accepts
|
||||||
// an integer index representing the intended txin index, and the
|
// an integer index representing the intended txin index, and the
|
||||||
// breached output from which it will spend.
|
// breached output from which it will spend.
|
||||||
addWitness := func(idx int, so SpendableOutput) error {
|
addWitness := func(idx int, so sweep.SpendableOutput) error {
|
||||||
// First, we construct a valid witness for this outpoint and
|
// First, we construct a valid witness for this outpoint and
|
||||||
// transaction using the SpendableOutput's witness generation
|
// transaction using the SpendableOutput's witness generation
|
||||||
// function.
|
// function.
|
||||||
|
58
sweep/input.go
Normal file
58
sweep/input.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package sweep
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/btcsuite/btcd/txscript"
|
||||||
|
"github.com/btcsuite/btcd/wire"
|
||||||
|
"github.com/btcsuite/btcutil"
|
||||||
|
"github.com/lightningnetwork/lnd/lnwallet"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SpendableOutput an interface which can be used by the breach arbiter to
|
||||||
|
// construct a transaction spending from outputs we control.
|
||||||
|
type SpendableOutput interface {
|
||||||
|
// Amount returns the number of satoshis contained within the output.
|
||||||
|
Amount() btcutil.Amount
|
||||||
|
|
||||||
|
// Outpoint returns the reference to the output being spent, used to
|
||||||
|
// construct the corresponding transaction input.
|
||||||
|
OutPoint() *wire.OutPoint
|
||||||
|
|
||||||
|
// WitnessType returns an enum specifying the type of witness that must
|
||||||
|
// be generated in order to spend this output.
|
||||||
|
WitnessType() lnwallet.WitnessType
|
||||||
|
|
||||||
|
// SignDesc returns a reference to a spendable output's sign descriptor,
|
||||||
|
// which is used during signing to compute a valid witness that spends
|
||||||
|
// this output.
|
||||||
|
SignDesc() *lnwallet.SignDescriptor
|
||||||
|
|
||||||
|
// BuildWitness returns a valid witness allowing this output to be
|
||||||
|
// spent, the witness should be attached to the transaction at the
|
||||||
|
// location determined by the given `txinIdx`.
|
||||||
|
BuildWitness(signer lnwallet.Signer, txn *wire.MsgTx,
|
||||||
|
hashCache *txscript.TxSigHashes,
|
||||||
|
txinIdx int) ([][]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CsvSpendableOutput is a SpendableOutput that contains all of the information
|
||||||
|
// necessary to construct, sign, and sweep an output locked with a CSV delay.
|
||||||
|
type CsvSpendableOutput interface {
|
||||||
|
SpendableOutput
|
||||||
|
|
||||||
|
// ConfHeight returns the height at which this output was confirmed.
|
||||||
|
// A zero value indicates that the output has not been confirmed.
|
||||||
|
ConfHeight() uint32
|
||||||
|
|
||||||
|
// SetConfHeight marks the height at which the output is confirmed in
|
||||||
|
// the chain.
|
||||||
|
SetConfHeight(height uint32)
|
||||||
|
|
||||||
|
// BlocksToMaturity returns the relative timelock, as a number of
|
||||||
|
// blocks, that must be built on top of the confirmation height before
|
||||||
|
// the output can be spent.
|
||||||
|
BlocksToMaturity() uint32
|
||||||
|
|
||||||
|
// OriginChanPoint returns the outpoint of the channel from which this
|
||||||
|
// output is derived.
|
||||||
|
OriginChanPoint() *wire.OutPoint
|
||||||
|
}
|
@ -4,6 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/lightningnetwork/lnd/sweep"
|
||||||
"io"
|
"io"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
@ -953,14 +954,14 @@ func (u *utxoNursery) createSweepTx(kgtnOutputs []kidOutput,
|
|||||||
// outputs are CLTV locked outputs that have had their timelocks
|
// outputs are CLTV locked outputs that have had their timelocks
|
||||||
// expire.
|
// expire.
|
||||||
var (
|
var (
|
||||||
csvOutputs []CsvSpendableOutput
|
csvOutputs []sweep.CsvSpendableOutput
|
||||||
cltvOutputs []SpendableOutput
|
cltvOutputs []sweep.SpendableOutput
|
||||||
weightEstimate lnwallet.TxWeightEstimator
|
weightEstimate lnwallet.TxWeightEstimator
|
||||||
)
|
)
|
||||||
|
|
||||||
// Allocate enough room for both types of kindergarten outputs.
|
// Allocate enough room for both types of kindergarten outputs.
|
||||||
csvOutputs = make([]CsvSpendableOutput, 0, len(kgtnOutputs))
|
csvOutputs = make([]sweep.CsvSpendableOutput, 0, len(kgtnOutputs))
|
||||||
cltvOutputs = make([]SpendableOutput, 0, len(kgtnOutputs))
|
cltvOutputs = make([]sweep.SpendableOutput, 0, len(kgtnOutputs))
|
||||||
|
|
||||||
// Our sweep transaction will pay to a single segwit p2wkh address,
|
// Our sweep transaction will pay to a single segwit p2wkh address,
|
||||||
// ensure it contributes to our weight estimate.
|
// ensure it contributes to our weight estimate.
|
||||||
@ -1028,8 +1029,8 @@ func (u *utxoNursery) createSweepTx(kgtnOutputs []kidOutput,
|
|||||||
// has a single output sending all the funds back to the source wallet, after
|
// has a single output sending all the funds back to the source wallet, after
|
||||||
// accounting for the fee estimate.
|
// accounting for the fee estimate.
|
||||||
func (u *utxoNursery) populateSweepTx(txWeight int64, classHeight uint32,
|
func (u *utxoNursery) populateSweepTx(txWeight int64, classHeight uint32,
|
||||||
csvInputs []CsvSpendableOutput,
|
csvInputs []sweep.CsvSpendableOutput,
|
||||||
cltvInputs []SpendableOutput) (*wire.MsgTx, error) {
|
cltvInputs []sweep.SpendableOutput) (*wire.MsgTx, error) {
|
||||||
|
|
||||||
// Generate the receiving script to which the funds will be swept.
|
// Generate the receiving script to which the funds will be swept.
|
||||||
pkScript, err := u.cfg.GenSweepScript()
|
pkScript, err := u.cfg.GenSweepScript()
|
||||||
@ -1099,7 +1100,7 @@ func (u *utxoNursery) populateSweepTx(txWeight int64, classHeight uint32,
|
|||||||
|
|
||||||
// With all the inputs in place, use each output's unique witness
|
// With all the inputs in place, use each output's unique witness
|
||||||
// function to generate the final witness required for spending.
|
// function to generate the final witness required for spending.
|
||||||
addWitness := func(idx int, tso SpendableOutput) error {
|
addWitness := func(idx int, tso sweep.SpendableOutput) error {
|
||||||
witness, err := tso.BuildWitness(
|
witness, err := tso.BuildWitness(
|
||||||
u.cfg.Signer, sweepTx, hashCache, idx,
|
u.cfg.Signer, sweepTx, hashCache, idx,
|
||||||
)
|
)
|
||||||
@ -1635,29 +1636,6 @@ func newSweepPkScript(wallet lnwallet.WalletController) ([]byte, error) {
|
|||||||
return txscript.PayToAddrScript(sweepAddr)
|
return txscript.PayToAddrScript(sweepAddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// CsvSpendableOutput is a SpendableOutput that contains all of the information
|
|
||||||
// necessary to construct, sign, and sweep an output locked with a CSV delay.
|
|
||||||
type CsvSpendableOutput interface {
|
|
||||||
SpendableOutput
|
|
||||||
|
|
||||||
// ConfHeight returns the height at which this output was confirmed.
|
|
||||||
// A zero value indicates that the output has not been confirmed.
|
|
||||||
ConfHeight() uint32
|
|
||||||
|
|
||||||
// SetConfHeight marks the height at which the output is confirmed in
|
|
||||||
// the chain.
|
|
||||||
SetConfHeight(height uint32)
|
|
||||||
|
|
||||||
// BlocksToMaturity returns the relative timelock, as a number of
|
|
||||||
// blocks, that must be built on top of the confirmation height before
|
|
||||||
// the output can be spent.
|
|
||||||
BlocksToMaturity() uint32
|
|
||||||
|
|
||||||
// OriginChanPoint returns the outpoint of the channel from which this
|
|
||||||
// output is derived.
|
|
||||||
OriginChanPoint() *wire.OutPoint
|
|
||||||
}
|
|
||||||
|
|
||||||
// babyOutput represents a two-stage CSV locked output, and is used to track
|
// babyOutput represents a two-stage CSV locked output, and is used to track
|
||||||
// htlc outputs through incubation. The first stage requires broadcasting a
|
// htlc outputs through incubation. The first stage requires broadcasting a
|
||||||
// presigned timeout txn that spends from the CLTV locked output on the
|
// presigned timeout txn that spends from the CLTV locked output on the
|
||||||
@ -1971,5 +1949,5 @@ func readTxOut(r io.Reader, txo *wire.TxOut) error {
|
|||||||
|
|
||||||
// Compile-time constraint to ensure kidOutput and babyOutput implement the
|
// Compile-time constraint to ensure kidOutput and babyOutput implement the
|
||||||
// CsvSpendableOutput interface.
|
// CsvSpendableOutput interface.
|
||||||
var _ CsvSpendableOutput = (*kidOutput)(nil)
|
var _ sweep.CsvSpendableOutput = (*kidOutput)(nil)
|
||||||
var _ CsvSpendableOutput = (*babyOutput)(nil)
|
var _ sweep.CsvSpendableOutput = (*babyOutput)(nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user