mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 22:50:59 +01:00
Return the script type from Solver
Because false is synonymous with TX_NONSTANDARD, this conveys the same information and makes the handling explicitly based on script type, simplifying each call site. Prior to this change it was common for the return value to be ignored, or for the return value and TX_NONSTANDARD to be redundantly handled.
This commit is contained in:
@@ -25,22 +25,19 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
|
||||
}
|
||||
|
||||
CScript s;
|
||||
txnouttype whichType;
|
||||
std::vector<std::vector<unsigned char> > solutions;
|
||||
|
||||
// TX_PUBKEY
|
||||
s.clear();
|
||||
s << ToByteVector(pubkeys[0]) << OP_CHECKSIG;
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEY);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_PUBKEY);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 1U);
|
||||
BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0]));
|
||||
|
||||
// TX_PUBKEYHASH
|
||||
s.clear();
|
||||
s << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEYHASH);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_PUBKEYHASH);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 1U);
|
||||
BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0].GetID()));
|
||||
|
||||
@@ -48,8 +45,7 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
|
||||
CScript redeemScript(s); // initialize with leftover P2PKH script
|
||||
s.clear();
|
||||
s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_SCRIPTHASH);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_SCRIPTHASH);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 1U);
|
||||
BOOST_CHECK(solutions[0] == ToByteVector(CScriptID(redeemScript)));
|
||||
|
||||
@@ -59,8 +55,7 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
|
||||
ToByteVector(pubkeys[0]) <<
|
||||
ToByteVector(pubkeys[1]) <<
|
||||
OP_2 << OP_CHECKMULTISIG;
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_MULTISIG);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_MULTISIG);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 4U);
|
||||
BOOST_CHECK(solutions[0] == std::vector<unsigned char>({1}));
|
||||
BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0]));
|
||||
@@ -73,8 +68,7 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
|
||||
ToByteVector(pubkeys[1]) <<
|
||||
ToByteVector(pubkeys[2]) <<
|
||||
OP_3 << OP_CHECKMULTISIG;
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_MULTISIG);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_MULTISIG);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 5U);
|
||||
BOOST_CHECK(solutions[0] == std::vector<unsigned char>({2}));
|
||||
BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0]));
|
||||
@@ -88,15 +82,13 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
|
||||
std::vector<unsigned char>({0}) <<
|
||||
std::vector<unsigned char>({75}) <<
|
||||
std::vector<unsigned char>({255});
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_NULL_DATA);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NULL_DATA);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 0U);
|
||||
|
||||
// TX_WITNESS_V0_KEYHASH
|
||||
s.clear();
|
||||
s << OP_0 << ToByteVector(pubkeys[0].GetID());
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_WITNESS_V0_KEYHASH);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_WITNESS_V0_KEYHASH);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 1U);
|
||||
BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0].GetID()));
|
||||
|
||||
@@ -107,16 +99,14 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
|
||||
|
||||
s.clear();
|
||||
s << OP_0 << ToByteVector(scriptHash);
|
||||
BOOST_CHECK(Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_WITNESS_V0_SCRIPTHASH);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_WITNESS_V0_SCRIPTHASH);
|
||||
BOOST_CHECK_EQUAL(solutions.size(), 1U);
|
||||
BOOST_CHECK(solutions[0] == ToByteVector(scriptHash));
|
||||
|
||||
// TX_NONSTANDARD
|
||||
s.clear();
|
||||
s << OP_9 << OP_ADD << OP_11 << OP_EQUAL;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(whichType, TX_NONSTANDARD);
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(script_standard_Solver_failure)
|
||||
@@ -127,53 +117,52 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_failure)
|
||||
pubkey = key.GetPubKey();
|
||||
|
||||
CScript s;
|
||||
txnouttype whichType;
|
||||
std::vector<std::vector<unsigned char> > solutions;
|
||||
|
||||
// TX_PUBKEY with incorrectly sized pubkey
|
||||
s.clear();
|
||||
s << std::vector<unsigned char>(30, 0x01) << OP_CHECKSIG;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_PUBKEYHASH with incorrectly sized key hash
|
||||
s.clear();
|
||||
s << OP_DUP << OP_HASH160 << ToByteVector(pubkey) << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_SCRIPTHASH with incorrectly sized script hash
|
||||
s.clear();
|
||||
s << OP_HASH160 << std::vector<unsigned char>(21, 0x01) << OP_EQUAL;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_MULTISIG 0/2
|
||||
s.clear();
|
||||
s << OP_0 << ToByteVector(pubkey) << OP_1 << OP_CHECKMULTISIG;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_MULTISIG 2/1
|
||||
s.clear();
|
||||
s << OP_2 << ToByteVector(pubkey) << OP_1 << OP_CHECKMULTISIG;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_MULTISIG n = 2 with 1 pubkey
|
||||
s.clear();
|
||||
s << OP_1 << ToByteVector(pubkey) << OP_2 << OP_CHECKMULTISIG;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_MULTISIG n = 1 with 0 pubkeys
|
||||
s.clear();
|
||||
s << OP_1 << OP_1 << OP_CHECKMULTISIG;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_NULL_DATA with other opcodes
|
||||
s.clear();
|
||||
s << OP_RETURN << std::vector<unsigned char>({75}) << OP_ADD;
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
|
||||
// TX_WITNESS with incorrect program size
|
||||
s.clear();
|
||||
s << OP_0 << std::vector<unsigned char>(19, 0x01);
|
||||
BOOST_CHECK(!Solver(s, whichType, solutions));
|
||||
BOOST_CHECK_EQUAL(Solver(s, solutions), TX_NONSTANDARD);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(script_standard_ExtractDestination)
|
||||
|
||||
Reference in New Issue
Block a user