diff --git a/script/src/flags.rs b/script/src/flags.rs index 068c0e1a44164310fbb37d462acfc4c0d017dfe2..72b196c06ec209c7b3df2d3d6f5a568f256a52c1 100644 --- a/script/src/flags.rs +++ b/script/src/flags.rs @@ -144,6 +144,11 @@ impl VerificationFlags { self } + pub fn verify_cleanstack(mut self, value: bool) -> Self { + self.verify_cleanstack = value; + self + } + pub fn verify_discourage_upgradable_witness_program(mut self, value: bool) -> Self { self.verify_discourage_upgradable_witness_program = value; self diff --git a/script/src/interpreter.rs b/script/src/interpreter.rs index 9ad6640e3d60e74ea459b56366e1a39192e461bd..0fb53971dd68f5a4d28530363743adf7c97ee1aa 100644 --- a/script/src/interpreter.rs +++ b/script/src/interpreter.rs @@ -346,7 +346,6 @@ pub fn verify_script( // Disallow CLEANSTACK without P2SH, as otherwise a switch CLEANSTACK->P2SH+CLEANSTACK // would be possible, which is not a softfork (and P2SH should be one). assert!(flags.verify_p2sh); - assert!(flags.verify_witness); if stack.len() != 1 { return Err(Error::Cleanstack); } diff --git a/verification/src/accept_transaction.rs b/verification/src/accept_transaction.rs index 57ff09e998b3fb021c859e29144101437eb083e1..8403417e9238bd1649c5d85b8fe7edc30c36c41a 100644 --- a/verification/src/accept_transaction.rs +++ b/verification/src/accept_transaction.rs @@ -309,6 +309,7 @@ pub struct TransactionEval<'a> { verify_monolith_opcodes: bool, verify_magnetic_anomaly_opcodes: bool, verify_sigpushonly: bool, + verify_cleanstack: bool, signature_version: SignatureVersion, } @@ -347,6 +348,7 @@ impl<'a> TransactionEval<'a> { let verify_witness = deployments.segwit(); let verify_nulldummy = verify_witness; let verify_sigpushonly = verify_magnetic_anomaly_opcodes; + let verify_cleanstack = verify_magnetic_anomaly_opcodes; TransactionEval { transaction: transaction, @@ -362,6 +364,7 @@ impl<'a> TransactionEval<'a> { verify_monolith_opcodes: verify_monolith_opcodes, verify_magnetic_anomaly_opcodes: verify_magnetic_anomaly_opcodes, verify_sigpushonly: verify_sigpushonly, + verify_cleanstack: verify_cleanstack, signature_version: signature_version, } } @@ -413,7 +416,8 @@ impl<'a> TransactionEval<'a> { .verify_bin2num(self.verify_monolith_opcodes) .verify_num2bin(self.verify_monolith_opcodes) .verify_checkdatasig(self.verify_magnetic_anomaly_opcodes) - .verify_sigpushonly(self.verify_sigpushonly); + .verify_sigpushonly(self.verify_sigpushonly) + .verify_cleanstack(self.verify_cleanstack); try!(verify_script(&input, &output, &script_witness, &flags, &checker, self.signature_version) .map_err(|e| TransactionError::Signature(index, e)));