The big one is missing data.
Header size is unaffected by number of transactions per second, so I think SPV nodes could be assumed to check headers.
Making the header chain the root for all the other proofs is reasonable.
Even if some SPV nodes only keep the 10-20k newest blocks, it would likely be safe.
If P2SH was made mandatory, then this is made easier. The entire script and release script is included in the spending transaction.
It is still necessary to prove that the output actually exists. That can be handled by the UTXO commit system.
If merkle tree changes are allowed, the merkle tree could also have paths to the hash for all outputs. That keeps the proof of existence easier.
Failing that, there could be a rule that transactions can't have more than 4 outputs. That (somewhat) limits the size of transactions.
The UTXO commit system would also cover this.
Proof of block too large
Right, needs a new merkle tree.
This is the hard one. If there was a commit system, then blocks should include the extra data needed to verify each of the commits.
If all UTXOs are in a tree, then only the hash of the root is needed.
To verify each transaction, it is necessary to know the root before and after the transaction to prove that the transaction tree has been correctly updated.
This means that there is a need for a merkle tree containing the root of the tree after each update.
To verify that the UTXO tree has been updated correctly, then you need
merkle root of UTXO merkle tree for the block
path to the node before and after the transaction
- This proves the tree's root before and after the transaction was inserted
path through the UTXO tree for each input and output in the transaction
- This allows the TXO's to be inserted and removed
This allows a SPV node to check a particular transaction.
The final issue is proving that proof data is missing. If an illegal transaction is included, nodes have to be able to obtain the extra data. If they can't, then they can't create the proof.