--- tags: hard_fork_1 --- # Best Way to handle state v0/v1 duplicates ## Say we have... ```go= // BeaconState is in /beacon-chain/state/v0 type BeaconState struct { state *pbp2p.BeaconState dirtyFields map[fieldIndex]interface{} ... } ``` ```go= // BeaconState is in /beacon-chain/state/v1 type BeaconState struct { state *pbp2p.BeaconStateV1 dirtyFields map[fieldIndex]interface{} ... } ``` `v1.BeaconState` will be implementing the same interface as `v0.BeaconState` How can we avoid duplicate getter and setter code where `pbp2p.BeaconState` and `pbp2p.BeaconStateV1` have the same fields? ```go= // In /beacon-chain/state/v0 // GenesisTime of the beacon state as a uint64. func (b *BeaconState) GenesisTime() uint64 { if !b.hasInnerState() { return 0 } b.lock.RLock() defer b.lock.RUnlock() // GenesisTime is a common field between pbp2p.BeaconState and pbp2p.BeaconStateV1 return b.state.GenesisTime } ``` ```go= // In /beacon-chain/state/v1. Can we avoid this? // GenesisTime of the beacon state as a uint64. func (b *BeaconState) GenesisTime() uint64 { if !b.hasInnerState() { return 0 } b.lock.RLock() defer b.lock.RUnlock() // GenesisTime is a common field between pbp2p.BeaconState and pbp2p.BeaconStateV1 return b.state.GenesisTime } ```