package state_native import ( "math/big" "github.com/prysmaticlabs/prysm/v5/beacon-chain/core/time" "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/stateutil" "github.com/prysmaticlabs/prysm/v5/config/features" "github.com/prysmaticlabs/prysm/v5/runtime/version" ) // CurrentEpochParticipation corresponding to participation bits on the beacon chain. func (b *BeaconState) CurrentEpochParticipation() ([]byte, error) { if b.version == version.Phase0 { return nil, errNotSupported("CurrentEpochParticipation", b.version) } if b.currentEpochParticipation == nil { return nil, nil } b.lock.RLock() defer b.lock.RUnlock() return b.currentEpochParticipationVal(), nil } // PreviousEpochParticipation corresponding to participation bits on the beacon chain. func (b *BeaconState) PreviousEpochParticipation() ([]byte, error) { if b.version == version.Phase0 { return nil, errNotSupported("PreviousEpochParticipation", b.version) } if b.previousEpochParticipation == nil { return nil, nil } b.lock.RLock() defer b.lock.RUnlock() return b.previousEpochParticipationVal(), nil } // UnrealizedCheckpointBalances returns the total balances: active, target attested in // current epoch and target attested in previous epoch. This function is used to // compute the "unrealized justification" that a synced Beacon Block will have. func (b *BeaconState) UnrealizedCheckpointBalances() (*big.Int, *big.Int, *big.Int, error) { if b.version == version.Phase0 { return big.NewInt(0), big.NewInt(0), big.NewInt(0), errNotSupported("UnrealizedCheckpointBalances", b.version) } currentEpoch := time.CurrentEpoch(b) b.lock.RLock() defer b.lock.RUnlock() cp := b.currentEpochParticipation pp := b.previousEpochParticipation if cp == nil || pp == nil { return big.NewInt(0), big.NewInt(0), big.NewInt(0), ErrNilParticipation } if features.Get().EnableExperimentalState { return stateutil.UnrealizedCheckpointBalances(cp, pp, stateutil.NewValMultiValueSliceReader(b.validatorsMultiValue, b), currentEpoch) } else { return stateutil.UnrealizedCheckpointBalances(cp, pp, stateutil.NewValSliceReader(b.validators), currentEpoch) } } // currentEpochParticipationVal corresponding to participation bits on the beacon chain. // This assumes that a lock is already held on BeaconState. func (b *BeaconState) currentEpochParticipationVal() []byte { tmp := make([]byte, len(b.currentEpochParticipation)) copy(tmp, b.currentEpochParticipation) return tmp } // previousEpochParticipationVal corresponding to participation bits on the beacon chain. // This assumes that a lock is already held on BeaconState. func (b *BeaconState) previousEpochParticipationVal() []byte { tmp := make([]byte, len(b.previousEpochParticipation)) copy(tmp, b.previousEpochParticipation) return tmp }