mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-09 15:37:56 -05:00
Return the genesis block root from last validated checkpoint if zero (#15021)
* Return the genesis block root from last validated checkpoint if zero When starting a node we load the last validated checkpoint. On tests or a new node this checkpoint can have the zero blockroot (it returns the finalized checkpoint). This PR ensures that it returns the genesis block root instead. It can't affect runnning code since the root is only used at startup in `setup_forkchoice`. But it may affect tests because now `OptimisticForRoot` will error out if there is no genesis block root set on db. * Terence review * fix test
This commit is contained in:
@@ -582,6 +582,7 @@ func TestService_IsOptimisticForRoot_StateSummaryRecovered(t *testing.T) {
|
|||||||
br, err := b.Block.HashTreeRoot()
|
br, err := b.Block.HashTreeRoot()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
util.SaveBlock(t, context.Background(), beaconDB, b)
|
util.SaveBlock(t, context.Background(), beaconDB, b)
|
||||||
|
require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, [32]byte{}))
|
||||||
_, err = c.IsOptimisticForRoot(ctx, br)
|
_, err = c.IsOptimisticForRoot(ctx, br)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
summ, err := beaconDB.StateSummary(ctx, br)
|
summ, err := beaconDB.StateSummary(ctx, br)
|
||||||
|
|||||||
@@ -1983,6 +1983,7 @@ func TestNoViableHead_Reboot(t *testing.T) {
|
|||||||
|
|
||||||
require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, genesisState, genesisRoot), "Could not save genesis state")
|
require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, genesisState, genesisRoot), "Could not save genesis state")
|
||||||
require.NoError(t, service.cfg.BeaconDB.SaveHeadBlockRoot(ctx, genesisRoot), "Could not save genesis state")
|
require.NoError(t, service.cfg.BeaconDB.SaveHeadBlockRoot(ctx, genesisRoot), "Could not save genesis state")
|
||||||
|
require.NoError(t, service.cfg.BeaconDB.SaveGenesisBlockRoot(ctx, genesisRoot), "Could not save genesis state")
|
||||||
|
|
||||||
for i := 1; i < 6; i++ {
|
for i := 1; i < 6; i++ {
|
||||||
driftGenesisTime(service, int64(i), 0)
|
driftGenesisTime(service, int64(i), 0)
|
||||||
@@ -2117,6 +2118,7 @@ func TestNoViableHead_Reboot(t *testing.T) {
|
|||||||
require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, genesisState, jroot))
|
require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, genesisState, jroot))
|
||||||
service.cfg.ForkChoiceStore.SetBalancesByRooter(service.cfg.StateGen.ActiveNonSlashedBalancesByRoot)
|
service.cfg.ForkChoiceStore.SetBalancesByRooter(service.cfg.StateGen.ActiveNonSlashedBalancesByRoot)
|
||||||
require.NoError(t, service.StartFromSavedState(genesisState))
|
require.NoError(t, service.StartFromSavedState(genesisState))
|
||||||
|
require.NoError(t, service.cfg.BeaconDB.SaveGenesisBlockRoot(ctx, genesisRoot))
|
||||||
|
|
||||||
// Forkchoice has the genesisRoot loaded at startup
|
// Forkchoice has the genesisRoot loaded at startup
|
||||||
require.Equal(t, genesisRoot, service.ensureRootNotZeros(service.cfg.ForkChoiceStore.CachedHeadRoot()))
|
require.Equal(t, genesisRoot, service.ensureRootNotZeros(service.cfg.ForkChoiceStore.CachedHeadRoot()))
|
||||||
@@ -2126,7 +2128,7 @@ func TestNoViableHead_Reboot(t *testing.T) {
|
|||||||
require.Equal(t, genesisRoot, bytesutil.ToBytes32(headRoot))
|
require.Equal(t, genesisRoot, bytesutil.ToBytes32(headRoot))
|
||||||
optimistic, err := service.IsOptimistic(ctx)
|
optimistic, err := service.IsOptimistic(ctx)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, true, optimistic)
|
require.Equal(t, false, optimistic)
|
||||||
|
|
||||||
// Check that the node's justified checkpoint does not agree with the
|
// Check that the node's justified checkpoint does not agree with the
|
||||||
// last valid state's justified checkpoint
|
// last valid state's justified checkpoint
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package kv
|
package kv
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
|
"github.com/prysmaticlabs/prysm/v5/config/params"
|
||||||
"github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace"
|
"github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace"
|
||||||
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
|
||||||
bolt "go.etcd.io/bbolt"
|
bolt "go.etcd.io/bbolt"
|
||||||
@@ -19,7 +21,17 @@ func (s *Store) LastValidatedCheckpoint(ctx context.Context) (*ethpb.Checkpoint,
|
|||||||
if enc == nil {
|
if enc == nil {
|
||||||
var finErr error
|
var finErr error
|
||||||
checkpoint, finErr = s.FinalizedCheckpoint(ctx)
|
checkpoint, finErr = s.FinalizedCheckpoint(ctx)
|
||||||
return finErr
|
if finErr != nil {
|
||||||
|
return finErr
|
||||||
|
}
|
||||||
|
if bytes.Equal(checkpoint.Root, params.BeaconConfig().ZeroHash[:]) {
|
||||||
|
bkt = tx.Bucket(blocksBucket)
|
||||||
|
r := bkt.Get(genesisBlockRootKey)
|
||||||
|
if r != nil {
|
||||||
|
checkpoint.Root = r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
checkpoint = ðpb.Checkpoint{}
|
checkpoint = ðpb.Checkpoint{}
|
||||||
return decode(ctx, enc, checkpoint)
|
return decode(ctx, enc, checkpoint)
|
||||||
|
|||||||
3
changelog/potuz_last_validated.md
Normal file
3
changelog/potuz_last_validated.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
### Ignored
|
||||||
|
|
||||||
|
- When starting a node, check that the last validated checkpoint has zero as root and return the genesis block root
|
||||||
Reference in New Issue
Block a user