Skip to content

Commit a541f0b

Browse files
committed
Use an enum for signature versions
1 parent 3a62cb9 commit a541f0b

File tree

10 files changed

+54
-48
lines changed

10 files changed

+54
-48
lines changed

src/policy/policy.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs)
137137
{
138138
std::vector<std::vector<unsigned char> > stack;
139139
// convert the scriptSig into a stack, so we can inspect the redeemScript
140-
if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), 0))
140+
if (!EvalScript(stack, tx.vin[i].scriptSig, SCRIPT_VERIFY_NONE, BaseSignatureChecker(), SIGVERSION_BASE))
141141
return false;
142142
if (stack.empty())
143143
return false;

src/script/interpreter.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ bool static CheckMinimalPush(const valtype& data, opcodetype opcode) {
229229
return true;
230230
}
231231

232-
bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, int sigversion, ScriptError* serror)
232+
bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror)
233233
{
234234
static const CScriptNum bnZero(0);
235235
static const CScriptNum bnOne(1);
@@ -869,7 +869,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
869869
CScript scriptCode(pbegincodehash, pend);
870870

871871
// Drop the signature, since there's no way for a signature to sign itself
872-
if (sigversion == 0) {
872+
if (sigversion == SIGVERSION_BASE) {
873873
scriptCode.FindAndDelete(CScript(vchSig));
874874
}
875875

@@ -927,7 +927,7 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
927927
for (int k = 0; k < nSigsCount; k++)
928928
{
929929
valtype& vchSig = stacktop(-isig-k);
930-
if (sigversion == 0) {
930+
if (sigversion == SIGVERSION_BASE) {
931931
scriptCode.FindAndDelete(CScript(vchSig));
932932
}
933933
}
@@ -1110,9 +1110,9 @@ class CTransactionSignatureSerializer {
11101110

11111111
} // anon namespace
11121112

1113-
uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, int sigversion)
1113+
uint256 SignatureHash(const CScript& scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion)
11141114
{
1115-
if (sigversion == 1) {
1115+
if (sigversion == SIGVERSION_WITNESS_V0) {
11161116
uint256 hashPrevouts;
11171117
uint256 hashSequence;
11181118
uint256 hashOutputs;
@@ -1196,7 +1196,7 @@ bool TransactionSignatureChecker::VerifySignature(const std::vector<unsigned cha
11961196
return pubkey.Verify(sighash, vchSig);
11971197
}
11981198

1199-
bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vector<unsigned char>& vchPubKey, const CScript& scriptCode, int sigversion) const
1199+
bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn, const vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
12001200
{
12011201
CPubKey pubkey(vchPubKey);
12021202
if (!pubkey.IsValid())
@@ -1340,7 +1340,7 @@ static bool VerifyWitnessProgram(const CScriptWitness& witness, int witversion,
13401340
return set_error(serror, SCRIPT_ERR_PUSH_SIZE);
13411341
}
13421342

1343-
if (!EvalScript(stack, scriptPubKey, flags, checker, 1, serror)) {
1343+
if (!EvalScript(stack, scriptPubKey, flags, checker, SIGVERSION_WITNESS_V0, serror)) {
13441344
return false;
13451345
}
13461346

@@ -1367,12 +1367,12 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const C
13671367
}
13681368

13691369
vector<vector<unsigned char> > stack, stackCopy;
1370-
if (!EvalScript(stack, scriptSig, flags, checker, 0, serror))
1370+
if (!EvalScript(stack, scriptSig, flags, checker, SIGVERSION_BASE, serror))
13711371
// serror is set
13721372
return false;
13731373
if (flags & SCRIPT_VERIFY_P2SH)
13741374
stackCopy = stack;
1375-
if (!EvalScript(stack, scriptPubKey, flags, checker, 0, serror))
1375+
if (!EvalScript(stack, scriptPubKey, flags, checker, SIGVERSION_BASE, serror))
13761376
// serror is set
13771377
return false;
13781378
if (stack.empty())
@@ -1418,7 +1418,7 @@ bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const C
14181418
CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end());
14191419
popstack(stack);
14201420

1421-
if (!EvalScript(stack, pubKey2, flags, checker, 0, serror))
1421+
if (!EvalScript(stack, pubKey2, flags, checker, SIGVERSION_BASE, serror))
14221422
// serror is set
14231423
return false;
14241424
if (stack.empty())

src/script/interpreter.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,18 @@ enum
9898

9999
bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, unsigned int flags, ScriptError* serror);
100100

101-
uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, int sigversion);
101+
enum SigVersion
102+
{
103+
SIGVERSION_BASE = 0,
104+
SIGVERSION_WITNESS_V0 = 1,
105+
};
106+
107+
uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType, const CAmount& amount, SigVersion sigversion);
102108

103109
class BaseSignatureChecker
104110
{
105111
public:
106-
virtual bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, int sigversion) const
112+
virtual bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
107113
{
108114
return false;
109115
}
@@ -133,7 +139,7 @@ class TransactionSignatureChecker : public BaseSignatureChecker
133139

134140
public:
135141
TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn) : txTo(txToIn), nIn(nInIn), amount(amountIn) {}
136-
bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, int sigversion) const;
142+
bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const;
137143
bool CheckLockTime(const CScriptNum& nLockTime) const;
138144
bool CheckSequence(const CScriptNum& nSequence) const;
139145
};
@@ -147,7 +153,7 @@ class MutableTransactionSignatureChecker : public TransactionSignatureChecker
147153
MutableTransactionSignatureChecker(const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount) : TransactionSignatureChecker(&txTo, nInIn, amount), txTo(*txToIn) {}
148154
};
149155

