Between deployments, to store the same membership set when there are changes in the logic of the RLN contract, we need to have a separate GroupStorage contract, so that new RLN contracts can refer to the same storage, and utilize common utility functions like set, remove on the storage.
This also allows us to modularize the group sync layer, where we validate changes to the group in the GroupStorage contract, and therefore, users can implement their own validation on who can register to a membership group.
Between deployments, to store the same membership set when there are changes in the logic of the RLN contract, we need to have a separate GroupStorage contract, so that new RLN contracts can refer to the same storage, and utilize common utility functions like set, remove on the storage.
This also allows us to modularize the group sync layer, where we validate changes to the group in the GroupStorage contract, and therefore, users can implement their own validation on who can register to a membership group.