Skip to content

Commit 84ab56d

Browse files
committed
Require any Router also implements MessageRouter
ChannelManager is parameterized by a Router in order to find routes when sending and retrying payments. For the offers flow, it needs to be able to construct blinded paths (e.g., in the offer and in reply paths). Instead of adding yet another parameter to ChannelManager, require that any Router also implements MessageRouter. Implement this for DefaultRouter by delegating to a DefaultMessageRouter.
1 parent 692052e commit 84ab56d

File tree

4 files changed

+91
-10
lines changed

4 files changed

+91
-10
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use bitcoin::hashes::sha256::Hash as Sha256;
3030
use bitcoin::hashes::sha256d::Hash as Sha256dHash;
3131
use bitcoin::hash_types::{BlockHash, WPubkeyHash};
3232

33+
use lightning::blinded_path::BlindedPath;
3334
use lightning::chain;
3435
use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, chainmonitor, channelmonitor, Confirm, Watch};
3536
use lightning::chain::channelmonitor::{ChannelMonitor, MonitorEvent};
@@ -46,6 +47,7 @@ use lightning::ln::script::ShutdownScript;
4647
use lightning::ln::functional_test_utils::*;
4748
use lightning::offers::invoice::UnsignedBolt12Invoice;
4849
use lightning::offers::invoice_request::UnsignedInvoiceRequest;
50+
use lightning::onion_message::{Destination, MessageRouter, OnionMessagePath};
4951
use lightning::util::test_channel_signer::{TestChannelSigner, EnforcementState};
5052
use lightning::util::errors::APIError;
5153
use lightning::util::logger::Logger;
@@ -56,7 +58,7 @@ use lightning::routing::router::{InFlightHtlcs, Path, Route, RouteHop, RoutePara
5658
use crate::utils::test_logger::{self, Output};
5759
use crate::utils::test_persister::TestPersister;
5860

59-
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1};
61+
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1, self};
6062
use bitcoin::secp256k1::ecdh::SharedSecret;
6163
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
6264
use bitcoin::secp256k1::schnorr;
@@ -101,6 +103,23 @@ impl Router for FuzzRouter {
101103
}
102104
}
103105

106+
impl MessageRouter for FuzzRouter {
107+
fn find_path(
108+
&self, _sender: PublicKey, _peers: Vec<PublicKey>, _destination: Destination
109+
) -> Result<OnionMessagePath, ()> {
110+
unreachable!()
111+
}
112+
113+
fn create_blinded_paths<
114+
ES: EntropySource + ?Sized, T: secp256k1::Signing + secp256k1::Verification
115+
>(
116+
&self, _recipient: PublicKey, _peers: Vec<PublicKey>, _entropy_source: &ES,
117+
_secp_ctx: &Secp256k1<T>
118+
) -> Result<Vec<BlindedPath>, ()> {
119+
unreachable!()
120+
}
121+
}
122+
104123
pub struct TestBroadcaster {}
105124
impl BroadcasterInterface for TestBroadcaster {
106125
fn broadcast_transactions(&self, _txs: &[&Transaction]) { }

fuzz/src/full_stack.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use bitcoin::hashes::sha256::Hash as Sha256;
2828
use bitcoin::hashes::sha256d::Hash as Sha256dHash;
2929
use bitcoin::hash_types::{Txid, BlockHash, WPubkeyHash};
3030

31+
use lightning::blinded_path::BlindedPath;
3132
use lightning::chain;
3233
use lightning::chain::{BestBlock, ChannelMonitorUpdateStatus, Confirm, Listen};
3334
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
@@ -43,6 +44,7 @@ use lightning::ln::script::ShutdownScript;
4344
use lightning::ln::functional_test_utils::*;
4445
use lightning::offers::invoice::UnsignedBolt12Invoice;
4546
use lightning::offers::invoice_request::UnsignedInvoiceRequest;
47+
use lightning::onion_message::{Destination, MessageRouter, OnionMessagePath};
4648
use lightning::routing::gossip::{P2PGossipSync, NetworkGraph};
4749
use lightning::routing::utxo::UtxoLookup;
4850
use lightning::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteParameters, Router};
@@ -55,7 +57,7 @@ use lightning::util::ser::{ReadableArgs, Writeable};
5557
use crate::utils::test_logger;
5658
use crate::utils::test_persister::TestPersister;
5759

58-
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1};
60+
use bitcoin::secp256k1::{Message, PublicKey, SecretKey, Scalar, Secp256k1, self};
5961
use bitcoin::secp256k1::ecdh::SharedSecret;
6062
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
6163
use bitcoin::secp256k1::schnorr;
@@ -144,6 +146,23 @@ impl Router for FuzzRouter {
144146
}
145147
}
146148

149+
impl MessageRouter for FuzzRouter {
150+
fn find_path(
151+
&self, _sender: PublicKey, _peers: Vec<PublicKey>, _destination: Destination
152+
) -> Result<OnionMessagePath, ()> {
153+
unreachable!()
154+
}
155+
156+
fn create_blinded_paths<
157+
ES: EntropySource + ?Sized, T: secp256k1::Signing + secp256k1::Verification
158+
>(
159+
&self, _recipient: PublicKey, _peers: Vec<PublicKey>, _entropy_source: &ES,
160+
_secp_ctx: &Secp256k1<T>
161+
) -> Result<Vec<BlindedPath>, ()> {
162+
unreachable!()
163+
}
164+
}
165+
147166
struct TestBroadcaster {
148167
txn_broadcasted: Mutex<Vec<Transaction>>,
149168
}

