3434 maxSidecarsCount: int
3535 maxSidecarsPerBlockCount: int
3636 sidecarsCount: int
37- custodyColumns: seq [ColumnIndex ]
37+ custodyColumns* : seq [ColumnIndex ]
3838 custodyMap: ColumnMap
3939 roots: Table [Eth2Digest , RootTableRecord [A]]
4040 usage: OrderedSet [Eth2Digest ]
@@ -328,6 +328,19 @@ func hasSidecars*(
328328 # # ``blck`` with block root ``blockRoot``.
329329 hasSidecars (quarantine, blck.root, blck)
330330
331+ func peekSidecars * (
332+ quarantine: ColumnQuarantine ,
333+ blockRoot: Eth2Digest
334+ ): seq [DataColumnSidecar ] =
335+ # # Function returns the sidecars stored in the ColumnQuarantine
336+ # # for a specific block root ``blockRoot``.
337+ let record = quarantine.roots.getOrDefault (blockRoot)
338+ if len (record.sidecars) == 0 :
339+ # Block root not found or sidecars sequence was not initialized.
340+ return @ []
341+
342+ record.sidecars.mapIt (it[]) # Dereference and return the sidecars
343+
331344func popSidecars * (
332345 quarantine: var BlobQuarantine ,
333346 blockRoot: Eth2Digest ,
@@ -516,6 +529,78 @@ func fetchMissingSidecars*(
516529 res.add (DataColumnIdentifier (block_root: blockRoot, index: column))
517530 res
518531
532+ func fetchMissingColumnsByRoot * (
533+ quarantine: ColumnQuarantine ,
534+ blockRoot: Eth2Digest ,
535+ blck: fulu.SignedBeaconBlock ,
536+ peerCustodyColumns: openArray [ColumnIndex ] = []
537+ ): seq [DataColumnsByRootIdentifier ] =
538+ # # Function returns a sequence of DataColumnsByRootIdentifier for data columns
539+ # # which are missing for the block associated with root ``blockRoot`` and block ``blck``.
540+ var res: seq [DataColumnsByRootIdentifier ]
541+ var missingIndices: DataColumnIndices
542+ let record = quarantine.roots.getOrDefault (blockRoot)
543+
544+ if len (blck.message.body.blob_kzg_commitments) == 0 :
545+ # Fast-path if block does not have any columns
546+ return res
547+
548+ let
549+ supernode = (len (quarantine.custodyColumns) == NUMBER_OF_COLUMNS )
550+ columnsCount =
551+ if supernode:
552+ (NUMBER_OF_COLUMNS div 2 + 1 )
553+ else :
554+ len (quarantine.custodyColumns)
555+
556+ if supernode:
557+ let
558+ columns =
559+ if len (peerCustodyColumns) > 0 :
560+ @ peerCustodyColumns
561+ else :
562+ quarantine.custodyColumns
563+ if len (record.sidecars) == 0 :
564+ var columnsRequested = 0
565+ for column in columns:
566+ if columnsRequested >= columnsCount:
567+ # We don't need to request more than (NUMBER_OF_COLUMNS div 2 + 1)
568+ # columns.
569+ break
570+ discard missingIndices.add (column)
571+ inc (columnsRequested)
572+ else :
573+ if record.count >= columnsCount:
574+ return res
575+ var columnsRequested = 0
576+ for column in columns:
577+ if record.count + columnsRequested >= columnsCount:
578+ # We don't need to request more than (NUMBER_OF_COLUMNS div 2 + 1)
579+ # columns.
580+ break
581+ let index = quarantine.getIndex (column)
582+ if (index == - 1 ) or record.sidecars[index].isNil ():
583+ discard missingIndices.add (column)
584+ inc (columnsRequested)
585+ else :
586+ let peerMap =
587+ if len (peerCustodyColumns) > 0 :
588+ ColumnMap .init (peerCustodyColumns)
589+ else :
590+ ColumnMap .init (quarantine.custodyColumns)
591+ if len (record.sidecars) == 0 :
592+ for column in (peerMap and quarantine.custodyMap).items ():
593+ discard missingIndices.add (column)
594+ else :
595+ for column in (peerMap and quarantine.custodyMap).items ():
596+ let index = quarantine.getIndex (column)
597+ if (index == - 1 ) or (record.sidecars[index].isNil ()):
598+ discard missingIndices.add (column)
599+
600+ if missingIndices.len > 0 :
601+ res.add (DataColumnsByRootIdentifier (block_root: blockRoot, indices: missingIndices))
602+ res
603+
519604func pruneAfterFinalization * [A, B](
520605 quarantine: var SidecarQuarantine [A, B],
521606 epoch: Epoch
@@ -575,7 +660,7 @@ func init*(
575660 T: typedesc [ColumnQuarantine ],
576661 cfg: RuntimeConfig ,
577662 custodyColumns: openArray [ColumnIndex ],
578- onBlobSidecarCallback : OnDataColumnSidecarCallback
663+ onDataColumnSidecarCallback : OnDataColumnSidecarCallback
579664): ColumnQuarantine =
580665 doAssert (len (custodyColumns) <= NUMBER_OF_COLUMNS )
581666 let size = maxSidecars (NUMBER_OF_COLUMNS )
@@ -594,5 +679,5 @@ func init*(
594679 indexMap: indexMap,
595680 custodyColumns: @ custodyColumns,
596681 custodyMap: ColumnMap .init (custodyColumns),
597- onSidecarCallback: onBlobSidecarCallback
682+ onSidecarCallback: onDataColumnSidecarCallback
598683 )
0 commit comments