|
|
@ -1479,4 +1479,146 @@ BOOST_AUTO_TEST_CASE(script_can_append_self) |
|
|
|
BOOST_CHECK(s == d); |
|
|
|
BOOST_CHECK(s == d); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(HAVE_CONSENSUS_LIB) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Test simple (successful) usage of bitcoinconsensus_verify_script */ |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_returns_true) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int libconsensus_flags = 0; |
|
|
|
|
|
|
|
int nIn = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CScript scriptPubKey; |
|
|
|
|
|
|
|
CScript scriptSig; |
|
|
|
|
|
|
|
CScriptWitness wit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scriptPubKey << OP_1; |
|
|
|
|
|
|
|
CTransaction creditTx = BuildCreditingTransaction(scriptPubKey, 1); |
|
|
|
|
|
|
|
CTransaction spendTx = BuildSpendingTransaction(scriptSig, wit, creditTx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
stream << spendTx; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bitcoinconsensus_error err; |
|
|
|
|
|
|
|
int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), nIn, libconsensus_flags, &err); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(result, 1); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_OK); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Test bitcoinconsensus_verify_script returns invalid tx index err*/ |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_tx_index_err) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int libconsensus_flags = 0; |
|
|
|
|
|
|
|
int nIn = 3; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CScript scriptPubKey; |
|
|
|
|
|
|
|
CScript scriptSig; |
|
|
|
|
|
|
|
CScriptWitness wit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scriptPubKey << OP_EQUAL; |
|
|
|
|
|
|
|
CTransaction creditTx = BuildCreditingTransaction(scriptPubKey, 1); |
|
|
|
|
|
|
|
CTransaction spendTx = BuildSpendingTransaction(scriptSig, wit, creditTx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
stream << spendTx; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bitcoinconsensus_error err; |
|
|
|
|
|
|
|
int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), nIn, libconsensus_flags, &err); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(result, 0); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_TX_INDEX); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Test bitcoinconsensus_verify_script returns tx size mismatch err*/ |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_tx_size) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int libconsensus_flags = 0; |
|
|
|
|
|
|
|
int nIn = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CScript scriptPubKey; |
|
|
|
|
|
|
|
CScript scriptSig; |
|
|
|
|
|
|
|
CScriptWitness wit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scriptPubKey << OP_EQUAL; |
|
|
|
|
|
|
|
CTransaction creditTx = BuildCreditingTransaction(scriptPubKey, 1); |
|
|
|
|
|
|
|
CTransaction spendTx = BuildSpendingTransaction(scriptSig, wit, creditTx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
stream << spendTx; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bitcoinconsensus_error err; |
|
|
|
|
|
|
|
int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size() * 2, nIn, libconsensus_flags, &err); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(result, 0); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_TX_SIZE_MISMATCH); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Test bitcoinconsensus_verify_script returns invalid tx serialization error */ |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_tx_serialization) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int libconsensus_flags = 0; |
|
|
|
|
|
|
|
int nIn = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CScript scriptPubKey; |
|
|
|
|
|
|
|
CScript scriptSig; |
|
|
|
|
|
|
|
CScriptWitness wit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scriptPubKey << OP_EQUAL; |
|
|
|
|
|
|
|
CTransaction creditTx = BuildCreditingTransaction(scriptPubKey, 1); |
|
|
|
|
|
|
|
CTransaction spendTx = BuildSpendingTransaction(scriptSig, wit, creditTx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
stream << 0xffffffff; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bitcoinconsensus_error err; |
|
|
|
|
|
|
|
int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), nIn, libconsensus_flags, &err); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(result, 0); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_TX_DESERIALIZE); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Test bitcoinconsensus_verify_script returns amount required error */ |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_amount_required_err) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int libconsensus_flags = bitcoinconsensus_SCRIPT_FLAGS_VERIFY_WITNESS; |
|
|
|
|
|
|
|
int nIn = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CScript scriptPubKey; |
|
|
|
|
|
|
|
CScript scriptSig; |
|
|
|
|
|
|
|
CScriptWitness wit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scriptPubKey << OP_EQUAL; |
|
|
|
|
|
|
|
CTransaction creditTx = BuildCreditingTransaction(scriptPubKey, 1); |
|
|
|
|
|
|
|
CTransaction spendTx = BuildSpendingTransaction(scriptSig, wit, creditTx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
stream << spendTx; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bitcoinconsensus_error err; |
|
|
|
|
|
|
|
int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), nIn, libconsensus_flags, &err); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(result, 0); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_AMOUNT_REQUIRED); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Test bitcoinconsensus_verify_script returns invalid flags err */ |
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(bitcoinconsensus_verify_script_invalid_flags) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int libconsensus_flags = 1 << 3; |
|
|
|
|
|
|
|
int nIn = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CScript scriptPubKey; |
|
|
|
|
|
|
|
CScript scriptSig; |
|
|
|
|
|
|
|
CScriptWitness wit; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scriptPubKey << OP_EQUAL; |
|
|
|
|
|
|
|
CTransaction creditTx = BuildCreditingTransaction(scriptPubKey, 1); |
|
|
|
|
|
|
|
CTransaction spendTx = BuildSpendingTransaction(scriptSig, wit, creditTx); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
|
|
|
|
|
|
|
stream << spendTx; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bitcoinconsensus_error err; |
|
|
|
|
|
|
|
int result = bitcoinconsensus_verify_script(scriptPubKey.data(), scriptPubKey.size(), (const unsigned char*)&stream[0], stream.size(), nIn, libconsensus_flags, &err); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(result, 0); |
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(err, bitcoinconsensus_ERR_INVALID_FLAGS); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
|
BOOST_AUTO_TEST_SUITE_END() |
|
|
|