Skip to content

Commit 9f0f53b

Browse files
committed
feat: envelope backfilling
1 parent 4d68bec commit 9f0f53b

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

beacon_chain/consensus_object_pools/block_clearance.nim

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
535589
proc verifyBlockSignatures*(
536590
verifier: var BatchVerifier,
537591
fork: Fork,

beacon_chain/gossip_processing/block_processor.nim

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,8 @@ proc dumpBlock(
186186
discard
187187

188188
from ../consensus_object_pools/block_clearance import
189-
addBackfillBlock, addHeadBlockWithParent, checkHeadBlock, verifyBlockProposer
189+
addBackfillBlock, addBackfillExecutionPayload,
190+
addHeadBlockWithParent, checkHeadBlock, verifyBlockProposer
190191

191192
proc verifySidecars(
192193
signedBlock: ForkySignedBeaconBlock,
@@ -890,6 +891,22 @@ proc addBlock*(
890891
of VerifierError.Duplicate:
891892
err(res.error())
892893

894+
proc storeBackfillPayload(
895+
self: ref BlockProcessor,
896+
signedBlock: gloas.SignedBeaconBlock,
897+
signedEnvelope: gloas.SignedExecutionPayloadEnvelope,
898+
sidecarsOpt: Opt[gloas.DataColumnSidecars],
899+
): Result[void, VerifierError] =
900+
self.envelopeQuarantine[].remove(signedEnvelope.message.beacon_block_root)
901+
902+
?verifySidecars(signedBlock, signedEnvelope, sidecarsOpt)
903+
904+
self.consensusManager.dag.addBackfillExecutionPayload(signedEnvelope).isOkOr:
905+
return err(error)
906+
907+
self[].storeSidecars(sidecarsOpt)
908+
ok()
909+
893910
proc storePayload(
894911
self: ref BlockProcessor,
895912
signedBlock: gloas.SignedBeaconBlock,

0 commit comments

Comments
 (0)