lightning/src/routing/router.rs

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
//! The router finds paths within a [`NetworkGraph`] for a payment.
1111
12-
use bitcoin::secp256k1::PublicKey;
12+
use bitcoin::secp256k1::{PublicKey, Secp256k1, self};
1313
use bitcoin::hashes::Hash;
1414
use bitcoin::hashes::sha256::Hash as Sha256;
1515

@@ -19,8 +19,10 @@ use crate::ln::channelmanager::{ChannelDetails, PaymentId};
1919
use crate::ln::features::{Bolt11InvoiceFeatures, Bolt12InvoiceFeatures, ChannelFeatures, NodeFeatures};
2020
use crate::ln::msgs::{DecodeError, ErrorAction, LightningError, MAX_VALUE_MSAT};
2121
use crate::offers::invoice::{BlindedPayInfo, Bolt12Invoice};
22+
use crate::onion_message::{DefaultMessageRouter, Destination, MessageRouter, OnionMessagePath};
2223
use crate::routing::gossip::{DirectedChannelInfo, EffectiveCapacity, ReadOnlyNetworkGraph, NetworkGraph, NodeId, RoutingFees};
2324
use crate::routing::scoring::{ChannelUsage, LockableScore, ScoreLookUp};
25+
use crate::sign::EntropySource;
2426
use crate::util::ser::{Writeable, Readable, ReadableArgs, Writer};
2527
use crate::util::logger::{Level, Logger};
2628
use crate::util::chacha20::ChaCha20;
@@ -33,29 +35,31 @@ use core::{cmp, fmt};
3335
use core::ops::Deref;
3436

3537
/// 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
3739
L::Target: Logger,
3840
S::Target: for <'a> LockableScore<'a, ScoreLookUp = Sc>,
3941
{
4042
network_graph: G,
4143
logger: L,
4244
random_seed_bytes: Mutex<[u8; 32]>,
4345
scorer: S,
44-
score_params: SP
46+
score_params: SP,
47+
message_router: DefaultMessageRouter<G, L>,
4548
}
4649

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
4851
L::Target: Logger,
4952
S::Target: for <'a> LockableScore<'a, ScoreLookUp = Sc>,
5053
{
5154
/// Creates a new router.
5255
pub fn new(network_graph: G, logger: L, random_seed_bytes: [u8; 32], scorer: S, score_params: SP) -> Self {
5356
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 }
5559
}
5660
}
5761

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
5963
L::Target: Logger,
6064
S::Target: for <'a> LockableScore<'a, ScoreLookUp = Sc>,
6165
{
@@ -80,8 +84,28 @@ impl< G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref, SP: Sized, Sc: Sco
8084
}
8185
}
8286

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+
83107
/// A trait defining behavior for routing a payment.
84-
pub trait Router {
108+
pub trait Router: MessageRouter {
85109
/// Finds a [`Route`] for a payment between the given `payer` and a payee.
86110
///
87111
/// The `payee` and the payment's value are given in [`RouteParameters::payment_params`]

lightning/src/util/test_utils.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
// You may not use this file except in accordance with one or both of these
88
// licenses.
99

10+
use crate::blinded_path::BlindedPath;
1011
use crate::chain;
1112
use crate::chain::WatchedOutput;
1213
use crate::chain::chaininterface;
@@ -30,6 +31,7 @@ use crate::ln::msgs::LightningError;
3031
use crate::ln::script::ShutdownScript;
3132
use crate::offers::invoice::UnsignedBolt12Invoice;
3233
use crate::offers::invoice_request::UnsignedInvoiceRequest;
34+
use crate::onion_message::{Destination, MessageRouter, OnionMessagePath};
3335
use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId, RoutingFees};
3436
use crate::routing::utxo::{UtxoLookup, UtxoLookupError, UtxoResult};
3537
use crate::routing::router::{find_route, InFlightHtlcs, Path, Route, RouteParameters, RouteHintHop, Router, ScorerAccountingForInFlightHtlcs};
@@ -51,7 +53,7 @@ use bitcoin::network::constants::Network;
5153
use bitcoin::hash_types::{BlockHash, Txid};
5254
use bitcoin::sighash::{SighashCache, EcdsaSighashType};
5355

54-
use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey};
56+
use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey, self};
5557
use bitcoin::secp256k1::ecdh::SharedSecret;
5658
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
5759
use bitcoin::secp256k1::schnorr;
@@ -190,6 +192,23 @@ impl<'a> Router for TestRouter<'a> {
190192
}
191193
}
192194

195+
impl<'a> MessageRouter for TestRouter<'a> {
196+
fn find_path(
197+
&self, _sender: PublicKey, _peers: Vec<PublicKey>, _destination: Destination
198+
) -> Result<OnionMessagePath, ()> {
199+
unreachable!()
200+
}
201+
202+
fn create_blinded_paths<
203+
ES: EntropySource + ?Sized, T: secp256k1::Signing + secp256k1::Verification
204+
>(
205+
&self, _recipient: PublicKey, _peers: Vec<PublicKey>, _entropy_source: &ES,
206+
_secp_ctx: &Secp256k1<T>
207+
) -> Result<Vec<BlindedPath>, ()> {
208+
unreachable!()
209+
}
210+
}
211+
193212
impl<'a> Drop for TestRouter<'a> {
194213
fn drop(&mut self) {
195214
#[cfg(feature = "std")] {

0 commit comments

Comments
 (0)