55#include < consensus/validation.h>
66#include < key.h>
77#include < random.h>
8+ #include < script/sigcache.h>
89#include < script/sign.h>
910#include < script/signingprovider.h>
1011#include < test/util/setup_common.h>
1112#include < txmempool.h>
1213#include < util/chaintype.h>
14+ #include < util/check.h>
1315#include < validation.h>
1416
1517#include < boost/test/unit_test.hpp>
1618
1719struct Dersig100Setup : public TestChain100Setup {
20+
1821 Dersig100Setup ()
1922 : TestChain100Setup{ChainType::REGTEST, {" -testactivationheight=dersig@102" }} {}
2023};
2124
2225bool CheckInputScripts (const CTransaction& tx, TxValidationState& state,
2326 const CCoinsViewCache& inputs, unsigned int flags, bool cacheSigStore,
2427 bool cacheFullScriptStore, PrecomputedTransactionData& txdata,
28+ ValidationCache& validation_cache,
2529 std::vector<CScriptCheck>* pvChecks) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
2630
2731BOOST_AUTO_TEST_SUITE (txvalidationcache_tests)
@@ -118,7 +122,7 @@ BOOST_FIXTURE_TEST_CASE(tx_mempool_block_doublespend, Dersig100Setup)
118122// should fail.
119123// Capture this interaction with the upgraded_nop argument: set it when evaluating
120124// any script flag that is implemented as an upgraded NOP code.
121- static void ValidateCheckInputsForAllFlags (const CTransaction &tx, uint32_t failing_flags, bool add_to_cache, CCoinsViewCache& active_coins_tip) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
125+ static void ValidateCheckInputsForAllFlags (const CTransaction &tx, uint32_t failing_flags, bool add_to_cache, CCoinsViewCache& active_coins_tip, ValidationCache& validation_cache ) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
122126{
123127 PrecomputedTransactionData txdata;
124128
@@ -140,7 +144,7 @@ static void ValidateCheckInputsForAllFlags(const CTransaction &tx, uint32_t fail
140144 // WITNESS requires P2SH
141145 test_flags |= SCRIPT_VERIFY_P2SH;
142146 }
143- bool ret = CheckInputScripts (tx, state, &active_coins_tip, test_flags, true , add_to_cache, txdata, nullptr );
147+ bool ret = CheckInputScripts (tx, state, &active_coins_tip, test_flags, true , add_to_cache, txdata, validation_cache, nullptr );
144148 // CheckInputScripts should succeed iff test_flags doesn't intersect with
145149 // failing_flags
146150 bool expected_return_value = !(test_flags & failing_flags);
@@ -150,13 +154,13 @@ static void ValidateCheckInputsForAllFlags(const CTransaction &tx, uint32_t fail
150154 if (ret && add_to_cache) {
151155 // Check that we get a cache hit if the tx was valid
152156 std::vector<CScriptCheck> scriptchecks;
153- BOOST_CHECK (CheckInputScripts (tx, state, &active_coins_tip, test_flags, true , add_to_cache, txdata, &scriptchecks));
157+ BOOST_CHECK (CheckInputScripts (tx, state, &active_coins_tip, test_flags, true , add_to_cache, txdata, validation_cache, &scriptchecks));
154158 BOOST_CHECK (scriptchecks.empty ());
155159 } else {
156160 // Check that we get script executions to check, if the transaction
157161 // was invalid, or we didn't add to cache.
158162 std::vector<CScriptCheck> scriptchecks;
159- BOOST_CHECK (CheckInputScripts (tx, state, &active_coins_tip, test_flags, true , add_to_cache, txdata, &scriptchecks));
163+ BOOST_CHECK (CheckInputScripts (tx, state, &active_coins_tip, test_flags, true , add_to_cache, txdata, validation_cache, &scriptchecks));
160164 BOOST_CHECK_EQUAL (scriptchecks.size (), tx.vin .size ());
161165 }
162166 }
@@ -214,20 +218,20 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
214218 TxValidationState state;
215219 PrecomputedTransactionData ptd_spend_tx;
216220
217- BOOST_CHECK (!CheckInputScripts (CTransaction (spend_tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true , true , ptd_spend_tx, nullptr ));
221+ BOOST_CHECK (!CheckInputScripts (CTransaction (spend_tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true , true , ptd_spend_tx, m_node. chainman -> m_validation_cache , nullptr ));
218222
219223 // If we call again asking for scriptchecks (as happens in
220224 // ConnectBlock), we should add a script check object for this -- we're
221225 // not caching invalidity (if that changes, delete this test case).
222226 std::vector<CScriptCheck> scriptchecks;
223- BOOST_CHECK (CheckInputScripts (CTransaction (spend_tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true , true , ptd_spend_tx, &scriptchecks));
227+ BOOST_CHECK (CheckInputScripts (CTransaction (spend_tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_DERSIG, true , true , ptd_spend_tx, m_node. chainman -> m_validation_cache , &scriptchecks));
224228 BOOST_CHECK_EQUAL (scriptchecks.size (), 1U );
225229
226230 // Test that CheckInputScripts returns true iff DERSIG-enforcing flags are
227231 // not present. Don't add these checks to the cache, so that we can
228232 // test later that block validation works fine in the absence of cached
229233 // successes.
230- ValidateCheckInputsForAllFlags (CTransaction (spend_tx), SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC, false , m_node.chainman ->ActiveChainstate ().CoinsTip ());
234+ ValidateCheckInputsForAllFlags (CTransaction (spend_tx), SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC, false , m_node.chainman ->ActiveChainstate ().CoinsTip (), m_node. chainman -> m_validation_cache );
231235 }
232236
233237 // And if we produce a block with this tx, it should be valid (DERSIG not
@@ -253,7 +257,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
253257 std::vector<unsigned char > vchSig2 (p2pk_scriptPubKey.begin (), p2pk_scriptPubKey.end ());
254258 invalid_under_p2sh_tx.vin [0 ].scriptSig << vchSig2;
255259
256- ValidateCheckInputsForAllFlags (CTransaction (invalid_under_p2sh_tx), SCRIPT_VERIFY_P2SH, true , m_node.chainman ->ActiveChainstate ().CoinsTip ());
260+ ValidateCheckInputsForAllFlags (CTransaction (invalid_under_p2sh_tx), SCRIPT_VERIFY_P2SH, true , m_node.chainman ->ActiveChainstate ().CoinsTip (), m_node. chainman -> m_validation_cache );
257261 }
258262
259263 // Test CHECKLOCKTIMEVERIFY
@@ -276,13 +280,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
276280 vchSig.push_back ((unsigned char )SIGHASH_ALL);
277281 invalid_with_cltv_tx.vin [0 ].scriptSig = CScript () << vchSig << 101 ;
278282
279- ValidateCheckInputsForAllFlags (CTransaction (invalid_with_cltv_tx), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true , m_node.chainman ->ActiveChainstate ().CoinsTip ());
283+ ValidateCheckInputsForAllFlags (CTransaction (invalid_with_cltv_tx), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true , m_node.chainman ->ActiveChainstate ().CoinsTip (), m_node. chainman -> m_validation_cache );
280284
281285 // Make it valid, and check again
282286 invalid_with_cltv_tx.vin [0 ].scriptSig = CScript () << vchSig << 100 ;
283287 TxValidationState state;
284288 PrecomputedTransactionData txdata;
285- BOOST_CHECK (CheckInputScripts (CTransaction (invalid_with_cltv_tx), state, m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true , true , txdata, nullptr ));
289+ BOOST_CHECK (CheckInputScripts (CTransaction (invalid_with_cltv_tx), state, m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY, true , true , txdata, m_node. chainman -> m_validation_cache , nullptr ));
286290 }
287291
288292 // TEST CHECKSEQUENCEVERIFY
@@ -304,13 +308,13 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
304308 vchSig.push_back ((unsigned char )SIGHASH_ALL);
305309 invalid_with_csv_tx.vin [0 ].scriptSig = CScript () << vchSig << 101 ;
306310
307- ValidateCheckInputsForAllFlags (CTransaction (invalid_with_csv_tx), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true , m_node.chainman ->ActiveChainstate ().CoinsTip ());
311+ ValidateCheckInputsForAllFlags (CTransaction (invalid_with_csv_tx), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true , m_node.chainman ->ActiveChainstate ().CoinsTip (), m_node. chainman -> m_validation_cache );
308312
309313 // Make it valid, and check again
310314 invalid_with_csv_tx.vin [0 ].scriptSig = CScript () << vchSig << 100 ;
311315 TxValidationState state;
312316 PrecomputedTransactionData txdata;
313- BOOST_CHECK (CheckInputScripts (CTransaction (invalid_with_csv_tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true , true , txdata, nullptr ));
317+ BOOST_CHECK (CheckInputScripts (CTransaction (invalid_with_csv_tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_CHECKSEQUENCEVERIFY, true , true , txdata, m_node. chainman -> m_validation_cache , nullptr ));
314318 }
315319
316320 // TODO: add tests for remaining script flags
@@ -333,11 +337,11 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
333337 UpdateInput (valid_with_witness_tx.vin [0 ], sigdata);
334338
335339 // This should be valid under all script flags.
336- ValidateCheckInputsForAllFlags (CTransaction (valid_with_witness_tx), 0 , true , m_node.chainman ->ActiveChainstate ().CoinsTip ());
340+ ValidateCheckInputsForAllFlags (CTransaction (valid_with_witness_tx), 0 , true , m_node.chainman ->ActiveChainstate ().CoinsTip (), m_node. chainman -> m_validation_cache );
337341
338342 // Remove the witness, and check that it is now invalid.
339343 valid_with_witness_tx.vin [0 ].scriptWitness .SetNull ();
340- ValidateCheckInputsForAllFlags (CTransaction (valid_with_witness_tx), SCRIPT_VERIFY_WITNESS, true , m_node.chainman ->ActiveChainstate ().CoinsTip ());
344+ ValidateCheckInputsForAllFlags (CTransaction (valid_with_witness_tx), SCRIPT_VERIFY_WITNESS, true , m_node.chainman ->ActiveChainstate ().CoinsTip (), m_node. chainman -> m_validation_cache );
341345 }
342346
343347 {
@@ -362,7 +366,7 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
362366 }
363367
364368 // This should be valid under all script flags
365- ValidateCheckInputsForAllFlags (CTransaction (tx), 0 , true , m_node.chainman ->ActiveChainstate ().CoinsTip ());
369+ ValidateCheckInputsForAllFlags (CTransaction (tx), 0 , true , m_node.chainman ->ActiveChainstate ().CoinsTip (), m_node. chainman -> m_validation_cache );
366370
367371 // Check that if the second input is invalid, but the first input is
368372 // valid, the transaction is not cached.
@@ -372,12 +376,12 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, Dersig100Setup)
372376 TxValidationState state;
373377 PrecomputedTransactionData txdata;
374378 // This transaction is now invalid under segwit, because of the second input.
375- BOOST_CHECK (!CheckInputScripts (CTransaction (tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true , true , txdata, nullptr ));
379+ BOOST_CHECK (!CheckInputScripts (CTransaction (tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true , true , txdata, m_node. chainman -> m_validation_cache , nullptr ));
376380
377381 std::vector<CScriptCheck> scriptchecks;
378382 // Make sure this transaction was not cached (ie because the first
379383 // input was valid)
380- BOOST_CHECK (CheckInputScripts (CTransaction (tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true , true , txdata, &scriptchecks));
384+ BOOST_CHECK (CheckInputScripts (CTransaction (tx), state, &m_node.chainman ->ActiveChainstate ().CoinsTip (), SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, true , true , txdata, m_node. chainman -> m_validation_cache , &scriptchecks));
381385 // Should get 2 script checks back -- caching is on a whole-transaction basis.
382386 BOOST_CHECK_EQUAL (scriptchecks.size (), 2U );
383387 }
0 commit comments