Abort if we add a duplicate input

This commit is contained in:
Duncan Dean 2024-03-26 12:15:37 +02:00
parent ebd57c5d53
commit 62d4952348
No known key found for this signature in database

View file

@ -308,7 +308,10 @@ impl NegotiationContext {
};
let prev_output =
tx.output.get(msg.prevtx_out as usize).ok_or(AbortReason::PrevTxOutInvalid)?.clone();
self.prevtx_outpoints.insert(input.previous_output);
if !self.prevtx_outpoints.insert(input.previous_output) {
// We have added an input that already exists
return Err(AbortReason::PrevTxOutInvalid);
}
self.inputs.insert(msg.serial_id, TxInputWithPrevOutput { input, prev_output });
Ok(())
}
@ -1253,7 +1256,7 @@ mod tests {
outputs_a: generate_outputs(&[1_000_000]),
inputs_b: vec![],
outputs_b: vec![],
expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::NodeA)),
expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::NodeB)),
});
// Non-initiator uses same prevout as initiator.
let duplicate_input = TxIn {
@ -1266,7 +1269,7 @@ mod tests {
outputs_a: generate_outputs(&[1_000_000]),
inputs_b: vec![(duplicate_input.clone(), tx.clone())],
outputs_b: vec![],
expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::NodeB)),
expect_error: Some((AbortReason::PrevTxOutInvalid, ErrorCulprit::NodeA)),
});
// Initiator sends too many TxAddInputs
do_test_interactive_tx_constructor(TestSession {