From 9d2d5a78d47a3c82b75589f6085cb049b8d39bc0 Mon Sep 17 00:00:00 2001 From: Carla Kirk-Cohen Date: Thu, 31 Mar 2022 14:54:03 +0200 Subject: [PATCH] multi: pass shared key to new htlc TODO - our view etc functions don't have our shared key, find a good way to get this. A possible solution is just to lazily store it so that we don't need to call lnd/create a session every time we want to restore it. --- client.go | 11 ++++++----- client_test.go | 3 ++- loopd/view.go | 2 ++ swap.go | 4 ++-- swap/htlc.go | 17 +++++++++++++++-- swap/htlc_test.go | 2 +- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/client.go b/client.go index b6bed80..0599aee 100644 --- a/client.go +++ b/client.go @@ -195,7 +195,8 @@ func (s *Client) FetchSwaps() ([]*SwapInfo, error) { htlc, err := swap.NewHtlc( GetHtlcScriptVersion(swp.Contract.ProtocolVersion), swp.Contract.CltvExpiry, swp.Contract.SenderKey, - swp.Contract.ReceiverKey, swp.Hash, swap.HtlcP2WSH, + swp.Contract.ReceiverKey, nil, + swp.Hash, swap.HtlcP2WSH, s.lndServices.ChainParams, ) if err != nil { @@ -216,8 +217,8 @@ func (s *Client) FetchSwaps() ([]*SwapInfo, error) { htlcNP2WSH, err := swap.NewHtlc( GetHtlcScriptVersion(swp.Contract.ProtocolVersion), swp.Contract.CltvExpiry, swp.Contract.SenderKey, - swp.Contract.ReceiverKey, swp.Hash, swap.HtlcNP2WSH, - s.lndServices.ChainParams, + swp.Contract.ReceiverKey, nil, + swp.Hash, swap.HtlcNP2WSH, s.lndServices.ChainParams, ) if err != nil { return nil, err @@ -226,8 +227,8 @@ func (s *Client) FetchSwaps() ([]*SwapInfo, error) { htlcP2WSH, err := swap.NewHtlc( GetHtlcScriptVersion(swp.Contract.ProtocolVersion), swp.Contract.CltvExpiry, swp.Contract.SenderKey, - swp.Contract.ReceiverKey, swp.Hash, swap.HtlcP2WSH, - s.lndServices.ChainParams, + swp.Contract.ReceiverKey, nil, + swp.Hash, swap.HtlcP2WSH, s.lndServices.ChainParams, ) if err != nil { return nil, err diff --git a/client_test.go b/client_test.go index 6a315bc..8e79b62 100644 --- a/client_test.go +++ b/client_test.go @@ -284,7 +284,8 @@ func testResume(t *testing.T, confs uint32, expired, preimageRevealed, scriptVersion := GetHtlcScriptVersion(protocolVersion) htlc, err := swap.NewHtlc( scriptVersion, pendingSwap.Contract.CltvExpiry, senderKey, - receiverKey, hash, swap.HtlcP2WSH, &chaincfg.TestNet3Params, + receiverKey, pendingSwap.Contract.SharedKey(), hash, + swap.HtlcP2WSH, &chaincfg.TestNet3Params, ) require.NoError(t, err) require.Equal(t, htlc.PkScript, confIntent.PkScript) diff --git a/loopd/view.go b/loopd/view.go index c13c8ba..ad80f5e 100644 --- a/loopd/view.go +++ b/loopd/view.go @@ -54,6 +54,7 @@ func viewOut(swapClient *loop.Client, chainParams *chaincfg.Params) error { s.Contract.CltvExpiry, s.Contract.SenderKey, s.Contract.ReceiverKey, + nil, s.Hash, swap.HtlcP2WSH, chainParams, ) if err != nil { @@ -106,6 +107,7 @@ func viewIn(swapClient *loop.Client, chainParams *chaincfg.Params) error { s.Contract.CltvExpiry, s.Contract.SenderKey, s.Contract.ReceiverKey, + nil, s.Hash, swap.HtlcNP2WSH, chainParams, ) if err != nil { diff --git a/swap.go b/swap.go index eb40597..9e719f5 100644 --- a/swap.go +++ b/swap.go @@ -76,8 +76,8 @@ func (s *swapKit) getHtlc(outputType swap.HtlcOutputType) (*swap.Htlc, error) { return swap.NewHtlc( GetHtlcScriptVersion(s.contract.ProtocolVersion), s.contract.CltvExpiry, s.contract.SenderKey, - s.contract.ReceiverKey, s.hash, outputType, - s.swapConfig.lnd.ChainParams, + s.contract.ReceiverKey, s.musig2Session.CombinedKey, s.hash, + outputType, s.swapConfig.lnd.ChainParams, ) } diff --git a/swap/htlc.go b/swap/htlc.go index 6a2d320..b6e5606 100644 --- a/swap/htlc.go +++ b/swap/htlc.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" + "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/txscript" @@ -14,6 +15,10 @@ import ( "github.com/lightningnetwork/lnd/lntypes" ) +// ErrNoSharedKey is returned when a script version does not support use of a +// shared key. +var ErrNoSharedKey = errors.New("shared key not supported for script version") + // HtlcOutputType defines the output type of the htlc that is published. type HtlcOutputType uint8 @@ -90,7 +95,7 @@ var ( // script size. QuoteHtlc, _ = NewHtlc( HtlcV2, - ^int32(0), quoteKey, quoteKey, quoteHash, HtlcP2WSH, + ^int32(0), quoteKey, quoteKey, nil, quoteHash, HtlcP2WSH, &chaincfg.MainNetParams, ) @@ -113,7 +118,7 @@ func (h HtlcOutputType) String() string { // NewHtlc returns a new instance. func NewHtlc(version ScriptVersion, cltvExpiry int32, - senderKey, receiverKey [33]byte, + senderKey, receiverKey [33]byte, sharedKey *btcec.PublicKey, hash lntypes.Hash, outputType HtlcOutputType, chainParams *chaincfg.Params) (*Htlc, error) { @@ -124,11 +129,19 @@ func NewHtlc(version ScriptVersion, cltvExpiry int32, switch version { case HtlcV1: + if sharedKey != nil { + return nil, ErrNoSharedKey + } + htlc, err = newHTLCScriptV1( cltvExpiry, senderKey, receiverKey, hash, ) case HtlcV2: + if sharedKey != nil { + return nil, ErrNoSharedKey + } + htlc, err = newHTLCScriptV2( cltvExpiry, senderKey, receiverKey, hash, ) diff --git a/swap/htlc_test.go b/swap/htlc_test.go index 5c37c32..1202b0f 100644 --- a/swap/htlc_test.go +++ b/swap/htlc_test.go @@ -137,7 +137,7 @@ func TestHtlcV2(t *testing.T) { // Create the htlc. htlc, err := NewHtlc( HtlcV2, testCltvExpiry, - senderKey, receiverKey, hash, + senderKey, receiverKey, nil, hash, HtlcP2WSH, &chaincfg.MainNetParams, ) require.NoError(t, err)