Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
Show First 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | static ScriptErrorDesc script_errors[] = { | ||||
{ScriptError::EVAL_FALSE, "EVAL_FALSE"}, | {ScriptError::EVAL_FALSE, "EVAL_FALSE"}, | ||||
{ScriptError::OP_RETURN, "OP_RETURN"}, | {ScriptError::OP_RETURN, "OP_RETURN"}, | ||||
{ScriptError::SCRIPT_SIZE, "SCRIPT_SIZE"}, | {ScriptError::SCRIPT_SIZE, "SCRIPT_SIZE"}, | ||||
{ScriptError::PUSH_SIZE, "PUSH_SIZE"}, | {ScriptError::PUSH_SIZE, "PUSH_SIZE"}, | ||||
{ScriptError::OP_COUNT, "OP_COUNT"}, | {ScriptError::OP_COUNT, "OP_COUNT"}, | ||||
{ScriptError::STACK_SIZE, "STACK_SIZE"}, | {ScriptError::STACK_SIZE, "STACK_SIZE"}, | ||||
{ScriptError::SIG_COUNT, "SIG_COUNT"}, | {ScriptError::SIG_COUNT, "SIG_COUNT"}, | ||||
{ScriptError::PUBKEY_COUNT, "PUBKEY_COUNT"}, | {ScriptError::PUBKEY_COUNT, "PUBKEY_COUNT"}, | ||||
{ScriptError::INPUT_SIGCHECKS, "INPUT_SIGCHECKS"}, | |||||
{ScriptError::INVALID_OPERAND_SIZE, "OPERAND_SIZE"}, | {ScriptError::INVALID_OPERAND_SIZE, "OPERAND_SIZE"}, | ||||
{ScriptError::INVALID_NUMBER_RANGE, "INVALID_NUMBER_RANGE"}, | {ScriptError::INVALID_NUMBER_RANGE, "INVALID_NUMBER_RANGE"}, | ||||
{ScriptError::IMPOSSIBLE_ENCODING, "IMPOSSIBLE_ENCODING"}, | {ScriptError::IMPOSSIBLE_ENCODING, "IMPOSSIBLE_ENCODING"}, | ||||
{ScriptError::INVALID_SPLIT_RANGE, "SPLIT_RANGE"}, | {ScriptError::INVALID_SPLIT_RANGE, "SPLIT_RANGE"}, | ||||
{ScriptError::INVALID_BIT_COUNT, "INVALID_BIT_COUNT"}, | {ScriptError::INVALID_BIT_COUNT, "INVALID_BIT_COUNT"}, | ||||
{ScriptError::VERIFY, "VERIFY"}, | {ScriptError::VERIFY, "VERIFY"}, | ||||
{ScriptError::EQUALVERIFY, "EQUALVERIFY"}, | {ScriptError::EQUALVERIFY, "EQUALVERIFY"}, | ||||
{ScriptError::CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY"}, | {ScriptError::CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY"}, | ||||
▲ Show 20 Lines • Show All 2,171 Lines • ▼ Show 20 Lines | tests.push_back( | ||||
"CHECKMULTISIG 3-of-3 Schnorr with mixed-in ECDSA signature", | "CHECKMULTISIG 3-of-3 Schnorr with mixed-in ECDSA signature", | ||||
newmultisigflags) | newmultisigflags) | ||||
.Num(0b111) | .Num(0b111) | ||||
.PushSigECDSA(keys.key0) | .PushSigECDSA(keys.key0) | ||||
.PushSigSchnorr(keys.key1) | .PushSigSchnorr(keys.key1) | ||||
.PushSigSchnorr(keys.key2) | .PushSigSchnorr(keys.key2) | ||||
.SetScriptError(ScriptError::SIG_NONSCHNORR)); | .SetScriptError(ScriptError::SIG_NONSCHNORR)); | ||||
// SigChecks tests follow. We want to primarily focus on behaviour with | |||||
// the modern set of (relevant) flags. | |||||
uint32_t sigchecksflags = | |||||
SCRIPT_ENABLE_SCHNORR_MULTISIG | SCRIPT_VERIFY_NULLFAIL | | |||||
SCRIPT_VERIFY_MINIMALDATA | SCRIPT_VERIFY_STRICTENC | | |||||
SCRIPT_VERIFY_INPUT_SIGCHECKS | SCRIPT_VERIFY_P2SH; | |||||
// First, try some important use cases that we want to make sure are | |||||
// supported but that have high density of sigchecks. | |||||
tests.push_back(TestBuilder(CScript() << 1 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << 3 | |||||
<< OP_CHECKMULTISIG, | |||||
"SigChecks on bare CHECKMULTISIG 1-of-3 ECDSA", | |||||
sigchecksflags) | |||||
.Num(0) | |||||
.PushSigECDSA(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << 1 << ToByteVector(keys.pubkey0C) << -1 << -1 | |||||
<< -1 << -1 << -1 << -1 << -1 << -1 << -1 << -1 | |||||
<< -1 << -1 << -1 << -1 << -1 << -1 << -1 << -1 | |||||
<< -1 << 20 << OP_CHECKMULTISIG, | |||||
"SigChecks on bare CHECKMULTISIG 1-of-20 Schnorr", | |||||
sigchecksflags) | |||||
.Push("010000") | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, | |||||
"SigChecks on P2PK Schnorr", sigchecksflags) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, | |||||
"SigChecks on P2PK ECDSA", sigchecksflags) | |||||
.PushSigECDSA(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() | |||||
<< 1 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) | |||||
<< ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) | |||||
<< ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) | |||||
<< ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) | |||||
<< ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) | |||||
<< ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) | |||||
<< ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) | |||||
<< 15 << OP_CHECKMULTISIG, | |||||
"SigChecks on P2SH CHECKMULTISIG 1-of-15 ECDSA with compressed " | |||||
"keys", | |||||
sigchecksflags, true) | |||||
.Num(0) | |||||
.PushSigECDSA(keys.key0) | |||||
.PushRedeem()); | |||||
tests.push_back( | |||||
TestBuilder(CScript() | |||||
<< ToByteVector(keys.pubkey0C) << 0 << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_OVER | |||||
<< OP_CHECKSIG << OP_OVER << OP_CHECKSIG << OP_DROP, | |||||
"Null signatures make no SigChecks (CHECKSIG)", | |||||
sigchecksflags, true) | |||||
.PushRedeem()); | |||||
tests.push_back( | |||||
TestBuilder(CScript() | |||||
<< 0 << ToByteVector(keys.pubkey0C) << 0 << 0 | |||||
<< OP_2OVER << OP_CHECKDATASIG << OP_2OVER | |||||
<< OP_CHECKDATASIG << OP_2OVER << OP_CHECKDATASIG | |||||
<< OP_2OVER << OP_CHECKDATASIG << OP_2OVER | |||||
<< OP_CHECKDATASIG << OP_2OVER << OP_CHECKDATASIG | |||||
<< OP_2OVER << OP_CHECKDATASIG << OP_2OVER | |||||
<< OP_CHECKDATASIG << OP_2OVER << OP_CHECKDATASIG | |||||
<< OP_2OVER << OP_CHECKDATASIG << OP_2OVER | |||||
<< OP_CHECKDATASIG << OP_2OVER << OP_CHECKDATASIG | |||||
<< OP_2OVER << OP_CHECKDATASIG << OP_2OVER | |||||
<< OP_CHECKDATASIG << OP_2OVER << OP_CHECKDATASIG | |||||
<< OP_2OVER << OP_CHECKDATASIG << OP_2DROP << OP_NIP, | |||||
"Null signatures make no SigChecks (CHECKDATASIG)", | |||||
sigchecksflags, true) | |||||
.PushRedeem()); | |||||
// Note that the following test case is "legacy-only", there is no schnorr | |||||
// counterpart since schnorr mode does not permit any null signatures nor | |||||
// an incorrect popcount in checkbits. | |||||
tests.push_back( | |||||
TestBuilder(CScript() | |||||
<< OP_DUP << OP_2DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << 16 << ToByteVector(keys.pubkey0C) | |||||
<< OP_DUP << OP_2DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << 16 << OP_CHECKMULTISIG << OP_NOT, | |||||
"Null signatures make no SigChecks (CHECKMULTISIG)", | |||||
sigchecksflags, true) | |||||
.Num(0) | |||||
.Num(0) | |||||
.PushRedeem()); | |||||
// Now some unusual use cases (some are unsupported behaviour) | |||||
tests.push_back(TestBuilder(CScript() << 1 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) | |||||
<< OP_DUP << 4 << OP_CHECKMULTISIG, | |||||
"SigChecks on bare CHECKMULTISIG 1-of-4 ECDSA", | |||||
sigchecksflags) | |||||
.Num(0) | |||||
.PushSigECDSA(keys.key0) | |||||
.SetScriptError(ScriptError::INPUT_SIGCHECKS)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() | |||||
<< 1 << -1 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << 15 << OP_CHECKMULTISIG, | |||||
"SigChecks on P2SH CHECKMULTISIG 1-of-15 ECDSA with a runt key", | |||||
sigchecksflags, true) | |||||
.Num(0) | |||||
.PushSigECDSA(keys.key0) | |||||
.PushRedeem() | |||||
.SetScriptError(ScriptError::INPUT_SIGCHECKS)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() | |||||
<< 1 << -1 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << 15 << OP_CHECKMULTISIG, | |||||
"SigChecks on P2SH CHECKMULTISIG 1-of-15 Schnorr with a runt key", | |||||
sigchecksflags, true) | |||||
.Push("0200") | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushRedeem()); | |||||
tests.push_back(TestBuilder(CScript() << 0 << -1 << -1 << -1 << -1 << -1 | |||||
<< -1 << -1 << -1 << -1 << -1 << 10 | |||||
<< OP_CHECKMULTISIG, | |||||
"Very short P2SH multisig 0-of-10, spent with " | |||||
"legacy mode (0 sigchecks)", | |||||
sigchecksflags, true) | |||||
.Num(0) | |||||
.PushRedeem()); | |||||
tests.push_back(TestBuilder(CScript() << 0 << -1 << -1 << -1 << -1 << -1 | |||||
<< -1 << -1 << -1 << -1 << -1 << 10 | |||||
<< OP_CHECKMULTISIG, | |||||
"Very short P2SH multisig 0-of-10, spent with " | |||||
"schnorr mode (0 sigchecks)", | |||||
sigchecksflags, true) | |||||
.Push("0000") | |||||
.PushRedeem()); | |||||
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, | ||||
json_tests::script_tests + sizeof(json_tests::script_tests))); | json_tests::script_tests + sizeof(json_tests::script_tests))); | ||||
for (unsigned int idx = 0; idx < json_tests.size(); idx++) { | for (unsigned int idx = 0; idx < json_tests.size(); idx++) { | ||||
▲ Show 20 Lines • Show All 832 Lines • Show Last 20 Lines |