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 initialization without spent outputs even when the BIP143 prevout, sequence, and output hashes were already cached.
No current caller reuses an object across transactions, so validation and signing results are unchanged.
btck_script_pubkey_verify() in the experimental kernel C API also copied caller-supplied txdata on each verification call.
Fix: Remove default construction and 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.
The kernel verification path binds directly to caller-supplied txdata and constructs a local fallback only when needed.