Brilliant.
Lists should have been event-driven (added/removed entry events) instead of updated through full state transfers. Saving the entire contact list as an event should be used only as an ocasional check-point rather than for every single change. In that way, you could always read the latest checkpoint and then apply the delta events in sequence one after the other to compute the current state.