150-
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, int sigversion, ScriptError* error = NULL);
156+
bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* error = NULL);
151157
bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror = NULL);
152158

153159
size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, unsigned int flags);

src/script/sign.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ typedef std::vector<unsigned char> valtype;
2020

2121
TransactionSignatureCreator::TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {}
2222

23-
bool TransactionSignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& address, const CScript& scriptCode, int sigversion) const
23+
bool TransactionSignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& address, const CScript& scriptCode, SigVersion sigversion) const
2424
{
2525
CKey key;
2626
if (!keystore->GetKey(address, key))
@@ -33,7 +33,7 @@ bool TransactionSignatureCreator::CreateSig(std::vector<unsigned char>& vchSig,
3333
return true;
3434
}
3535

36-
static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, int sigversion)
36+
static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
3737
{
3838
vector<unsigned char> vchSig;
3939
if (!creator.CreateSig(vchSig, address, scriptCode, sigversion))
@@ -42,7 +42,7 @@ static bool Sign1(const CKeyID& address, const BaseSignatureCreator& creator, co
4242
return true;
4343
}
4444

45-
static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, int sigversion)
45+
static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
4646
{
4747
int nSigned = 0;
4848
int nRequired = multisigdata.front()[0];
@@ -63,7 +63,7 @@ static bool SignN(const vector<valtype>& multisigdata, const BaseSignatureCreato
6363
* Returns false if scriptPubKey could not be completely satisfied.
6464
*/
6565
static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptPubKey,
66-
std::vector<valtype>& ret, txnouttype& whichTypeRet, int sigversion)
66+
std::vector<valtype>& ret, txnouttype& whichTypeRet, SigVersion sigversion)
6767
{
6868
CScript scriptRet;
6969
uint160 h160;
@@ -142,7 +142,7 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu
142142
bool solved = true;
143143
std::vector<valtype> result;
144144
txnouttype whichType;
145-
solved = SignStep(creator, script, result, whichType, 0);
145+
solved = SignStep(creator, script, result, whichType, SIGVERSION_BASE);
146146
bool P2SH = false;
147147
CScript subscript;
148148
sigdata.scriptWitness.stack.clear();
@@ -153,7 +153,7 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu
153153
// the final scriptSig is the signatures from that
154154
// and then the serialized subscript:
155155
script = subscript = CScript(result[0].begin(), result[0].end());
156-
solved = solved && SignStep(creator, script, result, whichType, 0) && whichType != TX_SCRIPTHASH;
156+
solved = solved && SignStep(creator, script, result, whichType, SIGVERSION_BASE) && whichType != TX_SCRIPTHASH;
157157
P2SH = true;
158158
}
159159

