Problem: PrecomputedTransactionData could be default-constructed and filled later with Init().
That allowed an object to exist without transaction-specific data and left a public reuse path that was easy to get wrong.
The old Init() guard only checked m_spent_outputs_ready, which remained false after forced initialization without spent outputs even though force=true cached the BIP143 prevout, sequence, and output hashes for witness-v0 sighash.
Fix: Remove default construction and public Init() so each PrecomputedTransactionData object is built for one transaction.
Callers that already have the transaction and optional spent outputs construct it directly.
Validation stores txdata in std::optional and emplaces it only after a script-cache miss, keeping precomputation lazy.
ConnectBlock() also leaves txdata storage empty when assumevalid skips script checks, covering #35663.