Skip to content

Commit

Permalink
cln: label the address
Browse files Browse the repository at this point in the history
Ensure that all cln/liquid transactions related to peerswaps
 are identifiable by the label.
This makes it easier to audit the transactions.
if it fails, it is logged and subsequent processing is continued.
  • Loading branch information
YusukeShimizu committed Feb 13, 2024
1 parent eea02b3 commit 6fd45cb
Show file tree
Hide file tree
Showing 11 changed files with 158 additions and 167 deletions.
78 changes: 37 additions & 41 deletions clightning/clightning_wallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ import (
"github.com/elementsproject/peerswap/version"
)

func (cl *ClightningClient) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex string, fee uint64, vout uint32, err error) {
func (cl *ClightningClient) CreateOpeningTransaction(swapParams *swap.OpeningParams) (unpreparedTxHex, label string, fee uint64, vout uint32, err error) {
addr, err := cl.bitcoinChain.CreateOpeningAddress(swapParams, onchain.BitcoinCsv)
if err != nil {
return "", 0, 0, err
return "", "", 0, 0, err
}
outputs := []*glightning.Outputs{
{
Expand All @@ -26,35 +26,35 @@ func (cl *ClightningClient) CreateOpeningTransaction(swapParams *swap.OpeningPar
}
prepRes, err := cl.glightning.PrepareTx(outputs, &glightning.FeeRate{Directive: glightning.Urgent}, nil)
if err != nil {
return "", 0, 0, err
return "", "", 0, 0, err
}

// Backwards compatibility layer. Since `v23.05`, `preparetx` returns a
// psbt v2 instead of v0. We still want to support `v23.02` so we skip the
// conversion of the psbt (from v2 to v0).
isV2, err := version.CompareVersionStrings(cl.Version(), "v23.05")
if err != nil {
return "", 0, 0, err
return "", "", 0, 0, err
}
if isV2 {
res, err := cl.glightning.SetPSBTVersion(prepRes.Psbt, 0)
if err != nil {
return "", 0, 0, err
return "", "", 0, 0, err
}
prepRes.Psbt = res.Psbt
}

fee, err = cl.bitcoinChain.GetFeeSatsFromTx(prepRes.Psbt, prepRes.UnsignedTx)
if err != nil {
return "", 0, 0, err
return "", "", 0, 0, err
}

_, vout, err = cl.bitcoinChain.GetVoutAndVerify(prepRes.UnsignedTx, swapParams)
if err != nil {
return "", 0, 0, err
return "", "", 0, 0, err
}
cl.hexToIdMap[prepRes.UnsignedTx] = prepRes.TxId
return prepRes.UnsignedTx, fee, vout, nil
return prepRes.UnsignedTx, addr, fee, vout, nil
}

func (cl *ClightningClient) BroadcastOpeningTx(unpreparedTxHex string) (txId, txHex string, error error) {
Expand All @@ -71,30 +71,30 @@ func (cl *ClightningClient) BroadcastOpeningTx(unpreparedTxHex string) (txId, tx
return sendRes.TxId, sendRes.SignedTx, nil
}

func (cl *ClightningClient) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex string, err error) {
func (cl *ClightningClient) CreatePreimageSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex, address string, err error) {

_, vout, err := cl.bitcoinChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams)
if err != nil {
return "", "", err
return "", "", "", err
}

newAddr, err := cl.glightning.NewAddr()
if err != nil {
return "", "", err
return "", "", "", err
}

tx, sigHash, redeemScript, err := cl.bitcoinChain.PrepareSpendingTransaction(swapParams, claimParams, newAddr, vout, 0, 0)
if err != nil {
return "", "", err
return "", "", "", err
}
sigBytes, err := claimParams.Signer.Sign(sigHash)
if err != nil {
return "", "", err
return "", "", "", err
}

preimage, err := lightning.MakePreimageFromStr(claimParams.Preimage)
if err != nil {
return "", "", err
return "", "", "", err
}

tx.TxIn[0].Witness = onchain.GetPreimageWitness(sigBytes.Serialize(), preimage[:], redeemScript)
Expand All @@ -103,37 +103,37 @@ func (cl *ClightningClient) CreatePreimageSpendingTransaction(swapParams *swap.O

err = tx.Serialize(bytesBuffer)
if err != nil {
return "", "", err
return "", "", "", err
}

txHex = hex.EncodeToString(bytesBuffer.Bytes())

txId, err = cl.gbitcoin.SendRawTx(txHex)
if err != nil {
return "", "", err
return "", "", "", err
}
return txId, txHex, nil
return txId, txHex, address, nil
}

func (cl *ClightningClient) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex string, error error) {
func (cl *ClightningClient) CreateCsvSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams) (txId, txHex, address string, error error) {
newAddr, err := cl.glightning.NewAddr()
if err != nil {
return "", "", err
return "", "", "", err
}

_, vout, err := cl.bitcoinChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams)
if err != nil {
return "", "", err
return "", "", "", err
}

tx, sigHash, redeemScript, err := cl.bitcoinChain.PrepareSpendingTransaction(swapParams, claimParams, newAddr, vout, onchain.BitcoinCsv, 0)
if err != nil {
return "", "", err
return "", "", "", err
}

sigBytes, err := claimParams.Signer.Sign(sigHash)
if err != nil {
return "", "", err
return "", "", "", err
}

tx.TxIn[0].Witness = onchain.GetCsvWitness(sigBytes.Serialize(), redeemScript)
Expand All @@ -142,43 +142,43 @@ func (cl *ClightningClient) CreateCsvSpendingTransaction(swapParams *swap.Openin

err = tx.Serialize(bytesBuffer)
if err != nil {
return "", "", err
return "", "", "", err
}

txHex = hex.EncodeToString(bytesBuffer.Bytes())

txId, err = cl.gbitcoin.SendRawTx(txHex)
if err != nil {
return "", "", err
return "", "", "", err
}
return txId, txHex, nil
return txId, txHex, address, nil
}

func (cl *ClightningClient) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex string, error error) {
func (cl *ClightningClient) CreateCoopSpendingTransaction(swapParams *swap.OpeningParams, claimParams *swap.ClaimParams, takerSigner swap.Signer) (txId, txHex, address string, error error) {
refundAddr, err := cl.NewAddress()
if err != nil {
return "", "", err
return "", "", "", err
}
refundFee, err := cl.GetRefundFee()
if err != nil {
return "", "", err
return "", "", "", err
}
_, vout, err := cl.bitcoinChain.GetVoutAndVerify(claimParams.OpeningTxHex, swapParams)
if err != nil {
return "", "", err
return "", "", "", err
}
spendingTx, sigHashBytes, redeemScript, err := cl.bitcoinChain.PrepareSpendingTransaction(swapParams, claimParams, refundAddr, vout, 0, refundFee)
if err != nil {
return "", "", err
return "", "", "", err
}

takerSig, err := takerSigner.Sign(sigHashBytes[:])
if err != nil {
return "", "", err
return "", "", "", err
}
makerSig, err := claimParams.Signer.Sign(sigHashBytes[:])
if err != nil {
return "", "", err
return "", "", "", err
}

spendingTx.TxIn[0].Witness = onchain.GetCooperativeWitness(takerSig.Serialize(), makerSig.Serialize(), redeemScript)
Expand All @@ -187,24 +187,20 @@ func (cl *ClightningClient) CreateCoopSpendingTransaction(swapParams *swap.Openi

err = spendingTx.Serialize(bytesBuffer)
if err != nil {
return "", "", err
return "", "", "", err
}

txHex = hex.EncodeToString(bytesBuffer.Bytes())

txId, err = cl.gbitcoin.SendRawTx(txHex)
if err != nil {
return "", "", err
return "", "", "", err
}
return spendingTx.TxHash().String(), txHex, nil
return spendingTx.TxHash().String(), txHex, address, 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) SetLabel(txID, address, label string) error {
return cl.gbitcoin.SetLabel(address, label)
}

func (cl *ClightningClient) NewAddress() (string, error) {
Expand Down
4 changes: 3 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ require (
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/net v0.0.0-20221004154528-8021a29435af // indirect
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0 // indirect
golang.org/x/sys v0.0.0-20221010160319-abe0a0adba9c // indirect
golang.org/x/sys v0.0.0-20221010160319-abe0a0adba9c
golang.org/x/term v0.0.0-20220919170432-7a66f970e087 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af // indirect
Expand All @@ -151,3 +151,5 @@ require (

// This fork contains some options we need to reconnect to lnd.
replace github.com/grpc-ecosystem/go-grpc-middleware => github.com/nepet/go-grpc-middleware v1.3.1-0.20220824133300-340e95267339

replace github.com/elementsproject/glightning => github.com/yusukeshimizu/glightning v0.0.0-20240213224601-57223c407dc9
8 changes: 2 additions & 6 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -186,12 +186,6 @@ github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dvyukov/go-fuzz v0.0.0-20220726122315-1d375ef9f9f6 h1:sE4tvxWw01v7K3MAHwKF2UF3xQbgy23PRURntuV1CkU=
github.com/dvyukov/go-fuzz v0.0.0-20220726122315-1d375ef9f9f6/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
github.com/elementsproject/glightning v0.0.0-20230508201707-c2410b204731 h1:OAY0lNrZiCO1lwlaGiVH4htwrih1AAxxpuWRA9qQYwI=
github.com/elementsproject/glightning v0.0.0-20230508201707-c2410b204731/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo=
github.com/elementsproject/glightning v0.0.0-20230525134205-ef34d849f564 h1:orSb6yU9D1Ow9epbRZJVAfGF6vC1HxaPqg9zLWga6Hw=
github.com/elementsproject/glightning v0.0.0-20230525134205-ef34d849f564/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo=
github.com/elementsproject/glightning v0.0.0-20231126051537-e32b4dae6cbb h1:ob08+u2vJvk9uFoPhwFe/DWom1pgUFLGh+VXUbfarWs=
github.com/elementsproject/glightning v0.0.0-20231126051537-e32b4dae6cbb/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
Expand Down Expand Up @@ -669,6 +663,8 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yusukeshimizu/glightning v0.0.0-20240213224601-57223c407dc9 h1:XGh5zUYKoofEQDs1IDtok4CDFuV4qBjD2+h1TXogwA0=
github.com/yusukeshimizu/glightning v0.0.0-20240213224601-57223c407dc9/go.mod h1:YAdIeSyx8VEhDCtEaGOJLmWNpPaQ3x4vYSAj9Vrppdo=
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
Expand Down
15 changes: 8 additions & 7 deletions lnd/lnd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@ import (
"encoding/base64"
"encoding/hex"
"fmt"
"io/ioutil"
"log"
"math/rand"
"path/filepath"
"strconv"
"testing"
"time"

"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/btcutil/psbt"
Expand All @@ -29,13 +37,6 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"gopkg.in/macaroon.v2"
"io/ioutil"
"log"
"math/rand"
"path/filepath"
"strconv"
"testing"
"time"
)

type Testthing struct {
Expand Down
Loading

0 comments on commit 6fd45cb

Please sign in to comment.