|
|
|
@ -1495,4 +1495,146 @@ BOOST_AUTO_TEST_CASE(script_can_append_self)
|
|
|
|
|
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()
|
|
|
|
|