From 335203289201b2e34cb57a6a107547f946475109 Mon Sep 17 00:00:00 2001 From: yancy Date: Tue, 26 Nov 2024 14:29:38 -0600 Subject: [PATCH 1/2] Fix internal weight calculation This function calls helper function predict_weight_internal and that function was refactored. The refactor changed the interface to accept the input_weight instead of partial input_weight, however this function was not updated with the refactor and was still passing a partial input weight. This commit is a followup that fixes the internal calculation error by pass input_weight instead of partial_weight to the helper function predict_weight_internal. --- bitcoin/src/blockdata/transaction.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs index 0ed381ef4..9e2038096 100644 --- a/bitcoin/src/blockdata/transaction.rs +++ b/bitcoin/src/blockdata/transaction.rs @@ -920,14 +920,14 @@ pub const fn predict_weight_from_slices( inputs: &[InputWeightPrediction], output_script_lens: &[usize], ) -> Weight { - let mut partial_input_weight = 0; + let mut input_weight = 0; let mut inputs_with_witnesses = 0; // for loops not supported in const fn let mut i = 0; while i < inputs.len() { let prediction = inputs[i]; - partial_input_weight += prediction.witness_weight().to_wu() as usize; + input_weight += prediction.total_weight().to_wu() as usize; inputs_with_witnesses += (prediction.witness_size > 0) as usize; i += 1; } @@ -943,7 +943,7 @@ pub const fn predict_weight_from_slices( predict_weight_internal( inputs.len(), - partial_input_weight, + input_weight, inputs_with_witnesses, output_script_lens.len(), output_scripts_size, From f961f3c0eca4e9b175761756f48699012b63d70a Mon Sep 17 00:00:00 2001 From: yancy Date: Tue, 26 Nov 2024 14:55:49 -0600 Subject: [PATCH 2/2] Add test Test that behavior of this function as it interacts with predict_weight_internal --- bitcoin/src/blockdata/transaction.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs index 9e2038096..137110f4f 100644 --- a/bitcoin/src/blockdata/transaction.rs +++ b/bitcoin/src/blockdata/transaction.rs @@ -1964,6 +1964,21 @@ mod tests { ); } + #[test] + fn weight_prediction_const_from_slices() { + let predict = [ + InputWeightPrediction::P2WPKH_MAX, + InputWeightPrediction::NESTED_P2WPKH_MAX, + InputWeightPrediction::P2PKH_COMPRESSED_MAX, + InputWeightPrediction::P2PKH_UNCOMPRESSED_MAX, + InputWeightPrediction::P2TR_KEY_DEFAULT_SIGHASH, + InputWeightPrediction::P2TR_KEY_NON_DEFAULT_SIGHASH + ]; + + let weight = predict_weight_from_slices(&predict, &[1]); + assert_eq!(weight, Weight::from_wu(2493)); + } + #[test] fn sequence_debug_output() { let seq = Sequence::from_seconds_floor(1000);