There is a
thread discussing compressing this data. The idea is to have a merkle like tree that stores the data.
If you have the previous value and the list of transaction outputs from the current block (and some extra info about branches), you can prove that the tree was correctly updated.
If one of those was included in each block header, then double spending would be detectable without the whole chain.
Ahh, perfect. I knew the idea was obvious enough I wouldn't have been the first. Thank you, I had no idea what people called the idea to search for it.
So yeah, that's great. To bootstrap you ask nearby nodes what their max block is and their current UxO tree and for the block-header-history. It doesn't matter if the one you ask is a few blocks behind, since once you verify you can just append new blocks to the end. If you end up happening to bootstrap on a fork you just grab the UxO tree from the split and append the blocks on the longer chain.