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 := &ethpb.ProposerSlashing{
    21  		Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    22  			Header: &ethpb.BeaconBlockHeader{
    23  				ProposerIndex: 1,
    24  			},
    25  		}),
    26  		Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    27  			Header: &ethpb.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: &ethpb.ProposerSlashing{
    54  				Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    55  					Header: &ethpb.BeaconBlockHeader{
    56  						ProposerIndex: 1,
    57  					},
    58  				}),
    59  				Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    60  					Header: &ethpb.BeaconBlockHeader{
    61  						ProposerIndex: 1,
    62  					},
    63  				}),
    64  			},
    65  		},
    66  		{
    67  			ss: types.Included,
    68  			ps: &ethpb.ProposerSlashing{
    69  				Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    70  					Header: &ethpb.BeaconBlockHeader{
    71  						ProposerIndex: 2,
    72  					},
    73  				}),
    74  				Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    75  					Header: &ethpb.BeaconBlockHeader{
    76  						ProposerIndex: 2,
    77  					},
    78  				}),
    79  			},
    80  		},
    81  		{
    82  			ss: types.Reverted,
    83  			ps: &ethpb.ProposerSlashing{
    84  				Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    85  					Header: &ethpb.BeaconBlockHeader{
    86  						ProposerIndex: 3,
    87  					},
    88  				}),
    89  				Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
    90  					Header: &ethpb.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: &ethpb.ProposerSlashing{
   131  				Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   132  					Header: &ethpb.BeaconBlockHeader{
   133  						ProposerIndex: 1,
   134  					},
   135  				}),
   136  				Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   137  					Header: &ethpb.BeaconBlockHeader{
   138  						ProposerIndex: 1,
   139  					},
   140  				}),
   141  			},
   142  		},
   143  		{
   144  			ss: types.Active,
   145  			ps: &ethpb.ProposerSlashing{
   146  				Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   147  					Header: &ethpb.BeaconBlockHeader{
   148  						ProposerIndex: 2,
   149  					},
   150  				}),
   151  				Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   152  					Header: &ethpb.BeaconBlockHeader{
   153  						ProposerIndex: 2,
   154  					},
   155  				}),
   156  			},
   157  		},
   158  		{
   159  			ss: types.Active,
   160  			ps: &ethpb.ProposerSlashing{
   161  				Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   162  					Header: &ethpb.BeaconBlockHeader{
   163  						ProposerIndex: 3,
   164  					},
   165  				}),
   166  				Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   167  					Header: &ethpb.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(&ethpb.SignedBeaconBlockHeader{
   203  				Header: &ethpb.BeaconBlockHeader{
   204  					ProposerIndex: 1,
   205  				},
   206  			}),
   207  			Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   208  				Header: &ethpb.BeaconBlockHeader{
   209  					ProposerIndex: 1,
   210  				},
   211  			}),
   212  		},
   213  		{
   214  			Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   215  				Header: &ethpb.BeaconBlockHeader{
   216  					ProposerIndex: 2,
   217  				},
   218  			}),
   219  			Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   220  				Header: &ethpb.BeaconBlockHeader{
   221  					ProposerIndex: 2,
   222  				},
   223  			}),
   224  		},
   225  		{
   226  			Header_1: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   227  				Header: &ethpb.BeaconBlockHeader{
   228  					ProposerIndex: 3,
   229  				},
   230  			}),
   231  			Header_2: testutil.HydrateSignedBeaconHeader(&ethpb.SignedBeaconBlockHeader{
   232  				Header: &ethpb.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  }