From ebb428b789ab804da7cb13e70d5f8273882ec2b9 Mon Sep 17 00:00:00 2001 From: MPins Date: Sat, 21 Sep 2024 01:04:00 -0300 Subject: [PATCH] lnd: add the option to set the incoming channel on blinded path This commit makes sure that when an incoming channel list is supplied for the blinded route, that it changes the other blinding restrictions accordingly. Moreover it introduces a sanity check when the number of paths for the blinded route is set to 0. --- rpcserver.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/rpcserver.go b/rpcserver.go index 7236a5dad..65c9a41c1 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -6055,6 +6055,7 @@ func (r *rpcServer) AddInvoice(ctx context.Context, NumHops: globalBlindCfg.NumHops, MaxNumPaths: globalBlindCfg.MaxNumPaths, NodeOmissionSet: fn.NewSet[route.Vertex](), + IncomingChainedChannels: make([]uint64, 0), } if blindCfg != nil && !blind { @@ -6074,6 +6075,10 @@ func (r *rpcServer) AddInvoice(ctx context.Context, blindingRestrictions.MaxNumPaths = uint8(*blindCfg.MaxNumPaths) } + if blindingRestrictions.MaxNumPaths == 0 { + return nil, fmt.Errorf("blinded max num paths cannot " + + "be 0") + } for _, nodeIDBytes := range blindCfg.NodeOmissionList { vertex, err := route.NewVertexFromBytes(nodeIDBytes) @@ -6083,6 +6088,38 @@ func (r *rpcServer) AddInvoice(ctx context.Context, blindingRestrictions.NodeOmissionSet.Add(vertex) } + + blindingRestrictions.IncomingChainedChannels = append( + blindingRestrictions.IncomingChainedChannels, + blindCfg.IncomingChannelList..., + ) + + numChainedChannels := + uint8(len(blindingRestrictions.IncomingChainedChannels)) + + // When selecting the blinded incoming channel list parameter + // the maximum number of hops is implictitly set. + if numChainedChannels > blindingRestrictions.NumHops { + rpcsLog.Warnf("Changing the num_blinded_hops "+ + "from (%d) to (%d)", + blindingRestrictions.NumHops, + numChainedChannels) + + blindingRestrictions.NumHops = + numChainedChannels + } + + // The MinDistanceFromIntroNode must be greater than or equal to + // the number of hops specified on the chained channels. + minNumHops := blindingRestrictions.MinDistanceFromIntroNode + if minNumHops < numChainedChannels { + return nil, fmt.Errorf("minimum number of blinded "+ + "path hops (%d) must be greater than or equal "+ + "to the number of hops specified on the "+ + "chained channels (%d)", minNumHops, + numChainedChannels) + } + } if blindingRestrictions.MinDistanceFromIntroNode >