1010#include < crypto/sha256.h>
1111#include < pubkey.h>
1212#include < script/script.h>
13+ #include < tinyformat.h>
1314#include < uint256.h>
1415
1516typedef std::vector<unsigned char > valtype;
@@ -197,7 +198,7 @@ bool static IsDefinedHashtypeSignature(const valtype &vchSig) {
197198 return true ;
198199}
199200
200- bool CheckSignatureEncoding (const std::vector<unsigned char > &vchSig, unsigned int flags, ScriptError* serror) {
201+ bool CheckSignatureEncoding (const std::vector<unsigned char > &vchSig, script_verify_flags flags, ScriptError* serror) {
201202 // Empty signature. Not strictly DER encoded, but allowed to provide a
202203 // compact way to provide an invalid signature for use with CHECK(MULTI)SIG
203204 if (vchSig.size () == 0 ) {
@@ -214,7 +215,7 @@ bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, unsigned i
214215 return true ;
215216}
216217
217- bool static CheckPubKeyEncoding (const valtype &vchPubKey, unsigned int flags, const SigVersion &sigversion, ScriptError* serror) {
218+ bool static CheckPubKeyEncoding (const valtype &vchPubKey, script_verify_flags flags, const SigVersion &sigversion, ScriptError* serror) {
218219 if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey (vchPubKey)) {
219220 return set_error (serror, SCRIPT_ERR_PUBKEYTYPE);
220221 }
@@ -317,7 +318,7 @@ class ConditionStack {
317318};
318319}
319320
320- static bool EvalChecksigPreTapscript (const valtype& vchSig, const valtype& vchPubKey, CScript::const_iterator pbegincodehash, CScript::const_iterator pend, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool & fSuccess )
321+ static bool EvalChecksigPreTapscript (const valtype& vchSig, const valtype& vchPubKey, CScript::const_iterator pbegincodehash, CScript::const_iterator pend, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool & fSuccess )
321322{
322323 assert (sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0);
323324
@@ -343,7 +344,7 @@ static bool EvalChecksigPreTapscript(const valtype& vchSig, const valtype& vchPu
343344 return true ;
344345}
345346
346- static bool EvalChecksigTapscript (const valtype& sig, const valtype& pubkey, ScriptExecutionData& execdata, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool & success)
347+ static bool EvalChecksigTapscript (const valtype& sig, const valtype& pubkey, ScriptExecutionData& execdata, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool & success)
347348{
348349 assert (sigversion == SigVersion::TAPSCRIPT);
349350
@@ -388,7 +389,7 @@ static bool EvalChecksigTapscript(const valtype& sig, const valtype& pubkey, Scr
388389 * A return value of false means the script fails entirely. When true is returned, the
389390 * success variable indicates whether the signature check itself succeeded.
390391 */
391- static bool EvalChecksig (const valtype& sig, const valtype& pubkey, CScript::const_iterator pbegincodehash, CScript::const_iterator pend, ScriptExecutionData& execdata, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool & success)
392+ static bool EvalChecksig (const valtype& sig, const valtype& pubkey, CScript::const_iterator pbegincodehash, CScript::const_iterator pend, ScriptExecutionData& execdata, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool & success)
392393{
393394 switch (sigversion) {
394395 case SigVersion::BASE:
@@ -403,7 +404,7 @@ static bool EvalChecksig(const valtype& sig, const valtype& pubkey, CScript::con
403404 assert (false );
404405}
405406
406- bool EvalScript (std::vector<std::vector<unsigned char > >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* serror)
407+ bool EvalScript (std::vector<std::vector<unsigned char > >& stack, const CScript& script, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* serror)
407408{
408409 static const CScriptNum bnZero (0 );
409410 static const CScriptNum bnOne (1 );
@@ -1233,7 +1234,7 @@ bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript&
12331234 return set_success (serror);
12341235}
12351236
1236- bool EvalScript (std::vector<std::vector<unsigned char > >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror)
1237+ bool EvalScript (std::vector<std::vector<unsigned char > >& stack, const CScript& script, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror)
12371238{
12381239 ScriptExecutionData execdata;
12391240 return EvalScript (stack, script, flags, checker, sigversion, execdata, serror);
@@ -1824,7 +1825,7 @@ bool GenericTransactionSignatureChecker<T>::CheckSequence(const CScriptNum& nSeq
18241825template class GenericTransactionSignatureChecker <CTransaction>;
18251826template class GenericTransactionSignatureChecker <CMutableTransaction>;
18261827
1827- static bool ExecuteWitnessScript (const std::span<const valtype>& stack_span, const CScript& exec_script, unsigned int flags, SigVersion sigversion, const BaseSignatureChecker& checker, ScriptExecutionData& execdata, ScriptError* serror)
1828+ static bool ExecuteWitnessScript (const std::span<const valtype>& stack_span, const CScript& exec_script, script_verify_flags flags, SigVersion sigversion, const BaseSignatureChecker& checker, ScriptExecutionData& execdata, ScriptError* serror)
18281829{
18291830 std::vector<valtype> stack{stack_span.begin (), stack_span.end ()};
18301831
@@ -1909,7 +1910,7 @@ static bool VerifyTaprootCommitment(const std::vector<unsigned char>& control, c
19091910 return q.CheckTapTweak (p, merkle_root, control[0 ] & 1 );
19101911}
19111912
1912- static bool VerifyWitnessProgram (const CScriptWitness& witness, int witversion, const std::vector<unsigned char >& program, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror, bool is_p2sh)
1913+ static bool VerifyWitnessProgram (const CScriptWitness& witness, int witversion, const std::vector<unsigned char >& program, script_verify_flags flags, const BaseSignatureChecker& checker, ScriptError* serror, bool is_p2sh)
19131914{
19141915 CScript exec_script; // !< Actually executed script (last stack item in P2WSH; implied P2PKH script in P2WPKH; leaf script in P2TR)
19151916 std::span stack{witness.stack };
@@ -1994,7 +1995,7 @@ static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion,
19941995 // There is intentionally no return statement here, to be able to use "control reaches end of non-void function" warnings to detect gaps in the logic above.
19951996}
19961997
1997- bool VerifyScript (const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
1998+ bool VerifyScript (const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags, const BaseSignatureChecker& checker, ScriptError* serror)
19981999{
19992000 static const CScriptWitness emptyWitness;
20002001 if (witness == nullptr ) {
@@ -2131,7 +2132,7 @@ size_t static WitnessSigOps(int witversion, const std::vector<unsigned char>& wi
21312132 return 0 ;
21322133}
21332134
2134- size_t CountWitnessSigOps (const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags)
2135+ size_t CountWitnessSigOps (const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags)
21352136{
21362137 static const CScriptWitness witnessEmpty;
21372138
@@ -2161,3 +2162,48 @@ size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey,
21612162
21622163 return 0 ;
21632164}
2165+
2166+ #define FLAG_NAME (flag ) {std::string (#flag), SCRIPT_VERIFY_##flag}
2167+ const std::map<std::string, script_verify_flag_name> g_verify_flag_names{
2168+ FLAG_NAME (P2SH),
2169+ FLAG_NAME (STRICTENC),
2170+ FLAG_NAME (DERSIG),
2171+ FLAG_NAME (LOW_S),
2172+ FLAG_NAME (SIGPUSHONLY),
2173+ FLAG_NAME (MINIMALDATA),
2174+ FLAG_NAME (NULLDUMMY),
2175+ FLAG_NAME (DISCOURAGE_UPGRADABLE_NOPS),
2176+ FLAG_NAME (CLEANSTACK),
2177+ FLAG_NAME (MINIMALIF),
2178+ FLAG_NAME (NULLFAIL),
2179+ FLAG_NAME (CHECKLOCKTIMEVERIFY),
2180+ FLAG_NAME (CHECKSEQUENCEVERIFY),
2181+ FLAG_NAME (WITNESS),
2182+ FLAG_NAME (DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM),
2183+ FLAG_NAME (WITNESS_PUBKEYTYPE),
2184+ FLAG_NAME (CONST_SCRIPTCODE),
2185+ FLAG_NAME (TAPROOT),
2186+ FLAG_NAME (DISCOURAGE_UPGRADABLE_PUBKEYTYPE),
2187+ FLAG_NAME (DISCOURAGE_OP_SUCCESS),
2188+ FLAG_NAME (DISCOURAGE_UPGRADABLE_TAPROOT_VERSION),
2189+ };
2190+ #undef FLAG_NAME
2191+
2192+ std::vector<std::string> GetScriptFlagNames (script_verify_flags flags)
2193+ {
2194+ std::vector<std::string> res;
2195+ if (flags == SCRIPT_VERIFY_NONE) {
2196+ return res;
2197+ }
2198+ script_verify_flags leftover = flags;
2199+ for (const auto & [name, flag] : g_verify_flag_names) {
2200+ if ((flags & flag) != 0 ) {
2201+ res.push_back (name);
2202+ leftover &= ~flag;
2203+ }
2204+ }
2205+ if (leftover != 0 ) {
2206+ res.push_back (strprintf (" 0x%08x" , leftover.as_int ()));
2207+ }
2208+ return res;
2209+ }
0 commit comments