Pruning should arrive in Bitcoin Core 0.11, allowing people to run a full node with only 1 GB of storage space.
Please answer this simple question: "how does one bootstrap a full node once everybody's pruning?".
Suppose every node prunes a 99% of the blockchain, and keeps a random 1% of the blocks.
A new node bootstraps by contacting 100 random nodes.
This could even become part of the core protocol in time by putting historical data in a DHT but keeping headers and complete utxo as full local copies. All nodes contain full blockheaders. This makes attempting to rewrite history impossible. The headers are too important to store in a DHT but the transactions can be. All nodes don't need all the copies of SPENT transactions just full headers and the UTXO set. Of course users also have a vested interest in ensuring a copy of their txns remains so they would probably store that locally.
Future bitcoin node could only hold the following
Full blockheaders (~4MB per year)
Full blocks for the most recent x blocks (can improve efficiency in the event of reorg)
Current UTXO set
Users own transaction history
Some user defined portion of the full transaction set (could be 0% to 100%)
With Bitcoin's current architecture it would make sense to break up the transactions by blocks which would allow a single node to supply a full block. This isn't a requirement but based on how nodes currently bootstrap it would be the easiest to implement.
Full node boostrapping today
a) contact peers, get best chain
b) download block headers for chain(s) (multiple if peers disagree on best chain)
c) validate block headers for chain(s) (if multiple chains exist then the longest valid chain is best chain)
d) contact multiple peers (each who have 100% of blocks) and requests blocks according to best chain
e) if none of peers contain the full chain contact additional peers to find one with a full copy of chain
f) use blocks received to validate and build UTXO
Node is now bootstrapped
DHT node boostrapping
a) contact peers, get best chain
b) download block headers for chain(s) (multiple if peers disagree on best chain)
c) validate block headers for chain(s) (if multiple chains exist then the longest valid chain is best chain)
d) contact multiple peers and request their DHT identifier (a value which identifies what subset of the blocks the peer has locally)
e) Request needed blocks from the main chain from peers based on their inventory
e) if peers in aggregate do not contain full set of blocks then contact additional peers to find those which contain the missing inventory
f) use blocks received to validate and build UTXO
g) compute DHT identifier based on random value and user chosen DHT share (0% to 100%)*
h) remove blocks outside of inventory computed from DHT share
Node is now bootstrapped