github.com/prysmaticlabs/prysm@v1.4.4/beacon-chain/state/stategen/migrate_test.go (about)

     1  package stategen
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	types "github.com/prysmaticlabs/eth2-types"
     8  	"github.com/prysmaticlabs/prysm/beacon-chain/core/blocks"
     9  	testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing"
    10  	pb "github.com/prysmaticlabs/prysm/proto/beacon/p2p/v1"
    11  	"github.com/prysmaticlabs/prysm/proto/eth/v1alpha1/wrapper"
    12  	"github.com/prysmaticlabs/prysm/shared/testutil"
    13  	"github.com/prysmaticlabs/prysm/shared/testutil/assert"
    14  	"github.com/prysmaticlabs/prysm/shared/testutil/require"
    15  	logTest "github.com/sirupsen/logrus/hooks/test"
    16  )
    17  
    18  func TestMigrateToCold_CanSaveFinalizedInfo(t *testing.T) {
    19  	ctx := context.Background()
    20  	beaconDB := testDB.SetupDB(t)
    21  	service := New(beaconDB)
    22  	beaconState, _ := testutil.DeterministicGenesisState(t, 32)
    23  	b := testutil.NewBeaconBlock()
    24  	b.Block.Slot = 1
    25  	br, err := b.Block.HashTreeRoot()
    26  	require.NoError(t, err)
    27  	require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b)))
    28  	require.NoError(t, service.epochBoundaryStateCache.put(br, beaconState))
    29  	require.NoError(t, service.MigrateToCold(ctx, br))
    30  
    31  	wanted := &finalizedInfo{state: beaconState, root: br, slot: 1}
    32  	assert.DeepEqual(t, wanted, service.finalizedInfo, "Incorrect finalized info")
    33  }
    34  
    35  func TestMigrateToCold_HappyPath(t *testing.T) {
    36  	hook := logTest.NewGlobal()
    37  	ctx := context.Background()
    38  	beaconDB := testDB.SetupDB(t)
    39  
    40  	service := New(beaconDB)
    41  	service.slotsPerArchivedPoint = 1
    42  	beaconState, _ := testutil.DeterministicGenesisState(t, 32)
    43  	stateSlot := types.Slot(1)
    44  	require.NoError(t, beaconState.SetSlot(stateSlot))
    45  	b := testutil.NewBeaconBlock()
    46  	b.Block.Slot = 2
    47  	fRoot, err := b.Block.HashTreeRoot()
    48  	require.NoError(t, err)
    49  	require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b)))
    50  	require.NoError(t, service.epochBoundaryStateCache.put(fRoot, beaconState))
    51  	require.NoError(t, service.MigrateToCold(ctx, fRoot))
    52  
    53  	gotState, err := service.beaconDB.State(ctx, fRoot)
    54  	require.NoError(t, err)
    55  	assert.DeepSSZEqual(t, beaconState.InnerStateUnsafe(), gotState.InnerStateUnsafe(), "Did not save state")
    56  	gotRoot := service.beaconDB.ArchivedPointRoot(ctx, stateSlot/service.slotsPerArchivedPoint)
    57  	assert.Equal(t, fRoot, gotRoot, "Did not save archived root")
    58  	lastIndex, err := service.beaconDB.LastArchivedSlot(ctx)
    59  	require.NoError(t, err)
    60  	assert.Equal(t, types.Slot(1), lastIndex, "Did not save last archived index")
    61  
    62  	require.LogsContain(t, hook, "Saved state in DB")
    63  }
    64  
    65  func TestMigrateToCold_RegeneratePath(t *testing.T) {
    66  	hook := logTest.NewGlobal()
    67  	ctx := context.Background()
    68  	beaconDB := testDB.SetupDB(t)
    69  
    70  	service := New(beaconDB)
    71  	service.slotsPerArchivedPoint = 1
    72  	beaconState, pks := testutil.DeterministicGenesisState(t, 32)
    73  	genesisStateRoot, err := beaconState.HashTreeRoot(ctx)
    74  	require.NoError(t, err)
    75  	genesis := blocks.NewGenesisBlock(genesisStateRoot[:])
    76  	assert.NoError(t, beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(genesis)))
    77  	gRoot, err := genesis.Block.HashTreeRoot()
    78  	require.NoError(t, err)
    79  	assert.NoError(t, beaconDB.SaveState(ctx, beaconState, gRoot))
    80  	assert.NoError(t, beaconDB.SaveGenesisBlockRoot(ctx, gRoot))
    81  
    82  	b1, err := testutil.GenerateFullBlock(beaconState, pks, testutil.DefaultBlockGenConfig(), 1)
    83  	require.NoError(t, err)
    84  	r1, err := b1.Block.HashTreeRoot()
    85  	require.NoError(t, err)
    86  	require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b1)))
    87  	require.NoError(t, service.beaconDB.SaveStateSummary(ctx, &pb.StateSummary{Slot: 1, Root: r1[:]}))
    88  
    89  	b4, err := testutil.GenerateFullBlock(beaconState, pks, testutil.DefaultBlockGenConfig(), 4)
    90  	require.NoError(t, err)
    91  	r4, err := b4.Block.HashTreeRoot()
    92  	require.NoError(t, err)
    93  	require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b4)))
    94  	require.NoError(t, service.beaconDB.SaveStateSummary(ctx, &pb.StateSummary{Slot: 4, Root: r4[:]}))
    95  	service.finalizedInfo = &finalizedInfo{
    96  		slot:  0,
    97  		root:  genesisStateRoot,
    98  		state: beaconState,
    99  	}
   100  
   101  	require.NoError(t, service.MigrateToCold(ctx, r4))
   102  
   103  	s1, err := service.beaconDB.State(ctx, r1)
   104  	require.NoError(t, err)
   105  	assert.Equal(t, s1.Slot(), types.Slot(1), "Did not save state")
   106  	gotRoot := service.beaconDB.ArchivedPointRoot(ctx, 1/service.slotsPerArchivedPoint)
   107  	assert.Equal(t, r1, gotRoot, "Did not save archived root")
   108  	lastIndex, err := service.beaconDB.LastArchivedSlot(ctx)
   109  	require.NoError(t, err)
   110  	assert.Equal(t, types.Slot(1), lastIndex, "Did not save last archived index")
   111  
   112  	require.LogsContain(t, hook, "Saved state in DB")
   113  }
   114  
   115  func TestMigrateToCold_StateExistsInDB(t *testing.T) {
   116  	hook := logTest.NewGlobal()
   117  	ctx := context.Background()
   118  	beaconDB := testDB.SetupDB(t)
   119  
   120  	service := New(beaconDB)
   121  	service.slotsPerArchivedPoint = 1
   122  	beaconState, _ := testutil.DeterministicGenesisState(t, 32)
   123  	stateSlot := types.Slot(1)
   124  	require.NoError(t, beaconState.SetSlot(stateSlot))
   125  	b := testutil.NewBeaconBlock()
   126  	b.Block.Slot = 2
   127  	fRoot, err := b.Block.HashTreeRoot()
   128  	require.NoError(t, err)
   129  	require.NoError(t, service.beaconDB.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(b)))
   130  	require.NoError(t, service.epochBoundaryStateCache.put(fRoot, beaconState))
   131  	require.NoError(t, service.beaconDB.SaveState(ctx, beaconState, fRoot))
   132  
   133  	service.saveHotStateDB.savedStateRoots = [][32]byte{{1}, {2}, {3}, {4}, fRoot}
   134  	require.NoError(t, service.MigrateToCold(ctx, fRoot))
   135  	assert.DeepEqual(t, [][32]byte{{1}, {2}, {3}, {4}}, service.saveHotStateDB.savedStateRoots)
   136  	assert.LogsDoNotContain(t, hook, "Saved state in DB")
   137  }