42 const MempoolAcceptResult result = m_node.chainman->ProcessTransaction(MakeTransactionRef(tx));
47 std::vector<CMutableTransaction> spends;
49 for (
int i = 0; i < 2; i++)
51 spends[i].version = 1;
52 spends[i].vin = {
CTxIn{m_coinbase_txns[0]->GetHash(), 0}};
53 spends[i].vout = {
CTxOut{11*
CENT, scriptPubKey}};
56 std::vector<unsigned char> vchSig;
60 spends[i].vin[0].scriptSig << vchSig;
66 block = CreateAndProcessBlock(spends, scriptPubKey);
74 block = CreateAndProcessBlock(spends, scriptPubKey);
85 block = CreateAndProcessBlock(spends, scriptPubKey);
95 std::vector<CMutableTransaction> oneSpend;
96 oneSpend.push_back(spends[0]);
98 block = CreateAndProcessBlock(oneSpend, scriptPubKey);
123 for (
int count = 0; count < 10000; ++count) {
143 bool ret =
CheckInputScripts(tx, state, &active_coins_tip, test_flags,
true, add_to_cache, txdata, validation_cache,
nullptr);
146 bool expected_return_value = !(test_flags & failing_flags);
150 if (
ret && add_to_cache) {
152 std::vector<CScriptCheck> scriptchecks;
158 std::vector<CScriptCheck> scriptchecks;
186 spend_tx.
vin = {
CTxIn{m_coinbase_txns[0]->GetHash(), 0}};
197 std::vector<unsigned char> vchSig;
200 vchSig.push_back((
unsigned char) 0);
202 spend_tx.
vin[0].scriptSig << vchSig;
219 std::vector<CScriptCheck> scriptchecks;
234 block = CreateAndProcessBlock({spend_tx}, p2pk_scriptPubKey);
237 BOOST_CHECK(m_node.chainman->ActiveChainstate().CoinsTip().GetBestBlock() == block.
GetHash());
243 invalid_under_p2sh_tx.
version = 1;
245 invalid_under_p2sh_tx.
vout = {
CTxOut{11*
CENT, p2pk_scriptPubKey}};
246 std::vector<unsigned char> vchSig2(p2pk_scriptPubKey.
begin(), p2pk_scriptPubKey.
end());
247 invalid_under_p2sh_tx.
vin[0].scriptSig << vchSig2;
255 invalid_with_cltv_tx.
version = 1;
261 std::vector<unsigned char> vchSig;
265 invalid_with_cltv_tx.
vin[0].scriptSig =
CScript() << vchSig << 101;
270 invalid_with_cltv_tx.
vin[0].scriptSig =
CScript() << vchSig << 100;
279 invalid_with_csv_tx.
version = 2;
284 std::vector<unsigned char> vchSig;
288 invalid_with_csv_tx.
vin[0].scriptSig =
CScript() << vchSig << 101;
293 invalid_with_csv_tx.
vin[0].scriptSig =
CScript() << vchSig << 100;
305 valid_with_witness_tx.
version = 1;
307 valid_with_witness_tx.
vout = {
CTxOut{11*
CENT, p2pk_scriptPubKey}};
318 valid_with_witness_tx.
vin[0].scriptWitness.SetNull();
330 tr_keystore.
keys.emplace(coinbaseKey.GetPubKey().GetID(), coinbaseKey);
331 const std::map<COutPoint, Coin> coins{
332 {tr_tx.
vin[0].prevout,
Coin(spend_tx.
vout[4], 0,
false)}
334 std::map<int, bilingual_str> input_errors;
336 auto& witness_stack = tr_tx.
vin[0].scriptWitness.stack;
337 BOOST_REQUIRE(witness_stack.size() == 1 && witness_stack[0].size() == 64);
340 witness_stack[0][63] ^= 0x01;
342 witness_stack[0][63] ^= 0x01;
360 for (
int i = 0; i < 2; ++i) {
372 tx.
vin[1].scriptWitness.SetNull();
379 std::vector<CScriptCheck> scriptchecks;
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
bool CheckInputScripts(const CTransaction &tx, TxValidationState &state, const CCoinsViewCache &inputs, script_verify_flags flags, bool cacheSigStore, bool cacheFullScriptStore, PrecomputedTransactionData &txdata, ValidationCache &validation_cache, std::vector< CScriptCheck > *pvChecks) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Check whether all of this transaction's input scripts succeed.