Skip to content

Commit f159304

Browse files
committed
Use FundingTxInput in InteractiveTxConstructorArgs
InteractiveTxConstructor::new converts inputs given in channel.rs to InputOwned. Instead of converting FundingTxInput in channel.rs to the type needed by that constructor, pass in FundingTxInput and have it converted directly to InputOwned there. This saves one conversion and Vec allocation. It also lets us use the satisfaction_weight in an upcoming refactor.
1 parent 3564646 commit f159304

File tree

3 files changed

+41
-84
lines changed

3 files changed

+41
-84
lines changed

lightning/src/ln/channel.rs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6617,14 +6617,6 @@ impl FundingNegotiationContext {
66176617
}
66186618
}
66196619

6620-
let funding_inputs = self
6621-
.our_funding_inputs
6622-
.into_iter()
6623-
.map(|FundingTxInput { utxo, sequence, prevtx }| {
6624-
(TxIn { previous_output: utxo.outpoint, sequence, ..Default::default() }, prevtx)
6625-
})
6626-
.collect();
6627-
66286620
let constructor_args = InteractiveTxConstructorArgs {
66296621
entropy_source,
66306622
holder_node_id,
@@ -6633,7 +6625,7 @@ impl FundingNegotiationContext {
66336625
feerate_sat_per_kw: self.funding_feerate_sat_per_1000_weight,
66346626
is_initiator: self.is_initiator,
66356627
funding_tx_locktime: self.funding_tx_locktime,
6636-
inputs_to_contribute: funding_inputs,
6628+
inputs_to_contribute: self.our_funding_inputs,
66376629
shared_funding_input: self.shared_funding_input,
66386630
shared_funding_output: SharedOwnedOutput::new(
66396631
shared_funding_output,
@@ -13669,12 +13661,6 @@ where
1366913661
value: Amount::from_sat(funding.get_value_satoshis()),
1367013662
script_pubkey: funding.get_funding_redeemscript().to_p2wsh(),
1367113663
};
13672-
let inputs_to_contribute = our_funding_inputs
13673-
.into_iter()
13674-
.map(|FundingTxInput { utxo, sequence, prevtx }| {
13675-
(TxIn { previous_output: utxo.outpoint, sequence, ..Default::default() }, prevtx)
13676-
})
13677-
.collect();
1367813664

1367913665
let interactive_tx_constructor = Some(InteractiveTxConstructor::new(
1368013666
InteractiveTxConstructorArgs {
@@ -13685,7 +13671,7 @@ where
1368513671
feerate_sat_per_kw: funding_negotiation_context.funding_feerate_sat_per_1000_weight,
1368613672
funding_tx_locktime: funding_negotiation_context.funding_tx_locktime,
1368713673
is_initiator: false,
13688-
inputs_to_contribute,
13674+
inputs_to_contribute: our_funding_inputs,
1368913675
shared_funding_input: None,
1369013676
shared_funding_output: SharedOwnedOutput::new(shared_funding_output, our_funding_contribution_sats),
1369113677
outputs_to_contribute: funding_negotiation_context.our_funding_outputs.clone(),

lightning/src/ln/funding.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ impl FundingTxInput {
198198
FundingTxInput::new(prevtx, vout, witness_weight, Script::is_p2tr)
199199
}
200200

201+
#[cfg(test)]
202+
pub(crate) fn new_p2pkh(prevtx: Transaction, vout: u32) -> Result<Self, ()> {
203+
FundingTxInput::new(prevtx, vout, Weight::ZERO, Script::is_p2pkh)
204+
}
205+
201206
/// The sequence number to use in the [`TxIn`].
202207
///
203208
/// [`TxIn`]: bitcoin::TxIn

lightning/src/ln/interactivetxs.rs

Lines changed: 34 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,7 +1920,7 @@ where
19201920
pub feerate_sat_per_kw: u32,
19211921
pub is_initiator: bool,
19221922
pub funding_tx_locktime: AbsoluteLockTime,
1923-
pub inputs_to_contribute: Vec<(TxIn, Transaction)>,
1923+
pub inputs_to_contribute: Vec<FundingTxInput>,
19241924
pub shared_funding_input: Option<SharedOwnedInput>,
19251925
pub shared_funding_output: SharedOwnedOutput,
19261926
pub outputs_to_contribute: Vec<TxOut>,
@@ -1959,21 +1959,14 @@ impl InteractiveTxConstructor {
19591959
shared_funding_output.clone(),
19601960
);
19611961

1962-
// Check for the existence of prevouts'
1963-
for (txin, tx) in inputs_to_contribute.iter() {
1964-
let vout = txin.previous_output.vout as usize;
1965-
if tx.output.get(vout).is_none() {
1966-
return Err(AbortReason::PrevTxOutInvalid);
1967-
}
1968-
}
19691962
let mut inputs_to_contribute: Vec<(SerialId, InputOwned)> = inputs_to_contribute
19701963
.into_iter()
1971-
.map(|(txin, tx)| {
1964+
.map(|FundingTxInput { utxo, sequence, prevtx: prev_tx }| {
19721965
let serial_id = generate_holder_serial_id(entropy_source, is_initiator);
1973-
let vout = txin.previous_output.vout as usize;
1974-
let prev_output = tx.output.get(vout).unwrap().clone(); // checked above
1966+
let txin = TxIn { previous_output: utxo.outpoint, sequence, ..Default::default() };
1967+
let prev_output = utxo.output;
19751968
let input =
1976-
InputOwned::Single(SingleOwnedInput { input: txin, prev_tx: tx, prev_output });
1969+
InputOwned::Single(SingleOwnedInput { input: txin, prev_tx, prev_output });
19771970
(serial_id, input)
19781971
})
19791972
.collect();
@@ -2283,12 +2276,12 @@ mod tests {
22832276

22842277
struct TestSession {
22852278
description: &'static str,
2286-
inputs_a: Vec<(TxIn, Transaction)>,
2279+
inputs_a: Vec<FundingTxInput>,
22872280
a_shared_input: Option<(OutPoint, TxOut, u64)>,
22882281
/// The funding output, with the value contributed
22892282
shared_output_a: (TxOut, u64),
22902283
outputs_a: Vec<TxOut>,
2291-
inputs_b: Vec<(TxIn, Transaction)>,
2284+
inputs_b: Vec<FundingTxInput>,
22922285
b_shared_input: Option<(OutPoint, TxOut, u64)>,
22932286
/// The funding output, with the value contributed
22942287
shared_output_b: (TxOut, u64),
@@ -2558,20 +2551,18 @@ mod tests {
25582551
}
25592552
}
25602553

2561-
fn generate_inputs(outputs: &[TestOutput]) -> Vec<(TxIn, Transaction)> {
2554+
fn generate_inputs(outputs: &[TestOutput]) -> Vec<FundingTxInput> {
25622555
let tx = generate_tx(outputs);
2563-
let txid = tx.compute_txid();
2564-
tx.output
2556+
outputs
25652557
.iter()
25662558
.enumerate()
2567-
.map(|(idx, _)| {
2568-
let txin = TxIn {
2569-
previous_output: OutPoint { txid, vout: idx as u32 },
2570-
script_sig: Default::default(),
2571-
sequence: Sequence::ENABLE_RBF_NO_LOCKTIME,
2572-
witness: Default::default(),
2573-
};
2574-
(txin, tx.clone())
2559+
.map(|(idx, output)| {
2560+
match output {
2561+
TestOutput::P2WPKH(_) => FundingTxInput::new_p2wpkh(tx.clone(), idx as u32).unwrap(),
2562+
TestOutput::P2WSH(_) => FundingTxInput::new_p2wsh(tx.clone(), idx as u32, Weight::from_wu(42)).unwrap(),
2563+
TestOutput::P2TR(_) => FundingTxInput::new_p2tr_key_spend(tx.clone(), idx as u32).unwrap(),
2564+
TestOutput::P2PKH(_) => FundingTxInput::new_p2pkh(tx.clone(), idx as u32).unwrap(),
2565+
}
25752566
})
25762567
.collect()
25772568
}
@@ -2619,37 +2610,26 @@ mod tests {
26192610
(generate_txout(&TestOutput::P2WSH(value)), local_value)
26202611
}
26212612

2622-
fn generate_fixed_number_of_inputs(count: u16) -> Vec<(TxIn, Transaction)> {
2613+
fn generate_fixed_number_of_inputs(count: u16) -> Vec<FundingTxInput> {
26232614
// Generate transactions with a total `count` number of outputs such that no transaction has a
26242615
// serialized length greater than u16::MAX.
26252616
let max_outputs_per_prevtx = 1_500;
26262617
let mut remaining = count;
2627-
let mut inputs: Vec<(TxIn, Transaction)> = Vec::with_capacity(count as usize);
2618+
let mut inputs: Vec<FundingTxInput> = Vec::with_capacity(count as usize);
26282619

26292620
while remaining > 0 {
26302621
let tx_output_count = remaining.min(max_outputs_per_prevtx);
26312622
remaining -= tx_output_count;
26322623

2624+
let outputs = vec![TestOutput::P2WPKH(1_000_000); tx_output_count as usize];
2625+
26332626
// Use unique locktime for each tx so outpoints are different across transactions
2634-
let tx = generate_tx_with_locktime(
2635-
&vec![TestOutput::P2WPKH(1_000_000); tx_output_count as usize],
2636-
(1337 + remaining).into(),
2637-
);
2638-
let txid = tx.compute_txid();
2627+
let tx = generate_tx_with_locktime(&outputs, (1337 + remaining).into());
26392628

2640-
let mut temp: Vec<(TxIn, Transaction)> = tx
2641-
.output
2629+
let mut temp: Vec<FundingTxInput> = outputs
26422630
.iter()
26432631
.enumerate()
2644-
.map(|(idx, _)| {
2645-
let input = TxIn {
2646-
previous_output: OutPoint { txid, vout: idx as u32 },
2647-
script_sig: Default::default(),
2648-
sequence: Sequence::ENABLE_RBF_NO_LOCKTIME,
2649-
witness: Default::default(),
2650-
};
2651-
(input, tx.clone())
2652-
})
2632+
.map(|(idx, _)| FundingTxInput::new_p2wpkh(tx.clone(), idx as u32).unwrap())
26532633
.collect();
26542634

26552635
inputs.append(&mut temp);
@@ -2860,13 +2840,11 @@ mod tests {
28602840
});
28612841

28622842
let tx = generate_tx(&[TestOutput::P2WPKH(1_000_000)]);
2863-
let invalid_sequence_input = TxIn {
2864-
previous_output: OutPoint { txid: tx.compute_txid(), vout: 0 },
2865-
..Default::default()
2866-
};
2843+
let mut invalid_sequence_input = FundingTxInput::new_p2wpkh(tx.clone(), 0).unwrap();
2844+
invalid_sequence_input.set_sequence(Default::default());
28672845
do_test_interactive_tx_constructor(TestSession {
28682846
description: "Invalid input sequence from initiator",
2869-
inputs_a: vec![(invalid_sequence_input, tx.clone())],
2847+
inputs_a: vec![invalid_sequence_input],
28702848
a_shared_input: None,
28712849
shared_output_a: generate_funding_txout(1_000_000, 1_000_000),
28722850
outputs_a: vec![],
@@ -2876,14 +2854,10 @@ mod tests {
28762854
outputs_b: vec![],
28772855
expect_error: Some((AbortReason::IncorrectInputSequenceValue, ErrorCulprit::NodeA)),
28782856
});
2879-
let duplicate_input = TxIn {
2880-
previous_output: OutPoint { txid: tx.compute_txid(), vout: 0 },
2881-
sequence: Sequence::ENABLE_RBF_NO_LOCKTIME,
2882-
..Default::default()
2883-
};
2857+
let duplicate_input = FundingTxInput::new_p2wpkh(tx.clone(), 0).unwrap();
28842858
do_test_interactive_tx_constructor(TestSession {
28852859
description: "Duplicate prevout from initiator",
2886-
inputs_a: vec![(duplicate_input.clone(), tx.clone()), (duplicate_input, tx.clone())],
2860+
inputs_a: vec![duplicate_input.clone(), duplicate_input],
28872861
a_shared_input: None,
28882862
shared_output_a: generate_funding_txout(1_000_000, 1_000_000),
28892863
outputs_a: vec![],
@@ -2894,35 +2868,27 @@ mod tests {
28942868
expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::NodeB)),
28952869
});
28962870
// Non-initiator uses same prevout as initiator.
2897-
let duplicate_input = TxIn {
2898-
previous_output: OutPoint { txid: tx.compute_txid(), vout: 0 },
2899-
sequence: Sequence::ENABLE_RBF_NO_LOCKTIME,
2900-
..Default::default()
2901-
};
2871+
let duplicate_input = FundingTxInput::new_p2wpkh(tx.clone(), 0).unwrap();
29022872
do_test_interactive_tx_constructor(TestSession {
29032873
description: "Non-initiator uses same prevout as initiator",
2904-
inputs_a: vec![(duplicate_input.clone(), tx.clone())],
2874+
inputs_a: vec![duplicate_input.clone()],
29052875
a_shared_input: None,
29062876
shared_output_a: generate_funding_txout(1_000_000, 905_000),
29072877
outputs_a: vec![],
2908-
inputs_b: vec![(duplicate_input.clone(), tx.clone())],
2878+
inputs_b: vec![duplicate_input],
29092879
b_shared_input: None,
29102880
shared_output_b: generate_funding_txout(1_000_000, 95_000),
29112881
outputs_b: vec![],
29122882
expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::NodeA)),
29132883
});
2914-
let duplicate_input = TxIn {
2915-
previous_output: OutPoint { txid: tx.compute_txid(), vout: 0 },
2916-
sequence: Sequence::ENABLE_RBF_NO_LOCKTIME,
2917-
..Default::default()
2918-
};
2884+
let duplicate_input = FundingTxInput::new_p2wpkh(tx.clone(), 0).unwrap();
29192885
do_test_interactive_tx_constructor(TestSession {
29202886
description: "Non-initiator uses same prevout as initiator",
2921-
inputs_a: vec![(duplicate_input.clone(), tx.clone())],
2887+
inputs_a: vec![duplicate_input.clone()],
29222888
a_shared_input: None,
29232889
shared_output_a: generate_funding_txout(1_000_000, 1_000_000),
29242890
outputs_a: vec![],
2925-
inputs_b: vec![(duplicate_input.clone(), tx.clone())],
2891+
inputs_b: vec![duplicate_input],
29262892
b_shared_input: None,
29272893
shared_output_b: generate_funding_txout(1_000_000, 0),
29282894
outputs_b: vec![],

0 commit comments

Comments
 (0)