mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 22:50:59 +01:00
Merge #13429: Return the script type from Solver
984d72ec65 Return the script type from Solver (Ben Woosley)
Pull request description:
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.
Tree-SHA512: 31864f856b8cb75f4b782d12678070e8b1cfe9665c6f57cfb25e7ac8bcea8a22f9a78d7c8cf0101c841f2a612400666fb91798bffe88de856e98b873703b0965
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