@@ -532,6 +532,60 @@ proc addHeadExecutionPayload*(
532532
533533 ok (blck)
534534
535+ proc addBackfillExecutionPayload * (
536+ dag: ChainDAGRef ,
537+ signedEnvelope: gloas.SignedExecutionPayloadEnvelope ,
538+ # gloas.TrustedSignedExecutionPayloadEnvelope,
539+ ): Result [void , VerifierError ] =
540+ template blockRoot (): auto = signedEnvelope.message.beacon_block_root
541+ template envelope (): auto = signedEnvelope.message
542+
543+ logScope:
544+ blockRoot = shortLog (blockRoot)
545+ slot = envelope.slot
546+ signature = shortLog (signedEnvelope.signature)
547+ backfill = shortLog (dag.backfill)
548+
549+ let startTick = Moment .now ()
550+
551+ # When a valid block is backfilled, dag.backfill has already moved to next
552+ # parent. So we need to check with finalizedHead and database.
553+ if envelope.slot > dag.finalizedHead.slot:
554+ return err (VerifierError .Invalid )
555+ let bsi = dag.getBlockIdAtSlot (envelope.slot).valueOr:
556+ # This should not be happening as we backfill envelope after the block is
557+ # backfilled successfully.
558+ return err (VerifierError .Invalid )
559+ if blockRoot != bsi.bid.root:
560+ return err (VerifierError .Invalid )
561+ if dag.db.containsExecutionPayloadEnvelope (blockRoot):
562+ return err (VerifierError .Duplicate )
563+
564+ # Verify signature
565+ when signedEnvelope.signature isnot TrustedSig :
566+ let builderKey = dag.validatorKey (envelope.builder_index).valueOr:
567+ fatal " Invalid builder in backfill envelope - checkpoint state corrupt?" ,
568+ head = shortLog (dag.head), tail = shortLog (dag.tail)
569+ quit 1
570+ if not verify_execution_payload_envelope_signature (
571+ dag.forkAtEpoch (envelope.slot.epoch),
572+ dag.genesis_validators_root,
573+ envelope.slot.epoch,
574+ envelope,
575+ builderKey,
576+ signedEnvelope.signature):
577+ return err (VerifierError .Invalid )
578+ let sigVerifyTick = Moment .now
579+
580+ dag.db.putExecutionPayloadEnvelope (signedEnvelope)
581+ let putBlockTick = Moment .now
582+
583+ debug " Envelope backfilled" ,
584+ sigVerifyDur = sigVerifyTick - startTick,
585+ putBlockDur = putBlockTick - sigVerifyTick
586+
587+ ok ()
588+
535589proc verifyBlockSignatures * (
536590 verifier: var BatchVerifier ,
537591 fork: Fork ,
0 commit comments