Skip to content

Commit bd6e599

Browse files
committed
f: adjust create_payment_onion for simplified path calculation
1 parent 0898f0d commit bd6e599

File tree

2 files changed

+16
-48
lines changed

2 files changed

+16
-48
lines changed

lightning/src/ln/blinded_payment_tests.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -1674,7 +1674,7 @@ fn test_combined_trampoline_onion_creation_vectors() {
16741674
node_features: NodeFeatures::empty(),
16751675
short_channel_id: 0,
16761676
channel_features: ChannelFeatures::empty(),
1677-
fee_msat: 0,
1677+
fee_msat: 3_000,
16781678
cltv_expiry_delta: 0,
16791679
maybe_announced_channel: false,
16801680
},
@@ -1686,7 +1686,7 @@ fn test_combined_trampoline_onion_creation_vectors() {
16861686
short_channel_id: (572330 << 40) + (42 << 16) + 2821,
16871687
channel_features: ChannelFeatures::empty(),
16881688
fee_msat: 150_153_000,
1689-
cltv_expiry_delta: 24,
1689+
cltv_expiry_delta: 0,
16901690
maybe_announced_channel: false,
16911691
},
16921692
],
@@ -1695,8 +1695,8 @@ fn test_combined_trampoline_onion_creation_vectors() {
16951695
TrampolineHop {
16961696
pubkey: pubkey_from_hex("027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007"),
16971697
node_features: Features::empty(),
1698-
fee_msat: 0,
1699-
cltv_expiry_delta: 0,
1698+
fee_msat: 2_500,
1699+
cltv_expiry_delta: 24,
17001700
},
17011701
// Dave's pubkey (the intro node needs to be duplicated)
17021702
TrampolineHop {
@@ -1734,10 +1734,10 @@ fn test_combined_trampoline_onion_creation_vectors() {
17341734
let amt_msat = 150_000_000;
17351735
let cur_height = 800_000;
17361736
let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
1737-
let (bob_onion, htlc_msat, htlc_cltv) = onion_utils::create_payment_onion_internal(&secp_ctx, &path, &session_priv, amt_msat, &recipient_onion_fields, cur_height, &associated_data, &None, None, [0; 32], Some(payment_secret), Some(outer_session_key), Some(outer_onion_prng_seed)).unwrap();
1737+
let (bob_onion, htlc_msat, htlc_cltv) = onion_utils::create_payment_onion_internal(&secp_ctx, &path, &session_priv, amt_msat, &recipient_onion_fields, cur_height, &associated_data, &None, None, [0; 32], Some(outer_session_key), Some(outer_onion_prng_seed)).unwrap();
17381738

17391739
let outer_onion_packet_hex = bob_onion.encode().to_lower_hex_string();
17401740
assert_eq!(outer_onion_packet_hex, "00025fd60556c134ae97e4baedba220a644037754ee67c54fd05e93bf40c17cbb73362fb9dee96001ff229945595b6edb59437a6bc143406d3f90f749892a84d8d430c6890437d26d5bfc599d565316ef51347521075bbab87c59c57bcf20af7e63d7192b46cf171e4f73cb11f9f603915389105d91ad630224bea95d735e3988add1e24b5bf28f1d7128db64284d90a839ba340d088c74b1fb1bd21136b1809428ec5399c8649e9bdf92d2dcfc694deae5046fa5b2bdf646847aaad73f5e95275763091c90e71031cae1f9a770fdea559642c9c02f424a2a28163dd0957e3874bd28a97bec67d18c0321b0e68bc804aa8345b17cb626e2348ca06c8312a167c989521056b0f25c55559d446507d6c491d50605cb79fa87929ce64b0a9860926eeaec2c431d926a1cadb9a1186e4061cb01671a122fc1f57602cbef06d6c194ec4b715c2e3dd4120baca3172cd81900b49fef857fb6d6afd24c983b608108b0a5ac0c1c6c52011f23b8778059ffadd1bb7cd06e2525417365f485a7fd1d4a9ba3818ede7cdc9e71afee8532252d08e2531ca52538655b7e8d912f7ec6d37bbcce8d7ec690709dbf9321e92c565b78e7fe2c22edf23e0902153d1ca15a112ad32fb19695ec65ce11ddf670da7915f05ad4b86c154fb908cb567315d1124f303f75fa075ebde8ef7bb12e27737ad9e4924439097338ea6d7a6fc3721b88c9b830a34e8d55f4c582b74a3895cc848fe57f4fe29f115dabeb6b3175be15d94408ed6771109cfaf57067ae658201082eae7605d26b1449af4425ae8e8f58cdda5c6265f1fd7a386fc6cea3074e4f25b909b96175883676f7610a00fdf34df9eb6c7b9a4ae89b839c69fd1f285e38cdceb634d782cc6d81179759bc9fd47d7fd060470d0b048287764c6837963274e708314f017ac7dc26d0554d59bfcfd3136225798f65f0b0fea337c6b256ebbb63a90b994c0ab93fd8b1d6bd4c74aebe535d6110014cd3d525394027dfe8faa98b4e9b2bee7949eb1961f1b026791092f84deea63afab66603dbe9b6365a102a1fef2f6b9744bc1bb091a8da9130d34d4d39f25dbad191649cfb67e10246364b7ce0c6ec072f9690cabb459d9fda0c849e17535de4357e9907270c75953fca3c845bb613926ecf73205219c7057a4b6bb244c184362bb4e2f24279dc4e60b94a5b1ec11c34081a628428ba5646c995b9558821053ba9c84a05afbf00dabd60223723096516d2f5668f3ec7e11612b01eb7a3a0506189a2272b88e89807943adb34291a17f6cb5516ffd6f945a1c42a524b21f096d66f350b1dad4db455741ae3d0e023309fbda5ef55fb0dc74f3297041448b2be76c525141963934c6afc53d263fb7836626df502d7c2ee9e79cbbd87afd84bbb8dfbf45248af3cd61ad5fac827e7683ca4f91dfad507a8eb9c17b2c9ac5ec051fe645a4a6cb37136f6f19b611e0ea8da7960af2d779507e55f57305bc74b7568928c5dd5132990fe54c22117df91c257d8c7b61935a018a28c1c3b17bab8e4294fa699161ec21123c9fc4e71079df31f300c2822e1246561e04765d3aab333eafd026c7431ac7616debb0e022746f4538e1c6348b600c988eeb2d051fc60c468dca260a84c79ab3ab8342dc345a764672848ea234e17332bc124799daf7c5fcb2e2358514a7461357e1c19c802c5ee32deccf1776885dd825bedd5f781d459984370a6b7ae885d4483a76ddb19b30f47ed47cd56aa5a079a89793dbcad461c59f2e002067ac98dd5a534e525c9c46c2af730741bf1f8629357ec0bfc0bc9ecb31af96777e507648ff4260dc3673716e098d9111dfd245f1d7c55a6de340deb8bd7a053e5d62d760f184dc70ca8fa255b9023b9b9aedfb6e419a5b5951ba0f83b603793830ee68d442d7b88ee1bbf6bbd1bcd6f68cc1af");
1741-
assert_eq!(htlc_msat, 150_153_000);
1741+
assert_eq!(htlc_msat, 150_156_000);
17421742
assert_eq!(htlc_cltv, 800_060);
17431743
}

lightning/src/ln/onion_utils.rs

+10-42
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::routing::gossip::NetworkUpdate;
1818
use crate::routing::router::{BlindedTail, Path, RouteHop, RouteParameters, TrampolineHop};
1919
use crate::sign::NodeSigner;
2020
use crate::types::features::{ChannelFeatures, NodeFeatures};
21-
use crate::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
21+
use crate::types::payment::{PaymentHash, PaymentPreimage};
2222
use crate::util::errors::{self, APIError};
2323
use crate::util::logger::Logger;
2424
use crate::util::ser::{LengthCalculatingWriter, Readable, ReadableArgs, Writeable, Writer};
@@ -1478,7 +1478,6 @@ pub fn create_payment_onion<T: secp256k1::Signing>(
14781478
prng_seed,
14791479
None,
14801480
None,
1481-
None,
14821481
)
14831482
}
14841483

@@ -1488,8 +1487,8 @@ pub(crate) fn create_payment_onion_internal<T: secp256k1::Signing>(
14881487
secp_ctx: &Secp256k1<T>, path: &Path, session_priv: &SecretKey, total_msat: u64,
14891488
recipient_onion: &RecipientOnionFields, cur_block_height: u32, payment_hash: &PaymentHash,
14901489
keysend_preimage: &Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>,
1491-
prng_seed: [u8; 32], secondary_payment_secret: Option<PaymentSecret>,
1492-
secondary_session_priv: Option<SecretKey>, secondary_prng_seed: Option<[u8; 32]>,
1490+
prng_seed: [u8; 32], secondary_session_priv: Option<SecretKey>,
1491+
secondary_prng_seed: Option<[u8; 32]>,
14931492
) -> Result<(msgs::OnionPacket, u64, u32), APIError> {
14941493
let mut outer_total_msat = total_msat;
14951494
let mut outer_starting_htlc_offset = cur_block_height;
@@ -1525,54 +1524,23 @@ pub(crate) fn create_payment_onion_internal<T: secp256k1::Signing>(
15251524
})?;
15261525

15271526
trampoline_packet_option = Some(trampoline_packet);
1527+
1528+
outer_session_priv_override = Some(secondary_session_priv.unwrap_or_else(|| {
1529+
let session_priv_hash = Sha256::hash(&session_priv.secret_bytes()).to_byte_array();
1530+
SecretKey::from_slice(&session_priv_hash[..]).expect("You broke SHA-256!")
1531+
}));
15281532
}
15291533

