@aztec/validator-client 6.0.0-nightly.20260603 → 6.0.0-nightly.20260604
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/proposal_handler.d.ts +3 -4
- package/dest/proposal_handler.d.ts.map +1 -1
- package/dest/proposal_handler.js +17 -56
- package/package.json +19 -19
- package/src/proposal_handler.ts +18 -64
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Archiver } from '@aztec/archiver';
|
|
2
2
|
import type { BlobClientInterface } from '@aztec/blob-client/client';
|
|
3
|
-
import type
|
|
3
|
+
import { type EpochCache } from '@aztec/epoch-cache';
|
|
4
4
|
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
5
5
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
6
6
|
import type { LogData } from '@aztec/foundation/log';
|
|
@@ -16,7 +16,7 @@ import type { FailedTx, Tx } from '@aztec/stdlib/tx';
|
|
|
16
16
|
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
17
17
|
import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
18
18
|
import type { ValidatorMetrics } from './metrics.js';
|
|
19
|
-
export type BlockProposalValidationFailureReason = 'invalid_signature' | 'invalid_proposal' | 'parent_block_not_found' | '
|
|
19
|
+
export type BlockProposalValidationFailureReason = 'invalid_signature' | 'invalid_proposal' | 'parent_block_not_found' | 'parent_block_wrong_slot' | 'in_hash_mismatch' | 'global_variables_mismatch' | 'block_number_already_exists' | 'txs_not_available' | 'state_mismatch' | 'failed_txs' | 'initial_state_mismatch' | 'timeout' | 'block_proposal_beyond_checkpoint' | 'checkpoint_proposal_equivocation' | 'unknown_error';
|
|
20
20
|
type ReexecuteTransactionsResult = {
|
|
21
21
|
block: L2Block;
|
|
22
22
|
failedTxs: FailedTx[];
|
|
@@ -109,7 +109,6 @@ export declare class ProposalHandler {
|
|
|
109
109
|
*/
|
|
110
110
|
private validateNonFirstBlockInCheckpoint;
|
|
111
111
|
private getReexecutionDeadline;
|
|
112
|
-
private waitForBlockSourceSync;
|
|
113
112
|
private getReexecuteFailureReason;
|
|
114
113
|
reexecuteTransactions(proposal: BlockProposal, blockNumber: BlockNumber, checkpointNumber: CheckpointNumber, txs: Tx[], l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[]): Promise<ReexecuteTransactionsResult>;
|
|
115
114
|
/**
|
|
@@ -132,4 +131,4 @@ export declare class ProposalHandler {
|
|
|
132
131
|
private setProposedCheckpointFromValidation;
|
|
133
132
|
}
|
|
134
133
|
export {};
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsS0FBSyxVQUFVLEVBQW1DLE1BQU0sb0JBQW9CLENBQUM7QUFFdEYsT0FBTyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFFaEIsVUFBVSxFQUNYLE1BQU0saUNBQWlDLENBQUM7QUFFekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3JELE9BQU8sRUFBRSxZQUFZLEVBQVMsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sS0FBSyxFQUFhLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUYsT0FBTyxLQUFLLEVBQUUsNEJBQTRCLEVBQXNCLE1BQU0sMEJBQTBCLENBQUM7QUFJakcsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEgsT0FBTyxFQUNMLEtBQUssbUJBQW1CLEVBR3pCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUF5QixzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sS0FBSyxFQUE2QixRQUFR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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"proposal_handler.d.ts","sourceRoot":"","sources":["../src/proposal_handler.ts"],"names":[],"mappings":"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"}
|
package/dest/proposal_handler.js
CHANGED
|
@@ -65,6 +65,7 @@ function _ts_dispose_resources(env) {
|
|
|
65
65
|
}
|
|
66
66
|
import { encodeCheckpointBlobDataFromBlocks, getBlobsPerL1Block } from '@aztec/blob-lib';
|
|
67
67
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
68
|
+
import { PROPOSER_PIPELINING_SLOT_OFFSET } from '@aztec/epoch-cache';
|
|
68
69
|
import { validateFeeAssetPriceModifier } from '@aztec/ethereum/contracts';
|
|
69
70
|
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
70
71
|
import { pick } from '@aztec/foundation/collection';
|
|
@@ -74,7 +75,7 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
74
75
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
75
76
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
76
77
|
import { getPreviousCheckpointOutHashes, validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
77
|
-
import { getEpochAtSlot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
78
|
+
import { getEpochAtSlot, getLastL1SlotTimestampForL2Slot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
78
79
|
import { Gas } from '@aztec/stdlib/gas';
|
|
79
80
|
import { accumulateCheckpointOutHashes, computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
80
81
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
@@ -236,7 +237,7 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
236
237
|
const result = await this.handleCheckpointProposal(proposal, proposalInfo);
|
|
237
238
|
if (!result.isValid) {
|
|
238
239
|
await this.checkpointProposalValidationFailureCallback?.(proposal, result, proposalInfo);
|
|
239
|
-
} else if (this.archiver
|
|
240
|
+
} else if (this.archiver) {
|
|
240
241
|
const set = await this.setProposedCheckpointFromValidation(proposal);
|
|
241
242
|
if (set) {
|
|
242
243
|
this.metrics?.recordCheckpointProposalToPipelinedStateDuration(pipeliningTimer.ms());
|
|
@@ -297,23 +298,9 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
297
298
|
reason: retainedSlotValidation.reason
|
|
298
299
|
};
|
|
299
300
|
}
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
// checkpoint prune could remove a block that would conflict with this proposal.
|
|
304
|
-
// When pipelining is enabled, the proposer builds ahead of L1 submission, so the
|
|
305
|
-
// block source won't have synced to the proposed slot yet. Skip the sync wait to
|
|
306
|
-
// avoid eating into the attestation window.
|
|
307
|
-
if (!this.epochCache.isProposerPipeliningEnabled()) {
|
|
308
|
-
const blockSourceSync = await this.waitForBlockSourceSync(slotNumber);
|
|
309
|
-
if (!blockSourceSync) {
|
|
310
|
-
this.log.warn(`Block source is not synced, skipping processing`, proposalInfo);
|
|
311
|
-
return {
|
|
312
|
-
isValid: false,
|
|
313
|
-
reason: 'block_source_not_synced'
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
}
|
|
301
|
+
// The proposer builds ahead of L1 submission under pipelining, so the block source won't have
|
|
302
|
+
// synced to the proposed slot yet. We deliberately do not wait for it to sync here, to avoid
|
|
303
|
+
// eating into the attestation window.
|
|
317
304
|
// Check that the parent proposal is a block we know, otherwise reexecution would fail.
|
|
318
305
|
// If we don't find it immediately, we keep retrying for a while; it may be we still
|
|
319
306
|
// need to process other block proposals to get to it.
|
|
@@ -416,7 +403,7 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
416
403
|
epoch,
|
|
417
404
|
checkpointNumber,
|
|
418
405
|
l1Constants: this.epochCache.getL1Constants(),
|
|
419
|
-
pipeliningEnabled:
|
|
406
|
+
pipeliningEnabled: true,
|
|
420
407
|
log: this.log
|
|
421
408
|
});
|
|
422
409
|
// Try re-executing the transactions in the proposal if needed
|
|
@@ -635,38 +622,10 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
635
622
|
getReexecutionDeadline(slotNumber, config) {
|
|
636
623
|
// Under proposer pipelining, the proposal slot may be ahead of wall clock time.
|
|
637
624
|
// Reexecution budgets should still be bounded by the current slot we are in now.
|
|
638
|
-
const wallclockSlot = slotNumber -
|
|
625
|
+
const wallclockSlot = slotNumber - PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
639
626
|
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(wallclockSlot + 1), config));
|
|
640
627
|
return new Date(nextSlotTimestampSeconds * 1000);
|
|
641
628
|
}
|
|
642
|
-
/** Waits for the block source to sync L1 data up to at least the slot before the given one. */ async waitForBlockSourceSync(slot) {
|
|
643
|
-
const deadline = this.getReexecutionDeadline(slot, this.checkpointsBuilder.getConfig());
|
|
644
|
-
const timeoutMs = deadline.getTime() - this.dateProvider.now();
|
|
645
|
-
if (slot === 0) {
|
|
646
|
-
return true;
|
|
647
|
-
}
|
|
648
|
-
// Make a quick check before triggering an archiver sync
|
|
649
|
-
// If we are pipelining and have a pending checkpoint number stored, we will allow the block proposal to be for a slot further
|
|
650
|
-
const syncedSlot = await this.blockSource.getSyncedL2SlotNumber();
|
|
651
|
-
if (syncedSlot !== undefined && syncedSlot + 1 + this.epochCache.pipeliningOffset() >= slot) {
|
|
652
|
-
return true;
|
|
653
|
-
}
|
|
654
|
-
try {
|
|
655
|
-
// Trigger an immediate sync of the block source, and wait until it reports being synced to the required slot
|
|
656
|
-
return await retryUntil(async ()=>{
|
|
657
|
-
await this.blockSource.syncImmediate();
|
|
658
|
-
const updatedSyncedSlot = await this.blockSource.getSyncedL2SlotNumber();
|
|
659
|
-
return updatedSyncedSlot !== undefined && updatedSyncedSlot + 1 >= slot;
|
|
660
|
-
}, 'wait for block source sync', timeoutMs / 1000, 0.5);
|
|
661
|
-
} catch (err) {
|
|
662
|
-
if (err instanceof TimeoutError) {
|
|
663
|
-
this.log.warn(`Timed out waiting for block source to sync to slot ${slot}`);
|
|
664
|
-
return false;
|
|
665
|
-
} else {
|
|
666
|
-
throw err;
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
629
|
getReexecuteFailureReason(err) {
|
|
671
630
|
if (err instanceof TransactionsNotAvailableError) {
|
|
672
631
|
return 'txs_not_available';
|
|
@@ -848,12 +807,14 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
848
807
|
};
|
|
849
808
|
try {
|
|
850
809
|
const slot = proposal.slotNumber;
|
|
851
|
-
// Block-sync deadline = the
|
|
852
|
-
//
|
|
853
|
-
//
|
|
854
|
-
//
|
|
855
|
-
|
|
856
|
-
const
|
|
810
|
+
// Block-sync deadline = the L1 publish deadline, i.e. the latest moment the proposer can submit
|
|
811
|
+
// this checkpoint and still have it land on L1 in the target slot. That is 12s (one Ethereum
|
|
812
|
+
// slot) before the last L1 block of the target slot, which is later than the target-slot start
|
|
813
|
+
// used for block re-execution. Keeping validation/attestation alive until then lets validators
|
|
814
|
+
// keep attesting right up to the proposer's real publish cutoff.
|
|
815
|
+
const l1Constants = this.epochCache.getL1Constants();
|
|
816
|
+
const publishDeadlineSeconds = Number(getLastL1SlotTimestampForL2Slot(slot, l1Constants)) - l1Constants.ethereumSlotDuration;
|
|
817
|
+
const deadline = new Date(publishDeadlineSeconds * 1000);
|
|
857
818
|
const timeoutSeconds = Math.max(1, Math.floor((deadline.getTime() - this.dateProvider.now()) / 1000));
|
|
858
819
|
// Wait for last block to sync by archive
|
|
859
820
|
let lastBlockData;
|
|
@@ -950,7 +911,7 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
950
911
|
epoch,
|
|
951
912
|
checkpointNumber,
|
|
952
913
|
l1Constants: this.epochCache.getL1Constants(),
|
|
953
|
-
pipeliningEnabled:
|
|
914
|
+
pipeliningEnabled: true,
|
|
954
915
|
log: this.log
|
|
955
916
|
});
|
|
956
917
|
// Fork world state at the block before the first block
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/validator-client",
|
|
3
|
-
"version": "6.0.0-nightly.
|
|
3
|
+
"version": "6.0.0-nightly.20260604",
|
|
4
4
|
"main": "dest/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -64,30 +64,30 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/blob-client": "6.0.0-nightly.
|
|
68
|
-
"@aztec/blob-lib": "6.0.0-nightly.
|
|
69
|
-
"@aztec/constants": "6.0.0-nightly.
|
|
70
|
-
"@aztec/epoch-cache": "6.0.0-nightly.
|
|
71
|
-
"@aztec/ethereum": "6.0.0-nightly.
|
|
72
|
-
"@aztec/foundation": "6.0.0-nightly.
|
|
73
|
-
"@aztec/node-keystore": "6.0.0-nightly.
|
|
74
|
-
"@aztec/noir-protocol-circuits-types": "6.0.0-nightly.
|
|
75
|
-
"@aztec/p2p": "6.0.0-nightly.
|
|
76
|
-
"@aztec/protocol-contracts": "6.0.0-nightly.
|
|
77
|
-
"@aztec/prover-client": "6.0.0-nightly.
|
|
78
|
-
"@aztec/simulator": "6.0.0-nightly.
|
|
79
|
-
"@aztec/slasher": "6.0.0-nightly.
|
|
80
|
-
"@aztec/stdlib": "6.0.0-nightly.
|
|
81
|
-
"@aztec/telemetry-client": "6.0.0-nightly.
|
|
82
|
-
"@aztec/validator-ha-signer": "6.0.0-nightly.
|
|
67
|
+
"@aztec/blob-client": "6.0.0-nightly.20260604",
|
|
68
|
+
"@aztec/blob-lib": "6.0.0-nightly.20260604",
|
|
69
|
+
"@aztec/constants": "6.0.0-nightly.20260604",
|
|
70
|
+
"@aztec/epoch-cache": "6.0.0-nightly.20260604",
|
|
71
|
+
"@aztec/ethereum": "6.0.0-nightly.20260604",
|
|
72
|
+
"@aztec/foundation": "6.0.0-nightly.20260604",
|
|
73
|
+
"@aztec/node-keystore": "6.0.0-nightly.20260604",
|
|
74
|
+
"@aztec/noir-protocol-circuits-types": "6.0.0-nightly.20260604",
|
|
75
|
+
"@aztec/p2p": "6.0.0-nightly.20260604",
|
|
76
|
+
"@aztec/protocol-contracts": "6.0.0-nightly.20260604",
|
|
77
|
+
"@aztec/prover-client": "6.0.0-nightly.20260604",
|
|
78
|
+
"@aztec/simulator": "6.0.0-nightly.20260604",
|
|
79
|
+
"@aztec/slasher": "6.0.0-nightly.20260604",
|
|
80
|
+
"@aztec/stdlib": "6.0.0-nightly.20260604",
|
|
81
|
+
"@aztec/telemetry-client": "6.0.0-nightly.20260604",
|
|
82
|
+
"@aztec/validator-ha-signer": "6.0.0-nightly.20260604",
|
|
83
83
|
"koa": "^2.16.1",
|
|
84
84
|
"koa-router": "^13.1.1",
|
|
85
85
|
"tslib": "^2.4.0",
|
|
86
86
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
87
87
|
},
|
|
88
88
|
"devDependencies": {
|
|
89
|
-
"@aztec/archiver": "6.0.0-nightly.
|
|
90
|
-
"@aztec/world-state": "6.0.0-nightly.
|
|
89
|
+
"@aztec/archiver": "6.0.0-nightly.20260604",
|
|
90
|
+
"@aztec/world-state": "6.0.0-nightly.20260604",
|
|
91
91
|
"@electric-sql/pglite": "^0.3.14",
|
|
92
92
|
"@jest/globals": "^30.0.0",
|
|
93
93
|
"@types/jest": "^30.0.0",
|
package/src/proposal_handler.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { Archiver } from '@aztec/archiver';
|
|
|
2
2
|
import type { BlobClientInterface } from '@aztec/blob-client/client';
|
|
3
3
|
import { type Blob, encodeCheckpointBlobDataFromBlocks, getBlobsPerL1Block } from '@aztec/blob-lib';
|
|
4
4
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
5
|
-
import type
|
|
5
|
+
import { type EpochCache, PROPOSER_PIPELINING_SLOT_OFFSET } from '@aztec/epoch-cache';
|
|
6
6
|
import { validateFeeAssetPriceModifier } from '@aztec/ethereum/contracts';
|
|
7
7
|
import {
|
|
8
8
|
BlockNumber,
|
|
@@ -22,7 +22,7 @@ import { BlockProposalValidator } from '@aztec/p2p/msg_validators';
|
|
|
22
22
|
import type { BlockData, L2Block, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
23
23
|
import type { CheckpointReexecutionTracker, ReexecutionOutcome } from '@aztec/stdlib/checkpoint';
|
|
24
24
|
import { getPreviousCheckpointOutHashes, validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
25
|
-
import { getEpochAtSlot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
25
|
+
import { getEpochAtSlot, getLastL1SlotTimestampForL2Slot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
26
26
|
import { Gas } from '@aztec/stdlib/gas';
|
|
27
27
|
import type { ITxProvider, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
28
28
|
import {
|
|
@@ -49,7 +49,6 @@ export type BlockProposalValidationFailureReason =
|
|
|
49
49
|
| 'invalid_signature'
|
|
50
50
|
| 'invalid_proposal'
|
|
51
51
|
| 'parent_block_not_found'
|
|
52
|
-
| 'block_source_not_synced'
|
|
53
52
|
| 'parent_block_wrong_slot'
|
|
54
53
|
| 'in_hash_mismatch'
|
|
55
54
|
| 'global_variables_mismatch'
|
|
@@ -314,7 +313,7 @@ export class ProposalHandler {
|
|
|
314
313
|
const result = await this.handleCheckpointProposal(proposal, proposalInfo);
|
|
315
314
|
if (!result.isValid) {
|
|
316
315
|
await this.checkpointProposalValidationFailureCallback?.(proposal, result, proposalInfo);
|
|
317
|
-
} else if (this.archiver
|
|
316
|
+
} else if (this.archiver) {
|
|
318
317
|
const set = await this.setProposedCheckpointFromValidation(proposal);
|
|
319
318
|
if (set) {
|
|
320
319
|
this.metrics?.recordCheckpointProposalToPipelinedStateDuration(pipeliningTimer.ms());
|
|
@@ -376,20 +375,9 @@ export class ProposalHandler {
|
|
|
376
375
|
return { isValid: false, blockNumber: proposal.blockNumber, reason: retainedSlotValidation.reason };
|
|
377
376
|
}
|
|
378
377
|
|
|
379
|
-
//
|
|
380
|
-
//
|
|
381
|
-
//
|
|
382
|
-
// checkpoint prune could remove a block that would conflict with this proposal.
|
|
383
|
-
// When pipelining is enabled, the proposer builds ahead of L1 submission, so the
|
|
384
|
-
// block source won't have synced to the proposed slot yet. Skip the sync wait to
|
|
385
|
-
// avoid eating into the attestation window.
|
|
386
|
-
if (!this.epochCache.isProposerPipeliningEnabled()) {
|
|
387
|
-
const blockSourceSync = await this.waitForBlockSourceSync(slotNumber);
|
|
388
|
-
if (!blockSourceSync) {
|
|
389
|
-
this.log.warn(`Block source is not synced, skipping processing`, proposalInfo);
|
|
390
|
-
return { isValid: false, reason: 'block_source_not_synced' };
|
|
391
|
-
}
|
|
392
|
-
}
|
|
378
|
+
// The proposer builds ahead of L1 submission under pipelining, so the block source won't have
|
|
379
|
+
// synced to the proposed slot yet. We deliberately do not wait for it to sync here, to avoid
|
|
380
|
+
// eating into the attestation window.
|
|
393
381
|
|
|
394
382
|
// Check that the parent proposal is a block we know, otherwise reexecution would fail.
|
|
395
383
|
// If we don't find it immediately, we keep retrying for a while; it may be we still
|
|
@@ -479,7 +467,7 @@ export class ProposalHandler {
|
|
|
479
467
|
epoch,
|
|
480
468
|
checkpointNumber,
|
|
481
469
|
l1Constants: this.epochCache.getL1Constants(),
|
|
482
|
-
pipeliningEnabled:
|
|
470
|
+
pipeliningEnabled: true,
|
|
483
471
|
log: this.log,
|
|
484
472
|
});
|
|
485
473
|
|
|
@@ -699,48 +687,11 @@ export class ProposalHandler {
|
|
|
699
687
|
): Date {
|
|
700
688
|
// Under proposer pipelining, the proposal slot may be ahead of wall clock time.
|
|
701
689
|
// Reexecution budgets should still be bounded by the current slot we are in now.
|
|
702
|
-
const wallclockSlot = slotNumber -
|
|
690
|
+
const wallclockSlot = slotNumber - PROPOSER_PIPELINING_SLOT_OFFSET;
|
|
703
691
|
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(wallclockSlot + 1), config));
|
|
704
692
|
return new Date(nextSlotTimestampSeconds * 1000);
|
|
705
693
|
}
|
|
706
694
|
|
|
707
|
-
/** Waits for the block source to sync L1 data up to at least the slot before the given one. */
|
|
708
|
-
private async waitForBlockSourceSync(slot: SlotNumber): Promise<boolean> {
|
|
709
|
-
const deadline = this.getReexecutionDeadline(slot, this.checkpointsBuilder.getConfig());
|
|
710
|
-
const timeoutMs = deadline.getTime() - this.dateProvider.now();
|
|
711
|
-
if (slot === 0) {
|
|
712
|
-
return true;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
// Make a quick check before triggering an archiver sync
|
|
716
|
-
// If we are pipelining and have a pending checkpoint number stored, we will allow the block proposal to be for a slot further
|
|
717
|
-
const syncedSlot = await this.blockSource.getSyncedL2SlotNumber();
|
|
718
|
-
if (syncedSlot !== undefined && syncedSlot + 1 + this.epochCache.pipeliningOffset() >= slot) {
|
|
719
|
-
return true;
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
try {
|
|
723
|
-
// Trigger an immediate sync of the block source, and wait until it reports being synced to the required slot
|
|
724
|
-
return await retryUntil(
|
|
725
|
-
async () => {
|
|
726
|
-
await this.blockSource.syncImmediate();
|
|
727
|
-
const updatedSyncedSlot = await this.blockSource.getSyncedL2SlotNumber();
|
|
728
|
-
return updatedSyncedSlot !== undefined && updatedSyncedSlot + 1 >= slot;
|
|
729
|
-
},
|
|
730
|
-
'wait for block source sync',
|
|
731
|
-
timeoutMs / 1000,
|
|
732
|
-
0.5,
|
|
733
|
-
);
|
|
734
|
-
} catch (err) {
|
|
735
|
-
if (err instanceof TimeoutError) {
|
|
736
|
-
this.log.warn(`Timed out waiting for block source to sync to slot ${slot}`);
|
|
737
|
-
return false;
|
|
738
|
-
} else {
|
|
739
|
-
throw err;
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
|
|
744
695
|
private getReexecuteFailureReason(err: any): BlockProposalValidationFailureReason {
|
|
745
696
|
if (err instanceof TransactionsNotAvailableError) {
|
|
746
697
|
return 'txs_not_available';
|
|
@@ -950,12 +901,15 @@ export class ProposalHandler {
|
|
|
950
901
|
): Promise<CheckpointProposalValidationResult> {
|
|
951
902
|
const slot = proposal.slotNumber;
|
|
952
903
|
|
|
953
|
-
// Block-sync deadline = the
|
|
954
|
-
//
|
|
955
|
-
//
|
|
956
|
-
//
|
|
957
|
-
|
|
958
|
-
const
|
|
904
|
+
// Block-sync deadline = the L1 publish deadline, i.e. the latest moment the proposer can submit
|
|
905
|
+
// this checkpoint and still have it land on L1 in the target slot. That is 12s (one Ethereum
|
|
906
|
+
// slot) before the last L1 block of the target slot, which is later than the target-slot start
|
|
907
|
+
// used for block re-execution. Keeping validation/attestation alive until then lets validators
|
|
908
|
+
// keep attesting right up to the proposer's real publish cutoff.
|
|
909
|
+
const l1Constants = this.epochCache.getL1Constants();
|
|
910
|
+
const publishDeadlineSeconds =
|
|
911
|
+
Number(getLastL1SlotTimestampForL2Slot(slot, l1Constants)) - l1Constants.ethereumSlotDuration;
|
|
912
|
+
const deadline = new Date(publishDeadlineSeconds * 1000);
|
|
959
913
|
const timeoutSeconds = Math.max(1, Math.floor((deadline.getTime() - this.dateProvider.now()) / 1000));
|
|
960
914
|
|
|
961
915
|
// Wait for last block to sync by archive
|
|
@@ -1050,7 +1004,7 @@ export class ProposalHandler {
|
|
|
1050
1004
|
epoch,
|
|
1051
1005
|
checkpointNumber,
|
|
1052
1006
|
l1Constants: this.epochCache.getL1Constants(),
|
|
1053
|
-
pipeliningEnabled:
|
|
1007
|
+
pipeliningEnabled: true,
|
|
1054
1008
|
log: this.log,
|
|
1055
1009
|
});
|
|
1056
1010
|
|