mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-09 11:11:20 +00:00
73443208a1
* Remove native state flag and use native state in spectests * remove feature from tests * use e2e config in slasher simulator * use params.BeaconConfig in testutil * use correct function * use minimal config in go_test * fix TestListValidators * parameterize sync committee bits and aggregation bits * Fix TestServer_ListIndexedAttestations_GenesisEpoch (cherry picked from commit 254ab623dde08ae8886b152facdbbd8889ed79db) * fix more tests * fix even more * moreeee * aaaand more * one more fix * one more * simplify TestGetAltairDuties_UnknownPubkey * comment out problematic test * one more fix * one more * aaaand one more * another * use fieldparams in HydrateBlindedBeaconBlockBodyBellatrix * create new package for mainnet tests * TestServer_GetBellatrixBeaconBlock * change slashed validator index * clear cache in reward_test.go * deprecate flag * create bazel mainnet target * move attester mainnet test to mainnet target * "fix" proposer tests * use minimal config in TestServer_circuitBreakBuilder * fix TestProposer_ProposeBlock_OK * more fixes in validator package * more fixes * more fixes * test code * move TestProposer_GetBeaconBlock_BellatrixEpoch to minimal * finally * remove proposer_bellatrix_mainnet_test.go * fix TestServer_GetBellatrixBeaconBlock_HappyCase * fix TestServer_GetBellatrixBeaconBlock_BuilderCase * Preston needs to fix this! * Revert "Preston needs to fix this!" This reverts commit b03d97a16e3080e254c7b19d7f193d3c600ca869. * remove proto state tests * fix migration tests * static analysis fix * review * remove proto state * swap state in tests * fix BUILD file in /proto/testing * remove metrics test with nil state
113 lines
3.4 KiB
Go
113 lines
3.4 KiB
Go
package kv
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/prysmaticlabs/prysm/v3/beacon-chain/core/blocks"
|
|
dbIface "github.com/prysmaticlabs/prysm/v3/beacon-chain/db/iface"
|
|
"github.com/prysmaticlabs/prysm/v3/beacon-chain/state"
|
|
state_native "github.com/prysmaticlabs/prysm/v3/beacon-chain/state/state-native"
|
|
"github.com/prysmaticlabs/prysm/v3/config/params"
|
|
consensusblocks "github.com/prysmaticlabs/prysm/v3/consensus-types/blocks"
|
|
ethpb "github.com/prysmaticlabs/prysm/v3/proto/prysm/v1alpha1"
|
|
)
|
|
|
|
// SaveGenesisData bootstraps the beaconDB with a given genesis state.
|
|
func (s *Store) SaveGenesisData(ctx context.Context, genesisState state.BeaconState) error {
|
|
stateRoot, err := genesisState.HashTreeRoot(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
genesisBlk := blocks.NewGenesisBlock(stateRoot[:])
|
|
genesisBlkRoot, err := genesisBlk.Block.HashTreeRoot()
|
|
if err != nil {
|
|
return errors.Wrap(err, "could not get genesis block root")
|
|
}
|
|
wsb, err := consensusblocks.NewSignedBeaconBlock(genesisBlk)
|
|
if err != nil {
|
|
return errors.Wrap(err, "could not wrap genesis block")
|
|
}
|
|
if err := s.SaveBlock(ctx, wsb); err != nil {
|
|
return errors.Wrap(err, "could not save genesis block")
|
|
}
|
|
if err := s.SaveState(ctx, genesisState, genesisBlkRoot); err != nil {
|
|
return errors.Wrap(err, "could not save genesis state")
|
|
}
|
|
if err := s.SaveStateSummary(ctx, ðpb.StateSummary{
|
|
Slot: 0,
|
|
Root: genesisBlkRoot[:],
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := s.SaveHeadBlockRoot(ctx, genesisBlkRoot); err != nil {
|
|
return errors.Wrap(err, "could not save head block root")
|
|
}
|
|
if err := s.SaveGenesisBlockRoot(ctx, genesisBlkRoot); err != nil {
|
|
return errors.Wrap(err, "could not save genesis block root")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// LoadGenesis loads a genesis state from a ssz-serialized byte slice, if no genesis exists already.
|
|
func (s *Store) LoadGenesis(ctx context.Context, sb []byte) error {
|
|
st := ðpb.BeaconState{}
|
|
if err := st.UnmarshalSSZ(sb); err != nil {
|
|
return err
|
|
}
|
|
gs, err := state_native.InitializeFromProtoUnsafePhase0(st)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
existing, err := s.GenesisState(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// If some different genesis state existed already, return an error. The same genesis state is
|
|
// considered a no-op.
|
|
if existing != nil && !existing.IsNil() {
|
|
a, err := existing.HashTreeRoot(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
b, err := gs.HashTreeRoot(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if a == b {
|
|
return nil
|
|
}
|
|
return dbIface.ErrExistingGenesisState
|
|
}
|
|
|
|
if !bytes.Equal(gs.Fork().CurrentVersion, params.BeaconConfig().GenesisForkVersion) {
|
|
return fmt.Errorf("loaded genesis fork version (%#x) does not match config genesis "+
|
|
"fork version (%#x)", gs.Fork().CurrentVersion, params.BeaconConfig().GenesisForkVersion)
|
|
}
|
|
return s.SaveGenesisData(ctx, gs)
|
|
}
|
|
|
|
// EnsureEmbeddedGenesis checks that a genesis block has been generated when an embedded genesis
|
|
// state is used. If a genesis block does not exist, but a genesis state does, then we should call
|
|
// SaveGenesisData on the existing genesis state.
|
|
func (s *Store) EnsureEmbeddedGenesis(ctx context.Context) error {
|
|
gb, err := s.GenesisBlock(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if gb != nil && !gb.IsNil() {
|
|
return nil
|
|
}
|
|
gs, err := s.GenesisState(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if gs != nil && !gs.IsNil() {
|
|
return s.SaveGenesisData(ctx, gs)
|
|
}
|
|
return nil
|
|
}
|