X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=fuzz%2Fsrc%2Frouter.rs;h=c9ceea3d0b3d196169d47a996f4e4a47237098aa;hb=281a0aead744351c43fce660cf78f955fc969bfb;hp=abc6572d85ecc13bd39364d095025bf2736cd70d;hpb=9bf4b6ed90762b5d15549178be3e6707fcd6b86c;p=rust-lightning diff --git a/fuzz/src/router.rs b/fuzz/src/router.rs index abc6572d..c9ceea3d 100644 --- a/fuzz/src/router.rs +++ b/fuzz/src/router.rs @@ -7,13 +7,17 @@ // You may not use this file except in accordance with one or both of these // licenses. +use bitcoin::blockdata::constants::ChainHash; use bitcoin::blockdata::script::Builder; use bitcoin::blockdata::transaction::TxOut; -use bitcoin::hash_types::BlockHash; +use lightning::blinded_path::{BlindedHop, BlindedPath}; use lightning::chain::transaction::OutPoint; +use lightning::ln::ChannelId; use lightning::ln::channelmanager::{self, ChannelDetails, ChannelCounterparty}; +use lightning::ln::features::{BlindedHopFeatures, Bolt12InvoiceFeatures}; use lightning::ln::msgs; +use lightning::offers::invoice::BlindedPayInfo; use lightning::routing::gossip::{NetworkGraph, RoutingFees}; use lightning::routing::utxo::{UtxoFuture, UtxoLookup, UtxoLookupError, UtxoResult}; use lightning::routing::router::{find_route, PaymentParameters, RouteHint, RouteHintHop, RouteParameters}; @@ -85,7 +89,7 @@ struct FuzzChainSource<'a, 'b, Out: test_logger::Output> { net_graph: &'a NetworkGraph<&'b test_logger::TestLogger>, } impl UtxoLookup for FuzzChainSource<'_, '_, Out> { - fn get_utxo(&self, _genesis_hash: &BlockHash, _short_channel_id: u64) -> UtxoResult { + fn get_utxo(&self, _chain_hash: &ChainHash, _short_channel_id: u64) -> UtxoResult { let input_slice = self.input.get_slice(2); if input_slice.is_none() { return UtxoResult::Sync(Err(UtxoLookupError::UnknownTx)); } let input_slice = input_slice.unwrap(); @@ -207,7 +211,7 @@ pub fn do_test(data: &[u8], out: Out) { let rnid = node_pks.iter().skip(u16::from_be_bytes(get_slice!(2).try_into().unwrap()) as usize % node_pks.len()).next().unwrap(); let capacity = u64::from_be_bytes(get_slice!(8).try_into().unwrap()); $first_hops_vec.push(ChannelDetails { - channel_id: [0; 32], + channel_id: ChannelId::new_zero(), counterparty: ChannelCounterparty { node_id: *rnid, features: channelmanager::provided_init_features(&UserConfig::default()), @@ -315,7 +319,7 @@ pub fn do_test(data: &[u8], out: Out) { net_graph.channel_failed_permanent(short_channel_id); }, _ if node_pks.is_empty() => {}, - _ => { + x if x < 250 => { let mut first_hops_vec = Vec::new(); // Use macros here and in the blinded match arm to ensure values are fetched from the fuzz // input in the same order, for better coverage. @@ -323,13 +327,50 @@ pub fn do_test(data: &[u8], out: Out) { let mut last_hops = Vec::new(); last_hops!(last_hops); find_routes!(first_hops, node_pks.iter(), |final_amt, final_delta, target: &PublicKey| { - RouteParameters { - payment_params: PaymentParameters::from_node_id(*target, final_delta) + RouteParameters::from_payment_params_and_value( + PaymentParameters::from_node_id(*target, final_delta) .with_route_hints(last_hops.clone()).unwrap(), - final_value_msat: final_amt, - } + final_amt) }); }, + x => { + let mut first_hops_vec = Vec::new(); + let first_hops = first_hops!(first_hops_vec); + let mut last_hops_unblinded = Vec::new(); + last_hops!(last_hops_unblinded); + let dummy_pk = PublicKey::from_slice(&[2; 33]).unwrap(); + let last_hops: Vec<(BlindedPayInfo, BlindedPath)> = last_hops_unblinded.into_iter().map(|hint| { + let hop = &hint.0[0]; + let payinfo = BlindedPayInfo { + fee_base_msat: hop.fees.base_msat, + fee_proportional_millionths: hop.fees.proportional_millionths, + htlc_minimum_msat: hop.htlc_minimum_msat.unwrap(), + htlc_maximum_msat: hop.htlc_minimum_msat.unwrap().saturating_mul(100), + cltv_expiry_delta: hop.cltv_expiry_delta, + features: BlindedHopFeatures::empty(), + }; + let num_blinded_hops = x % 250; + let mut blinded_hops = Vec::new(); + for _ in 0..num_blinded_hops { + blinded_hops.push(BlindedHop { + blinded_node_id: dummy_pk, + encrypted_payload: Vec::new() + }); + } + (payinfo, BlindedPath { + introduction_node_id: hop.src_node_id, + blinding_point: dummy_pk, + blinded_hops, + }) + }).collect(); + let mut features = Bolt12InvoiceFeatures::empty(); + features.set_basic_mpp_optional(); + find_routes!(first_hops, vec![dummy_pk].iter(), |final_amt, _, _| { + RouteParameters::from_payment_params_and_value(PaymentParameters::blinded(last_hops.clone()) + .with_bolt12_features(features.clone()).unwrap(), + final_amt) + }); + } } } }