Problem: PrecomputedTransactionData could be default-constructed and filled later with Init().
That made it possible to keep an object around without transaction-specific data, and the public Init() method left a reuse path that was easy to get wrong.
In particular, the old Init() guard only checked m_spent_outputs_ready, which stayed false after forced initialization without spent outputs, while force=true still enabled BIP143 precomputation and left cached prevout, sequence, and output hashes ready for witness-v0 sighash reuse.
Fix: Make txdata construction do the initialization.
Callers that already have the transaction and optional spent outputs now construct PrecomputedTransactionData directly; validation uses std::optional<PrecomputedTransactionData> so it can still wait until after a script-cache miss.
The type is no longer default-constructible, public Init() is gone, and each object is built for one transaction.
This hardens the helper against accidental reuse and simplifies the API by removing the default-construct-then-fill pattern.
This also covers #35663: ConnectBlock() leaves txdata storage empty when script checks are skipped during assumevalid.