1414 ../ sszdump
1515
1616from std/ deques import Deque , addLast, contains, initDeque, items, len, shrink
17- from std/ sequtils import anyIt, filterIt
17+ from std/ sequtils import anyIt
1818from ../ consensus_object_pools/ consensus_manager import
1919 ConsensusManager , to, updateHead, updateExecutionHead, checkExpectedEnvelope
2020from ../ consensus_object_pools/ blockchain_dag import
@@ -130,11 +130,39 @@ type
130130
131131 NoSidecars * = typeof (())
132132 SomeOptSidecars =
133- NoSidecars | Opt [BlobSidecars ] | Opt [fulu.DataColumnSidecars ] |
133+ NoSidecars | Opt [BlobSidecars ] | Opt [fulu.DataColumnSidecarsForImport ] |
134134 Opt [gloas.DataColumnSidecars ]
135135
136136const noSidecars* = default (NoSidecars )
137137
138+ proc popSidecarsForImport * (
139+ quarantine: var FuluColumnQuarantine ,
140+ blockRoot: Eth2Digest
141+ ): Opt [fulu.DataColumnSidecarsForImport ] =
142+ # # Pop the columns of ``blockRoot``, split by whether their KZG proofs have
143+ # # already been checked. The drain has to stay adjacent to the pop: read any
144+ # # later, it could answer for another set of columns popped for the same root.
145+ let sidecars = quarantine.popSidecars (blockRoot).valueOr:
146+ return Opt .none (fulu.DataColumnSidecarsForImport )
147+ let unverified = quarantine.popPendingVerify (blockRoot)
148+
149+ var res: fulu.DataColumnSidecarsForImport
150+ for sidecar in sidecars:
151+ if sidecar[].index in unverified:
152+ res.untrusted.add (sidecar)
153+ else :
154+ res.trusted.add (sidecar)
155+ Opt .some (res)
156+
157+ proc popSidecarsForImport * (
158+ quarantine: var GloasColumnQuarantine ,
159+ blockRoot: Eth2Digest
160+ ): Opt [gloas.DataColumnSidecars ] =
161+ # # Gloas checks every column in `addPayload`; only the drain matters here.
162+ let sidecars = quarantine.popSidecars (blockRoot)
163+ discard quarantine.popPendingVerify (blockRoot)
164+ sidecars
165+
138166# Initialization
139167# ------------------------------------------------------------------------------
140168
@@ -225,11 +253,12 @@ proc verifySidecars(
225253
226254proc verifySidecars (
227255 signedBlock: fulu.SignedBeaconBlock ,
228- sidecarsOpt: Opt [fulu.DataColumnSidecars ],
256+ sidecarsOpt: Opt [fulu.DataColumnSidecarsForImport ],
229257): Result [void , VerifierError ] =
230258 sidecarsOpt.isErrOr:
231- if value.len > 0 and signedBlock.message.body.blob_kzg_commitments.len > 0 :
232- verify_data_column_sidecar_kzg_proofs (value).isOkOr:
259+ if value.untrusted.len > 0 and
260+ signedBlock.message.body.blob_kzg_commitments.len > 0 :
261+ verify_data_column_sidecar_kzg_proofs (value.untrusted).isOkOr:
233262 debug " data column validation failed" ,
234263 blockRoot = shortLog (signedBlock.root),
235264 blck = shortLog (signedBlock.message),
@@ -240,17 +269,23 @@ proc verifySidecars(
240269
241270proc storeSidecars (
242271 self: BlockProcessor ,
243- sidecarsOpt: Opt [fulu.DataColumnSidecars ] | Opt [gloas.DataColumnSidecars ]
272+ sidecarsOpt: Opt [fulu.DataColumnSidecarsForImport ] |
273+ Opt [gloas.DataColumnSidecars ]
244274) =
245275 sidecarsOpt.isErrOr:
246- self.consensusManager.dag.db.putDataColumnSidecars (value)
247- if self.onDataColumnsStored != nil and value.len > 0 :
276+ let sidecars =
277+ when value is gloas.DataColumnSidecars :
278+ value
279+ else :
280+ value.items ()
281+ self.consensusManager.dag.db.putDataColumnSidecars (sidecars)
282+ if self.onDataColumnsStored != nil and sidecars.len > 0 :
248283 let slot =
249284 when value is gloas.DataColumnSidecars :
250285 # [Modified in Gloas:EIP7732] carries `slot` directly.
251- value [0 ][].slot
286+ sidecars [0 ][].slot
252287 else :
253- value [0 ][].signed_block_header.message.slot
288+ sidecars [0 ][].signed_block_header.message.slot
254289 self.onDataColumnsStored (slot)
255290
256291proc enqueuePayload * (self: ref BlockProcessor , blck: gloas.SignedBeaconBlock )
@@ -465,9 +500,9 @@ proc enqueueQuarantine(self: ref BlockProcessor, parent: BlockRef) =
465500 elif consensusFork == ConsensusFork .Fulu :
466501 let sidecarsOpt =
467502 if len (forkyBlck.message.body.blob_kzg_commitments) == 0 :
468- Opt .some (default (fulu.DataColumnSidecars ))
503+ Opt .some (default (fulu.DataColumnSidecarsForImport ))
469504 else :
470- self.fuluColumnQuarantine[].popSidecars (forkyBlck.root)
505+ self.fuluColumnQuarantine[].popSidecarsForImport (forkyBlck.root)
471506 elif consensusFork in ConsensusFork .Phase0 .. ConsensusFork .Electra :
472507 const sidecarsOpt = noSidecars
473508 else :
@@ -630,7 +665,8 @@ proc enqueueFromDb(self: ref BlockProcessor, root: Eth2Digest) =
630665 sidecarsOk = false # Pruned, or inconsistent DB
631666 break
632667 data_column_sidecars.add data_column
633- Opt .some data_column_sidecars
668+ # Columns reach the database only after their proofs were checked.
669+ Opt .some data_column_sidecars.toTrustedImport ()
634670 else :
635671 noSidecars
636672
@@ -727,13 +763,7 @@ proc storeBlock(
727763 when consensusFork == ConsensusFork .Fulu :
728764 # Only request manager-sourced columns arrive unverified; getBlobsV2/V3/V4
729765 # and CL gossip are both either trusted or verified.
730- let pendingVerify =
731- self.fuluColumnQuarantine[].popPendingVerify (signedBlock.root)
732- if not pendingVerify.empty:
733- sidecarsOpt.isErrOr:
734- let toVerify = value.filterIt (it[].index in pendingVerify)
735- if toVerify.len > 0 :
736- ? verifySidecars (signedBlock, Opt .some (toVerify))
766+ ? verifySidecars (signedBlock, sidecarsOpt)
737767 debug " block_processor verifySidecars completed" ,
738768 verifySidecarsDur = Moment .now () - newPayloadTick,
739769 blck = shortLog (signedBlock.message),
@@ -933,10 +963,14 @@ proc addBlock*(
933963 # becomes canonical, it is vital to import it as quickly as possible.
934964 self.enqueueFromDb (blck.message.parent_root)
935965
936- when sidecarsOpt is Opt [fulu.DataColumnSidecars ]:
966+ when sidecarsOpt is Opt [fulu.DataColumnSidecarsForImport ]:
937967 if sidecarsOpt.isSome:
968+ # Put them back as they came out, so trusted ones stay trusted.
969+ let sidecars = sidecarsOpt.get
970+ self.fuluColumnQuarantine[].put (
971+ blockRoot, sidecars.untrusted, verified = false )
938972 self.fuluColumnQuarantine[].put (
939- blockRoot, sidecarsOpt.get , verified = false )
973+ blockRoot, sidecars.trusted.asSeq , verified = true )
940974 elif sidecarsOpt is Opt [gloas.DataColumnSidecars ]:
941975 # In Gloas, block is enqueued with NoSidecar so we need not to care
942976 # about quarantine.
@@ -1117,7 +1151,7 @@ proc enqueuePayload*(self: ref BlockProcessor, blck: gloas.SignedBeaconBlock) =
11171151 if bid.message.blob_kzg_commitments.len () == 0 :
11181152 Opt .some (default (gloas.DataColumnSidecars ))
11191153 else :
1120- self.gloasColumnQuarantine[].popSidecars (blck.root)
1154+ self.gloasColumnQuarantine[].popSidecarsForImport (blck.root)
11211155 if sidecarsOpt.isNone ():
11221156 let dag = self.consensusManager.dag
11231157 # As sidecars are missing, put envelope back to quarantine.
0 commit comments