Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
Show All 30 Lines | |||||
#include <univalue.h> | #include <univalue.h> | ||||
#include <cstdint> | #include <cstdint> | ||||
#include <fstream> | #include <fstream> | ||||
#include <string> | #include <string> | ||||
#include <vector> | #include <vector> | ||||
// Uncomment if you want to output updated JSON tests. | // Uncomment if you want to output updated JSON tests. | ||||
// #define UPDATE_JSON_TESTS | #define UPDATE_JSON_TESTS | ||||
static const uint32_t gFlags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC; | static const uint32_t gFlags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC; | ||||
struct ScriptErrorDesc { | struct ScriptErrorDesc { | ||||
ScriptError err; | ScriptError err; | ||||
const char *name; | const char *name; | ||||
}; | }; | ||||
static ScriptErrorDesc script_errors[] = { | static ScriptErrorDesc script_errors[] = { | ||||
{ScriptError::OK, "OK"}, | {ScriptError::OK, "OK"}, | ||||
{ScriptError::UNKNOWN, "UNKNOWN_ERROR"}, | {ScriptError::UNKNOWN, "UNKNOWN_ERROR"}, | ||||
{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::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::VERIFY, "VERIFY"}, | {ScriptError::VERIFY, "VERIFY"}, | ||||
{ScriptError::EQUALVERIFY, "EQUALVERIFY"}, | {ScriptError::EQUALVERIFY, "EQUALVERIFY"}, | ||||
{ScriptError::CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY"}, | {ScriptError::CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY"}, | ||||
{ScriptError::CHECKSIGVERIFY, "CHECKSIGVERIFY"}, | {ScriptError::CHECKSIGVERIFY, "CHECKSIGVERIFY"}, | ||||
{ScriptError::CHECKDATASIGVERIFY, "CHECKDATASIGVERIFY"}, | {ScriptError::CHECKDATASIGVERIFY, "CHECKDATASIGVERIFY"}, | ||||
{ScriptError::NUMEQUALVERIFY, "NUMEQUALVERIFY"}, | {ScriptError::NUMEQUALVERIFY, "NUMEQUALVERIFY"}, | ||||
{ScriptError::BAD_OPCODE, "BAD_OPCODE"}, | {ScriptError::BAD_OPCODE, "BAD_OPCODE"}, | ||||
{ScriptError::DISABLED_OPCODE, "DISABLED_OPCODE"}, | {ScriptError::DISABLED_OPCODE, "DISABLED_OPCODE"}, | ||||
Show All 15 Lines | static ScriptErrorDesc script_errors[] = { | ||||
{ScriptError::SIG_BADLENGTH, "SIG_BADLENGTH"}, | {ScriptError::SIG_BADLENGTH, "SIG_BADLENGTH"}, | ||||
{ScriptError::SIG_NONSCHNORR, "SIG_NONSCHNORR"}, | {ScriptError::SIG_NONSCHNORR, "SIG_NONSCHNORR"}, | ||||
{ScriptError::DISCOURAGE_UPGRADABLE_NOPS, "DISCOURAGE_UPGRADABLE_NOPS"}, | {ScriptError::DISCOURAGE_UPGRADABLE_NOPS, "DISCOURAGE_UPGRADABLE_NOPS"}, | ||||
{ScriptError::NONCOMPRESSED_PUBKEY, "NONCOMPRESSED_PUBKEY"}, | {ScriptError::NONCOMPRESSED_PUBKEY, "NONCOMPRESSED_PUBKEY"}, | ||||
{ScriptError::ILLEGAL_FORKID, "ILLEGAL_FORKID"}, | {ScriptError::ILLEGAL_FORKID, "ILLEGAL_FORKID"}, | ||||
{ScriptError::MUST_USE_FORKID, "MISSING_FORKID"}, | {ScriptError::MUST_USE_FORKID, "MISSING_FORKID"}, | ||||
{ScriptError::DIV_BY_ZERO, "DIV_BY_ZERO"}, | {ScriptError::DIV_BY_ZERO, "DIV_BY_ZERO"}, | ||||
{ScriptError::MOD_BY_ZERO, "MOD_BY_ZERO"}, | {ScriptError::MOD_BY_ZERO, "MOD_BY_ZERO"}, | ||||
{ScriptError::INVALID_BITFIELD_SIZE, "BITFIELD_SIZE"}, | |||||
{ScriptError::INVALID_BIT_RANGE, "BIT_RANGE"}, | |||||
}; | }; | ||||
static const char *FormatScriptError(ScriptError err) { | static const char *FormatScriptError(ScriptError err) { | ||||
for (size_t i = 0; i < ARRAYLEN(script_errors); ++i) { | for (size_t i = 0; i < ARRAYLEN(script_errors); ++i) { | ||||
if (script_errors[i].err == err) { | if (script_errors[i].err == err) { | ||||
return script_errors[i].name; | return script_errors[i].name; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,736 Lines • ▼ Show 20 Lines | tests.push_back( | ||||
"recovered-pubkey CHECKMULTISIG with " | "recovered-pubkey CHECKMULTISIG with " | ||||
"64-byte DER w/ SCHNORR_MULTISIG", | "64-byte DER w/ SCHNORR_MULTISIG", | ||||
newmultisigflags) | newmultisigflags) | ||||
.Num(0) | .Num(0) | ||||
.PushECDSASigFromParts(rdata, sdata) | .PushECDSASigFromParts(rdata, sdata) | ||||
.PushECDSARecoveredPubKey(rdata, sdata) | .PushECDSARecoveredPubKey(rdata, sdata) | ||||
.SetScriptError(ScriptError::SIG_BADLENGTH)); | .SetScriptError(ScriptError::SIG_BADLENGTH)); | ||||
} | } | ||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG << OP_NOT, | |||||
"CHECKMULTISIG 2-of-3 w/ SCHNORR_MULTISIG " | |||||
"(return-false still valid via legacy mode)", | |||||
newmultisigflags) | |||||
.Num(0) | |||||
.Num(0) | |||||
.Num(0)); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << OP_0 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 0-of-0 w/ SCHNORR_MULTISIG", | |||||
newmultisigflags) | |||||
.Num(0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(ParseHex("BEEF")) << OP_1 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 0-of-1 w/ SCHNORR_MULTISIG, null dummy", | |||||
newmultisigflags) | |||||
.Num(0)); | |||||
// Tests of schnorr checkmultisig actually turned on (flag on & dummy | |||||
// element is not null). | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-1 Schnorr", | |||||
newmultisigflags) | |||||
.Num(0b1) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-1 Schnorr, nonminimal bits", | |||||
newmultisigflags) | |||||
.Push("0100") | |||||
.PushSigSchnorr(keys.key0) | |||||
.SetScriptError(ScriptError::INVALID_BITFIELD_SIZE)); | |||||
tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 3-of-3 Schnorr", | |||||
newmultisigflags) | |||||
.Num(0b111) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2)); | |||||
tests.push_back(TestBuilder(CScript() << OP_4 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 4-of-3 Schnorr", | |||||
newmultisigflags) | |||||
.Num(0b1111) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.SetScriptError(ScriptError::SIG_COUNT)); | |||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 (110) Schnorr", | |||||
newmultisigflags) | |||||
.Num(0b110) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2)); | |||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 (101) Schnorr", | |||||
newmultisigflags) | |||||
.Num(0b101) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key2)); | |||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 (011) Schnorr", | |||||
newmultisigflags) | |||||
.Num(0b011) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 Schnorr, mismatched bits Schnorr", | |||||
newmultisigflags) | |||||
.Num(0b011) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key2) | |||||
.SetScriptError(ScriptError::SIG_NULLFAIL)); | |||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 Schnorr, all bits set", | |||||
newmultisigflags) | |||||
.Num(0b111) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.SetScriptError(ScriptError::INVALID_BIT_COUNT)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 Schnorr, extra high bit set", | |||||
newmultisigflags) | |||||
.Num(0b1110) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.SetScriptError(ScriptError::INVALID_BIT_RANGE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 Schnorr, too high bit set", | |||||
newmultisigflags) | |||||
.Num(0b1010) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.SetScriptError(ScriptError::INVALID_BIT_RANGE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 Schnorr, too few bits set", | |||||
newmultisigflags) | |||||
.Num(0b010) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.SetScriptError(ScriptError::INVALID_BIT_COUNT)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 Schnorr, with no bits set " | |||||
"(attempt to malleate return-false)", | |||||
newmultisigflags) | |||||
.Push("00") | |||||
.Num(0) | |||||
.Num(0) | |||||
.SetScriptError(ScriptError::INVALID_BIT_COUNT)); | |||||
tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG null dummy with schnorr sigs " | |||||
"(with SCHNORR_MULTISIG on)", | |||||
newmultisigflags) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.SetScriptError(ScriptError::SIG_BADLENGTH)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 Schnorr, misordered signatures", | |||||
newmultisigflags) | |||||
.Num(0b011) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key0) | |||||
.SetScriptError(ScriptError::SIG_NULLFAIL)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) << OP_DUP << OP_2DUP | |||||
<< OP_2DUP << ToByteVector(keys.pubkey2C) << OP_8 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-8 Schnorr, right way to represent 0b10000001", | |||||
newmultisigflags) | |||||
.Num(-1) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key2)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) << OP_DUP << OP_2DUP | |||||
<< OP_2DUP << ToByteVector(keys.pubkey2C) << OP_8 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-8 Schnorr, wrong way to represent 0b10000001", | |||||
newmultisigflags) | |||||
.Num(0b10000001) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key2) | |||||
.SetScriptError(ScriptError::INVALID_BITFIELD_SIZE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() | |||||
<< OP_OVER << OP_DUP << OP_DUP << OP_2DUP << OP_3DUP | |||||
<< OP_3DUP << OP_3DUP << OP_3DUP << 20 | |||||
<< ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_OVER << OP_DUP | |||||
<< OP_DUP << OP_2DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << 20 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 20-of-20 Schnorr", newmultisigflags) | |||||
.Push("ffff0f") | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_OVER << OP_DUP << OP_DUP << OP_2DUP << OP_3DUP | |||||
<< OP_3DUP << OP_3DUP << OP_3DUP << 20 | |||||
<< ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_OVER << OP_DUP | |||||
<< OP_DUP << OP_2DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << 20 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 20-of-20 Schnorr, checkbits +1", newmultisigflags) | |||||
.Push("000010") | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.SetScriptError(ScriptError::INVALID_BIT_RANGE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0C) << OP_DUP | |||||
<< ToByteVector(keys.pubkey1C) << OP_3DUP | |||||
<< OP_3DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << 21 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-21 Schnorr", newmultisigflags) | |||||
.Push("000010") | |||||
.PushSigSchnorr(keys.key0) | |||||
.SetScriptError(ScriptError::PUBKEY_COUNT)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< OP_DUP << OP_2DUP << OP_3DUP | |||||
<< OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << 20 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-20 Schnorr, first key", | |||||
newmultisigflags) | |||||
.Push("010000") | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_1 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) << OP_DUP << OP_2DUP | |||||
<< OP_3DUP << OP_3DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< 20 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-20 Schnorr, first key, wrong endianness", | |||||
newmultisigflags) | |||||
.Push("000001") | |||||
.PushSigSchnorr(keys.key0) | |||||
.SetScriptError(ScriptError::SIG_NULLFAIL)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_1 << ToByteVector(keys.pubkey0C) << OP_2DUP | |||||
<< OP_2DUP << OP_3DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << 20 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-20 Schnorr, truncating zeros not allowed", | |||||
newmultisigflags) | |||||
.Num(1) | |||||
.PushSigSchnorr(keys.key0) | |||||
.SetScriptError(ScriptError::INVALID_BITFIELD_SIZE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() | |||||
<< OP_1 << ToByteVector(keys.pubkey0C) << OP_DUP | |||||
<< OP_2DUP << OP_3DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << ToByteVector(keys.pubkey1C) << 20 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-20 Schnorr, last key", newmultisigflags) | |||||
.Push("000008") | |||||
.PushSigSchnorr(keys.key1)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() | |||||
<< OP_1 << ToByteVector(keys.pubkey0C) << OP_DUP | |||||
<< OP_2DUP << OP_3DUP << OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << ToByteVector(keys.pubkey1C) << 20 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-20 Schnorr, last key, wrong endianness", | |||||
newmultisigflags) | |||||
.Push("080000") | |||||
.PushSigSchnorr(keys.key1) | |||||
.SetScriptError(ScriptError::SIG_NULLFAIL)); | |||||
tests.push_back(TestBuilder(CScript() | |||||
<< OP_1 << ToByteVector(keys.pubkey0C) | |||||
<< OP_DUP << OP_2DUP << OP_3DUP << OP_3DUP | |||||
<< OP_3DUP << OP_3DUP << OP_3DUP | |||||
<< ToByteVector(keys.pubkey1C) << 20 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-20 Schnorr, last key, " | |||||
"truncating zeros not allowed", | |||||
newmultisigflags) | |||||
.Push("0800") | |||||
.PushSigSchnorr(keys.key1) | |||||
.SetScriptError(ScriptError::INVALID_BITFIELD_SIZE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(ParseHex("BEEF")) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 (110) Schnorr, first key garbage", | |||||
newmultisigflags) | |||||
.Num(0b110) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(ParseHex("BEEF")) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 (011) Schnorr, first key garbage", | |||||
newmultisigflags) | |||||
.Num(0b011) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.SetScriptError(ScriptError::PUBKEYTYPE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(ParseHex("BEEF")) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 (011) Schnorr, last key garbage", | |||||
newmultisigflags) | |||||
.Num(0b011) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(ParseHex("BEEF")) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 2-of-3 (110) Schnorr, last key garbage", | |||||
newmultisigflags) | |||||
.Num(0b110) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.SetScriptError(ScriptError::PUBKEYTYPE)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_0 << OP_0 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 0-of-0 with SCHNORR_MULTISIG, dummy must be null", | |||||
newmultisigflags) | |||||
.Push("00") | |||||
.SetScriptError(ScriptError::INVALID_BITFIELD_SIZE)); | |||||
tests.push_back(TestBuilder(CScript() | |||||
<< OP_0 << ToByteVector(ParseHex("BEEF")) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 0-of-1 with SCHNORR_MULTISIG, " | |||||
"dummy need not be null", | |||||
newmultisigflags) | |||||
.Push("00")); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIG, | |||||
"SCHNORR_MULTISIG implies that NULLDUMMY flag has no effect", | |||||
newmultisigflags | SCRIPT_VERIFY_NULLDUMMY) | |||||
.Num(0b1) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"OP_CHECKMULTISIGVERIFY Schnorr", newmultisigflags) | |||||
.Num(0b1) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 1-of-1 ECDSA signature in Schnorr mode", | |||||
newmultisigflags) | |||||
.Num(0b1) | |||||
.PushSigECDSA(keys.key0) | |||||
.SetScriptError(ScriptError::SIG_NONSCHNORR)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << OP_3 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG 3-of-3 Schnorr with mixed-in ECDSA signature", | |||||
newmultisigflags) | |||||
.Num(0b111) | |||||
.PushSigECDSA(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.SetScriptError(ScriptError::SIG_NONSCHNORR)); | |||||
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))); | ||||
▲ Show 20 Lines • Show All 804 Lines • Show Last 20 Lines |