Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
Show First 20 Lines • Show All 303 Lines • ▼ Show 20 Lines | TestBuilder &Push(const std::string &hex) { | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &Push(const CScript &_script) { | TestBuilder &Push(const CScript &_script) { | ||||
DoPush(std::vector<uint8_t>(_script.begin(), _script.end())); | DoPush(std::vector<uint8_t>(_script.begin(), _script.end())); | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &PushSig(const CKey &key, int nHashType = SIGHASH_ALL, | TestBuilder &PushSig(const CKey &key, | ||||
SigHashType sigHashType = SigHashType(), | |||||
unsigned int lenR = 32, unsigned int lenS = 32, | unsigned int lenR = 32, unsigned int lenS = 32, | ||||
Amount amount = Amount(0)) { | Amount amount = Amount(0)) { | ||||
uint256 hash = | uint256 hash = SignatureHash(script, spendTx, 0, sigHashType, amount); | ||||
SignatureHash(script, spendTx, 0, SigHashType(nHashType), amount); | |||||
std::vector<uint8_t> vchSig, r, s; | std::vector<uint8_t> vchSig, r, s; | ||||
uint32_t iter = 0; | uint32_t iter = 0; | ||||
do { | do { | ||||
key.Sign(hash, vchSig, iter++); | key.Sign(hash, vchSig, iter++); | ||||
if ((lenS == 33) != (vchSig[5 + vchSig[3]] == 33)) { | if ((lenS == 33) != (vchSig[5 + vchSig[3]] == 33)) { | ||||
NegateSignatureS(vchSig); | NegateSignatureS(vchSig); | ||||
} | } | ||||
r = std::vector<uint8_t>(vchSig.begin() + 4, | r = std::vector<uint8_t>(vchSig.begin() + 4, | ||||
vchSig.begin() + 4 + vchSig[3]); | vchSig.begin() + 4 + vchSig[3]); | ||||
s = std::vector<uint8_t>(vchSig.begin() + 6 + vchSig[3], | s = std::vector<uint8_t>(vchSig.begin() + 6 + vchSig[3], | ||||
vchSig.begin() + 6 + vchSig[3] + | vchSig.begin() + 6 + vchSig[3] + | ||||
vchSig[5 + vchSig[3]]); | vchSig[5 + vchSig[3]]); | ||||
} while (lenR != r.size() || lenS != s.size()); | } while (lenR != r.size() || lenS != s.size()); | ||||
vchSig.push_back(static_cast<uint8_t>(nHashType)); | vchSig.push_back(static_cast<uint8_t>(sigHashType.getRawSigHashType())); | ||||
DoPush(vchSig); | DoPush(vchSig); | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &Push(const CPubKey &pubkey) { | TestBuilder &Push(const CPubKey &pubkey) { | ||||
DoPush(std::vector<uint8_t>(pubkey.begin(), pubkey.end())); | DoPush(std::vector<uint8_t>(pubkey.begin(), pubkey.end())); | ||||
return *this; | return *this; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 | ||||
.PushSig(keys.key2) | .PushSig(keys.key2) | ||||
.Push(keys.pubkey2C) | .Push(keys.pubkey2C) | ||||
.DamagePush(5) | .DamagePush(5) | ||||
.ScriptError(SCRIPT_ERR_EQUALVERIFY)); | .ScriptError(SCRIPT_ERR_EQUALVERIFY)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
"P2PK anyonecanpay", 0) | "P2PK anyonecanpay", 0) | ||||
.PushSig(keys.key1, SIGHASH_ALL | SIGHASH_ANYONECANPAY)); | .PushSig(keys.key1, SigHashType().withAnyoneCanPay(true))); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
"P2PK anyonecanpay marked with normal hashtype", 0) | "P2PK anyonecanpay marked with normal hashtype", 0) | ||||
.PushSig(keys.key1, SIGHASH_ALL | SIGHASH_ANYONECANPAY) | .PushSig(keys.key1, SigHashType().withAnyoneCanPay(true)) | ||||
.EditPush(70, "81", "01") | .EditPush(70, "81", "01") | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, | ||||
"P2SH(P2PK)", SCRIPT_VERIFY_P2SH, true) | "P2SH(P2PK)", SCRIPT_VERIFY_P2SH, true) | ||||
.PushSig(keys.key0) | .PushSig(keys.key0) | ||||
.PushRedeem()); | .PushRedeem()); | ||||
▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | ||||
.PushSig(keys.key1) | .PushSig(keys.key1) | ||||
.Num(0) | .Num(0) | ||||
.PushRedeem() | .PushRedeem() | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"P2PK with too much R padding but no DERSIG", 0) | "P2PK with too much R padding but no DERSIG", 0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 31, 32) | .PushSig(keys.key1, SigHashType(), 31, 32) | ||||
.EditPush(1, "43021F", "44022000")); | .EditPush(1, "43021F", "44022000")); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"P2PK with too much R padding", SCRIPT_VERIFY_DERSIG) | "P2PK with too much R padding", SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 31, 32) | .PushSig(keys.key1, SigHashType(), 31, 32) | ||||
.EditPush(1, "43021F", "44022000") | .EditPush(1, "43021F", "44022000") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"P2PK with too much S padding but no DERSIG", 0) | "P2PK with too much S padding but no DERSIG", 0) | ||||
.PushSig(keys.key1, SIGHASH_ALL) | .PushSig(keys.key1) | ||||
.EditPush(1, "44", "45") | .EditPush(1, "44", "45") | ||||
.EditPush(37, "20", "2100")); | .EditPush(37, "20", "2100")); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"P2PK with too much S padding", SCRIPT_VERIFY_DERSIG) | "P2PK with too much S padding", SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key1, SIGHASH_ALL) | .PushSig(keys.key1) | ||||
.EditPush(1, "44", "45") | .EditPush(1, "44", "45") | ||||
.EditPush(37, "20", "2100") | .EditPush(37, "20", "2100") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"P2PK with too little R padding but no DERSIG", 0) | "P2PK with too little R padding but no DERSIG", 0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220")); | .EditPush(1, "45022100", "440220")); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"P2PK with too little R padding", SCRIPT_VERIFY_DERSIG) | "P2PK with too little R padding", SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder( | TestBuilder( | ||||
CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, | CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with bad sig with too much R padding but no DERSIG", 0) | "P2PK NOT with bad sig with too much R padding but no DERSIG", 0) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 31, 32) | .PushSig(keys.key2, SigHashType(), 31, 32) | ||||
.EditPush(1, "43021F", "44022000") | .EditPush(1, "43021F", "44022000") | ||||
.DamagePush(10)); | .DamagePush(10)); | ||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) | ||||
<< OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with bad sig with too much R padding", | "P2PK NOT with bad sig with too much R padding", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 31, 32) | .PushSig(keys.key2, SigHashType(), 31, 32) | ||||
.EditPush(1, "43021F", "44022000") | .EditPush(1, "43021F", "44022000") | ||||
.DamagePush(10) | .DamagePush(10) | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() | TestBuilder(CScript() | ||||
<< ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, | << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with too much R padding but no DERSIG", 0) | "P2PK NOT with too much R padding but no DERSIG", 0) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 31, 32) | .PushSig(keys.key2, SigHashType(), 31, 32) | ||||
.EditPush(1, "43021F", "44022000") | .EditPush(1, "43021F", "44022000") | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) | ||||
<< OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with too much R padding", | "P2PK NOT with too much R padding", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 31, 32) | .PushSig(keys.key2, SigHashType(), 31, 32) | ||||
.EditPush(1, "43021F", "44022000") | .EditPush(1, "43021F", "44022000") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"BIP66 example 1, without DERSIG", 0) | "BIP66 example 1, without DERSIG", 0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220")); | .EditPush(1, "45022100", "440220")); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"BIP66 example 1, with DERSIG", SCRIPT_VERIFY_DERSIG) | "BIP66 example 1, with DERSIG", SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | ||||
<< OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
"BIP66 example 2, without DERSIG", 0) | "BIP66 example 2, without DERSIG", 0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | ||||
<< OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
"BIP66 example 2, with DERSIG", | "BIP66 example 2, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG, | ||||
"BIP66 example 3, without DERSIG", 0) | "BIP66 example 3, without DERSIG", 0) | ||||
.Num(0) | .Num(0) | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back( | tests.push_back( | ||||
Show All 30 Lines | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.Num(1) | .Num(1) | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"BIP66 example 7, without DERSIG", 0) | "BIP66 example 7, without DERSIG", 0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.PushSig(keys.key2)); | .PushSig(keys.key2)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"BIP66 example 7, with DERSIG", | "BIP66 example 7, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.PushSig(keys.key2) | .PushSig(keys.key2) | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG << OP_NOT, | << OP_CHECKMULTISIG << OP_NOT, | ||||
"BIP66 example 8, without DERSIG", 0) | "BIP66 example 8, without DERSIG", 0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.PushSig(keys.key2) | .PushSig(keys.key2) | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG << OP_NOT, | << OP_CHECKMULTISIG << OP_NOT, | ||||
"BIP66 example 8, with DERSIG", | "BIP66 example 8, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.PushSig(keys.key2) | .PushSig(keys.key2) | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"BIP66 example 9, without DERSIG", 0) | "BIP66 example 9, without DERSIG", 0) | ||||
.Num(0) | .Num(0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 33, 32) | .PushSig(keys.key2, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"BIP66 example 9, with DERSIG", | "BIP66 example 9, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.Num(0) | .Num(0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 33, 32) | .PushSig(keys.key2, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG << OP_NOT, | << OP_CHECKMULTISIG << OP_NOT, | ||||
"BIP66 example 10, without DERSIG", 0) | "BIP66 example 10, without DERSIG", 0) | ||||
.Num(0) | .Num(0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 33, 32) | .PushSig(keys.key2, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220")); | .EditPush(1, "45022100", "440220")); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG << OP_NOT, | << OP_CHECKMULTISIG << OP_NOT, | ||||
"BIP66 example 10, with DERSIG", | "BIP66 example 10, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.Num(0) | .Num(0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 33, 32) | .PushSig(keys.key2, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"BIP66 example 11, without DERSIG", 0) | "BIP66 example 11, without DERSIG", 0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.Num(0) | .Num(0) | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"BIP66 example 11, with DERSIG", | "BIP66 example 11, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.Num(0) | .Num(0) | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG << OP_NOT, | << OP_CHECKMULTISIG << OP_NOT, | ||||
"BIP66 example 12, without DERSIG", 0) | "BIP66 example 12, without DERSIG", 0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.Num(0)); | .Num(0)); | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_2 | << ToByteVector(keys.pubkey2C) << OP_2 | ||||
<< OP_CHECKMULTISIG << OP_NOT, | << OP_CHECKMULTISIG << OP_NOT, | ||||
"BIP66 example 12, with DERSIG", | "BIP66 example 12, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL, 33, 32) | .PushSig(keys.key1, SigHashType(), 33, 32) | ||||
.EditPush(1, "45022100", "440220") | .EditPush(1, "45022100", "440220") | ||||
.Num(0)); | .Num(0)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | ||||
"P2PK with multi-byte hashtype, without DERSIG", 0) | "P2PK with multi-byte hashtype, without DERSIG", 0) | ||||
.PushSig(keys.key2, SIGHASH_ALL) | .PushSig(keys.key2) | ||||
.EditPush(70, "01", "0101")); | .EditPush(70, "01", "0101")); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | ||||
"P2PK with multi-byte hashtype, with DERSIG", | "P2PK with multi-byte hashtype, with DERSIG", | ||||
SCRIPT_VERIFY_DERSIG) | SCRIPT_VERIFY_DERSIG) | ||||
.PushSig(keys.key2, SIGHASH_ALL) | .PushSig(keys.key2) | ||||
.EditPush(70, "01", "0101") | .EditPush(70, "01", "0101") | ||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | .ScriptError(SCRIPT_ERR_SIG_DER)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | ||||
"P2PK with high S but no LOW_S", 0) | "P2PK with high S but no LOW_S", 0) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 32, 33)); | .PushSig(keys.key2, SigHashType(), 32, 33)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | ||||
"P2PK with high S", SCRIPT_VERIFY_LOW_S) | "P2PK with high S", SCRIPT_VERIFY_LOW_S) | ||||
.PushSig(keys.key2, SIGHASH_ALL, 32, 33) | .PushSig(keys.key2, SigHashType(), 32, 33) | ||||
.ScriptError(SCRIPT_ERR_SIG_HIGH_S)); | .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | ||||
"P2PK with hybrid pubkey but no STRICTENC", 0) | "P2PK with hybrid pubkey but no STRICTENC", 0) | ||||
.PushSig(keys.key0, SIGHASH_ALL)); | .PushSig(keys.key0)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | ||||
"P2PK with hybrid pubkey", SCRIPT_VERIFY_STRICTENC) | "P2PK with hybrid pubkey", SCRIPT_VERIFY_STRICTENC) | ||||
.PushSig(keys.key0, SIGHASH_ALL) | .PushSig(keys.key0, SigHashType()) | ||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | ||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | ||||
<< OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with hybrid pubkey but no STRICTENC", | "P2PK NOT with hybrid pubkey but no STRICTENC", | ||||
0) | 0) | ||||
.PushSig(keys.key0, SIGHASH_ALL) | .PushSig(keys.key0) | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | ||||
<< OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with hybrid pubkey", | "P2PK NOT with hybrid pubkey", | ||||
SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
.PushSig(keys.key0, SIGHASH_ALL) | .PushSig(keys.key0) | ||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() | TestBuilder(CScript() | ||||
<< ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, | << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with invalid hybrid pubkey but no STRICTENC", 0) | "P2PK NOT with invalid hybrid pubkey but no STRICTENC", 0) | ||||
.PushSig(keys.key0, SIGHASH_ALL) | .PushSig(keys.key0) | ||||
.DamagePush(10)); | .DamagePush(10)); | ||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | ||||
<< OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with invalid hybrid pubkey", | "P2PK NOT with invalid hybrid pubkey", | ||||
SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
.PushSig(keys.key0, SIGHASH_ALL) | .PushSig(keys.key0) | ||||
.DamagePush(10) | .DamagePush(10) | ||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) | TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) | ||||
<< ToByteVector(keys.pubkey1C) << OP_2 | << ToByteVector(keys.pubkey1C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"1-of-2 with the second 1 hybrid pubkey and no STRICTENC", | "1-of-2 with the second 1 hybrid pubkey and no STRICTENC", | ||||
0) | 0) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL)); | .PushSig(keys.key1)); | ||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) | tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0H) | ||||
<< ToByteVector(keys.pubkey1C) << OP_2 | << ToByteVector(keys.pubkey1C) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"1-of-2 with the second 1 hybrid pubkey", | "1-of-2 with the second 1 hybrid pubkey", | ||||
SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL)); | .PushSig(keys.key1)); | ||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) | tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey0H) << OP_2 | << ToByteVector(keys.pubkey0H) << OP_2 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"1-of-2 with the first 1 hybrid pubkey", | "1-of-2 with the first 1 hybrid pubkey", | ||||
SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
.Num(0) | .Num(0) | ||||
.PushSig(keys.key1, SIGHASH_ALL) | .PushSig(keys.key1) | ||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
"P2PK with undefined hashtype but no STRICTENC", 0) | "P2PK with undefined hashtype but no STRICTENC", 0) | ||||
.PushSig(keys.key1, 5)); | .PushSig(keys.key1, SigHashType(5))); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
"P2PK with undefined hashtype", SCRIPT_VERIFY_STRICTENC) | "P2PK with undefined hashtype", SCRIPT_VERIFY_STRICTENC) | ||||
.PushSig(keys.key1, 5) | .PushSig(keys.key1, SigHashType(5)) | ||||
.ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder( | TestBuilder( | ||||
CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT, | CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with invalid sig and undefined hashtype but no STRICTENC", | "P2PK NOT with invalid sig and undefined hashtype but no STRICTENC", | ||||
0) | 0) | ||||
.PushSig(keys.key1, 5) | .PushSig(keys.key1, SigHashType(5)) | ||||
.DamagePush(10)); | .DamagePush(10)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() | TestBuilder(CScript() | ||||
<< ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT, | << ToByteVector(keys.pubkey1) << OP_CHECKSIG << OP_NOT, | ||||
"P2PK NOT with invalid sig and undefined hashtype", | "P2PK NOT with invalid sig and undefined hashtype", | ||||
SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
.PushSig(keys.key1, 5) | .PushSig(keys.key1, SigHashType(5)) | ||||
.DamagePush(10) | .DamagePush(10) | ||||
.ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | ||||
tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | ||||
<< ToByteVector(keys.pubkey1C) | << ToByteVector(keys.pubkey1C) | ||||
<< ToByteVector(keys.pubkey2C) << OP_3 | << ToByteVector(keys.pubkey2C) << OP_3 | ||||
<< OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
"3-of-3 with nonzero dummy but no NULLDUMMY", 0) | "3-of-3 with nonzero dummy but no NULLDUMMY", 0) | ||||
▲ Show 20 Lines • Show All 131 Lines • ▼ Show 20 Lines | tests.push_back( | ||||
.PushSig(keys.key0) | .PushSig(keys.key0) | ||||
.PushRedeem()); | .PushRedeem()); | ||||
static const Amount TEST_AMOUNT(12345000000000); | static const Amount TEST_AMOUNT(12345000000000); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | ||||
"P2PK FORKID", SCRIPT_ENABLE_SIGHASH_FORKID, false, | "P2PK FORKID", SCRIPT_ENABLE_SIGHASH_FORKID, false, | ||||
TEST_AMOUNT) | TEST_AMOUNT) | ||||
.PushSig(keys.key0, SIGHASH_ALL | SIGHASH_FORKID, 32, 32, | .PushSig(keys.key0, SigHashType().withForkId(true), 32, 32, | ||||
TEST_AMOUNT)); | TEST_AMOUNT)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | ||||
"P2PK INVALID AMOUNT", SCRIPT_ENABLE_SIGHASH_FORKID, false, | "P2PK INVALID AMOUNT", SCRIPT_ENABLE_SIGHASH_FORKID, false, | ||||
TEST_AMOUNT) | TEST_AMOUNT) | ||||
.PushSig(keys.key0, SIGHASH_ALL | SIGHASH_FORKID, 32, 32, | .PushSig(keys.key0, SigHashType().withForkId(true), 32, 32, | ||||
TEST_AMOUNT + Amount(1)) | TEST_AMOUNT + Amount(1)) | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | ||||
"P2PK INVALID FORKID", SCRIPT_VERIFY_STRICTENC, false, | "P2PK INVALID FORKID", SCRIPT_VERIFY_STRICTENC, false, | ||||
TEST_AMOUNT) | TEST_AMOUNT) | ||||
.PushSig(keys.key0, SIGHASH_ALL | SIGHASH_FORKID, 32, 32, | .PushSig(keys.key0, SigHashType().withForkId(true), 32, 32, | ||||
TEST_AMOUNT) | TEST_AMOUNT) | ||||
.ScriptError(SCRIPT_ERR_ILLEGAL_FORKID)); | .ScriptError(SCRIPT_ERR_ILLEGAL_FORKID)); | ||||
std::set<std::string> tests_set; | std::set<std::string> tests_set; | ||||
{ | { | ||||
UniValue json_tests = read_json(std::string( | UniValue json_tests = read_json(std::string( | ||||
json_tests::script_tests, | json_tests::script_tests, | ||||
▲ Show 20 Lines • Show All 731 Lines • Show Last 20 Lines |