I understand there are a few different sync modes. Archival nodes keep everything and they take ~2TB if not more.
geth --fast downloads all historical transactions (besides transaction headers), but only verifies recent states, which saves space and is faster to catch up. Fast is the default mode for initial syncs (and only enabled for the initial sync).
My questions are about historical transactions:
- What's the point to download transactions in
--fastmode? It seems like it could just work without doing so.
- More generally, what are the reasons to keep historical transactions around, now that state root is already in consensus?
W.r.t. #2, an argument I've seen is that replaying transactions is the only definitive way to verify a given state, I.e., if one just verifies state roots, an attacker could feed false states (after eclipsing the victim node and assuming the attacker has enough hashing power) that circumvents EVM mechanisms (i.e., no valid transactions can lead to that state.) This is a noted weakness of fast sync compared to classical sync. I agree this is technically a new attack vector. But I'm not sure I appreciate the practical difference. What is the difference between an invalid state and a valid state which is potentially derived from bogus transactions?