package blockchain import ( "context" "testing" "github.com/pkg/errors" "github.com/prysmaticlabs/prysm/beacon-chain/blockchain/store" testDB "github.com/prysmaticlabs/prysm/beacon-chain/db/testing" fieldparams "github.com/prysmaticlabs/prysm/config/fieldparams" types "github.com/prysmaticlabs/prysm/consensus-types/primitives" "github.com/prysmaticlabs/prysm/consensus-types/wrapper" "github.com/prysmaticlabs/prysm/encoding/bytesutil" ethpb "github.com/prysmaticlabs/prysm/proto/prysm/v1alpha1" "github.com/prysmaticlabs/prysm/testing/require" "github.com/prysmaticlabs/prysm/testing/util" "github.com/prysmaticlabs/prysm/time/slots" ) func TestService_VerifyWeakSubjectivityRoot(t *testing.T) { beaconDB := testDB.SetupDB(t) b := util.NewBeaconBlock() b.Block.Slot = 1792480 wsb, err := wrapper.WrappedSignedBeaconBlock(b) require.NoError(t, err) require.NoError(t, beaconDB.SaveBlock(context.Background(), wsb)) r, err := b.Block.HashTreeRoot() require.NoError(t, err) blockEpoch := slots.ToEpoch(b.Block.Slot) tests := []struct { wsVerified bool disabled bool wantErr error checkpt *ethpb.Checkpoint finalizedEpoch types.Epoch name string }{ { name: "nil root and epoch", disabled: true, }, { name: "not yet to verify, ws epoch higher than finalized epoch", checkpt: ðpb.Checkpoint{Root: bytesutil.PadTo([]byte{'a'}, 32), Epoch: blockEpoch}, finalizedEpoch: blockEpoch - 1, }, { name: "can't find the block in DB", checkpt: ðpb.Checkpoint{Root: bytesutil.PadTo([]byte{'a'}, fieldparams.RootLength), Epoch: 1}, finalizedEpoch: blockEpoch + 1, wantErr: errWSBlockNotFound, }, { name: "can't find the block corresponds to ws epoch in DB", checkpt: ðpb.Checkpoint{Root: r[:], Epoch: blockEpoch - 2}, // Root belongs in epoch 1. finalizedEpoch: blockEpoch - 1, wantErr: errWSBlockNotFoundInEpoch, }, { name: "can verify and pass", checkpt: ðpb.Checkpoint{Root: r[:], Epoch: blockEpoch}, finalizedEpoch: blockEpoch + 1, }, { name: "equal epoch", checkpt: ðpb.Checkpoint{Root: r[:], Epoch: blockEpoch}, finalizedEpoch: blockEpoch, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { wv, err := NewWeakSubjectivityVerifier(tt.checkpt, beaconDB) require.Equal(t, !tt.disabled, wv.enabled) require.NoError(t, err) s := &Service{ cfg: &config{BeaconDB: beaconDB, WeakSubjectivityCheckpt: tt.checkpt}, store: &store.Store{}, wsVerifier: wv, } s.store.SetFinalizedCheckptAndPayloadHash(ðpb.Checkpoint{Epoch: tt.finalizedEpoch}, [32]byte{}) err = s.wsVerifier.VerifyWeakSubjectivity(context.Background(), s.store.FinalizedCheckpt().Epoch) if tt.wantErr == nil { require.NoError(t, err) } else { require.Equal(t, true, errors.Is(err, tt.wantErr)) } }) } }