github.com/prysmaticlabs/prysm@v1.4.4/slasher/db/kv/proposer_slashings_test.go (about) 1 package kv 2 3 import ( 4 "context" 5 "sort" 6 "testing" 7 8 ethpb "github.com/prysmaticlabs/prysm/proto/eth/v1alpha1" 9 "github.com/prysmaticlabs/prysm/shared/sszutil" 10 "github.com/prysmaticlabs/prysm/shared/testutil" 11 "github.com/prysmaticlabs/prysm/shared/testutil/require" 12 "github.com/prysmaticlabs/prysm/slasher/db/types" 13 "gopkg.in/d4l3k/messagediff.v1" 14 ) 15 16 func TestStore_ProposerSlashingNilBucket(t *testing.T) { 17 db := setupDB(t) 18 ctx := context.Background() 19 20 ps := ðpb.ProposerSlashing{ 21 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 22 Header: ðpb.BeaconBlockHeader{ 23 ProposerIndex: 1, 24 }, 25 }), 26 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 27 Header: ðpb.BeaconBlockHeader{ 28 ProposerIndex: 1, 29 }, 30 }), 31 } 32 has, _, err := db.HasProposerSlashing(ctx, ps) 33 require.NoError(t, err) 34 require.Equal(t, false, has) 35 36 p, err := db.ProposalSlashingsByStatus(ctx, types.SlashingStatus(types.Active)) 37 require.NoError(t, err, "Failed to get proposer slashing") 38 require.NotNil(t, p) 39 require.Equal(t, 0, len(p), "Get should return empty attester slashing array for a non existent key") 40 } 41 42 func TestStore_SaveProposerSlashing(t *testing.T) { 43 44 db := setupDB(t) 45 ctx := context.Background() 46 47 tests := []struct { 48 ss types.SlashingStatus 49 ps *ethpb.ProposerSlashing 50 }{ 51 { 52 ss: types.Active, 53 ps: ðpb.ProposerSlashing{ 54 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 55 Header: ðpb.BeaconBlockHeader{ 56 ProposerIndex: 1, 57 }, 58 }), 59 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 60 Header: ðpb.BeaconBlockHeader{ 61 ProposerIndex: 1, 62 }, 63 }), 64 }, 65 }, 66 { 67 ss: types.Included, 68 ps: ðpb.ProposerSlashing{ 69 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 70 Header: ðpb.BeaconBlockHeader{ 71 ProposerIndex: 2, 72 }, 73 }), 74 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 75 Header: ðpb.BeaconBlockHeader{ 76 ProposerIndex: 2, 77 }, 78 }), 79 }, 80 }, 81 { 82 ss: types.Reverted, 83 ps: ðpb.ProposerSlashing{ 84 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 85 Header: ðpb.BeaconBlockHeader{ 86 ProposerIndex: 3, 87 }, 88 }), 89 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 90 Header: ðpb.BeaconBlockHeader{ 91 ProposerIndex: 3, 92 }, 93 }), 94 }, 95 }, 96 } 97 98 for _, tt := range tests { 99 err := db.SaveProposerSlashing(ctx, tt.ss, tt.ps) 100 require.NoError(t, err, "Save proposer slashing failed") 101 102 proposerSlashings, err := db.ProposalSlashingsByStatus(ctx, tt.ss) 103 require.NoError(t, err, "Failed to get proposer slashings") 104 105 var diff string 106 if len(proposerSlashings) > 0 { 107 diff, _ = messagediff.PrettyDiff(proposerSlashings[0], tt.ps) 108 } else { 109 diff, _ = messagediff.PrettyDiff(nil, tt.ps) 110 } 111 t.Log(diff) 112 113 if len(proposerSlashings) == 0 || !sszutil.DeepEqual(proposerSlashings[0], tt.ps) { 114 t.Fatalf("Proposer slashing: %v should be part of proposer slashings response: %v", tt.ps, proposerSlashings) 115 } 116 } 117 } 118 119 func TestStore_UpdateProposerSlashingStatus(t *testing.T) { 120 121 db := setupDB(t) 122 ctx := context.Background() 123 124 tests := []struct { 125 ss types.SlashingStatus 126 ps *ethpb.ProposerSlashing 127 }{ 128 { 129 ss: types.Active, 130 ps: ðpb.ProposerSlashing{ 131 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 132 Header: ðpb.BeaconBlockHeader{ 133 ProposerIndex: 1, 134 }, 135 }), 136 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 137 Header: ðpb.BeaconBlockHeader{ 138 ProposerIndex: 1, 139 }, 140 }), 141 }, 142 }, 143 { 144 ss: types.Active, 145 ps: ðpb.ProposerSlashing{ 146 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 147 Header: ðpb.BeaconBlockHeader{ 148 ProposerIndex: 2, 149 }, 150 }), 151 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 152 Header: ðpb.BeaconBlockHeader{ 153 ProposerIndex: 2, 154 }, 155 }), 156 }, 157 }, 158 { 159 ss: types.Active, 160 ps: ðpb.ProposerSlashing{ 161 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 162 Header: ðpb.BeaconBlockHeader{ 163 ProposerIndex: 3, 164 }, 165 }), 166 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 167 Header: ðpb.BeaconBlockHeader{ 168 ProposerIndex: 3, 169 }, 170 }), 171 }, 172 }, 173 } 174 175 for _, tt := range tests { 176 err := db.SaveProposerSlashing(ctx, tt.ss, tt.ps) 177 require.NoError(t, err, "Save proposer slashing failed") 178 } 179 180 for _, tt := range tests { 181 has, st, err := db.HasProposerSlashing(ctx, tt.ps) 182 require.NoError(t, err, "Failed to get proposer slashing") 183 require.Equal(t, true, has, "Failed to find proposer slashing") 184 require.Equal(t, tt.ss, st, "Failed to find proposer slashing with the correct status") 185 186 err = db.SaveProposerSlashing(ctx, types.SlashingStatus(types.Included), tt.ps) 187 require.NoError(t, err) 188 has, st, err = db.HasProposerSlashing(ctx, tt.ps) 189 require.NoError(t, err, "Failed to get proposer slashing") 190 require.Equal(t, true, has, "Failed to find proposer slashing") 191 require.Equal(t, types.SlashingStatus(types.Included), st, "Failed to find proposer slashing with the correct status") 192 } 193 } 194 195 func TestStore_SaveProposerSlashings(t *testing.T) { 196 197 db := setupDB(t) 198 ctx := context.Background() 199 200 ps := []*ethpb.ProposerSlashing{ 201 { 202 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 203 Header: ðpb.BeaconBlockHeader{ 204 ProposerIndex: 1, 205 }, 206 }), 207 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 208 Header: ðpb.BeaconBlockHeader{ 209 ProposerIndex: 1, 210 }, 211 }), 212 }, 213 { 214 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 215 Header: ðpb.BeaconBlockHeader{ 216 ProposerIndex: 2, 217 }, 218 }), 219 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 220 Header: ðpb.BeaconBlockHeader{ 221 ProposerIndex: 2, 222 }, 223 }), 224 }, 225 { 226 Header_1: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 227 Header: ðpb.BeaconBlockHeader{ 228 ProposerIndex: 3, 229 }, 230 }), 231 Header_2: testutil.HydrateSignedBeaconHeader(ðpb.SignedBeaconBlockHeader{ 232 Header: ðpb.BeaconBlockHeader{ 233 ProposerIndex: 3, 234 }, 235 }), 236 }, 237 } 238 err := db.SaveProposerSlashings(ctx, types.Active, ps) 239 require.NoError(t, err, "Save proposer slashings failed") 240 proposerSlashings, err := db.ProposalSlashingsByStatus(ctx, types.Active) 241 require.NoError(t, err, "Failed to get proposer slashings") 242 sort.SliceStable(proposerSlashings, func(i, j int) bool { 243 return proposerSlashings[i].Header_1.Header.ProposerIndex < proposerSlashings[j].Header_1.Header.ProposerIndex 244 }) 245 if proposerSlashings == nil || !sszutil.DeepEqual(proposerSlashings, ps) { 246 diff, _ := messagediff.PrettyDiff(proposerSlashings, ps) 247 t.Log(diff) 248 t.Fatalf("Proposer slashing: %v should be part of proposer slashings response: %v", ps, proposerSlashings) 249 } 250 }