Skip to content

Commit a5ead12

Browse files
committed
script/interpreter: introduce script_verify_flags typename
Previously the SCRIPT_VERIFY_* flags were specified as either uint32_t, unsigned int, or unsigned. This converts them to a common type alias in preparation for changing the underlying type.
1 parent 4577fb2 commit a5ead12

24 files changed

+114
-96
lines changed

src/bench/verify_script.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ static void VerifyScriptBench(benchmark::Bench& bench)
2424
{
2525
ECC_Context ecc_context{};
2626

27-
const uint32_t flags{SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH};
27+
const script_verify_flags flags{SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH};
2828
const int witnessversion = 0;
2929

3030
// Key pair.

src/consensus/params.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#ifndef BITCOIN_CONSENSUS_PARAMS_H
77
#define BITCOIN_CONSENSUS_PARAMS_H
88

9+
#include <script/verify_flags.h>
910
#include <uint256.h>
1011

1112
#include <array>
@@ -89,7 +90,7 @@ struct Params {
8990
* - buried in the chain, and
9091
* - fail if the default script verify flags are applied.
9192
*/
92-
std::map<uint256, uint32_t> script_flag_exceptions;
93+
std::map<uint256, script_verify_flags> script_flag_exceptions;
9394
/** Block height and hash at which BIP34 becomes active */
9495
int BIP34Height;
9596
uint256 BIP34Hash;

src/consensus/tx_verify.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& in
140140
return nSigOps;
141141
}
142142

143-
int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, uint32_t flags)
143+
int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, script_verify_flags flags)
144144
{
145145
int64_t nSigOps = GetLegacySigOpCount(tx) * WITNESS_SCALE_FACTOR;
146146

src/consensus/tx_verify.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define BITCOIN_CONSENSUS_TX_VERIFY_H
77

88
#include <consensus/amount.h>
9+
#include <script/verify_flags.h>
910

1011
#include <cstdint>
1112
#include <vector>
@@ -52,7 +53,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, const CCoinsViewCache& ma
5253
* @param[in] flags Script verification flags
5354
* @return Total signature operation cost of tx
5455
*/
55-
int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, uint32_t flags);
56+
int64_t GetTransactionSigOpCost(const CTransaction& tx, const CCoinsViewCache& inputs, script_verify_flags flags);
5657

