Skip to content

Commit a4c06d3

Browse files
authored
Merge pull request #4539 from TheBlueMatt/2026-04-drop-native-dns
Drop `ChannelManager`-built-in BIP 353 resolution logic
2 parents 2adb690 + 884158d commit a4c06d3

5 files changed

Lines changed: 17 additions & 447 deletions

File tree

lightning-dns-resolver/src/lib.rs

Lines changed: 2 additions & 162 deletions
Original file line numberDiff line numberDiff line change
@@ -147,32 +147,21 @@ mod test {
147147
use super::*;
148148

149149
use bitcoin::secp256k1::{self, PublicKey, Secp256k1};
150-
use bitcoin::Block;
151150

152151
use lightning::blinded_path::message::{
153152
BlindedMessagePath, MessageContext, MessageForwardNode,
154153
};
155154
use lightning::blinded_path::NodeIdLookUp;
156-
use lightning::events::{Event, PaymentPurpose};
157-
use lightning::ln::channelmanager::{OptionalOfferPaymentParams, PaymentId};
158-
use lightning::ln::functional_test_utils::*;
159-
use lightning::ln::msgs::{
160-
BaseMessageHandler, ChannelMessageHandler, Init, OnionMessageHandler,
161-
};
162-
use lightning::offers::offer::Offer;
155+
use lightning::ln::channelmanager::PaymentId;
156+
use lightning::ln::msgs::{BaseMessageHandler, Init, OnionMessageHandler};
163157
use lightning::onion_message::dns_resolution::{HumanReadableName, OMNameResolver};
164158
use lightning::onion_message::messenger::{
165159
AOnionMessenger, Destination, MessageRouter, OnionMessagePath, OnionMessenger,
166160
};
167-
use lightning::routing::router::DEFAULT_PAYMENT_DUMMY_HOPS;
168161
use lightning::sign::{KeysManager, NodeSigner, ReceiveAuthKey, Recipient};
169162
use lightning::types::features::InitFeatures;
170-
use lightning::types::payment::PaymentHash;
171163
use lightning::util::logger::Logger;
172164

173-
use lightning::expect_payment_claimed;
174-
use lightning_types::string::UntrustedString;
175-
176165
use std::sync::Mutex;
177166
use std::time::{Duration, Instant, SystemTime};
178167

@@ -348,153 +337,4 @@ mod test {
348337
assert_eq!(resolution.1, payment_id);
349338
assert!(resolution.2[.."bitcoin:".len()].eq_ignore_ascii_case("bitcoin:"));
350339
}
351-
352-
async fn pay_offer_flow<'a, 'b, 'c>(
353-
nodes: &[Node<'a, 'b, 'c>], resolver_messenger: &impl AOnionMessenger,
354-
resolver_id: PublicKey, payer_id: PublicKey, payee_id: PublicKey, offer: Offer,
355-
name: HumanReadableName, payment_id: PaymentId, payer_note: Option<String>,
356-
resolvers: Vec<Destination>,
357-
) {
358-
// Override contents to offer provided
359-
let proof_override = &nodes[0].node.testing_dnssec_proof_offer_resolution_override;
360-
proof_override.lock().unwrap().insert(name.clone(), offer);
361-
let amt = 42_000;
362-
let mut opts = OptionalOfferPaymentParams::default();
363-
opts.payer_note = payer_note.clone();
364-
#[allow(deprecated)]
365-
nodes[0]
366-
.node
367-
.pay_for_offer_from_human_readable_name(name, amt, payment_id, opts, resolvers)
368-
.unwrap();
369-
370-
let query = nodes[0].onion_messenger.next_onion_message_for_peer(resolver_id).unwrap();
371-
resolver_messenger.get_om().handle_onion_message(payer_id, &query);
372-
373-
assert!(resolver_messenger.get_om().next_onion_message_for_peer(payer_id).is_none());
374-
let start = Instant::now();
375-
let response = loop {
376-
tokio::time::sleep(Duration::from_millis(10)).await;
377-
if let Some(msg) = resolver_messenger.get_om().next_onion_message_for_peer(payer_id) {
378-
break msg;
379-
}
380-
assert!(start.elapsed() < Duration::from_secs(10), "Resolution took too long");
381-
};
382-
383-
nodes[0].onion_messenger.handle_onion_message(resolver_id, &response);
384-
385-
let invreq = nodes[0].onion_messenger.next_onion_message_for_peer(payee_id).unwrap();
386-
nodes[1].onion_messenger.handle_onion_message(payer_id, &invreq);
387-
388-
let inv = nodes[1].onion_messenger.next_onion_message_for_peer(payer_id).unwrap();
389-
nodes[0].onion_messenger.handle_onion_message(payee_id, &inv);
390-
391-
check_added_monitors(&nodes[0], 1);
392-
let updates = get_htlc_update_msgs(&nodes[0], &payee_id);
393-
nodes[1].node.handle_update_add_htlc(payer_id, &updates.update_add_htlcs[0]);
394-
do_commitment_signed_dance(&nodes[1], &nodes[0], &updates.commitment_signed, false, false);
395-
396-
for _ in 0..DEFAULT_PAYMENT_DUMMY_HOPS {
397-
assert!(nodes[1].node.needs_pending_htlc_processing());
398-
nodes[1].node.process_pending_htlc_forwards();
399-
}
400-
401-
expect_and_process_pending_htlcs(&nodes[1], false);
402-
403-
let claimable_events = nodes[1].node.get_and_clear_pending_events();
404-
assert_eq!(claimable_events.len(), 1);
405-
let our_payment_preimage;
406-
if let Event::PaymentClaimable { purpose, amount_msat, .. } = &claimable_events[0] {
407-
assert_eq!(*amount_msat, amt);
408-
if let PaymentPurpose::Bolt12OfferPayment {
409-
payment_preimage, payment_context, ..
410-
} = purpose
411-
{
412-
our_payment_preimage = payment_preimage.unwrap();
413-
nodes[1].node.claim_funds(our_payment_preimage);
414-
let payment_hash: PaymentHash = our_payment_preimage.into();
415-
expect_payment_claimed!(nodes[1], payment_hash, amt);
416-
if let Some(note) = payer_note {
417-
assert_eq!(
418-
payment_context.invoice_request.payer_note_truncated,
419-
Some(UntrustedString(note.into()))
420-
);
421-
} else {
422-
assert_eq!(payment_context.invoice_request.payer_note_truncated, None);
423-
}
424-
} else {
425-
panic!();
426-
}
427-
} else {
428-
panic!();
429-
}
430-
431-
check_added_monitors(&nodes[1], 1);
432-
let mut updates = get_htlc_update_msgs(&nodes[1], &payer_id);
433-
nodes[0].node.handle_update_fulfill_htlc(payee_id, updates.update_fulfill_htlcs.remove(0));
434-
do_commitment_signed_dance(&nodes[0], &nodes[1], &updates.commitment_signed, false, false);
435-
436-
expect_payment_sent(&nodes[0], our_payment_preimage, None, true, true);
437-
}
438-
439-
#[tokio::test]
440-
async fn end_to_end_test() {
441-
let chanmon_cfgs = create_chanmon_cfgs(2);
442-
let node_cfgs = create_node_cfgs_with_node_id_message_router(2, &chanmon_cfgs);
443-
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
444-
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
445-
446-
create_announced_chan_between_nodes(&nodes, 0, 1);
447-
448-
// The DNSSEC validation will only work with the current time, so set the time on the
449-
// resolver.
450-
let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs();
451-
let block = Block {
452-
header: create_dummy_header(nodes[0].best_block_hash(), now as u32),
453-
txdata: Vec::new(),
454-
};
455-
connect_block(&nodes[0], &block);
456-
connect_block(&nodes[1], &block);
457-
458-
let payer_id = nodes[0].node.get_our_node_id();
459-
let payee_id = nodes[1].node.get_our_node_id();
460-
461-
let (resolver_messenger, resolver_id) = create_resolver();
462-
let init_msg = get_om_init();
463-
nodes[0].onion_messenger.peer_connected(resolver_id, &init_msg, true).unwrap();
464-
resolver_messenger.get_om().peer_connected(payer_id, &init_msg, false).unwrap();
465-
466-
let name = HumanReadableName::from_encoded("matt@mattcorallo.com").unwrap();
467-
468-
let bs_offer = nodes[1].node.create_offer_builder().unwrap().build().unwrap();
469-
let resolvers = vec![Destination::Node(resolver_id)];
470-
471-
pay_offer_flow(
472-
&nodes,
473-
&resolver_messenger,
474-
resolver_id,
475-
payer_id,
476-
payee_id,
477-
bs_offer.clone(),
478-
name.clone(),
479-
PaymentId([42; 32]),
480-
None,
481-
resolvers.clone(),
482-
)
483-
.await;
484-
485-
// Pay offer with payer_note
486-
pay_offer_flow(
487-
&nodes,
488-
&resolver_messenger,
489-
resolver_id,
490-
payer_id,
491-
payee_id,
492-
bs_offer,
493-
name,
494-
PaymentId([21; 32]),
495-
Some("foo".into()),
496-
resolvers,
497-
)
498-
.await;
499-
}
500340
}

0 commit comments

Comments
 (0)