Forget blocks/transactions but keep the data
We are currently essentially storing any data twice: once in the transaction that created it, and once in the database itself. Transactions/blocks need to be kept around because other nodes want to download and verify them up to the genesis.
One way to mitigate this is to throw away blocks after a certain time. New clients then need to download a data set that contains the data up to that point. The question is how these nodes can trust that data set. One way to solve this would be to add a cryptographic checksum of the actual data (per table) in each block (or every N blocks, in a 'rollup block'). This however requires more expensive validation and strict requirements on how clients store data (e.g. ordering of rows is currently undefined, but should be when it is relevant for the hash).
Another optimization would be to put transactions in a Merkle tree (like Bitcoin does). Then, when a DROP TABLE or DELETE happens, transactions can be pruned. This however happens infrequently.
See also #66