5758
/**
5859
* Check if transaction is final and can be included in a block with the

src/policy/policy.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ static constexpr unsigned int MAX_DUST_OUTPUTS_PER_TX{1};
9898
* Note that this does not affect consensus validity; see GetBlockScriptFlags()
9999
* for that.
100100
*/
101-
static constexpr unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS{SCRIPT_VERIFY_P2SH |
101+
static constexpr script_verify_flags MANDATORY_SCRIPT_VERIFY_FLAGS{SCRIPT_VERIFY_P2SH |
102102
SCRIPT_VERIFY_DERSIG |
103103
SCRIPT_VERIFY_NULLDUMMY |
104104
SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY |
@@ -112,7 +112,7 @@ static constexpr unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS{SCRIPT_VERIFY_P2SH |
112112
* the additional (non-mandatory) rules here, to improve forwards and
113113
* backwards compatibility.
114114
*/
115-
static constexpr unsigned int STANDARD_SCRIPT_VERIFY_FLAGS{MANDATORY_SCRIPT_VERIFY_FLAGS |
115+
static constexpr script_verify_flags STANDARD_SCRIPT_VERIFY_FLAGS{MANDATORY_SCRIPT_VERIFY_FLAGS |
116116
SCRIPT_VERIFY_STRICTENC |
117117
SCRIPT_VERIFY_MINIMALDATA |
118118
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS |
@@ -128,7 +128,7 @@ static constexpr unsigned int STANDARD_SCRIPT_VERIFY_FLAGS{MANDATORY_SCRIPT_VERI
128128
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_PUBKEYTYPE};
129129

130130
/** For convenience, standard but not mandatory verify flags. */
131-
static constexpr unsigned int STANDARD_NOT_MANDATORY_VERIFY_FLAGS{STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS};
131+
static constexpr script_verify_flags STANDARD_NOT_MANDATORY_VERIFY_FLAGS{STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS};
132132

133133
/** Used as the flags parameter to sequence and nLocktime checks in non-consensus code. */
134134
static constexpr unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS{LOCKTIME_VERIFY_SEQUENCE};

src/script/interpreter.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ bool static IsDefinedHashtypeSignature(const valtype &vchSig) {
198198
return true;
199199
}
200200

201-
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) {
202202
// Empty signature. Not strictly DER encoded, but allowed to provide a
203203
// compact way to provide an invalid signature for use with CHECK(MULTI)SIG
204204
if (vchSig.size() == 0) {
@@ -215,7 +215,7 @@ bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, unsigned i
215215
return true;
216216
}
217217

218-
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) {
219219
if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey(vchPubKey)) {
220220
return set_error(serror, SCRIPT_ERR_PUBKEYTYPE);
221221
}
@@ -318,7 +318,7 @@ class ConditionStack {
318318
};
319319
}
320320

321-
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)
322322
{
323323
assert(sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0);
324324

@@ -344,7 +344,7 @@ static bool EvalChecksigPreTapscript(const valtype& vchSig, const valtype& vchPu
344344
return true;
345345
}
346346

347-
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)
348348
{
349349
assert(sigversion == SigVersion::TAPSCRIPT);
350350

@@ -389,7 +389,7 @@ static bool EvalChecksigTapscript(const valtype& sig, const valtype& pubkey, Scr
389389
* A return value of false means the script fails entirely. When true is returned, the
390390
* success variable indicates whether the signature check itself succeeded.
391391
*/
392-
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)
393393
{
394394
switch (sigversion) {
395395
case SigVersion::BASE:
@@ -404,7 +404,7 @@ static bool EvalChecksig(const valtype& sig, const valtype& pubkey, CScript::con
404404
assert(false);
405405
}
406406

407-
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)
408408
{
409409
static const CScriptNum bnZero(0);
410410
static const CScriptNum bnOne(1);
@@ -1234,7 +1234,7 @@ bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript&
12341234
return set_success(serror);
12351235
}
12361236

1237-
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)
12381238
{
12391239
ScriptExecutionData execdata;
12401240
return EvalScript(stack, script, flags, checker, sigversion, execdata, serror);
@@ -1825,7 +1825,7 @@ bool GenericTransactionSignatureChecker<T>::CheckSequence(const CScriptNum& nSeq
18251825
template class GenericTransactionSignatureChecker<CTransaction>;
18261826
template class GenericTransactionSignatureChecker<CMutableTransaction>;
18271827

1828-
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)
18291829
{
18301830
std::vector<valtype> stack{stack_span.begin(), stack_span.end()};
18311831

@@ -1910,7 +1910,7 @@ static bool VerifyTaprootCommitment(const std::vector<unsigned char>& control, c
19101910
return q.CheckTapTweak(p, merkle_root, control[0] & 1);
19111911
}
19121912

1913-
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)
19141914
{
19151915
CScript exec_script; //!< Actually executed script (last stack item in P2WSH; implied P2PKH script in P2WPKH; leaf script in P2TR)
19161916
std::span stack{witness.stack};
@@ -1995,7 +1995,7 @@ static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion,
19951995
// 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.
19961996
}
19971997

1998-
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)
19991999
{
20002000
static const CScriptWitness emptyWitness;
20012001
if (witness == nullptr) {
@@ -2132,7 +2132,7 @@ size_t static WitnessSigOps(int witversion, const std::vector<unsigned char>& wi
21322132
return 0;
21332133
}
21342134

2135-
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)
21362136
{
21372137
static const CScriptWitness witnessEmpty;
21382138

@@ -2189,13 +2189,13 @@ const std::map<std::string, uint32_t> g_verify_flag_names{
21892189
};
21902190
#undef FLAG_NAME
21912191

2192-
std::vector<std::string> GetScriptFlagNames(uint32_t flags)
2192+
std::vector<std::string> GetScriptFlagNames(script_verify_flags flags)
21932193
{
21942194
std::vector<std::string> res;
21952195
if (flags == SCRIPT_VERIFY_NONE) {
21962196
return res;
21972197
}
2198-
uint32_t leftover = flags;
2198+
script_verify_flags leftover = flags;
21992199
for (const auto& [name, flag] : g_verify_flag_names) {
22002200
if ((flags & flag) != 0) {
22012201
res.push_back(name);

src/script/interpreter.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <hash.h>
1111
#include <primitives/transaction.h>
1212
#include <script/script_error.h> // IWYU pragma: export
13+
#include <script/verify_flags.h> // IWYU pragma: export
1314
#include <span.h>
1415
#include <uint256.h>
1516

@@ -148,7 +149,7 @@ enum : uint32_t {
148149
SCRIPT_VERIFY_END_MARKER
149150
};
150151

151-
bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, unsigned int flags, ScriptError* serror);
152+
bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, script_verify_flags flags, ScriptError* serror);
152153

153154
struct PrecomputedTransactionData
154155
{
@@ -363,16 +364,16 @@ uint256 ComputeTapbranchHash(std::span<const unsigned char> a, std::span<const u
363364
* Requires control block to have valid length (33 + k*32, with k in {0,1,..,128}). */
364365
uint256 ComputeTaprootMerkleRoot(std::span<const unsigned char> control, const uint256& tapleaf_hash);
365366

366-
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* error = nullptr);
367-
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = nullptr);
368-
bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror = nullptr);
367+
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* error = nullptr);
368+
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = nullptr);
369+
bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags, const BaseSignatureChecker& checker, ScriptError* serror = nullptr);
369370

370-
size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags);
371+
size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags);
371372

