Skip to content

Commit

Permalink
Change to Proto Check For Blocks (#9372)
Browse files Browse the repository at this point in the history
* check inner objects

* add test in here.

* verify better

(cherry picked from commit 3a52814)
  • Loading branch information
nisdas authored and prestonvanloon committed Aug 27, 2021
1 parent f1bd5d7 commit 7ef1912
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
7 changes: 6 additions & 1 deletion beacon-chain/sync/pending_blocks_queue.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,9 +307,14 @@ func (s *Service) deleteBlockFromPendingQueue(slot types.Slot, b interfaces.Sign
return nil
}

// Defensive check to ignore nil blocks
if err := helpers.VerifyNilBeaconBlock(b); err != nil {
return err
}

newBlks := make([]interfaces.SignedBeaconBlock, 0, len(blks))
for _, blk := range blks {
if sszutil.DeepEqual(blk, b) {
if sszutil.DeepEqual(blk.Proto(), b.Proto()) {
continue
}
newBlks = append(newBlks, blk)
Expand Down
62 changes: 62 additions & 0 deletions beacon-chain/sync/pending_blocks_queue_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -524,3 +524,65 @@ func TestService_ProcessPendingBlockOnCorrectSlot(t *testing.T) {
require.NoError(t, r.processPendingBlocks(context.Background()))
assert.Equal(t, 2, len(r.slotToPendingBlocks.Items()), "Incorrect size for slot to pending blocks cache")
}

func TestService_ProcessBadPendingBlocks(t *testing.T) {
ctx := context.Background()
db := dbtest.SetupDB(t)

p1 := p2ptest.NewTestP2P(t)
mockChain := mock.ChainService{Genesis: time.Unix(time.Now().Unix()-int64(params.BeaconConfig().SecondsPerSlot), 0),
FinalizedCheckPoint: &ethpb.Checkpoint{
Epoch: 0,
}}
r := &Service{
cfg: &Config{
P2P: p1,
DB: db,
Chain: &mockChain,
StateGen: stategen.New(db),
},
slotToPendingBlocks: gcache.New(time.Second, 2*time.Second),
seenPendingBlocks: make(map[[32]byte]bool),
}
err := r.initCaches()
require.NoError(t, err)

beaconState, privKeys := testutil.DeterministicGenesisState(t, 100)
parentBlock := testutil.NewBeaconBlock()
require.NoError(t, db.SaveBlock(ctx, wrapper.WrappedPhase0SignedBeaconBlock(parentBlock)))
bRoot, err := parentBlock.Block.HashTreeRoot()
require.NoError(t, err)
require.NoError(t, db.SaveState(ctx, beaconState, bRoot))
require.NoError(t, db.SaveStateSummary(ctx, &pb.StateSummary{Root: bRoot[:]}))
copied := beaconState.Copy()
require.NoError(t, copied.SetSlot(1))
proposerIdx, err := helpers.BeaconProposerIndex(copied)
require.NoError(t, err)

st, err := testutil.NewBeaconState()
require.NoError(t, err)
mockChain.Root = bRoot[:]
mockChain.State = st

b1 := testutil.NewBeaconBlock()
b1.Block.ParentRoot = bRoot[:]
b1.Block.Slot = 1
b1Root, err := b1.Block.HashTreeRoot()
require.NoError(t, err)
b1.Block.ProposerIndex = proposerIdx
b1.Signature, err = helpers.ComputeDomainAndSign(beaconState, 0, b1.Block, params.BeaconConfig().DomainBeaconProposer, privKeys[proposerIdx])
require.NoError(t, err)

b := testutil.NewBeaconBlock()
b.Block.Slot = 55
b.Block.ParentRoot = []byte{'A', 'B', 'C'}
bA := wrapper.WrappedPhase0SignedBeaconBlock(b)
assert.NoError(t, err)

// Add block1 for slot 55
require.NoError(t, r.insertBlockToPendingQueue(b.Block.Slot, bA, b1Root))
bB := wrapper.WrappedPhase0SignedBeaconBlock(testutil.NewBeaconBlock())
assert.NoError(t, err)
// remove with a different block from the same slot.
require.NoError(t, r.deleteBlockFromPendingQueue(b.Block.Slot, bB, b1Root))
}

0 comments on commit 7ef1912

Please sign in to comment.