@@ -28,20 +28,11 @@ import {
2828 sszTypesFor ,
2929} from "@lodestar/types" ;
3030import { fromAsync , fromHex , sleep , toHex , toRootHex } from "@lodestar/utils" ;
31- import {
32- BlobsSource ,
33- BlockInput ,
34- BlockInputAvailableData ,
35- BlockInputBlobs ,
36- BlockInputDataColumns ,
37- BlockInputType ,
38- BlockSource ,
39- DataColumnsSource ,
40- ImportBlockOpts ,
41- getBlockInput ,
42- } from "../../../../chain/blocks/types.js" ;
31+ import { BlockInputSource , isBlockInputBlobs , isBlockInputColumns } from "../../../../chain/blocks/blockInput/index.js" ;
32+ import { ImportBlockOpts } from "../../../../chain/blocks/types.js" ;
4333import { verifyBlocksInEpoch } from "../../../../chain/blocks/verifyBlock.js" ;
4434import { BeaconChain } from "../../../../chain/chain.js" ;
35+ import { ChainEvent } from "../../../../chain/emitter.js" ;
4536import { BlockError , BlockErrorCode , BlockGossipError } from "../../../../chain/errors/index.js" ;
4637import {
4738 BlockType ,
@@ -51,7 +42,6 @@ import {
5142} from "../../../../chain/produceBlock/index.js" ;
5243import { validateGossipBlock } from "../../../../chain/validation/block.js" ;
5344import { OpSource } from "../../../../chain/validatorMonitor.js" ;
54- import { NetworkEvent } from "../../../../network/index.js" ;
5545import { getBlobSidecars , kzgCommitmentToVersionedHash , reconstructBlobs } from "../../../../util/blobs.js" ;
5646import { getDataColumnSidecarsFromBlock } from "../../../../util/dataColumns.js" ;
5747import { isOptimisticBlock } from "../../../../util/forkChoice.js" ;
@@ -95,10 +85,15 @@ export function getBeaconBlockApi({
9585 const fork = config . getForkName ( slot ) ;
9686 const blockRoot = toRootHex ( chain . config . getForkTypes ( slot ) . BeaconBlock . hashTreeRoot ( signedBlock . message ) ) ;
9787
98- let blockForImport : BlockInput , blobSidecars : deneb . BlobSidecars , dataColumnSidecars : fulu . DataColumnSidecars ;
88+ const blockForImport = chain . seenBlockInputCache . getByBlock ( {
89+ block : signedBlock ,
90+ source : BlockInputSource . api ,
91+ seenTimestampSec,
92+ blockRootHex : blockRoot ,
93+ } ) ;
94+ let blobSidecars : deneb . BlobSidecars , dataColumnSidecars : fulu . DataColumnSidecars ;
9995
10096 if ( isDenebBlockContents ( signedBlockContents ) ) {
101- let blockData : BlockInputAvailableData ;
10297 if ( isForkPostFulu ( fork ) ) {
10398 const timer = metrics ?. peerDas . dataColumnSidecarComputationTime . startTimer ( ) ;
10499 // If the block was produced by this node, we will already have computed cells
@@ -116,30 +111,36 @@ export function getBeaconBlockApi({
116111 cellsAndProofs
117112 ) ;
118113 timer ?.( ) ;
119- blockData = {
120- fork,
121- dataColumns : dataColumnSidecars ,
122- dataColumnsBytes : dataColumnSidecars . map ( ( ) => null ) ,
123- dataColumnsSource : DataColumnsSource . api ,
124- } as BlockInputDataColumns ;
125114 blobSidecars = [ ] ;
126115 } else if ( isForkPostDeneb ( fork ) ) {
127116 blobSidecars = getBlobSidecars ( config , signedBlock , signedBlockContents . blobs , signedBlockContents . kzgProofs ) ;
128- blockData = {
129- fork,
130- blobs : blobSidecars ,
131- blobsSource : BlobsSource . api ,
132- } as BlockInputBlobs ;
133117 dataColumnSidecars = [ ] ;
134118 } else {
135119 throw Error ( `Invalid data fork=${ fork } for publish` ) ;
136120 }
137-
138- blockForImport = getBlockInput . availableData ( config , signedBlock , BlockSource . api , blockData ) ;
139121 } else {
140122 blobSidecars = [ ] ;
141123 dataColumnSidecars = [ ] ;
142- blockForImport = getBlockInput . preData ( config , signedBlock , BlockSource . api ) ;
124+ }
125+
126+ if ( isBlockInputColumns ( blockForImport ) ) {
127+ for ( const dataColumnSidecar of dataColumnSidecars ) {
128+ blockForImport . addColumn ( {
129+ blockRootHex : blockRoot ,
130+ columnSidecar : dataColumnSidecar ,
131+ source : BlockInputSource . api ,
132+ seenTimestampSec,
133+ } ) ;
134+ }
135+ } else if ( isBlockInputBlobs ( blockForImport ) ) {
136+ for ( const blobSidecar of blobSidecars ) {
137+ blockForImport . addBlob ( {
138+ blockRootHex : blockRoot ,
139+ blobSidecar,
140+ source : BlockInputSource . api ,
141+ seenTimestampSec,
142+ } ) ;
143+ }
143144 }
144145
145146 // check what validations have been requested before broadcasting and publishing the block
@@ -184,9 +185,10 @@ export function getBeaconBlockApi({
184185 if ( ! blockLocallyProduced ) {
185186 const parentBlock = chain . forkChoice . getBlock ( signedBlock . message . parentRoot ) ;
186187 if ( parentBlock === null ) {
187- network . events . emit ( NetworkEvent . unknownBlockParent , {
188+ chain . emitter . emit ( ChainEvent . unknownParent , {
188189 blockInput : blockForImport ,
189190 peer : IDENTITY_PEER_ID ,
191+ source : BlockInputSource . api ,
190192 } ) ;
191193 chain . persistInvalidSszValue (
192194 chain . config . getForkTypes ( slot ) . SignedBeaconBlock ,
@@ -247,18 +249,16 @@ export function getBeaconBlockApi({
247249
248250 // Simple implementation of a pending block queue. Keeping the block here recycles the API logic, and keeps the
249251 // REST request promise without any extra infrastructure.
250- const msToBlockSlot =
251- computeTimeAtSlot ( config , blockForImport . block . message . slot , chain . genesisTime ) * 1000 - Date . now ( ) ;
252+ const msToBlockSlot = computeTimeAtSlot ( config , slot , chain . genesisTime ) * 1000 - Date . now ( ) ;
252253 if ( msToBlockSlot <= MAX_API_CLOCK_DISPARITY_MS && msToBlockSlot > 0 ) {
253254 // If block is a bit early, hold it in a promise. Equivalent to a pending queue.
254255 await sleep ( msToBlockSlot ) ;
255256 }
256257
257258 // TODO: Validate block
258- const delaySec =
259- seenTimestampSec - ( chain . genesisTime + blockForImport . block . message . slot * config . SECONDS_PER_SLOT ) ;
259+ const delaySec = seenTimestampSec - ( chain . genesisTime + slot * config . SECONDS_PER_SLOT ) ;
260260 metrics ?. gossipBlock . elapsedTimeTillReceived . observe ( { source : OpSource . api } , delaySec ) ;
261- chain . validatorMonitor ?. registerBeaconBlock ( OpSource . api , delaySec , blockForImport . block . message ) ;
261+ chain . validatorMonitor ?. registerBeaconBlock ( OpSource . api , delaySec , signedBlock . message ) ;
262262
263263 chain . logger . info ( "Publishing block" , valLogMeta ) ;
264264 const publishPromises = [
@@ -280,9 +280,10 @@ export function getBeaconBlockApi({
280280 . processBlock ( blockForImport , { ...opts , eagerPersistBlock : false } )
281281 . catch ( ( e ) => {
282282 if ( e instanceof BlockError && e . type . code === BlockErrorCode . PARENT_UNKNOWN ) {
283- network . events . emit ( NetworkEvent . unknownBlockParent , {
283+ chain . emitter . emit ( ChainEvent . unknownParent , {
284284 blockInput : blockForImport ,
285285 peer : IDENTITY_PEER_ID ,
286+ source : BlockInputSource . api ,
286287 } ) ;
287288 }
288289 throw e ;
@@ -315,38 +316,34 @@ export function getBeaconBlockApi({
315316
316317 chain . emitter . emit ( routes . events . EventType . blockGossip , { slot, block : blockRoot } ) ;
317318
318- if ( blockForImport . type === BlockInputType . availableData ) {
319- if ( isForkPostFulu ( blockForImport . blockData . fork ) ) {
320- const { dataColumns} = blockForImport . blockData as BlockInputDataColumns ;
321- metrics ?. dataColumns . bySource . inc ( { source : DataColumnsSource . api } , dataColumns . length ) ;
322-
323- if ( chain . emitter . listenerCount ( routes . events . EventType . dataColumnSidecar ) ) {
324- for ( const dataColumnSidecar of dataColumns ) {
325- chain . emitter . emit ( routes . events . EventType . dataColumnSidecar , {
326- blockRoot,
327- slot,
328- index : dataColumnSidecar . index ,
329- kzgCommitments : dataColumnSidecar . kzgCommitments . map ( toHex ) ,
330- } ) ;
331- }
332- }
333- } else if (
334- isForkPostDeneb ( blockForImport . blockData . fork ) &&
335- chain . emitter . listenerCount ( routes . events . EventType . blobSidecar )
336- ) {
337- const { blobs} = blockForImport . blockData as BlockInputBlobs ;
338-
339- for ( const blobSidecar of blobs ) {
340- const { index, kzgCommitment} = blobSidecar ;
341- chain . emitter . emit ( routes . events . EventType . blobSidecar , {
319+ if ( isBlockInputColumns ( blockForImport ) ) {
320+ const dataColumns = blockForImport . getAllColumns ( ) ;
321+ metrics ?. dataColumns . bySource . inc ( { source : BlockInputSource . api } , dataColumns . length ) ;
322+
323+ if ( chain . emitter . listenerCount ( routes . events . EventType . dataColumnSidecar ) ) {
324+ for ( const dataColumnSidecar of dataColumns ) {
325+ chain . emitter . emit ( routes . events . EventType . dataColumnSidecar , {
342326 blockRoot,
343327 slot,
344- index,
345- kzgCommitment : toHex ( kzgCommitment ) ,
346- versionedHash : toHex ( kzgCommitmentToVersionedHash ( kzgCommitment ) ) ,
328+ index : dataColumnSidecar . index ,
329+ kzgCommitments : dataColumnSidecar . kzgCommitments . map ( toHex ) ,
347330 } ) ;
348331 }
349332 }
333+ } else if ( isBlockInputBlobs ( blockForImport ) && chain . emitter . listenerCount ( routes . events . EventType . blobSidecar ) ) {
334+ const blobSidecars = blockForImport . getBlobs ( ) ;
335+ const versionedHashes = blockForImport . getVersionedHashes ( ) ;
336+
337+ for ( const blobSidecar of blobSidecars ) {
338+ const { index, kzgCommitment} = blobSidecar ;
339+ chain . emitter . emit ( routes . events . EventType . blobSidecar , {
340+ blockRoot,
341+ slot,
342+ index,
343+ kzgCommitment : toHex ( kzgCommitment ) ,
344+ versionedHash : toHex ( versionedHashes [ index ] ) ,
345+ } ) ;
346+ }
350347 }
351348 } ;
352349
0 commit comments