@@ -162,15 +162,15 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu
162162
CScript witnessscript;
163163
witnessscript << OP_DUP << OP_HASH160 << ToByteVector(result[0]) << OP_EQUALVERIFY << OP_CHECKSIG;
164164
txnouttype subType;
165-
solved = solved && SignStep(creator, witnessscript, result, subType, 1);
165+
solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0);
166166
sigdata.scriptWitness.stack = result;
167167
result.clear();
168168
}
169169
else if (solved && whichType == TX_WITNESS_V0_SCRIPTHASH)
170170
{
171171
CScript witnessscript(result[0].begin(), result[0].end());
172172
txnouttype subType;
173-
solved = solved && SignStep(creator, witnessscript, result, subType, 1) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH;
173+
solved = solved && SignStep(creator, witnessscript, result, subType, SIGVERSION_WITNESS_V0) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH;
174174
result.push_back(std::vector<unsigned char>(witnessscript.begin(), witnessscript.end()));
175175
sigdata.scriptWitness.stack = result;
176176
result.clear();
@@ -231,7 +231,7 @@ bool SignSignature(const CKeyStore &keystore, const CTransaction& txFrom, CMutab
231231

232232
static vector<valtype> CombineMultisig(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
233233
const vector<valtype>& vSolutions,
234-
const vector<valtype>& sigs1, const vector<valtype>& sigs2, int sigversion)
234+
const vector<valtype>& sigs1, const vector<valtype>& sigs2, SigVersion sigversion)
235235
{
236236
// Combine all the signatures we've got:
237237
set<valtype> allsigs;
@@ -294,7 +294,7 @@ struct Stacks
294294
Stacks() {}
295295
explicit Stacks(const std::vector<valtype>& scriptSigStack_) : script(scriptSigStack_), witness() {}
296296
explicit Stacks(const SignatureData& data) : witness(data.scriptWitness.stack) {
297-
EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), 0);
297+
EvalScript(script, data.scriptSig, SCRIPT_VERIFY_STRICTENC, BaseSignatureChecker(), SIGVERSION_BASE);
298298
}
299299

300300
SignatureData Output() const {
@@ -308,7 +308,7 @@ struct Stacks
308308

309309
static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker,
310310
const txnouttype txType, const vector<valtype>& vSolutions,
311-
Stacks sigs1, Stacks sigs2, int sigversion)
311+
Stacks sigs1, Stacks sigs2, SigVersion sigversion)
312312
{
313313
switch (txType)
314314
{
@@ -369,7 +369,7 @@ static Stacks CombineSignatures(const CScript& scriptPubKey, const BaseSignature
369369
sigs2.witness.pop_back();
370370
sigs2.script = sigs2.witness;
371371
sigs2.witness.clear();
372-
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, 1);
372+
Stacks result = CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, SIGVERSION_WITNESS_V0);
373373
result.witness = result.script;
374374
result.script.clear();
375375
result.witness.push_back(valtype(pubKey2.begin(), pubKey2.end()));
@@ -387,7 +387,7 @@ SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignature
387387
vector<vector<unsigned char> > vSolutions;
388388
Solver(scriptPubKey, txType, vSolutions);
389389

390-
return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), 0).Output();
390+
return CombineSignatures(scriptPubKey, checker, txType, vSolutions, Stacks(scriptSig1), Stacks(scriptSig2), SIGVERSION_BASE).Output();
391391
}
392392

393393
namespace {
@@ -397,7 +397,7 @@ class DummySignatureChecker : public BaseSignatureChecker
397397
public:
398398
DummySignatureChecker() {}
399399

400-
bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, int sigversion) const
400+
bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
401401
{
402402
return true;
403403
}
@@ -410,7 +410,7 @@ const BaseSignatureChecker& DummySignatureCreator::Checker() const
410410
return dummyChecker;
411411
}
412412

413-
bool DummySignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, int sigversion) const
413+
bool DummySignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const
414414
{
415415
// Create a dummy signature that is a valid DER-encoding
416416
vchSig.assign(72, '\000');

src/script/sign.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class BaseSignatureCreator {
2727
virtual const BaseSignatureChecker& Checker() const =0;
2828

2929
/** Create a singular (non-script) signature. */
30-
virtual bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, int sigversion) const =0;
30+
virtual bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;
3131
};
3232

3333
/** A signature creator for transactions. */
@@ -41,7 +41,7 @@ class TransactionSignatureCreator : public BaseSignatureCreator {
4141
public:
4242
TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL);
4343
const BaseSignatureChecker& Checker() const { return checker; }
44-
bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, int sigversion) const;
44+
bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const;
4545
};
4646

4747
class MutableTransactionSignatureCreator : public TransactionSignatureCreator {
@@ -56,7 +56,7 @@ class DummySignatureCreator : public BaseSignatureCreator {
5656
public:
5757
DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {}
5858
const BaseSignatureChecker& Checker() const;
59-
bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, int sigversion) const;
59+
bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const;
6060
};
6161

6262
struct SignatureData {

src/test/multisig_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ BOOST_FIXTURE_TEST_SUITE(multisig_tests, BasicTestingSetup)
2626
CScript
2727
sign_multisig(CScript scriptPubKey, vector<CKey> keys, CTransaction transaction, int whichIn)
2828
{
29-
uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL, 0, 0);
29+
uint256 hash = SignatureHash(scriptPubKey, transaction, whichIn, SIGHASH_ALL, 0, SIGVERSION_BASE);
3030

3131
CScript result;
3232
result << OP_0; // CHECKMULTISIG bug workaround

0 commit comments

Comments
 (0)