From 0233a70a2a919e7265983d1b6b107aee88f16671 Mon Sep 17 00:00:00 2001 From: terence tsao Date: Fri, 12 May 2023 13:24:52 -0700 Subject: [PATCH] Fix blockchain tests --- .../blockchain/process_attestation_test.go | 59 ++++++++++++++++--- beacon-chain/blockchain/testing/mock.go | 2 +- .../simulator/attestation_generator.go | 2 +- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/beacon-chain/blockchain/process_attestation_test.go b/beacon-chain/blockchain/process_attestation_test.go index dc5fae1700eb..558959f284ad 100644 --- a/beacon-chain/blockchain/process_attestation_test.go +++ b/beacon-chain/blockchain/process_attestation_test.go @@ -39,11 +39,20 @@ func TestStore_OnAttestation_ErrorConditions(t *testing.T) { blkWithoutState := util.NewBeaconBlock() blkWithoutState.Block.Slot = 0 util.SaveBlock(t, ctx, beaconDB, blkWithoutState) - BlkWithOutStateRoot, err := blkWithoutState.Block.HashTreeRoot() + + cp := ðpb.Checkpoint{} + st, blkRoot, err := prepareForkchoiceState(ctx, 0, [32]byte{}, [32]byte{}, params.BeaconConfig().ZeroHash, cp, cp) require.NoError(t, err) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, blkRoot)) blkWithStateBadAtt := util.NewBeaconBlock() blkWithStateBadAtt.Block.Slot = 1 + r, err := blkWithStateBadAtt.Block.HashTreeRoot() + require.NoError(t, err) + cp = ðpb.Checkpoint{Root: r[:]} + st, blkRoot, err = prepareForkchoiceState(ctx, blkWithStateBadAtt.Block.Slot, r, [32]byte{}, params.BeaconConfig().ZeroHash, cp, cp) + require.NoError(t, err) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, blkRoot)) util.SaveBlock(t, ctx, beaconDB, blkWithStateBadAtt) BlkWithStateBadAttRoot, err := blkWithStateBadAtt.Block.HashTreeRoot() require.NoError(t, err) @@ -54,7 +63,7 @@ func TestStore_OnAttestation_ErrorConditions(t *testing.T) { require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, s, BlkWithStateBadAttRoot)) blkWithValidState := util.NewBeaconBlock() - blkWithValidState.Block.Slot = 2 + blkWithValidState.Block.Slot = 32 util.SaveBlock(t, ctx, beaconDB, blkWithValidState) blkWithValidStateRoot, err := blkWithValidState.Block.HashTreeRoot() @@ -69,6 +78,9 @@ func TestStore_OnAttestation_ErrorConditions(t *testing.T) { require.NoError(t, err) require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, s, blkWithValidStateRoot)) + service.head = &head{ + state: st, + } tests := []struct { name string a *ethpb.Attestation @@ -79,11 +91,6 @@ func TestStore_OnAttestation_ErrorConditions(t *testing.T) { a: util.HydrateAttestation(ðpb.Attestation{Data: ðpb.AttestationData{Slot: params.BeaconConfig().SlotsPerEpoch, Target: ðpb.Checkpoint{Root: make([]byte, 32)}}}), wantedErr: "slot 32 does not match target epoch 0", }, - { - name: "no pre state for attestations's target block", - a: util.HydrateAttestation(ðpb.Attestation{Data: ðpb.AttestationData{Target: ðpb.Checkpoint{Root: BlkWithOutStateRoot[:]}}}), - wantedErr: "could not get pre state for epoch 0", - }, { name: "process attestation doesn't match current epoch", a: util.HydrateAttestation(ðpb.Attestation{Data: ðpb.AttestationData{Slot: 100 * params.BeaconConfig().SlotsPerEpoch, Target: ðpb.Checkpoint{Epoch: 100, @@ -166,6 +173,8 @@ func TestStore_SaveCheckpointState(t *testing.T) { WithStateGen(stategen.New(beaconDB, doublylinkedtree.New())), } service, err := NewService(ctx, opts...) + service.cfg.ForkChoiceStore = doublylinkedtree.New() + service.cfg.ForkChoiceStore.SetBalancesByRooter(func(_ context.Context, _ [32]byte) ([]uint64, error) { return []uint64{}, nil }) require.NoError(t, err) s, err := util.NewBeaconState() @@ -187,6 +196,9 @@ func TestStore_SaveCheckpointState(t *testing.T) { require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, s, bytesutil.ToBytes32([]byte{'A'}))) require.NoError(t, service.cfg.BeaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: bytesutil.PadTo([]byte{'A'}, fieldparams.RootLength)})) + st, root, err := prepareForkchoiceState(ctx, 1, bytesutil.ToBytes32(cp1.Root), [32]byte{}, [32]byte{'R'}, cp1, cp1) + require.NoError(t, err) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, root)) s1, err := service.getAttPreState(ctx, cp1) require.NoError(t, err) assert.Equal(t, 1*params.BeaconConfig().SlotsPerEpoch, s1.Slot(), "Unexpected state slot") @@ -195,7 +207,15 @@ func TestStore_SaveCheckpointState(t *testing.T) { require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, s, bytesutil.ToBytes32([]byte{'B'}))) require.NoError(t, service.cfg.BeaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: bytesutil.PadTo([]byte{'B'}, fieldparams.RootLength)})) s2, err := service.getAttPreState(ctx, cp2) + require.ErrorIs(t, ErrNotCheckpoint, err) + + st, root, err = prepareForkchoiceState(ctx, 33, bytesutil.ToBytes32(cp2.Root), bytesutil.ToBytes32(cp1.Root), [32]byte{'R'}, cp2, cp2) require.NoError(t, err) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, root)) + + s2, err = service.getAttPreState(ctx, cp2) + require.NoError(t, err) + assert.Equal(t, 2*params.BeaconConfig().SlotsPerEpoch, s2.Slot(), "Unexpected state slot") s1, err = service.getAttPreState(ctx, cp1) @@ -214,6 +234,10 @@ func TestStore_SaveCheckpointState(t *testing.T) { cp3 := ðpb.Checkpoint{Epoch: 1, Root: bytesutil.PadTo([]byte{'C'}, fieldparams.RootLength)} require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, s, bytesutil.ToBytes32([]byte{'C'}))) require.NoError(t, service.cfg.BeaconDB.SaveStateSummary(ctx, ðpb.StateSummary{Root: bytesutil.PadTo([]byte{'C'}, fieldparams.RootLength)})) + st, root, err = prepareForkchoiceState(ctx, 31, bytesutil.ToBytes32(cp3.Root), bytesutil.ToBytes32(cp2.Root), [32]byte{'P'}, cp2, cp2) + require.NoError(t, err) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, root)) + s3, err := service.getAttPreState(ctx, cp3) require.NoError(t, err) assert.Equal(t, s.Slot(), s3.Slot(), "Unexpected state slot") @@ -229,11 +253,20 @@ func TestStore_UpdateCheckpointState(t *testing.T) { } service, err := NewService(ctx, opts...) require.NoError(t, err) + service.cfg.ForkChoiceStore = doublylinkedtree.New() + service.cfg.ForkChoiceStore.SetBalancesByRooter(func(_ context.Context, _ [32]byte) ([]uint64, error) { return []uint64{}, nil }) epoch := primitives.Epoch(1) baseState, _ := util.DeterministicGenesisState(t, 1) - checkpoint := ðpb.Checkpoint{Epoch: epoch, Root: bytesutil.PadTo([]byte("hi"), fieldparams.RootLength)} + blk := util.NewBeaconBlock() + r1, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + checkpoint := ðpb.Checkpoint{Epoch: epoch, Root: r1[:]} require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, baseState, bytesutil.ToBytes32(checkpoint.Root))) + st, blkRoot, err := prepareForkchoiceState(ctx, blk.Block.Slot, r1, [32]byte{}, params.BeaconConfig().ZeroHash, checkpoint, checkpoint) + require.NoError(t, err) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, blkRoot)) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, r1)) returned, err := service.getAttPreState(ctx, checkpoint) require.NoError(t, err) assert.Equal(t, params.BeaconConfig().SlotsPerEpoch.Mul(uint64(checkpoint.Epoch)), returned.Slot(), "Incorrectly returned base state") @@ -243,8 +276,16 @@ func TestStore_UpdateCheckpointState(t *testing.T) { assert.Equal(t, returned.Slot(), cached.Slot(), "State should have been cached") epoch = 2 - newCheckpoint := ðpb.Checkpoint{Epoch: epoch, Root: bytesutil.PadTo([]byte("bye"), fieldparams.RootLength)} + blk = util.NewBeaconBlock() + blk.Block.Slot = 64 + r2, err := blk.Block.HashTreeRoot() + require.NoError(t, err) + newCheckpoint := ðpb.Checkpoint{Epoch: epoch, Root: r2[:]} require.NoError(t, service.cfg.BeaconDB.SaveState(ctx, baseState, bytesutil.ToBytes32(newCheckpoint.Root))) + st, blkRoot, err = prepareForkchoiceState(ctx, blk.Block.Slot, r2, r1, params.BeaconConfig().ZeroHash, newCheckpoint, newCheckpoint) + require.NoError(t, err) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, blkRoot)) + require.NoError(t, service.cfg.ForkChoiceStore.InsertNode(ctx, st, r2)) returned, err = service.getAttPreState(ctx, newCheckpoint) require.NoError(t, err) s, err := slots.EpochStart(newCheckpoint.Epoch) diff --git a/beacon-chain/blockchain/testing/mock.go b/beacon-chain/blockchain/testing/mock.go index 5aca2920c787..b79e0d734a06 100644 --- a/beacon-chain/blockchain/testing/mock.go +++ b/beacon-chain/blockchain/testing/mock.go @@ -320,7 +320,7 @@ func (_ *ChainService) ReceiveAttestation(_ context.Context, _ *ethpb.Attestatio } // AttestationTargetState mocks AttestationTargetState method in chain service. -func (s *ChainService) AttestationTargetState(_ context.Context, _ *ethpb.Checkpoint) (state.BeaconState, error) { +func (s *ChainService) AttestationTargetState(_ context.Context, _ *ethpb.Checkpoint) (state.ReadOnlyBeaconState, error) { return s.State, nil } diff --git a/testing/slasher/simulator/attestation_generator.go b/testing/slasher/simulator/attestation_generator.go index 1a4719f91458..ec3e009645f1 100644 --- a/testing/slasher/simulator/attestation_generator.go +++ b/testing/slasher/simulator/attestation_generator.go @@ -108,7 +108,7 @@ func (s *Simulator) generateAttestationsForSlot( } func (s *Simulator) aggregateSigForAttestation( - beaconState state.BeaconState, att *ethpb.IndexedAttestation, + beaconState state.ReadOnlyBeaconState, att *ethpb.IndexedAttestation, ) (bls.Signature, error) { domain, err := signing.Domain( beaconState.Fork(),