372373
int FindAndDelete(CScript& script, const CScript& b);
373374

374375
extern const std::map<std::string, uint32_t> g_verify_flag_names;
375376

376-
std::vector<std::string> GetScriptFlagNames(uint32_t flags);
377+
std::vector<std::string> GetScriptFlagNames(script_verify_flags flags);
377378

378379
#endif // BITCOIN_SCRIPT_INTERPRETER_H

src/script/verify_flags.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright (c) 2009-2010 Satoshi Nakamoto
2+
// Copyright (c) 2009-present The Bitcoin Core developers
3+
// Distributed under the MIT software license, see the accompanying
4+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5+
6+
#ifndef BITCOIN_SCRIPT_VERIFY_FLAGS_H
7+
#define BITCOIN_SCRIPT_VERIFY_FLAGS_H
8+
9+
#include <cstdint>
10+
11+
using script_verify_flags = uint32_t;
12+
13+
#endif // BITCOIN_SCRIPT_VERIFY_FLAGS_H

src/signet.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
static constexpr uint8_t SIGNET_HEADER[4] = {0xec, 0xc7, 0xda, 0xa2};
2828

29-
static constexpr unsigned int BLOCK_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_NULLDUMMY;
29+
static constexpr script_verify_flags BLOCK_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_NULLDUMMY;
3030

3131
static bool FetchAndClearCommitmentSection(const std::span<const uint8_t> header, CScript& witness_commitment, std::vector<uint8_t>& result)
3232
{

src/test/fuzz/eval_script.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
FUZZ_TARGET(eval_script)
1313
{
1414
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
15-
const unsigned int flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
15+
const script_verify_flags flags = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
1616
const std::vector<uint8_t> script_bytes = [&] {
1717
if (fuzzed_data_provider.remaining_bytes() != 0) {
1818
return fuzzed_data_provider.ConsumeRemainingBytes<uint8_t>();

0 commit comments

Comments
 (0)