You don't need to have lots of full client nodes.
Nowadays you can download the light-client version, which implementing Merkle Tree structures, lets nodes to don't be obligated to store ALL of the data on it's hard drive.
Some use cases for a fully light client, and how the light client meets those use cases, include:
- A light client wants to know the state of an account (nonce, balance, code or storage index) at a particular time. The light client can simply recursively download trie nodes from the state root until it gets to the desired value.
- A light client wants to check that a transaction was confirmed. The light client can simply ask the network for the index and block number of that transaction, and recursively download transaction trie nodes to check for availability.
The first three light client protocols require a logarithmic amount of
data access and computation; the fourth requires ~O(sqrt(N)) since
bloom filters are only a two-level structure, although this can be
improved to O(log(N)) if the light client is willing to rely on
multiple providers to point to "interesting" transaction indices and
decommission providers if they are revealed to have missed a
transaction. The first protocol is useful to simply check up on state,
and the second in consumer-merchant scenarios to check that a
transaction was validated. The third protocol allows Ethereum light
clients to collectively validate blocks with a very low degree of
trust.
- In Bitcoin, for example, a miner can create a block that gives the miner an excessive amount of transaction fees, and there would be no way for light nodes to detect this themselves, or upon seeing an honest full node detect it verify a proof of invalidity. In Ethereum, if a block is invalid, it must contain an invalid state transition at some index, and so a light client that happens to be verifying that index can see that something is wrong, either because the proof step does not check out, or because data is unavailable, and that client can then raise the alarm.
Here you got full info of how a light-client is implemented with Merkle Trees:
https://github.com/ethereum/wiki/blob/master/Light-client-protocol.md
https://en.wikipedia.org/wiki/Merkle_tree
Hope it helps!