diff --git a/beacon-chain/db/kv/BUILD.bazel b/beacon-chain/db/kv/BUILD.bazel index 90c7e48e05..b84704e253 100644 --- a/beacon-chain/db/kv/BUILD.bazel +++ b/beacon-chain/db/kv/BUILD.bazel @@ -94,6 +94,7 @@ go_test( "state_test.go", "utils_test.go", "validated_checkpoint_test.go", + "wss_test.go", ], data = glob(["testdata/**"]), embed = [":go_default_library"], @@ -101,6 +102,7 @@ go_test( "//beacon-chain/db/filters:go_default_library", "//beacon-chain/db/iface:go_default_library", "//beacon-chain/state:go_default_library", + "//beacon-chain/state/genesis:go_default_library", "//beacon-chain/state/v1:go_default_library", "//beacon-chain/state/v2:go_default_library", "//config/features:go_default_library", diff --git a/beacon-chain/db/kv/wss.go b/beacon-chain/db/kv/wss.go index 6d860c2bc0..9817e27d89 100644 --- a/beacon-chain/db/kv/wss.go +++ b/beacon-chain/db/kv/wss.go @@ -77,6 +77,12 @@ func (s *Store) SaveOrigin(ctx context.Context, serState, serBlock []byte) error return errors.Wrap(err, "could not save head block root") } + // save origin block root in a special key, to be used when the canonical + // origin (start of chain, ie alternative to genesis) block or state is needed + if err = s.SaveOriginCheckpointBlockRoot(ctx, blockRoot); err != nil { + return errors.Wrap(err, "could not save origin block root") + } + // rebuild the checkpoint from the block // use it to mark the block as justified and finalized slotEpoch, err := wblk.Block().Slot().SafeDivSlot(params.BeaconConfig().SlotsPerEpoch) @@ -94,11 +100,5 @@ func (s *Store) SaveOrigin(ctx context.Context, serState, serBlock []byte) error return errors.Wrap(err, "could not mark checkpoint sync block as finalized") } - // save origin block root in a special key, to be used when the canonical - // origin (start of chain, ie alternative to genesis) block or state is needed - if err = s.SaveOriginCheckpointBlockRoot(ctx, blockRoot); err != nil { - return errors.Wrap(err, "could not save origin block root") - } - return nil } diff --git a/beacon-chain/db/kv/wss_test.go b/beacon-chain/db/kv/wss_test.go new file mode 100644 index 0000000000..e347c87a4b --- /dev/null +++ b/beacon-chain/db/kv/wss_test.go @@ -0,0 +1,45 @@ +package kv + +import ( + "context" + "testing" + + "github.com/prysmaticlabs/prysm/beacon-chain/state/genesis" + "github.com/prysmaticlabs/prysm/config/params" + "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1/wrapper" + "github.com/prysmaticlabs/prysm/testing/require" + "github.com/prysmaticlabs/prysm/testing/util" +) + +func TestSaveOrigin(t *testing.T) { + // Embedded Genesis works with Mainnet config + params.SetupTestConfigCleanup(t) + cfg := params.BeaconConfig() + cfg.ConfigName = params.ConfigNames[params.Mainnet] + params.OverrideBeaconConfig(cfg) + + ctx := context.Background() + db := setupDB(t) + + st, err := genesis.State(params.Mainnet.String()) + require.NoError(t, err) + + sb, err := st.MarshalSSZ() + require.NoError(t, err) + require.NoError(t, db.LoadGenesis(ctx, sb)) + + // this is necessary for mainnet, because LoadGenesis is short-circuited by the embedded state, + // so the genesis root key is never written to the db. + require.NoError(t, db.EnsureEmbeddedGenesis(ctx)) + + cst, err := util.NewBeaconState() + require.NoError(t, err) + csb, err := cst.MarshalSSZ() + require.NoError(t, err) + cb := util.NewBeaconBlock() + scb, err := wrapper.WrappedSignedBeaconBlock(cb) + require.NoError(t, err) + cbb, err := scb.MarshalSSZ() + require.NoError(t, err) + require.NoError(t, db.SaveOrigin(ctx, csb, cbb)) +}