29 if (buffer.size() > 100
'000) return; 30 SpanReader ds{buffer}; 32 const CTransaction tx(deserialize, TX_WITH_WITNESS, ds); 34 script_verify_flags verify_flags; 37 assert(verify_flags == script_verify_flags::from_int(verify_flags.as_int())); 39 if (!IsValidFlagCombination(verify_flags)) return; 41 script_verify_flags fuzzed_flags; 44 std::vector<CTxOut> spent_outputs; 45 for (unsigned i = 0; i < tx.vin.size(); ++i) { 48 if (!MoneyRange(prevout.nValue)) { 49 // prevouts should be consensus-valid 52 spent_outputs.push_back(prevout); 54 PrecomputedTransactionData txdata; 55 txdata.Init(tx, std::move(spent_outputs)); 57 for (unsigned i = 0; i < tx.vin.size(); ++i) { 58 const CTxOut& prevout = txdata.m_spent_outputs.at(i); 59 const TransactionSignatureChecker checker{&tx, i, prevout.nValue, txdata, MissingDataBehavior::ASSERT_FAIL}; 62 const bool ret = VerifyScript(tx.vin.at(i).scriptSig, prevout.scriptPubKey, &tx.vin.at(i).scriptWitness, verify_flags, checker, &serror); 63 assert(ret == (serror == SCRIPT_ERR_OK)); 65 // Verify that removing flags from a passing test or adding flags to a failing test does not change the result 67 verify_flags &= ~fuzzed_flags; 69 verify_flags |= fuzzed_flags; 71 if (!IsValidFlagCombination(verify_flags)) return; 73 ScriptError serror_fuzzed; 74 const bool ret_fuzzed = VerifyScript(tx.vin.at(i).scriptSig, prevout.scriptPubKey, &tx.vin.at(i).scriptWitness, verify_flags, checker, &serror_fuzzed); 75 assert(ret_fuzzed == (serror_fuzzed == SCRIPT_ERR_OK)); 77 assert(ret_fuzzed == ret); 79 } catch (const std::ios_base::failure&) {
constexpr value_type as_int() const
Minimal stream for reading from an existing byte array by std::span.
FUZZ_TARGET(script_flags)
static SpanReader & operator>>(SpanReader &ds, script_verify_flags &f)
static constexpr script_verify_flags from_int(value_type f)