lnwallet+peer: move internalKeyForAddr to lnwallet package

This way we can re-use it. We also make it slightly more generalized.
This commit is contained in:
Olaoluwa Osuntokun
2024-06-03 23:00:38 -07:00
committed by Oliver Gugger
parent 74d27f2c7c
commit 07ee114116
5 changed files with 160 additions and 79 deletions

View File

@@ -13,13 +13,11 @@ import (
"time"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/connmgr"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btclog"
"github.com/btcsuite/btcwallet/waddrmgr"
"github.com/davecgh/go-spew/spew"
"github.com/lightningnetwork/lnd/buffer"
"github.com/lightningnetwork/lnd/build"
@@ -37,6 +35,7 @@ import (
"github.com/lightningnetwork/lnd/htlcswitch/hop"
"github.com/lightningnetwork/lnd/input"
"github.com/lightningnetwork/lnd/invoices"
"github.com/lightningnetwork/lnd/keychain"
"github.com/lightningnetwork/lnd/lnpeer"
"github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/lnutils"
@@ -902,71 +901,31 @@ func (p *Brontide) QuitSignal() <-chan struct{} {
return p.quit
}
// internalKeyForAddr returns the internal key associated with a taproot
// address.
func internalKeyForAddr(wallet *lnwallet.LightningWallet,
deliveryScript []byte) (fn.Option[btcec.PublicKey], error) {
none := fn.None[btcec.PublicKey]()
pkScript, err := txscript.ParsePkScript(deliveryScript)
if err != nil {
return none, err
}
addr, err := pkScript.Address(&wallet.Cfg.NetParams)
if err != nil {
return none, err
}
// If it's not a taproot address, we don't require to know the internal
// key in the first place. So we don't return an error here, but also no
// internal key.
_, isTaproot := addr.(*btcutil.AddressTaproot)
if !isTaproot {
return none, nil
}
walletAddr, err := wallet.AddressInfo(addr)
if err != nil {
return none, err
}
// If the address isn't known to the wallet, we can't determine the
// internal key.
if walletAddr == nil {
return none, nil
}
pubKeyAddr, ok := walletAddr.(waddrmgr.ManagedPubKeyAddress)
if !ok {
return none, fmt.Errorf("expected pubkey addr, got %T",
pubKeyAddr)
}
return fn.Some(*pubKeyAddr.PubKey()), nil
}
// addrWithInternalKey takes a delivery script, then attempts to supplement it
// with information related to the internal key for the addr, but only if it's
// a taproot addr.
func (p *Brontide) addrWithInternalKey(
deliveryScript []byte) fn.Result[chancloser.DeliveryAddrWithKey] {
deliveryScript []byte) (*chancloser.DeliveryAddrWithKey, error) {
// TODO(roasbeef): not compatible with external shutdown addr?
// Currently, custom channels cannot be created with external upfront
// shutdown addresses, so this shouldn't be an issue. We only require
// the internal key for taproot addresses to be able to provide a non
// inclusion proof of any scripts.
internalKey, err := internalKeyForAddr(p.cfg.Wallet, deliveryScript)
internalKeyDesc, err := lnwallet.InternalKeyForAddr(
p.cfg.Wallet, &p.cfg.Wallet.Cfg.NetParams, deliveryScript,
)
if err != nil {
return fn.Err[chancloser.DeliveryAddrWithKey](err)
return nil, fmt.Errorf("unable to fetch internal key: %w", err)
}
return fn.Ok(chancloser.DeliveryAddrWithKey{
return &chancloser.DeliveryAddrWithKey{
DeliveryAddress: deliveryScript,
InternalKey: internalKey,
})
InternalKey: fn.MapOption(
func(desc keychain.KeyDescriptor) btcec.PublicKey {
return *desc.PubKey
},
)(internalKeyDesc),
}, nil
}
// loadActiveChannels creates indexes within the peer for tracking all active
@@ -1040,6 +999,8 @@ func (p *Brontide) loadActiveChannels(chans []*channeldb.OpenChannel) (
}
}
// TODO(roasbeef): also make aux resolver here
var chanOpts []lnwallet.ChannelOpt
p.cfg.AuxLeafStore.WhenSome(func(s lnwallet.AuxLeafStore) {
chanOpts = append(chanOpts, lnwallet.WithLeafStore(s))
@@ -1211,7 +1172,7 @@ func (p *Brontide) loadActiveChannels(chans []*channeldb.OpenChannel) (
addr, err := p.addrWithInternalKey(
info.DeliveryScript.Val,
).Unpack()
)
if err != nil {
shutdownInfoErr = fmt.Errorf("unable to make "+
"delivery addr: %w", err)
@@ -2977,7 +2938,7 @@ func (p *Brontide) fetchActiveChanCloser(chanID lnwire.ChannelID) (
return nil, fmt.Errorf("unable to estimate fee")
}
addr, err := p.addrWithInternalKey(deliveryScript).Unpack()
addr, err := p.addrWithInternalKey(deliveryScript)
if err != nil {
return nil, fmt.Errorf("unable to parse addr: %w", err)
}
@@ -3224,7 +3185,7 @@ func (p *Brontide) restartCoopClose(lnChan *lnwallet.LightningChannel) (
closingParty = lntypes.Local
}
addr, err := p.addrWithInternalKey(deliveryScript).Unpack()
addr, err := p.addrWithInternalKey(deliveryScript)
if err != nil {
return nil, fmt.Errorf("unable to parse addr: %w", err)
}
@@ -3256,7 +3217,7 @@ func (p *Brontide) restartCoopClose(lnChan *lnwallet.LightningChannel) (
// createChanCloser constructs a ChanCloser from the passed parameters and is
// used to de-duplicate code.
func (p *Brontide) createChanCloser(channel *lnwallet.LightningChannel,
deliveryScript chancloser.DeliveryAddrWithKey,
deliveryScript *chancloser.DeliveryAddrWithKey,
fee chainfee.SatPerKWeight, req *htlcswitch.ChanClose,
closer lntypes.ChannelParty) (*chancloser.ChanCloser, error) {
@@ -3291,7 +3252,7 @@ func (p *Brontide) createChanCloser(channel *lnwallet.LightningChannel,
ChainParams: &p.cfg.Wallet.Cfg.NetParams,
Quit: p.quit,
},
deliveryScript,
*deliveryScript,
fee,
uint32(startingHeight),
req,
@@ -3350,7 +3311,7 @@ func (p *Brontide) handleLocalCloseReq(req *htlcswitch.ChanClose) {
return
}
}
addr, err := p.addrWithInternalKey(deliveryScript).Unpack()
addr, err := p.addrWithInternalKey(deliveryScript)
if err != nil {
err = fmt.Errorf("unable to parse addr for channel "+
"%v: %w", req.ChanPoint, err)