|
|
|
@ -119,7 +119,7 @@ void ValidateCheckInputsForAllFlags(CMutableTransaction &tx, uint32_t failing_fl
@@ -119,7 +119,7 @@ void ValidateCheckInputsForAllFlags(CMutableTransaction &tx, uint32_t failing_fl
|
|
|
|
|
// WITNESS requires P2SH
|
|
|
|
|
test_flags |= SCRIPT_VERIFY_P2SH; |
|
|
|
|
} |
|
|
|
|
bool ret = CheckInputs(tx, state, pcoinsTip, true, test_flags, true, add_to_cache, txdata, nullptr); |
|
|
|
|
bool ret = CheckInputs(tx, state, pcoinsTip.get(), true, test_flags, true, add_to_cache, txdata, nullptr); |
|
|
|
|
// CheckInputs should succeed iff test_flags doesn't intersect with
|
|
|
|
|
// failing_flags
|
|
|
|
|
bool expected_return_value = !(test_flags & failing_flags); |
|
|
|
@ -135,13 +135,13 @@ void ValidateCheckInputsForAllFlags(CMutableTransaction &tx, uint32_t failing_fl
@@ -135,13 +135,13 @@ void ValidateCheckInputsForAllFlags(CMutableTransaction &tx, uint32_t failing_fl
|
|
|
|
|
if (ret && add_to_cache) { |
|
|
|
|
// Check that we get a cache hit if the tx was valid
|
|
|
|
|
std::vector<CScriptCheck> scriptchecks; |
|
|
|
|
BOOST_CHECK(CheckInputs(tx, state, pcoinsTip, true, test_flags, true, add_to_cache, txdata, &scriptchecks)); |
|
|
|
|
BOOST_CHECK(CheckInputs(tx, state, pcoinsTip.get(), true, test_flags, true, add_to_cache, txdata, &scriptchecks)); |
|
|
|
|
BOOST_CHECK(scriptchecks.empty()); |
|
|
|
|
} else { |
|
|
|
|
// Check that we get script executions to check, if the transaction
|
|
|
|
|
// was invalid, or we didn't add to cache.
|
|
|
|
|
std::vector<CScriptCheck> scriptchecks; |
|
|
|
|
BOOST_CHECK(CheckInputs(tx, state, pcoinsTip, true, test_flags, true, add_to_cache, txdata, &scriptchecks)); |
|
|
|
|
BOOST_CHECK(CheckInputs(tx, state, pcoinsTip.get(), true, test_flags, true, add_to_cache, txdata, &scriptchecks)); |
|
|
|
|
BOOST_CHECK_EQUAL(scriptchecks.size(), tx.vin.size()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -201,13 +201,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
@@ -201,13 +201,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
|
|
|
|
CValidationState state; |
|
|
|
|
PrecomputedTransactionData ptd_spend_tx(spend_tx); |
|
|
|
|
|
|
|
|
|
BOOST_CHECK(!CheckInputs(spend_tx, state, pcoinsTip, true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, nullptr)); |
|
|
|
|
BOOST_CHECK(!CheckInputs(spend_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, nullptr)); |
|
|
|
|
|
|
|
|
|
// If we call again asking for scriptchecks (as happens in
|
|
|
|
|
// ConnectBlock), we should add a script check object for this -- we're
|
|
|
|
|
// not caching invalidity (if that changes, delete this test case).
|
|
|
|
|
std::vector<CScriptCheck> scriptchecks; |
|
|
|
|
BOOST_CHECK(CheckInputs(spend_tx, state, pcoinsTip, true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, &scriptchecks)); |
|
|
|
|
BOOST_CHECK(CheckInputs(spend_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true, true, ptd_spend_tx, &scriptchecks)); |
|
|
|
|
BOOST_CHECK_EQUAL(scriptchecks.size(), 1); |
|
|
|
|
|
|
|
|
|
// Test that CheckInputs returns true iff DERSIG-enforcing flags are
|
|
|
|
@ -268,7 +268,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
@@ -268,7 +268,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
|
|
|
|
invalid_with_cltv_tx.vin[0].scriptSig = CScript() << vchSig << 100; |
|
|
|
|
CValidationState state; |
|
|
|
|
PrecomputedTransactionData txdata(invalid_with_cltv_tx); |
|
|
|
|
BOOST_CHECK(CheckInputs(invalid_with_cltv_tx, state, pcoinsTip, true, SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, true, txdata, nullptr)); |
|
|
|
|
BOOST_CHECK(CheckInputs(invalid_with_cltv_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true, true, txdata, nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TEST CHECKSEQUENCEVERIFY
|
|
|
|
@ -296,7 +296,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
@@ -296,7 +296,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
|
|
|
|
invalid_with_csv_tx.vin[0].scriptSig = CScript() << vchSig << 100; |
|
|
|
|
CValidationState state; |
|
|
|
|
PrecomputedTransactionData txdata(invalid_with_csv_tx); |
|
|
|
|
BOOST_CHECK(CheckInputs(invalid_with_csv_tx, state, pcoinsTip, true, SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, true, txdata, nullptr)); |
|
|
|
|
BOOST_CHECK(CheckInputs(invalid_with_csv_tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true, true, txdata, nullptr)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: add tests for remaining script flags
|
|
|
|
@ -358,12 +358,12 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
@@ -358,12 +358,12 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
|
|
|
|
CValidationState state; |
|
|
|
|
PrecomputedTransactionData txdata(tx); |
|
|
|
|
// This transaction is now invalid under segwit, because of the second input.
|
|
|
|
|
BOOST_CHECK(!CheckInputs(tx, state, pcoinsTip, true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, nullptr)); |
|
|
|
|
BOOST_CHECK(!CheckInputs(tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, nullptr)); |
|
|
|
|
|
|
|
|
|
std::vector<CScriptCheck> scriptchecks; |
|
|
|
|
// Make sure this transaction was not cached (ie because the first
|
|
|
|
|
// input was valid)
|
|
|
|
|
BOOST_CHECK(CheckInputs(tx, state, pcoinsTip, true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, &scriptchecks)); |
|
|
|
|
BOOST_CHECK(CheckInputs(tx, state, pcoinsTip.get(), true, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true, true, txdata, &scriptchecks)); |
|
|
|
|
// Should get 2 script checks back -- caching is on a whole-transaction basis.
|
|
|
|
|
BOOST_CHECK_EQUAL(scriptchecks.size(), 2); |
|
|
|
|
} |
|
|
|
|