1530-
let (mut onion_payloads, htlc_msat, htlc_cltv) = build_onion_payloads(
1534+
let (onion_payloads, htlc_msat, htlc_cltv) = build_onion_payloads(
15311535
&path,
15321536
outer_total_msat,
15331537
recipient_onion,
15341538
outer_starting_htlc_offset,
15351539
keysend_preimage,
15361540
invoice_request,
1541+
trampoline_packet_option,
15371542
)?;
15381543

1539-
if !path.trampoline_hops.is_empty() {
1540-
let last_payload = onion_payloads.pop().ok_or(APIError::InvalidRoute {
1541-
err: "Non-Trampoline path needs at least one hop".to_owned(),
1542-
})?;
1543-
1544-
match last_payload {
1545-
OutboundOnionPayload::Receive { payment_data, .. } => {
1546-
let fee_delta = path.hops.last().map_or(0, |h| h.fee_msat);
1547-
let cltv_delta = path.hops.last().map_or(0, |h| h.cltv_expiry_delta);
1548-
let multipath_trampoline_data = payment_data.map(|d| {
1549-
let trampoline_payment_secret = secondary_payment_secret.unwrap_or_else(|| {
1550-
PaymentSecret(Sha256::hash(&d.payment_secret.0).to_byte_array())
1551-
});
1552-
let total_msat = fee_delta;
1553-
FinalOnionHopData { payment_secret: trampoline_payment_secret, total_msat }
1554-
});
1555-
onion_payloads.push(OutboundOnionPayload::TrampolineEntrypoint {
1556-
amt_to_forward: fee_delta,
1557-
outgoing_cltv_value: outer_starting_htlc_offset + cltv_delta,
1558-
multipath_trampoline_data,
1559-
trampoline_packet: trampoline_packet_option.unwrap(),
1560-
});
1561-
},
1562-
_ => {
1563-
return Err(APIError::InvalidRoute {
1564-
err: "Last non-Trampoline hop must be of type OutboundOnionPayload::Receive"
1565-
.to_owned(),
1566-
});
1567-
},
1568-
};
1569-
1570-
outer_session_priv_override = Some(secondary_session_priv.unwrap_or_else(|| {
1571-
let session_priv_hash = Sha256::hash(&session_priv.secret_bytes()).to_byte_array();
1572-
SecretKey::from_slice(&session_priv_hash[..]).expect("You broke SHA-256!")
1573-
}));
1574-
}
1575-
15761544
let outer_session_priv = outer_session_priv_override.as_ref().unwrap_or(session_priv);
15771545
let onion_keys = construct_onion_keys(&secp_ctx, &path, outer_session_priv).map_err(|_| {
15781546
APIError::InvalidRoute { err: "Pubkey along hop was maliciously selected".to_owned() }

0 commit comments

Comments
 (0)