You need to enumerate all the required fraud proofs
(This doesn't necessarily include them all)
- block to large
-- This requires a Merkle sum-tree for tx size
- Invalid merkle sum-tree for sizes
- inflation
-- This requires a Merkle sum-tree for fees
- Invalid merkle sum-tree for fees
- double spending
-- This requires the two spending transactions and merkle paths
-- Already supported
- false minting (spending non-existant output)
-- This requires UTXO commitments [edit] or commitments for every tx input in the block[/edit]
- Invalid UTXO commitments
- invalid signature
-- source and spend transactions and merkle paths
-- Already supported
- sum(outputs) > sum(inputs) transaction
-- All input transactions, overspending transaction and merkle paths
-- Already supported
Even limiting transactions to 100kB doesn't necessarily prevent things from getting to large. An overspending 100kB transaction with lots of 100kB inputs could give a massive fraud proof.
A consensus rule could be added that the total size of all inputs into a transaction cannot exceed 200kB and transactions cannot exceed 100kB. This keeps the fraud proof limited (though still very large).
It would be necessary to go through the entire set of consensus rules and create a fraud proof for every check that is performed.
It is also necessary to create a check of anything that is used for checking. If UTXO commitments are added, then fraud proofs are needed for the UTXO set commitment tree.
Ideally, there would be a guarantee that the maximum size of a fraud proof has a finite limit. Some of the elements of the fraud proof scale with O(log(N)) so it can't be guaranteed entirely, but it should be possible to guarantee in practice.
Fraud proof don't protect against miners withholding some info. You can't prove a block is invalid if you only have 99% of the transactions in the block.