---
# System prepended metadata

title: Beacon State Hard Fork Examples
tags: [hard_fork_1]

---

---
tags: hard_fork_1
---

# Beacon State Hard Fork Examples

## Currently:
### Interface
```go=
type BeaconState interface {
    PreviousEpochAttestations() []*pbp2p.PendingAttestation
	CurrentEpochAttestations() []*pbp2p.PendingAttestation
    AppendCurrentEpochAttestations(val *pbp2p.PendingAttestation) error
    AppendPreviousEpochAttestations(val *pbp2p.PendingAttestation) error
}
type BeaconStateV1 interface {
    BeaconState
    PreviousEpochParticipations() []byte
    CurrentEpochParticipations() []byte
    SetPreviousParticipationByteAtIndex(i uint64) error
    SetCurrentParticipationByteAtIndex(i uint64) error
}
```
### Process pending attestations into the state (setter)
```go=
func ProcessAttestationNoVerifySignature(
	ctx context.Context,
	beaconState iface.BeaconState,
	att *ethpb.Attestation,
) (iface.BeaconState, error) {
	...
	if err := beaconState.AppendCurrentEpochAttestations(pendingAtt); err != nil {
		return nil, err
	}
	if err := beaconState.AppendPreviousEpochAttestations(pendingAtt); err != nil {
		return nil, err
	}
	
	return beaconState, nil
}
```

### Get pending attestations into the state (getter)
```go=
func ProcessAttestations(
	ctx context.Context,
	state iface.ReadOnlyBeaconState,
	vp []*Validator,
	pBal *Balance,
) ([]*Validator, *Balance, error) {

	for _, a := range append(state.PreviousEpochAttestations(), 
    state.CurrentEpochAttestations()...) {
    
    
```

## What we want:
```go=
// Apply hardfork 1 getters and setters into existing phase 0 code path
type BeaconState interface {
    // HF1
    PreviousEpochParticipations() []byte
    CurrentEpochParticipations() []byte
    SetPreviousParticipationByteAtIndex(i uint64) error
    SetCurrentParticipationByteAtIndex(i uint64) error
}
```

### Now to process pending attestations into the state (setter)
```go=
// Phase 0 code path
func ProcessAttestationNoVerifySignature(
	ctx context.Context,
	beaconState iface.BeaconState,
	att *ethpb.Attestation,
) (iface.BeaconState, error) {
	...
    // Convert pendingAtt to bits
	if err := beaconState.SetCurrentParticipationByteAtIndex(bits); err != nil {
		return nil, err
	}
	if err := beaconState.SetPreviousParticipationByteAtIndex(bits); err != nil {
		return nil, err
	}
    // We still need the following because we need to save the attestations right?
    if err := beaconState.AppendCurrentEpochAttestations(pendingAtt); err != nil {
		return nil, err
	}
	if err := beaconState.AppendPreviousEpochAttestations(pendingAtt); err != nil {
		return nil, err
	}
	
	
	return beaconState, nil
}
```

## Outcome
* One single interface
* Still need 2 protobuf states
* We still need 2 different state pkgs `BeaconState` and `BeaconStateAltair` for HTR
* The processing paths no longer need to be duplicated. (ie. No `ProcessAttestationNoVerifySignature` and `ProcessAttestationNoVerifySignatureV1`)
