Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
Show All 30 Lines | |||||
#include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||
#include <univalue.h> | #include <univalue.h> | ||||
// 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 flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC; | static const uint32_t gFlags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC; | ||||
struct ScriptErrorDesc { | struct ScriptErrorDesc { | ||||
ScriptError_t err; | ScriptError_t err; | ||||
const char *name; | const char *name; | ||||
}; | }; | ||||
static ScriptErrorDesc script_errors[] = { | static ScriptErrorDesc script_errors[] = { | ||||
{SCRIPT_ERR_OK, "OK"}, | {SCRIPT_ERR_OK, "OK"}, | ||||
▲ Show 20 Lines • Show All 1,421 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) { | ||||
CMutableTransaction txFrom12 = | CMutableTransaction txFrom12 = | ||||
BuildCreditingTransaction(scriptPubKey12, Amount::zero()); | BuildCreditingTransaction(scriptPubKey12, Amount::zero()); | ||||
CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12); | CMutableTransaction txTo12 = BuildSpendingTransaction(CScript(), txFrom12); | ||||
CScript goodsig1 = | CScript goodsig1 = | ||||
sign_multisig(scriptPubKey12, key1, CTransaction(txTo12)); | sign_multisig(scriptPubKey12, key1, CTransaction(txTo12)); | ||||
BOOST_CHECK(VerifyScript( | BOOST_CHECK(VerifyScript( | ||||
goodsig1, scriptPubKey12, flags, | goodsig1, scriptPubKey12, gFlags, | ||||
MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | ||||
txTo12.vout[0].nValue = 2 * SATOSHI; | txTo12.vout[0].nValue = 2 * SATOSHI; | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
goodsig1, scriptPubKey12, flags, | goodsig1, scriptPubKey12, gFlags, | ||||
MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | ||||
CScript goodsig2 = | CScript goodsig2 = | ||||
sign_multisig(scriptPubKey12, key2, CTransaction(txTo12)); | sign_multisig(scriptPubKey12, key2, CTransaction(txTo12)); | ||||
BOOST_CHECK(VerifyScript( | BOOST_CHECK(VerifyScript( | ||||
goodsig2, scriptPubKey12, flags, | goodsig2, scriptPubKey12, gFlags, | ||||
MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | ||||
CScript badsig1 = sign_multisig(scriptPubKey12, key3, CTransaction(txTo12)); | CScript badsig1 = sign_multisig(scriptPubKey12, key3, CTransaction(txTo12)); | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
badsig1, scriptPubKey12, flags, | badsig1, scriptPubKey12, gFlags, | ||||
MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | MutableTransactionSignatureChecker(&txTo12, 0, txFrom12.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) { | BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) { | ||||
ScriptError err; | ScriptError err; | ||||
CKey key1, key2, key3, key4; | CKey key1, key2, key3, key4; | ||||
Show All 20 Lines | BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) { | ||||
const CTransaction txTo23(mutableTxTo23); | const CTransaction txTo23(mutableTxTo23); | ||||
std::vector<CKey> keys; | std::vector<CKey> keys; | ||||
keys.push_back(key1); | keys.push_back(key1); | ||||
keys.push_back(key2); | keys.push_back(key2); | ||||
CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(VerifyScript( | BOOST_CHECK(VerifyScript( | ||||
goodsig1, scriptPubKey23, flags, | goodsig1, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | ||||
keys.clear(); | keys.clear(); | ||||
keys.push_back(key1); | keys.push_back(key1); | ||||
keys.push_back(key3); | keys.push_back(key3); | ||||
CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(VerifyScript( | BOOST_CHECK(VerifyScript( | ||||
goodsig2, scriptPubKey23, flags, | goodsig2, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | ||||
keys.clear(); | keys.clear(); | ||||
keys.push_back(key2); | keys.push_back(key2); | ||||
keys.push_back(key3); | keys.push_back(key3); | ||||
CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(VerifyScript( | BOOST_CHECK(VerifyScript( | ||||
goodsig3, scriptPubKey23, flags, | goodsig3, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err)); | ||||
keys.clear(); | keys.clear(); | ||||
keys.push_back(key2); | keys.push_back(key2); | ||||
keys.push_back(key2); // Can't re-use sig | keys.push_back(key2); // Can't re-use sig | ||||
CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
badsig1, scriptPubKey23, flags, | badsig1, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | ||||
keys.clear(); | keys.clear(); | ||||
keys.push_back(key2); | keys.push_back(key2); | ||||
keys.push_back(key1); // sigs must be in correct order | keys.push_back(key1); // sigs must be in correct order | ||||
CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
badsig2, scriptPubKey23, flags, | badsig2, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | ||||
keys.clear(); | keys.clear(); | ||||
keys.push_back(key3); | keys.push_back(key3); | ||||
keys.push_back(key2); // sigs must be in correct order | keys.push_back(key2); // sigs must be in correct order | ||||
CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
badsig3, scriptPubKey23, flags, | badsig3, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | ||||
keys.clear(); | keys.clear(); | ||||
keys.push_back(key4); | keys.push_back(key4); | ||||
keys.push_back(key2); // sigs must match pubkeys | keys.push_back(key2); // sigs must match pubkeys | ||||
CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
badsig4, scriptPubKey23, flags, | badsig4, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | ||||
keys.clear(); | keys.clear(); | ||||
keys.push_back(key1); | keys.push_back(key1); | ||||
keys.push_back(key4); // sigs must match pubkeys | keys.push_back(key4); // sigs must match pubkeys | ||||
CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
badsig5, scriptPubKey23, flags, | badsig5, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_EVAL_FALSE, ScriptErrorString(err)); | ||||
keys.clear(); // Must have signatures | keys.clear(); // Must have signatures | ||||
CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23); | CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23); | ||||
BOOST_CHECK(!VerifyScript( | BOOST_CHECK(!VerifyScript( | ||||
badsig6, scriptPubKey23, flags, | badsig6, scriptPubKey23, gFlags, | ||||
TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | TransactionSignatureChecker(&txTo23, 0, txFrom23.vout[0].nValue), | ||||
&err)); | &err)); | ||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, | BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_INVALID_STACK_OPERATION, | ||||
ScriptErrorString(err)); | ScriptErrorString(err)); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(script_combineSigs) { | BOOST_AUTO_TEST_CASE(script_combineSigs) { | ||||
// Test the CombineSignatures function | // Test the CombineSignatures function | ||||
▲ Show 20 Lines • Show All 448 Lines • Show Last 20 Lines |