Add an extension trait for script validation

Add an extension trait for the validation logic in preparation for
moving the `Script` type to `primitives`.
This commit is contained in:
Tobin C. Harding 2024-07-23 06:25:17 -05:00
parent c1aa33ed89
commit 298b96c579
No known key found for this signature in database
GPG Key ID: 40BF9E4C269D6607
2 changed files with 44 additions and 38 deletions

View File

@ -682,6 +682,8 @@ fn script_ord() {
#[test] #[test]
#[cfg(feature = "bitcoinconsensus")] #[cfg(feature = "bitcoinconsensus")]
fn test_bitcoinconsensus() { fn test_bitcoinconsensus() {
use crate::consensus_validation::ScriptExt as _;
// a random segwit transaction from the blockchain using native segwit // a random segwit transaction from the blockchain using native segwit
let spent_bytes = hex!("0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d"); let spent_bytes = hex!("0020701a8d401c84fb13e6baf169d59684e17abd9fa216c8cc5b9fc63d622ff8c58d");
let spent = Script::from_bytes(&spent_bytes); let spent = Script::from_bytes(&spent_bytes);

View File

@ -12,6 +12,7 @@ use crate::amount::Amount;
use crate::consensus::encode; use crate::consensus::encode;
#[cfg(doc)] #[cfg(doc)]
use crate::consensus_validation; use crate::consensus_validation;
use crate::internal_macros::define_extension_trait;
use crate::script::Script; use crate::script::Script;
use crate::transaction::{OutPoint, Transaction, TxOut}; use crate::transaction::{OutPoint, Transaction, TxOut};
@ -115,45 +116,48 @@ where
Ok(()) Ok(())
} }
impl Script { define_extension_trait! {
/// Verifies spend of an input script. /// Extension functionality to add validation support to the [`Script`] type.
/// pub trait ScriptExt impl for Script {
/// Shorthand for [`Self::verify_with_flags`] with flag [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`]. /// Verifies spend of an input script.
/// ///
/// # Parameters /// Shorthand for [`Self::verify_with_flags`] with flag [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`].
/// ///
/// * `index` - The input index in spending which is spending this transaction. /// # Parameters
/// * `amount` - The amount this script guards. ///
/// * `spending_tx` - The transaction that attempts to spend the output holding this script. /// * `index` - The input index in spending which is spending this transaction.
/// /// * `amount` - The amount this script guards.
/// [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`]: https://docs.rs/bitcoinconsensus/0.106.0+26.0/bitcoinconsensus/constant.VERIFY_ALL_PRE_TAPROOT.html /// * `spending_tx` - The transaction that attempts to spend the output holding this script.
pub fn verify( ///
&self, /// [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`]: https://docs.rs/bitcoinconsensus/0.106.0+26.0/bitcoinconsensus/constant.VERIFY_ALL_PRE_TAPROOT.html
index: usize, fn verify(
amount: crate::Amount, &self,
spending_tx: &[u8], index: usize,
) -> Result<(), BitcoinconsensusError> { amount: crate::Amount,
verify_script(self, index, amount, spending_tx) spending_tx: &[u8],
} ) -> Result<(), BitcoinconsensusError> {
verify_script(self, index, amount, spending_tx)
}
/// Verifies spend of an input script. /// Verifies spend of an input script.
/// ///
/// # Parameters /// # Parameters
/// ///
/// * `index` - The input index in spending which is spending this transaction. /// * `index` - The input index in spending which is spending this transaction.
/// * `amount` - The amount this script guards. /// * `amount` - The amount this script guards.
/// * `spending_tx` - The transaction that attempts to spend the output holding this script. /// * `spending_tx` - The transaction that attempts to spend the output holding this script.
/// * `flags` - Verification flags, see [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`] and similar. /// * `flags` - Verification flags, see [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`] and similar.
/// ///
/// [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`]: https://docs.rs/bitcoinconsensus/0.106.0+26.0/bitcoinconsensus/constant.VERIFY_ALL_PRE_TAPROOT.html /// [`bitcoinconsensus::VERIFY_ALL_PRE_TAPROOT`]: https://docs.rs/bitcoinconsensus/0.106.0+26.0/bitcoinconsensus/constant.VERIFY_ALL_PRE_TAPROOT.html
pub fn verify_with_flags( fn verify_with_flags(
&self, &self,
index: usize, index: usize,
amount: crate::Amount, amount: crate::Amount,
spending_tx: &[u8], spending_tx: &[u8],
flags: impl Into<u32>, flags: impl Into<u32>,
) -> Result<(), BitcoinconsensusError> { ) -> Result<(), BitcoinconsensusError> {
verify_script_with_flags(self, index, amount, spending_tx, flags) verify_script_with_flags(self, index, amount, spending_tx, flags)
}
} }
} }