Skip to content

Commit 3cd2973

Browse files
authored
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
1 parent d3e5710 commit 3cd2973

File tree

4 files changed

+20
-2
lines changed

4 files changed

+20
-2
lines changed

beacon-chain/blockchain/chain_info_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ func TestService_IsOptimisticForRoot_StateSummaryRecovered(t *testing.T) {
582582
br, err := b.Block.HashTreeRoot()
583583
require.NoError(t, err)
584584
util.SaveBlock(t, context.Background(), beaconDB, b)
585+
require.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, [32]byte{}))
585586
_, err = c.IsOptimisticForRoot(ctx, br)
586587
assert.NoError(t, err)
587588
summ, err := beaconDB.StateSummary(ctx, br)

beacon-chain/blockchain/process_block_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -1983,6 +1983,7 @@ func TestNoViableHead_Reboot(t *testing.T) {
19831983

19841984
require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, genesisState, genesisRoot), "Could not save genesis state")
19851985
require.NoError(t, service.cfg.BeaconDB.SaveHeadBlockRoot(ctx, genesisRoot), "Could not save genesis state")
1986+
require.NoError(t, service.cfg.BeaconDB.SaveGenesisBlockRoot(ctx, genesisRoot), "Could not save genesis state")
19861987

19871988
for i := 1; i < 6; i++ {
19881989
driftGenesisTime(service, int64(i), 0)
@@ -2117,6 +2118,7 @@ func TestNoViableHead_Reboot(t *testing.T) {
21172118
require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, genesisState, jroot))
21182119
service.cfg.ForkChoiceStore.SetBalancesByRooter(service.cfg.StateGen.ActiveNonSlashedBalancesByRoot)
21192120
require.NoError(t, service.StartFromSavedState(genesisState))
2121+
require.NoError(t, service.cfg.BeaconDB.SaveGenesisBlockRoot(ctx, genesisRoot))
21202122

21212123
// Forkchoice has the genesisRoot loaded at startup
21222124
require.Equal(t, genesisRoot, service.ensureRootNotZeros(service.cfg.ForkChoiceStore.CachedHeadRoot()))
@@ -2126,7 +2128,7 @@ func TestNoViableHead_Reboot(t *testing.T) {
21262128
require.Equal(t, genesisRoot, bytesutil.ToBytes32(headRoot))
21272129
optimistic, err := service.IsOptimistic(ctx)
21282130
require.NoError(t, err)
2129-
require.Equal(t, true, optimistic)
2131+
require.Equal(t, false, optimistic)
21302132

21312133
// Check that the node's justified checkpoint does not agree with the
21322134
// last valid state's justified checkpoint

beacon-chain/db/kv/validated_checkpoint.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package kv
22

33
import (
4+
"bytes"
45
"context"
56

7+
"github.com/prysmaticlabs/prysm/v5/config/params"
68
"github.com/prysmaticlabs/prysm/v5/monitoring/tracing/trace"
79
ethpb "github.com/prysmaticlabs/prysm/v5/proto/prysm/v1alpha1"
810
bolt "go.etcd.io/bbolt"
@@ -19,7 +21,17 @@ func (s *Store) LastValidatedCheckpoint(ctx context.Context) (*ethpb.Checkpoint,
1921
if enc == nil {
2022
var finErr error
2123
checkpoint, finErr = s.FinalizedCheckpoint(ctx)
22-
return finErr
24+
if finErr != nil {
25+
return finErr
26+
}
27+
if bytes.Equal(checkpoint.Root, params.BeaconConfig().ZeroHash[:]) {
28+
bkt = tx.Bucket(blocksBucket)
29+
r := bkt.Get(genesisBlockRootKey)
30+
if r != nil {
31+
checkpoint.Root = r
32+
}
33+
}
34+
return nil
2335
}
2436
checkpoint = &ethpb.Checkpoint{}
2537
return decode(ctx, enc, checkpoint)

changelog/potuz_last_validated.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
### Ignored
2+
3+
- When starting a node, check that the last validated checkpoint has zero as root and return the genesis block root

0 commit comments

Comments
 (0)