Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_standard_tests.cpp
Show All 25 Lines | BOOST_AUTO_TEST_CASE(script_standard_Solver_success) { | ||||
txnouttype whichType; | txnouttype whichType; | ||||
std::vector<std::vector<uint8_t>> solutions; | std::vector<std::vector<uint8_t>> solutions; | ||||
// TX_PUBKEY | // TX_PUBKEY | ||||
s.clear(); | s.clear(); | ||||
s << ToByteVector(pubkeys[0]) << OP_CHECKSIG; | s << ToByteVector(pubkeys[0]) << OP_CHECKSIG; | ||||
BOOST_CHECK(Solver(s, whichType, solutions)); | BOOST_CHECK(Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEY); | BOOST_CHECK_EQUAL(whichType, TX_PUBKEY); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 1); | BOOST_CHECK_EQUAL(solutions.size(), 1U); | ||||
BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0])); | BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0])); | ||||
// TX_PUBKEYHASH | // TX_PUBKEYHASH | ||||
s.clear(); | s.clear(); | ||||
s << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) | s << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) | ||||
<< OP_EQUALVERIFY << OP_CHECKSIG; | << OP_EQUALVERIFY << OP_CHECKSIG; | ||||
BOOST_CHECK(Solver(s, whichType, solutions)); | BOOST_CHECK(Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEYHASH); | BOOST_CHECK_EQUAL(whichType, TX_PUBKEYHASH); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 1); | BOOST_CHECK_EQUAL(solutions.size(), 1U); | ||||
BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0].GetID())); | BOOST_CHECK(solutions[0] == ToByteVector(pubkeys[0].GetID())); | ||||
// TX_SCRIPTHASH | // TX_SCRIPTHASH | ||||
CScript redeemScript(s); // initialize with leftover P2PKH script | CScript redeemScript(s); // initialize with leftover P2PKH script | ||||
s.clear(); | s.clear(); | ||||
s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL; | s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL; | ||||
BOOST_CHECK(Solver(s, whichType, solutions)); | BOOST_CHECK(Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_SCRIPTHASH); | BOOST_CHECK_EQUAL(whichType, TX_SCRIPTHASH); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 1); | BOOST_CHECK_EQUAL(solutions.size(), 1U); | ||||
BOOST_CHECK(solutions[0] == ToByteVector(CScriptID(redeemScript))); | BOOST_CHECK(solutions[0] == ToByteVector(CScriptID(redeemScript))); | ||||
// TX_MULTISIG | // TX_MULTISIG | ||||
s.clear(); | s.clear(); | ||||
s << OP_1 << ToByteVector(pubkeys[0]) << ToByteVector(pubkeys[1]) << OP_2 | s << OP_1 << ToByteVector(pubkeys[0]) << ToByteVector(pubkeys[1]) << OP_2 | ||||
<< OP_CHECKMULTISIG; | << OP_CHECKMULTISIG; | ||||
BOOST_CHECK(Solver(s, whichType, solutions)); | BOOST_CHECK(Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_MULTISIG); | BOOST_CHECK_EQUAL(whichType, TX_MULTISIG); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 4); | BOOST_CHECK_EQUAL(solutions.size(), 4U); | ||||
BOOST_CHECK(solutions[0] == std::vector<uint8_t>({1})); | BOOST_CHECK(solutions[0] == std::vector<uint8_t>({1})); | ||||
BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0])); | BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0])); | ||||
BOOST_CHECK(solutions[2] == ToByteVector(pubkeys[1])); | BOOST_CHECK(solutions[2] == ToByteVector(pubkeys[1])); | ||||
BOOST_CHECK(solutions[3] == std::vector<uint8_t>({2})); | BOOST_CHECK(solutions[3] == std::vector<uint8_t>({2})); | ||||
s.clear(); | s.clear(); | ||||
s << OP_2 << ToByteVector(pubkeys[0]) << ToByteVector(pubkeys[1]) | s << OP_2 << ToByteVector(pubkeys[0]) << ToByteVector(pubkeys[1]) | ||||
<< ToByteVector(pubkeys[2]) << OP_3 << OP_CHECKMULTISIG; | << ToByteVector(pubkeys[2]) << OP_3 << OP_CHECKMULTISIG; | ||||
BOOST_CHECK(Solver(s, whichType, solutions)); | BOOST_CHECK(Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_MULTISIG); | BOOST_CHECK_EQUAL(whichType, TX_MULTISIG); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 5); | BOOST_CHECK_EQUAL(solutions.size(), 5U); | ||||
BOOST_CHECK(solutions[0] == std::vector<uint8_t>({2})); | BOOST_CHECK(solutions[0] == std::vector<uint8_t>({2})); | ||||
BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0])); | BOOST_CHECK(solutions[1] == ToByteVector(pubkeys[0])); | ||||
BOOST_CHECK(solutions[2] == ToByteVector(pubkeys[1])); | BOOST_CHECK(solutions[2] == ToByteVector(pubkeys[1])); | ||||
BOOST_CHECK(solutions[3] == ToByteVector(pubkeys[2])); | BOOST_CHECK(solutions[3] == ToByteVector(pubkeys[2])); | ||||
BOOST_CHECK(solutions[4] == std::vector<uint8_t>({3})); | BOOST_CHECK(solutions[4] == std::vector<uint8_t>({3})); | ||||
// TX_NULL_DATA | // TX_NULL_DATA | ||||
s.clear(); | s.clear(); | ||||
s << OP_RETURN << std::vector<uint8_t>({0}) << std::vector<uint8_t>({75}) | s << OP_RETURN << std::vector<uint8_t>({0}) << std::vector<uint8_t>({75}) | ||||
<< std::vector<uint8_t>({255}); | << std::vector<uint8_t>({255}); | ||||
BOOST_CHECK(Solver(s, whichType, solutions)); | BOOST_CHECK(Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_NULL_DATA); | BOOST_CHECK_EQUAL(whichType, TX_NULL_DATA); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 0); | BOOST_CHECK_EQUAL(solutions.size(), 0U); | ||||
// TX_WITNESS_V0_KEYHASH | // TX_WITNESS_V0_KEYHASH | ||||
s.clear(); | s.clear(); | ||||
s << OP_0 << ToByteVector(pubkeys[0].GetID()); | s << OP_0 << ToByteVector(pubkeys[0].GetID()); | ||||
BOOST_CHECK(!Solver(s, whichType, solutions)); | BOOST_CHECK(!Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_NONSTANDARD); | BOOST_CHECK_EQUAL(whichType, TX_NONSTANDARD); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 0); | BOOST_CHECK_EQUAL(solutions.size(), 0U); | ||||
// TX_WITNESS_V0_SCRIPTHASH | // TX_WITNESS_V0_SCRIPTHASH | ||||
uint256 scriptHash; | uint256 scriptHash; | ||||
CSHA256() | CSHA256() | ||||
.Write(&redeemScript[0], redeemScript.size()) | .Write(&redeemScript[0], redeemScript.size()) | ||||
.Finalize(scriptHash.begin()); | .Finalize(scriptHash.begin()); | ||||
s.clear(); | s.clear(); | ||||
s << OP_0 << ToByteVector(scriptHash); | s << OP_0 << ToByteVector(scriptHash); | ||||
BOOST_CHECK(!Solver(s, whichType, solutions)); | BOOST_CHECK(!Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_NONSTANDARD); | BOOST_CHECK_EQUAL(whichType, TX_NONSTANDARD); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 0); | BOOST_CHECK_EQUAL(solutions.size(), 0U); | ||||
// TX_NONSTANDARD | // TX_NONSTANDARD | ||||
s.clear(); | s.clear(); | ||||
s << OP_9 << OP_ADD << OP_11 << OP_EQUAL; | s << OP_9 << OP_ADD << OP_11 << OP_EQUAL; | ||||
BOOST_CHECK(!Solver(s, whichType, solutions)); | BOOST_CHECK(!Solver(s, whichType, solutions)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_NONSTANDARD); | BOOST_CHECK_EQUAL(whichType, TX_NONSTANDARD); | ||||
BOOST_CHECK_EQUAL(solutions.size(), 0); | BOOST_CHECK_EQUAL(solutions.size(), 0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 126 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(script_standard_ExtractDestinations) { | ||||
std::vector<CTxDestination> addresses; | std::vector<CTxDestination> addresses; | ||||
int nRequired; | int nRequired; | ||||
// TX_PUBKEY | // TX_PUBKEY | ||||
s.clear(); | s.clear(); | ||||
s << ToByteVector(pubkeys[0]) << OP_CHECKSIG; | s << ToByteVector(pubkeys[0]) << OP_CHECKSIG; | ||||
BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEY); | BOOST_CHECK_EQUAL(whichType, TX_PUBKEY); | ||||
BOOST_CHECK_EQUAL(addresses.size(), 1); | BOOST_CHECK_EQUAL(addresses.size(), 1U); | ||||
BOOST_CHECK_EQUAL(nRequired, 1); | BOOST_CHECK_EQUAL(nRequired, 1); | ||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) && | BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) && | ||||
*boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID()); | *boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID()); | ||||
// TX_PUBKEYHASH | // TX_PUBKEYHASH | ||||
s.clear(); | s.clear(); | ||||
s << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) | s << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) | ||||
<< OP_EQUALVERIFY << OP_CHECKSIG; | << OP_EQUALVERIFY << OP_CHECKSIG; | ||||
BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEYHASH); | BOOST_CHECK_EQUAL(whichType, TX_PUBKEYHASH); | ||||
BOOST_CHECK_EQUAL(addresses.size(), 1); | BOOST_CHECK_EQUAL(addresses.size(), 1U); | ||||
BOOST_CHECK_EQUAL(nRequired, 1); | BOOST_CHECK_EQUAL(nRequired, 1); | ||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) && | BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) && | ||||
*boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID()); | *boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID()); | ||||
// TX_SCRIPTHASH | // TX_SCRIPTHASH | ||||
// initialize with leftover P2PKH script | // initialize with leftover P2PKH script | ||||
CScript redeemScript(s); | CScript redeemScript(s); | ||||
s.clear(); | s.clear(); | ||||
s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL; | s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL; | ||||
BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_SCRIPTHASH); | BOOST_CHECK_EQUAL(whichType, TX_SCRIPTHASH); | ||||
BOOST_CHECK_EQUAL(addresses.size(), 1); | BOOST_CHECK_EQUAL(addresses.size(), 1U); | ||||
BOOST_CHECK_EQUAL(nRequired, 1); | BOOST_CHECK_EQUAL(nRequired, 1); | ||||
BOOST_CHECK(boost::get<CScriptID>(&addresses[0]) && | BOOST_CHECK(boost::get<CScriptID>(&addresses[0]) && | ||||
*boost::get<CScriptID>(&addresses[0]) == | *boost::get<CScriptID>(&addresses[0]) == | ||||
CScriptID(redeemScript)); | CScriptID(redeemScript)); | ||||
// TX_MULTISIG | // TX_MULTISIG | ||||
s.clear(); | s.clear(); | ||||
s << OP_2 << ToByteVector(pubkeys[0]) << ToByteVector(pubkeys[1]) << OP_2 | s << OP_2 << ToByteVector(pubkeys[0]) << ToByteVector(pubkeys[1]) << OP_2 | ||||
<< OP_CHECKMULTISIG; | << OP_CHECKMULTISIG; | ||||
BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | BOOST_CHECK(ExtractDestinations(s, whichType, addresses, nRequired)); | ||||
BOOST_CHECK_EQUAL(whichType, TX_MULTISIG); | BOOST_CHECK_EQUAL(whichType, TX_MULTISIG); | ||||
BOOST_CHECK_EQUAL(addresses.size(), 2); | BOOST_CHECK_EQUAL(addresses.size(), 2U); | ||||
BOOST_CHECK_EQUAL(nRequired, 2); | BOOST_CHECK_EQUAL(nRequired, 2); | ||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) && | BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) && | ||||
*boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID()); | *boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID()); | ||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[1]) && | BOOST_CHECK(boost::get<CKeyID>(&addresses[1]) && | ||||
*boost::get<CKeyID>(&addresses[1]) == pubkeys[1].GetID()); | *boost::get<CKeyID>(&addresses[1]) == pubkeys[1].GetID()); | ||||
// TX_NULL_DATA | // TX_NULL_DATA | ||||
s.clear(); | s.clear(); | ||||
▲ Show 20 Lines • Show All 261 Lines • Show Last 20 Lines |