github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/db/kv/checkpoint_test.go (about)

     1  package kv
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1"
     8  	"github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper"
     9  	"github.com/prysmaticlabs/prysm/shared/bytesutil"
    10  	"github.com/prysmaticlabs/prysm/shared/params"
    11  	"github.com/prysmaticlabs/prysm/shared/testutil"
    12  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    13  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    14  	"google.golang.org/protobuf/proto"
    15  )
    16  
    17  func TestStore_JustifiedCheckpoint_CanSaveRetrieve(t *testing.T) {
    18  	db := setupDB(t)
    19  	ctx := context.Background()
    20  	root := bytesutil.ToBytes32([]byte{'A'})
    21  	cp := &ethpb.Checkpoint{
    22  		Epoch: 10,
    23  		Root:  root[:],
    24  	}
    25  	st, err := testutil.NewBeaconState()
    26  	require.NoError(t, err)
    27  	require.NoError(t, st.SetSlot(1))
    28  	require.NoError(t, db.SaveState(ctx, st, root))
    29  	require.NoError(t, db.SaveJustifiedCheckpoint(ctx, cp))
    30  
    31  	retrieved, err := db.JustifiedCheckpoint(ctx)
    32  	require.NoError(t, err)
    33  	assert.Equal(t, true, proto.Equal(cp, retrieved), "Wanted %v, received %v", cp, retrieved)
    34  }
    35  
    36  func TestStore_FinalizedCheckpoint_CanSaveRetrieve(t *testing.T) {
    37  	db := setupDB(t)
    38  	ctx := context.Background()
    39  
    40  	genesis := bytesutil.ToBytes32([]byte{'G', 'E', 'N', 'E', 'S', 'I', 'S'})
    41  	require.NoError(t, db.SaveGenesisBlockRoot(ctx, genesis))
    42  
    43  	blk := testutil.NewBeaconBlock()
    44  	blk.Block.ParentRoot = genesis[:]
    45  	blk.Block.Slot = 40
    46  
    47  	root, err := blk.Block.HashTreeRoot()
    48  	require.NoError(t, err)
    49  
    50  	cp := &ethpb.Checkpoint{
    51  		Epoch: 5,
    52  		Root:  root[:],
    53  	}
    54  
    55  	// a valid chain is required to save finalized checkpoint.
    56  	require.NoError(t, db.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(blk)))
    57  	st, err := testutil.NewBeaconState()
    58  	require.NoError(t, err)
    59  	require.NoError(t, st.SetSlot(1))
    60  	// a state is required to save checkpoint
    61  	require.NoError(t, db.SaveState(ctx, st, root))
    62  
    63  	require.NoError(t, db.SaveFinalizedCheckpoint(ctx, cp))
    64  
    65  	retrieved, err := db.FinalizedCheckpoint(ctx)
    66  	require.NoError(t, err)
    67  	assert.Equal(t, true, proto.Equal(cp, retrieved), "Wanted %v, received %v", cp, retrieved)
    68  }
    69  
    70  func TestStore_JustifiedCheckpoint_DefaultIsZeroHash(t *testing.T) {
    71  	db := setupDB(t)
    72  	ctx := context.Background()
    73  
    74  	cp := &ethpb.Checkpoint{Root: params.BeaconConfig().ZeroHash[:]}
    75  	retrieved, err := db.JustifiedCheckpoint(ctx)
    76  	require.NoError(t, err)
    77  	assert.Equal(t, true, proto.Equal(cp, retrieved), "Wanted %v, received %v", cp, retrieved)
    78  }
    79  
    80  func TestStore_FinalizedCheckpoint_DefaultIsZeroHash(t *testing.T) {
    81  	db := setupDB(t)
    82  	ctx := context.Background()
    83  
    84  	cp := &ethpb.Checkpoint{Root: params.BeaconConfig().ZeroHash[:]}
    85  	retrieved, err := db.FinalizedCheckpoint(ctx)
    86  	require.NoError(t, err)
    87  	assert.Equal(t, true, proto.Equal(cp, retrieved), "Wanted %v, received %v", cp, retrieved)
    88  }
    89  
    90  func TestStore_FinalizedCheckpoint_StateMustExist(t *testing.T) {
    91  	db := setupDB(t)
    92  	ctx := context.Background()
    93  	cp := &ethpb.Checkpoint{
    94  		Epoch: 5,
    95  		Root:  []byte{'B'},
    96  	}
    97  
    98  	require.ErrorContains(t, errMissingStateForCheckpoint.Error(), db.SaveFinalizedCheckpoint(ctx, cp))
    99  }