From eea02b30adacee55791caba0cae9568bac5085de Mon Sep 17 00:00:00 2001 From: bruwbird Date: Sun, 11 Feb 2024 18:00:37 +0900 Subject: [PATCH] lnd: label the tx to make it easier to audit Ensure that all lnd transactions related to peerswaps are identifiable by the label `peerswap`. This makes it easier to audit the transactions from faraday. This is performed by LND's LabelTransaction RPC. Since CLN has no such function, no label is assigned. Since label recording is not an essential requirement for swap, if it fails, it is logged and subsequent processing is continued. --- clightning/clightning_wallet.go | 8 ++++++++ lnd/lnd_wallet.go | 17 +++++++++++++++++ onchain/bitcoin.go | 8 ++++++++ onchain/liquid.go | 8 ++++++++ swap/actions.go | 21 +++++++++++++++++++-- swap/services.go | 1 + swap/swap_out_sender_test.go | 4 ++++ 7 files changed, 65 insertions(+), 2 deletions(-) diff --git a/clightning/clightning_wallet.go b/clightning/clightning_wallet.go index 91893cb5..bbdb8ad1 100644 --- a/clightning/clightning_wallet.go +++ b/clightning/clightning_wallet.go @@ -199,6 +199,14 @@ func (cl *ClightningClient) CreateCoopSpendingTransaction(swapParams *swap.Openi return spendingTx.TxHash().String(), txHex, nil } +func (cl *ClightningClient) LabelTransaction(txId, label string) error { + // todo implement + // This function assigns an identifiable label to the target transaction based on the txid. + // Currently no such functionality is available, so it has not been implemented. + // Supported by lnd only. + return nil +} + func (cl *ClightningClient) NewAddress() (string, error) { newAddr, err := cl.glightning.NewAddr() if err != nil { diff --git a/lnd/lnd_wallet.go b/lnd/lnd_wallet.go index 039ecfa7..adc36684 100644 --- a/lnd/lnd_wallet.go +++ b/lnd/lnd_wallet.go @@ -7,6 +7,7 @@ import ( "encoding/hex" "github.com/btcsuite/btcd/btcutil/psbt" + "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" "github.com/elementsproject/peerswap/lightning" "github.com/elementsproject/peerswap/onchain" @@ -207,6 +208,22 @@ func (l *Client) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, c return spendingTx.TxHash().String(), txHex, nil } +// LabelTransaction labels a transaction with a given label. +// This makes it easier to audit the transactions from faraday. +// This is performed by LND's LabelTransaction RPC. +func (l *Client) LabelTransaction(txID, label string) error { + txIDHash, err := chainhash.NewHashFromStr(txID) + if err != nil { + return err + } + _, err = l.walletClient.LabelTransaction(l.ctx, + &walletrpc.LabelTransactionRequest{ + Txid: txIDHash.CloneBytes(), + Label: label, + Overwrite: true}) + return err +} + func (l *Client) GetOnchainBalance() (uint64, error) { res, err := l.lndClient.WalletBalance(l.ctx, &lnrpc.WalletBalanceRequest{}) if err != nil { diff --git a/onchain/bitcoin.go b/onchain/bitcoin.go index d6fc0101..02ef14c7 100644 --- a/onchain/bitcoin.go +++ b/onchain/bitcoin.go @@ -254,6 +254,14 @@ func (b *BitcoinOnChain) PrepareSpendingTransaction(swapParams *swap.OpeningPara return spendingTx, sigHash, redeemScript, nil } +func (b *BitcoinOnChain) LabelTransaction(txID, label string) error { + // TODO: implement + // This function assigns an identifiable label to the target transaction based on the txid. + // Currently no such functionality is available, so it has not been implemented. + // Supported by lnd only. + return nil +} + func (b *BitcoinOnChain) CreateOpeningAddress(params *swap.OpeningParams, csv uint32) (string, error) { redeemScript, err := ParamsToTxScript(params, csv) if err != nil { diff --git a/onchain/liquid.go b/onchain/liquid.go index 3a854a9e..27e26a61 100644 --- a/onchain/liquid.go +++ b/onchain/liquid.go @@ -220,6 +220,14 @@ func (l *LiquidOnChain) CreateCoopSpendingTransaction(swapParams *swap.OpeningPa return txId, txHex, nil } +func (l *LiquidOnChain) LabelTransaction(txID, label string) error { + // TODO: implement + // This function assigns an identifiable label to the target transaction based on the txid. + // Currently no such functionality is available, so it has not been implemented. + // Supported by lnd only. + return nil +} + func (l *LiquidOnChain) AddBlindingRandomFactors(claimParams *swap.ClaimParams) (err error) { claimParams.OutputAssetBlindingFactor = generateRandom32Bytes() claimParams.BlindingSeed = generateRandom32Bytes() diff --git a/swap/actions.go b/swap/actions.go index a8f158a1..046888c3 100644 --- a/swap/actions.go +++ b/swap/actions.go @@ -18,8 +18,9 @@ import ( ) const ( - BitcoinCsv = 1008 - LiquidCsv = 60 + BitcoinCsv = 1008 + LiquidCsv = 60 + peerswapLabel = "peerswap" ) type CheckRequestWrapperAction struct { @@ -194,6 +195,10 @@ func (s *ClaimSwapTransactionWithPreimageAction) Execute(services *SwapServices, return Event_OnRetry } swap.ClaimTxId = txId + err = wallet.LabelTransaction(txId, peerswapLabel) + if err != nil { + log.Infof("Error labeling trnasaction %v", err) + } } return Event_ActionSucceeded @@ -249,6 +254,10 @@ func (c *CreateAndBroadcastOpeningTransaction) Execute(services *SwapServices, s // todo: idempotent states return swap.HandleError(err) } + err = wallet.LabelTransaction(txId, peerswapLabel) + if err != nil { + log.Infof("Error labeling trnasaction %v", err) + } startingHeight, err := txWatcher.GetBlockHeight() if err != nil { return swap.HandleError(err) @@ -437,6 +446,10 @@ func (c *ClaimSwapTransactionWithCsv) Execute(services *SwapServices, swap *Swap return Event_OnRetry } swap.ClaimTxId = txId + err = wallet.LabelTransaction(txId, peerswapLabel) + if err != nil { + log.Infof("Error labeling trnasaction %v", err) + } } return Event_ActionSucceeded @@ -463,6 +476,10 @@ func (c *ClaimSwapTransactionCoop) Execute(services *SwapServices, swap *SwapDat return swap.HandleError(err) } swap.ClaimTxId = txId + err = wallet.LabelTransaction(txId, peerswapLabel) + if err != nil { + log.Infof("Error labeling trnasaction %v", err) + } } return Event_ActionSucceeded diff --git a/swap/services.go b/swap/services.go index 6a843c09..8bf11e53 100644 --- a/swap/services.go +++ b/swap/services.go @@ -74,6 +74,7 @@ type Wallet interface { CreatePreimageSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (string, string, error) CreateCsvSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams) (txId, txHex string, error error) CreateCoopSpendingTransaction(swapParams *OpeningParams, claimParams *ClaimParams, takerSigner Signer) (txId, txHex string, error error) + LabelTransaction(txId, label string) error GetOutputScript(params *OpeningParams) ([]byte, error) NewAddress() (string, error) GetRefundFee() (uint64, error) diff --git a/swap/swap_out_sender_test.go b/swap/swap_out_sender_test.go index b4267736..57ca0a70 100644 --- a/swap/swap_out_sender_test.go +++ b/swap/swap_out_sender_test.go @@ -458,6 +458,10 @@ func (d *dummyChain) AddWaitForConfirmationTx(swapId, txId string, vout, startin } +func (d *dummyChain) LabelTransaction(txId, label string) error { + return nil +} + func (d *dummyChain) AddWaitForCsvTx(swapId, txId string, vout uint32, startingHeight uint32, wantscript []byte) { }