9
9
10
10
//! The router finds paths within a [`NetworkGraph`] for a payment.
11
11
12
- use bitcoin:: secp256k1:: PublicKey ;
12
+ use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , self } ;
13
13
use bitcoin:: hashes:: Hash ;
14
14
use bitcoin:: hashes:: sha256:: Hash as Sha256 ;
15
15
@@ -19,8 +19,10 @@ use crate::ln::channelmanager::{ChannelDetails, PaymentId};
19
19
use crate :: ln:: features:: { Bolt11InvoiceFeatures , Bolt12InvoiceFeatures , ChannelFeatures , NodeFeatures } ;
20
20
use crate :: ln:: msgs:: { DecodeError , ErrorAction , LightningError , MAX_VALUE_MSAT } ;
21
21
use crate :: offers:: invoice:: { BlindedPayInfo , Bolt12Invoice } ;
22
+ use crate :: onion_message:: { DefaultMessageRouter , Destination , MessageRouter , OnionMessagePath } ;
22
23
use crate :: routing:: gossip:: { DirectedChannelInfo , EffectiveCapacity , ReadOnlyNetworkGraph , NetworkGraph , NodeId , RoutingFees } ;
23
24
use crate :: routing:: scoring:: { ChannelUsage , LockableScore , ScoreLookUp } ;
25
+ use crate :: sign:: EntropySource ;
24
26
use crate :: util:: ser:: { Writeable , Readable , ReadableArgs , Writer } ;
25
27
use crate :: util:: logger:: { Level , Logger } ;
26
28
use crate :: util:: chacha20:: ChaCha20 ;
@@ -33,29 +35,31 @@ use core::{cmp, fmt};
33
35
use core:: ops:: Deref ;
34
36
35
37
/// A [`Router`] implemented using [`find_route`].
36
- pub struct DefaultRouter < G : Deref < Target = NetworkGraph < L > > , L : Deref , S : Deref , SP : Sized , Sc : ScoreLookUp < ScoreParams = SP > > where
38
+ pub struct DefaultRouter < G : Deref < Target = NetworkGraph < L > > + Clone , L : Deref , S : Deref , SP : Sized , Sc : ScoreLookUp < ScoreParams = SP > > where
37
39
L :: Target : Logger ,
38
40
S :: Target : for < ' a > LockableScore < ' a , ScoreLookUp = Sc > ,
39
41
{
40
42
network_graph : G ,
41
43
logger : L ,
42
44
random_seed_bytes : Mutex < [ u8 ; 32 ] > ,
43
45
scorer : S ,
44
- score_params : SP
46
+ score_params : SP ,
47
+ message_router : DefaultMessageRouter < G , L > ,
45
48
}
46
49
47
- impl < G : Deref < Target = NetworkGraph < L > > , L : Deref , S : Deref , SP : Sized , Sc : ScoreLookUp < ScoreParams = SP > > DefaultRouter < G , L , S , SP , Sc > where
50
+ impl < G : Deref < Target = NetworkGraph < L > > + Clone , L : Deref , S : Deref , SP : Sized , Sc : ScoreLookUp < ScoreParams = SP > > DefaultRouter < G , L , S , SP , Sc > where
48
51
L :: Target : Logger ,
49
52
S :: Target : for < ' a > LockableScore < ' a , ScoreLookUp = Sc > ,
50
53
{
51
54
/// Creates a new router.
52
55
pub fn new ( network_graph : G , logger : L , random_seed_bytes : [ u8 ; 32 ] , scorer : S , score_params : SP ) -> Self {
53
56
let random_seed_bytes = Mutex :: new ( random_seed_bytes) ;
54
- Self { network_graph, logger, random_seed_bytes, scorer, score_params }
57
+ let message_router = DefaultMessageRouter :: new ( network_graph. clone ( ) ) ;
58
+ Self { network_graph, logger, random_seed_bytes, scorer, score_params, message_router }
55
59
}
56
60
}
57
61
58
- impl < G : Deref < Target = NetworkGraph < L > > , L : Deref , S : Deref , SP : Sized , Sc : ScoreLookUp < ScoreParams = SP > > Router for DefaultRouter < G , L , S , SP , Sc > where
62
+ impl < G : Deref < Target = NetworkGraph < L > > + Clone , L : Deref , S : Deref , SP : Sized , Sc : ScoreLookUp < ScoreParams = SP > > Router for DefaultRouter < G , L , S , SP , Sc > where
59
63
L :: Target : Logger ,
60
64
S :: Target : for < ' a > LockableScore < ' a , ScoreLookUp = Sc > ,
61
65
{
@@ -80,8 +84,28 @@ impl< G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref, SP: Sized, Sc: Sco
80
84
}
81
85
}
82
86
87
+ impl < G : Deref < Target = NetworkGraph < L > > + Clone , L : Deref , S : Deref , SP : Sized , Sc : ScoreLookUp < ScoreParams = SP > > MessageRouter for DefaultRouter < G , L , S , SP , Sc > where
88
+ L :: Target : Logger ,
89
+ S :: Target : for < ' a > LockableScore < ' a , ScoreLookUp = Sc > ,
90
+ {
91
+ fn find_path (
92
+ & self , sender : PublicKey , peers : Vec < PublicKey > , destination : Destination
93
+ ) -> Result < OnionMessagePath , ( ) > {
94
+ self . message_router . find_path ( sender, peers, destination)
95
+ }
96
+
97
+ fn create_blinded_paths <
98
+ ES : EntropySource + ?Sized , T : secp256k1:: Signing + secp256k1:: Verification
99
+ > (
100
+ & self , recipient : PublicKey , peers : Vec < PublicKey > , entropy_source : & ES ,
101
+ secp_ctx : & Secp256k1 < T >
102
+ ) -> Result < Vec < BlindedPath > , ( ) > {
103
+ self . message_router . create_blinded_paths ( recipient, peers, entropy_source, secp_ctx)
104
+ }
105
+ }
106
+
83
107
/// A trait defining behavior for routing a payment.
84
- pub trait Router {
108
+ pub trait Router : MessageRouter {
85
109
/// Finds a [`Route`] for a payment between the given `payer` and a payee.
86
110
///
87
111
/// The `payee` and the payment's value are given in [`RouteParameters::payment_params`]
0 commit comments