@@ -646,44 +646,36 @@ pub fn signature_verify_chain_segment<T: BeaconChainTypes>(
646646 & chain. spec ,
647647 ) ?;
648648
649- // Filter `chain_segment` for `RpcBlock::FullyAvailable` and verify KZG.
650- let available_blocks = chain_segment
651- . iter ( )
652- . map ( |( _, block) | match block {
653- RpcBlock :: FullyAvailable ( available_block) => Ok ( available_block. clone ( ) ) ,
654- // RangeSync and BackfillSync already ensure that the chain segment is fully available
655- // so this shouldn't be possible in practice.
656- RpcBlock :: BlockOnly { .. } => Err ( BlockError :: InternalError (
657- "Chain segment is not fully available" . to_string ( ) ,
658- ) ) ,
659- } )
660- . collect :: < Result < _ , _ > > ( ) ?;
649+ let mut available_blocks = Vec :: with_capacity ( chain_segment. len ( ) ) ;
650+ let mut signature_verified_blocks = Vec :: with_capacity ( chain_segment. len ( ) ) ;
661651
662- chain
663- . data_availability_checker
664- . batch_verify_kzg_for_available_blocks ( & available_blocks ) ? ;
652+ for ( block_root , block ) in chain_segment {
653+ let consensus_context =
654+ ConsensusContext :: new ( block . slot ( ) ) . set_current_block_root ( block_root ) ;
665655
666- let mut signature_verified_blocks = chain_segment
667- . into_iter ( )
668- . map ( |( block_root, block) | {
669- let consensus_context =
670- ConsensusContext :: new ( block. slot ( ) ) . set_current_block_root ( block_root) ;
671- match block {
672- RpcBlock :: FullyAvailable ( available_block) => SignatureVerifiedBlock {
656+ match block {
657+ RpcBlock :: FullyAvailable ( available_block) => {
658+ available_blocks. push ( available_block. clone ( ) ) ;
659+ signature_verified_blocks. push ( SignatureVerifiedBlock {
673660 block : MaybeAvailableBlock :: Available ( available_block) ,
674661 block_root,
675662 parent : None ,
676663 consensus_context,
677- } ,
678- RpcBlock :: BlockOnly { block, block_root } => SignatureVerifiedBlock {
679- block : MaybeAvailableBlock :: AvailabilityPending { block_root, block } ,
680- block_root,
681- parent : None ,
682- consensus_context,
683- } ,
664+ } ) ;
684665 }
685- } )
686- . collect :: < Vec < _ > > ( ) ;
666+ RpcBlock :: BlockOnly { .. } => {
667+ // RangeSync and BackfillSync already ensure that the chain segment is fully available
668+ // so this shouldn't be possible in practice.
669+ return Err ( BlockError :: InternalError (
670+ "Chain segment is not fully available" . to_string ( ) ,
671+ ) ) ;
672+ }
673+ }
674+ }
675+
676+ chain
677+ . data_availability_checker
678+ . batch_verify_kzg_for_available_blocks ( & available_blocks) ?;
687679
688680 // verify signatures
689681 let pubkey_cache = get_validator_pubkey_cache ( chain) ?;
0 commit comments