From aa1dea03cd76209348f0f3ae7227e7667d0d68dd Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Wed, 1 Dec 2021 10:52:40 +0100 Subject: [PATCH] speed up gossip and sync block validation (#3143) * avoid recomputing hash for block signature check * check block slot match before hitting the database --- beacon_chain/consensus_object_pools/blockchain_dag.nim | 4 ++-- beacon_chain/gossip_processing/gossip_validation.nim | 7 +++---- beacon_chain/spec/signatures_batch.nim | 2 +- tests/test_block_pool.nim | 5 +++++ 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/beacon_chain/consensus_object_pools/blockchain_dag.nim b/beacon_chain/consensus_object_pools/blockchain_dag.nim index 9a6a5ed9f..1c140c04a 100644 --- a/beacon_chain/consensus_object_pools/blockchain_dag.nim +++ b/beacon_chain/consensus_object_pools/blockchain_dag.nim @@ -743,10 +743,10 @@ func getBlockRange*( o # Return the index of the first non-nil item in the output -func getBlockBySlot*(dag: ChainDAGRef, slot: Slot): BlockRef = +func getBlockBySlot*(dag: ChainDAGRef, slot: Slot): BlockSlot = ## Retrieves the first block in the current canonical chain ## with slot number less or equal to `slot`. - dag.head.atSlot(slot).blck + dag.head.atSlot(slot) proc getForkedBlock*(dag: ChainDAGRef, blck: BlockRef): ForkedTrustedSignedBeaconBlock = case dag.cfg.blockForkAtEpoch(blck.slot.epoch) diff --git a/beacon_chain/gossip_processing/gossip_validation.nim b/beacon_chain/gossip_processing/gossip_validation.nim index cd7e39691..0c81feff0 100644 --- a/beacon_chain/gossip_processing/gossip_validation.nim +++ b/beacon_chain/gossip_processing/gossip_validation.nim @@ -228,13 +228,12 @@ proc validateBeaconBlock*( return errIgnore("BeaconBlock: already seen") let - slotBlockRef = getBlockBySlot(dag, signed_beacon_block.message.slot) + slotBlock = getBlockBySlot(dag, signed_beacon_block.message.slot) - if not slotBlockRef.isNil: - let blck = dag.get(slotBlockRef).data + if slotBlock.slot == signed_beacon_block.message.slot: + let blck = dag.get(slotBlock.blck).data if getForkedBlockField(blck, proposer_index) == signed_beacon_block.message.proposer_index and - getForkedBlockField(blck, slot) == signed_beacon_block.message.slot and blck.signature.toRaw() != signed_beacon_block.signature.toRaw(): return errIgnore("BeaconBlock: already proposed in the same slot") diff --git a/beacon_chain/spec/signatures_batch.nim b/beacon_chain/spec/signatures_batch.nim index c4c66b670..ef1b2fb4e 100644 --- a/beacon_chain/spec/signatures_batch.nim +++ b/beacon_chain/spec/signatures_batch.nim @@ -282,7 +282,7 @@ proc collectSignatureSets*( # ---------------------------------------------------- sigs.addSignatureSet( proposer_key.get(), - signed_block.message, + signed_block.root, signed_block.signature.loadOrExit( "collectSignatureSets: cannot load signature"), getStateField(state, fork), diff --git a/tests/test_block_pool.nim b/tests/test_block_pool.nim index 03f762680..efd6d2b00 100644 --- a/tests/test_block_pool.nim +++ b/tests/test_block_pool.nim @@ -467,6 +467,11 @@ suite "chain DAG finalization tests" & preset(): check: dag.heads.len() == 1 + dag.getBlockBySlot(0.Slot) == BlockSlot(blck: dag.genesis, slot: 0.Slot) + dag.getBlockBySlot(dag.head.slot) == BlockSlot( + blck: dag.head, slot: dag.head.slot.Slot) + dag.getBlockBySlot(dag.head.slot + 1) == BlockSlot( + blck: dag.head, slot: dag.head.slot.Slot + 1) check: dag.db.immutableValidators.len() == getStateField(dag.headState.data, validators).len()