From 6d8bc63ad6cc6235711bee739451898bb84686ab Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Wed, 4 Jun 2025 12:56:55 +0200 Subject: [PATCH] discovery+graph: get inbound fee directly from ChannelUpdate Remove the previously added TODOs which would extract InboundFee info from the ExtraOpaqueData of a ChannelUpdate at the time of ChannelEdgePolicy construction. These can now be replaced by using the newly added InboundFee record on the ChannelUpdate message. --- discovery/gossiper.go | 21 +-------------------- graph/builder.go | 18 +----------------- netann/channel_update.go | 10 +++++++++- 3 files changed, 11 insertions(+), 38 deletions(-) diff --git a/discovery/gossiper.go b/discovery/gossiper.go index d79fe7a74..d6855ae45 100644 --- a/discovery/gossiper.go +++ b/discovery/gossiper.go @@ -3257,29 +3257,10 @@ func (d *AuthenticatedGossiper) handleChanUpdate(ctx context.Context, MaxHTLC: upd.HtlcMaximumMsat, FeeBaseMSat: lnwire.MilliSatoshi(upd.BaseFee), FeeProportionalMillionths: lnwire.MilliSatoshi(upd.FeeRate), + InboundFee: upd.InboundFee.ValOpt(), ExtraOpaqueData: upd.ExtraOpaqueData, } - // Extract the inbound fee from the ExtraOpaqueData, if present. - // - // TODO(elle): this can be removed once we define the optional TLV - // field on the lnwire.ChannelUpdate itself. - var inboundFee lnwire.Fee - typeMap, err := upd.ExtraOpaqueData.ExtractRecords(&inboundFee) - if err != nil { - rErr := fmt.Errorf("%w: %w", graphdb.ErrParsingExtraTLVBytes, - err) - - log.Error(rErr) - nMsg.err <- rErr - return nil, false - } - - val, ok := typeMap[lnwire.FeeRecordType] - if ok && val == nil { - update.InboundFee = fn.Some(inboundFee) - } - if err := d.cfg.Graph.UpdateEdge(update, ops...); err != nil { if graph.IsError( err, graph.ErrOutdated, diff --git a/graph/builder.go b/graph/builder.go index 32aac9434..99fc73c17 100644 --- a/graph/builder.go +++ b/graph/builder.go @@ -11,7 +11,6 @@ import ( "github.com/go-errors/errors" "github.com/lightningnetwork/lnd/batch" "github.com/lightningnetwork/lnd/chainntnfs" - "github.com/lightningnetwork/lnd/fn/v2" graphdb "github.com/lightningnetwork/lnd/graph/db" "github.com/lightningnetwork/lnd/graph/db/models" "github.com/lightningnetwork/lnd/lnutils" @@ -955,25 +954,10 @@ func (b *Builder) ApplyChannelUpdate(msg *lnwire.ChannelUpdate1) bool { MaxHTLC: msg.HtlcMaximumMsat, FeeBaseMSat: lnwire.MilliSatoshi(msg.BaseFee), FeeProportionalMillionths: lnwire.MilliSatoshi(msg.FeeRate), + InboundFee: msg.InboundFee.ValOpt(), ExtraOpaqueData: msg.ExtraOpaqueData, } - // Extract the inbound fee from the ExtraOpaqueData, if present. - // - // TODO(elle): this can be removed once we define the optional TLV - // field on the lnwire.ChannelUpdate itself. - var inboundFee lnwire.Fee - typeMap, err := update.ExtraOpaqueData.ExtractRecords(&inboundFee) - if err != nil { - log.Errorf("%v: %v", graphdb.ErrParsingExtraTLVBytes, err) - return false - } - - val, ok := typeMap[lnwire.FeeRecordType] - if ok && val == nil { - update.InboundFee = fn.Some(inboundFee) - } - err = b.UpdateEdge(update) if err != nil && !IsError(err, ErrIgnored, ErrOutdated) { log.Errorf("Unable to apply channel update: %v", err) diff --git a/netann/channel_update.go b/netann/channel_update.go index efc5cf61e..1bb509b08 100644 --- a/netann/channel_update.go +++ b/netann/channel_update.go @@ -13,6 +13,7 @@ import ( "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/tlv" "github.com/pkg/errors" ) @@ -138,7 +139,7 @@ func ExtractChannelUpdate(ownerPubKey []byte, func UnsignedChannelUpdateFromEdge(info *models.ChannelEdgeInfo, policy *models.ChannelEdgePolicy) *lnwire.ChannelUpdate1 { - return &lnwire.ChannelUpdate1{ + update := &lnwire.ChannelUpdate1{ ChainHash: info.ChainHash, ShortChannelID: lnwire.NewShortChanIDFromInt(policy.ChannelID), Timestamp: uint32(policy.LastUpdate.Unix()), @@ -151,6 +152,13 @@ func UnsignedChannelUpdateFromEdge(info *models.ChannelEdgeInfo, FeeRate: uint32(policy.FeeProportionalMillionths), ExtraOpaqueData: policy.ExtraOpaqueData, } + policy.InboundFee.WhenSome(func(fee lnwire.Fee) { + update.InboundFee = tlv.SomeRecordT( + tlv.NewRecordT[tlv.TlvType55555, lnwire.Fee](fee), + ) + }) + + return update } // ChannelUpdateFromEdge reconstructs a signed ChannelUpdate from the given edge