48
48
// returned alongside.
49
49
#![ allow( clippy:: result_large_err) ]
50
50
51
- use crate :: blob_verification:: { GossipBlobError , GossipVerifiedBlob } ;
51
+ use crate :: blob_verification:: { GossipBlobError , GossipVerifiedBlob , GossipVerifiedBlobList } ;
52
52
use crate :: block_verification_types:: {
53
53
AsBlock , BlockContentsError , BlockImportData , GossipVerifiedBlockContents , RpcBlock ,
54
54
} ;
@@ -104,8 +104,8 @@ use tree_hash::TreeHash;
104
104
use types:: data_column_sidecar:: DataColumnSidecarError ;
105
105
use types:: {
106
106
BeaconBlockRef , BeaconState , BeaconStateError , BlobSidecarList , ChainSpec , CloneConfig ,
107
- DataColumnSidecar , DataColumnSubnetId , Epoch , EthSpec , ExecutionBlockHash , Hash256 ,
108
- InconsistentFork , PublicKey , PublicKeyBytes , RelativeEpoch , SignedBeaconBlock ,
107
+ DataColumnSidecar , DataColumnSubnetId , Epoch , EthSpec , ExecutionBlockHash , FullPayload ,
108
+ Hash256 , InconsistentFork , PublicKey , PublicKeyBytes , RelativeEpoch , SignedBeaconBlock ,
109
109
SignedBeaconBlockHeader , Slot ,
110
110
} ;
111
111
use types:: { BlobSidecar , ExecPayload } ;
@@ -741,43 +741,16 @@ impl<T: BeaconChainTypes> IntoGossipVerifiedBlockContents<T> for PublishBlockReq
741
741
} )
742
742
. transpose ( ) ?;
743
743
744
- let gossip_verified_data_columns = gossip_verified_blobs
745
- . as_ref ( )
746
- . map ( |blobs| {
747
- // NOTE: we expect KZG to be initialized if the blobs are present
748
- let kzg = chain
749
- . kzg
750
- . as_ref ( )
751
- . ok_or ( BlockContentsError :: DataColumnError (
752
- GossipDataColumnError :: < T :: EthSpec > :: KzgNotInitialized ,
753
- ) ) ?;
754
-
755
- let blob_sidecar_list: Vec < _ > =
756
- blobs. iter ( ) . map ( |blob| blob. clone_blob ( ) ) . collect ( ) ;
757
- let blob_sidecar_list = BlobSidecarList :: new ( blob_sidecar_list)
758
- . map_err ( DataColumnSidecarError :: SszError ) ?;
759
- let timer = metrics:: start_timer ( & metrics:: DATA_COLUMN_SIDECAR_COMPUTATION ) ;
760
- let sidecars = DataColumnSidecar :: build_sidecars ( & blob_sidecar_list, & block, kzg) ?;
761
- drop ( timer) ;
762
- let mut gossip_verified_data_columns = vec ! [ ] ;
763
- for sidecar in sidecars {
764
- let subnet = DataColumnSubnetId :: try_from_column_index :: < T :: EthSpec > (
765
- sidecar. index as usize ,
766
- )
767
- . map_err ( |_| {
768
- BlockContentsError :: < T :: EthSpec > :: DataColumnSidecarError (
769
- DataColumnSidecarError :: DataColumnIndexOutOfBounds ,
770
- )
771
- } ) ?;
772
- let column = GossipVerifiedDataColumn :: new ( sidecar, subnet. into ( ) , chain) ?;
773
- gossip_verified_data_columns. push ( column) ;
774
- }
775
- let gossip_verified_data_columns =
776
- GossipVerifiedDataColumnList :: new ( gossip_verified_data_columns)
777
- . map_err ( DataColumnSidecarError :: SszError ) ?;
778
- Ok :: < _ , BlockContentsError < T :: EthSpec > > ( gossip_verified_data_columns)
779
- } )
780
- . transpose ( ) ?;
744
+ let peer_das_enabled = chain
745
+ . spec
746
+ . peer_das_epoch
747
+ . map_or ( false , |peer_das_epoch| block. epoch ( ) >= peer_das_epoch) ;
748
+
749
+ let gossip_verified_data_columns = if peer_das_enabled {
750
+ build_gossip_verified_data_columns ( chain, & block, gossip_verified_blobs. as_ref ( ) ) ?
751
+ } else {
752
+ None
753
+ } ;
781
754
782
755
let gossip_verified_block = GossipVerifiedBlock :: new ( block, chain) ?;
783
756
@@ -793,6 +766,49 @@ impl<T: BeaconChainTypes> IntoGossipVerifiedBlockContents<T> for PublishBlockReq
793
766
}
794
767
}
795
768
769
+ fn build_gossip_verified_data_columns < T : BeaconChainTypes > (
770
+ chain : & BeaconChain < T > ,
771
+ block : & SignedBeaconBlock < T :: EthSpec , FullPayload < T :: EthSpec > > ,
772
+ gossip_verified_blobs : Option < & GossipVerifiedBlobList < T > > ,
773
+ ) -> Result < Option < GossipVerifiedDataColumnList < T > > , BlockContentsError < T :: EthSpec > > {
774
+ gossip_verified_blobs
775
+ // Only attempt to build data columns if blobs is non empty to avoid skewing the metrics.
776
+ . filter ( |b| !b. is_empty ( ) )
777
+ . map ( |blobs| {
778
+ // NOTE: we expect KZG to be initialized if the blobs are present
779
+ let kzg = chain
780
+ . kzg
781
+ . as_ref ( )
782
+ . ok_or ( BlockContentsError :: DataColumnError (
783
+ GossipDataColumnError :: < T :: EthSpec > :: KzgNotInitialized ,
784
+ ) ) ?;
785
+
786
+ let blob_sidecar_list: Vec < _ > = blobs. iter ( ) . map ( |blob| blob. clone_blob ( ) ) . collect ( ) ;
787
+ let blob_sidecar_list = BlobSidecarList :: new ( blob_sidecar_list)
788
+ . map_err ( DataColumnSidecarError :: SszError ) ?;
789
+ let timer = metrics:: start_timer ( & metrics:: DATA_COLUMN_SIDECAR_COMPUTATION ) ;
790
+ let sidecars = DataColumnSidecar :: build_sidecars ( & blob_sidecar_list, block, kzg) ?;
791
+ drop ( timer) ;
792
+ let mut gossip_verified_data_columns = vec ! [ ] ;
793
+ for sidecar in sidecars {
794
+ let subnet =
795
+ DataColumnSubnetId :: try_from_column_index :: < T :: EthSpec > ( sidecar. index as usize )
796
+ . map_err ( |_| {
797
+ BlockContentsError :: < T :: EthSpec > :: DataColumnSidecarError (
798
+ DataColumnSidecarError :: DataColumnIndexOutOfBounds ,
799
+ )
800
+ } ) ?;
801
+ let column = GossipVerifiedDataColumn :: new ( sidecar, subnet. into ( ) , chain) ?;
802
+ gossip_verified_data_columns. push ( column) ;
803
+ }
804
+ let gossip_verified_data_columns =
805
+ GossipVerifiedDataColumnList :: new ( gossip_verified_data_columns)
806
+ . map_err ( DataColumnSidecarError :: SszError ) ?;
807
+ Ok :: < _ , BlockContentsError < T :: EthSpec > > ( gossip_verified_data_columns)
808
+ } )
809
+ . transpose ( )
810
+ }
811
+
796
812
/// Implemented on types that can be converted into a `ExecutionPendingBlock`.
797
813
///
798
814
/// Used to allow functions to accept blocks at various stages of verification.
0 commit comments