From f47f123aabe735e781262ffe0bc704fb03c16fd3 Mon Sep 17 00:00:00 2001 From: Preston Van Loon Date: Sun, 6 Jan 2019 00:05:16 -0500 Subject: [PATCH] Remove some redundant fetches from DB for the beacon state (#1257) --- beacon-chain/blockchain/service.go | 23 +++++++---------------- beacon-chain/blockchain/service_test.go | 12 +++--------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/beacon-chain/blockchain/service.go b/beacon-chain/blockchain/service.go index 1b42adb58..5362d8644 100644 --- a/beacon-chain/blockchain/service.go +++ b/beacon-chain/blockchain/service.go @@ -246,7 +246,7 @@ func (c *ChainService) blockProcessing(processedBlock chan<- *pb.BeaconBlock) { } if currentSlot+1 == block.Slot { - if err := c.receiveBlock(block); err != nil { + if err := c.receiveBlock(block, beaconState); err != nil { log.Error(err) processedBlock <- nil continue @@ -257,7 +257,7 @@ func (c *ChainService) blockProcessing(processedBlock chan<- *pb.BeaconBlock) { log.Debugf( "Block slot number is lower than the current slot in the beacon state %d", block.Slot) - c.sendAndDeleteCachedBlocks(currentSlot) + c.sendAndDeleteCachedBlocks(currentSlot, beaconState) } } } @@ -286,24 +286,19 @@ func (c *ChainService) blockProcessing(processedBlock chan<- *pb.BeaconBlock) { // else: // return False # or throw or whatever // -func (c *ChainService) receiveBlock(block *pb.BeaconBlock) error { +func (c *ChainService) receiveBlock(block *pb.BeaconBlock, beaconState *pb.BeaconState) error { blockhash, err := b.Hash(block) if err != nil { return fmt.Errorf("could not hash incoming block: %v", err) } - beaconState, err := c.beaconDB.GetState() - if err != nil { - return fmt.Errorf("failed to get beacon state: %v", err) - } - if block.Slot == 0 { return errors.New("cannot process a genesis block: received block with slot 0") } // Save blocks with higher slot numbers in cache. - if err := c.isBlockReadyForProcessing(block); err != nil { + if err := c.isBlockReadyForProcessing(block, beaconState); err != nil { log.Debugf("block with hash %#x is not ready for processing: %v", blockhash, err) return nil } @@ -354,11 +349,7 @@ func (c *ChainService) receiveBlock(block *pb.BeaconBlock) error { return nil } -func (c *ChainService) isBlockReadyForProcessing(block *pb.BeaconBlock) error { - beaconState, err := c.beaconDB.GetState() - if err != nil { - return fmt.Errorf("failed to get beacon state: %v", err) - } +func (c *ChainService) isBlockReadyForProcessing(block *pb.BeaconBlock, beaconState *pb.BeaconState) error { var powBlockFetcher func(ctx context.Context, hash common.Hash) (*gethTypes.Block, error) if c.enablePOWChain { @@ -374,9 +365,9 @@ func (c *ChainService) isBlockReadyForProcessing(block *pb.BeaconBlock) error { // sendAndDeleteCachedBlocks checks if there is any block saved in the cache with a // slot number equivalent to the current slot. If there is then the block is // sent to the incoming block channel and deleted from the cache. -func (c *ChainService) sendAndDeleteCachedBlocks(currentSlot uint64) { +func (c *ChainService) sendAndDeleteCachedBlocks(currentSlot uint64, beaconState *pb.BeaconState) { if block, ok := c.unProcessedBlocks[currentSlot+1]; ok { - if err := c.isBlockReadyForProcessing(block); err == nil { + if err := c.isBlockReadyForProcessing(block, beaconState); err == nil { c.incomingBlockChan <- block delete(c.unProcessedBlocks, currentSlot) } diff --git a/beacon-chain/blockchain/service_test.go b/beacon-chain/blockchain/service_test.go index f5a871001..fabc6e9e7 100644 --- a/beacon-chain/blockchain/service_test.go +++ b/beacon-chain/blockchain/service_test.go @@ -428,14 +428,11 @@ func TestIsBlockReadyForProcessing(t *testing.T) { ParentRootHash32: []byte{'a'}, } - if err := chainService.isBlockReadyForProcessing(block); err == nil { + if err := chainService.isBlockReadyForProcessing(block, beaconState); err == nil { t.Fatal("block processing succeeded despite block having no parent saved") } beaconState.Slot = 10 - if err := chainService.beaconDB.SaveState(beaconState); err != nil { - t.Fatalf("cannot save state: %v", err) - } enc, _ := proto.Marshal(beaconState) stateRoot := hashutil.Hash(enc) @@ -453,7 +450,7 @@ func TestIsBlockReadyForProcessing(t *testing.T) { Slot: 10, } - if err := chainService.isBlockReadyForProcessing(block2); err == nil { + if err := chainService.isBlockReadyForProcessing(block2, beaconState); err == nil { t.Fatal("block processing succeeded despite block slot being invalid") } @@ -461,9 +458,6 @@ func TestIsBlockReadyForProcessing(t *testing.T) { copy(h[:], []byte("a")) beaconState.ProcessedPowReceiptRootHash32 = h[:] beaconState.Slot = 0 - if err := chainService.beaconDB.SaveState(beaconState); err != nil { - t.Fatalf("cannot save state: %v", err) - } currentSlot := uint64(1) attestationSlot := uint64(0) @@ -489,7 +483,7 @@ func TestIsBlockReadyForProcessing(t *testing.T) { chainService.enablePOWChain = true - if err := chainService.isBlockReadyForProcessing(block3); err != nil { + if err := chainService.isBlockReadyForProcessing(block3, beaconState); err != nil { t.Fatalf("block processing failed despite being a valid block: %v", err) } }