Merge pull request #598 from RCasatta/verify_flags

Add verify_with_flags to Script and Transaction
This commit is contained in:
Andrew Poelstra 2021-05-05 22:33:47 +00:00 committed by GitHub
commit 3fd88d317f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 9 deletions

View File

@ -449,13 +449,20 @@ impl Script {
} }
#[cfg(feature="bitcoinconsensus")] #[cfg(feature="bitcoinconsensus")]
/// verify spend of an input script /// Shorthand for [Self::verify_with_flags] with flag [bitcoinconsensus::VERIFY_ALL]
/// # Parameters
/// * index - the input index in spending which is spending this transaction
/// * amount - the amount this script guards
/// * spending - the transaction that attempts to spend the output holding this script
pub fn verify (&self, index: usize, amount: u64, spending: &[u8]) -> Result<(), Error> { pub fn verify (&self, index: usize, amount: u64, spending: &[u8]) -> Result<(), Error> {
Ok(bitcoinconsensus::verify (&self.0[..], amount, spending, index)?) self.verify_with_flags(index, ::Amount::from_sat(amount), spending, ::bitcoinconsensus::VERIFY_ALL)
}
#[cfg(feature="bitcoinconsensus")]
/// Verify spend of an input script
/// # Parameters
/// * `index` - the input index in spending which is spending this transaction
/// * `amount` - the amount this script guards
/// * `spending` - the transaction that attempts to spend the output holding this script
/// * `flags` - verification flags, see [bitcoinconsensus::VERIFY_ALL] and similar
pub fn verify_with_flags<F: Into<u32>>(&self, index: usize, amount: ::Amount, spending: &[u8], flags: F) -> Result<(), Error> {
Ok(bitcoinconsensus::verify_with_flags (&self.0[..], amount.as_sat(), spending, index, flags.into())?)
} }
/// Write the assembly decoding of the script bytes to the formatter. /// Write the assembly decoding of the script bytes to the formatter.

View File

@ -463,15 +463,23 @@ impl Transaction {
} }
} }
#[cfg(feature="bitcoinconsensus")]
/// Shorthand for [Self::verify_with_flags] with flag [bitcoinconsensus::VERIFY_ALL]
pub fn verify<S>(&self, spent: S) -> Result<(), script::Error>
where S: FnMut(&OutPoint) -> Option<TxOut> {
self.verify_with_flags(spent, ::bitcoinconsensus::VERIFY_ALL)
}
#[cfg(feature="bitcoinconsensus")] #[cfg(feature="bitcoinconsensus")]
/// Verify that this transaction is able to spend its inputs /// Verify that this transaction is able to spend its inputs
/// The lambda spent should not return the same TxOut twice! /// The lambda spent should not return the same TxOut twice!
pub fn verify<S>(&self, mut spent: S) -> Result<(), script::Error> pub fn verify_with_flags<S, F>(&self, mut spent: S, flags: F) -> Result<(), script::Error>
where S: FnMut(&OutPoint) -> Option<TxOut> { where S: FnMut(&OutPoint) -> Option<TxOut>, F : Into<u32> {
let tx = encode::serialize(&*self); let tx = encode::serialize(&*self);
let flags: u32 = flags.into();
for (idx, input) in self.input.iter().enumerate() { for (idx, input) in self.input.iter().enumerate() {
if let Some(output) = spent(&input.previous_output) { if let Some(output) = spent(&input.previous_output) {
output.script_pubkey.verify(idx, output.value, tx.as_slice())?; output.script_pubkey.verify_with_flags(idx, ::Amount::from_sat(output.value), tx.as_slice(), flags)?;
} else { } else {
return Err(script::Error::UnknownSpentOutput(input.previous_output.clone())); return Err(script::Error::UnknownSpentOutput(input.previous_output.clone()));
} }