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 }