From f868bc128b412876b08880b716c5ffb2be69d4de Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Wed, 18 Dec 2019 23:56:59 -0800 Subject: [PATCH] rpcserver+routerrpc: thread features + payment addr to SendPayment --- lnrpc/routerrpc/router_backend.go | 2 ++ routing/payment_session.go | 9 ++++++--- routing/router.go | 13 +++++++++++++ rpcserver.go | 6 ++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 7722a3c8..383180a3 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -602,6 +602,8 @@ func (r *RouterBackend) extractIntentFromSendRequest( payIntent.RouteHints = append( payIntent.RouteHints, payReq.RouteHints..., ) + payIntent.DestFeatures = payReq.Features + payIntent.PaymentAddr = payReq.PaymentAddr } else { // Otherwise, If the payment request field was not specified // (and a custom route wasn't specified), construct the payment diff --git a/routing/payment_session.go b/routing/payment_session.go index d8e765f1..e5474ddf 100644 --- a/routing/payment_session.go +++ b/routing/payment_session.go @@ -98,6 +98,8 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment, LastHop: payment.LastHop, CltvLimit: cltvLimit, DestCustomRecords: payment.DestCustomRecords, + DestFeatures: payment.DestFeatures, + PaymentAddr: payment.PaymentAddr, } // We'll also obtain a set of bandwidthHints from the lower layer for @@ -131,9 +133,10 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment, route, err := newRoute( sourceVertex, path, height, finalHopParams{ - amt: payment.Amount, - cltvDelta: finalCltvDelta, - records: payment.DestCustomRecords, + amt: payment.Amount, + cltvDelta: finalCltvDelta, + records: payment.DestCustomRecords, + paymentAddr: payment.PaymentAddr, }, ) if err != nil { diff --git a/routing/router.go b/routing/router.go index e8b42173..ef38788d 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1601,6 +1601,19 @@ type LightningPayment struct { // is reached. If nil, any node may be used. LastHop *route.Vertex + // DestFeatures specifies the set of features we assume the final node + // has for pathfinding. Typically these will be taken directly from an + // invoice, but they can also be manually supplied or assumed by the + // sender. If a nil feature vector is provided, the router will try to + // fallback to the graph in order to load a feature vector for a node in + // the public graph. + DestFeatures *lnwire.FeatureVector + + // PaymentAddr is the payment address specified by the receiver. This + // field should be a random 32-byte nonce presented in the receiver's + // invoice to prevent probing of the destination. + PaymentAddr *[32]byte + // PaymentRequest is an optional payment request that this payment is // attempting to complete. PaymentRequest []byte diff --git a/rpcserver.go b/rpcserver.go index b016ca98..1e5e71b1 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -3241,6 +3241,8 @@ type rpcPaymentIntent struct { routeHints [][]zpay32.HopHint outgoingChannelID *uint64 lastHop *route.Vertex + destFeatures *lnwire.FeatureVector + paymentAddr *[32]byte payReq []byte destCustomRecords record.CustomSet @@ -3370,6 +3372,8 @@ func (r *rpcServer) extractPaymentIntent(rpcPayReq *rpcPaymentRequest) (rpcPayme payIntent.cltvDelta = uint16(payReq.MinFinalCLTVExpiry()) payIntent.routeHints = payReq.RouteHints payIntent.payReq = []byte(rpcPayReq.PaymentRequest) + payIntent.destFeatures = payReq.Features + payIntent.paymentAddr = payReq.PaymentAddr if err := validateDest(payIntent.dest); err != nil { return payIntent, err @@ -3492,6 +3496,8 @@ func (r *rpcServer) dispatchPaymentIntent( PaymentRequest: payIntent.payReq, PayAttemptTimeout: routing.DefaultPayAttemptTimeout, DestCustomRecords: payIntent.destCustomRecords, + DestFeatures: payIntent.destFeatures, + PaymentAddr: payIntent.paymentAddr, } preImage, route, routerErr = r.server.chanRouter.SendPayment(