@aztec/validator-client 4.1.2 → 4.2.0-aztecnr-rc.2
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/README.md +9 -10
- package/dest/block_proposal_handler.d.ts +64 -0
- package/dest/block_proposal_handler.d.ts.map +1 -0
- package/dest/{proposal_handler.js → block_proposal_handler.js} +9 -249
- package/dest/checkpoint_builder.d.ts +10 -8
- package/dest/checkpoint_builder.d.ts.map +1 -1
- package/dest/checkpoint_builder.js +29 -19
- package/dest/factory.d.ts +6 -5
- package/dest/factory.d.ts.map +1 -1
- package/dest/factory.js +4 -4
- package/dest/index.d.ts +2 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -1
- package/dest/metrics.d.ts +2 -2
- package/dest/metrics.d.ts.map +1 -1
- package/dest/validator.d.ts +22 -9
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +231 -18
- package/package.json +19 -19
- package/src/{proposal_handler.ts → block_proposal_handler.ts} +10 -283
- package/src/checkpoint_builder.ts +38 -25
- package/src/factory.ts +6 -5
- package/src/index.ts +1 -1
- package/src/metrics.ts +1 -1
- package/src/validator.ts +253 -21
- package/dest/proposal_handler.d.ts +0 -94
- package/dest/proposal_handler.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -237,13 +237,11 @@ L1 enforces gas and blob capacity per checkpoint. The node enforces these during
|
|
|
237
237
|
|
|
238
238
|
### Per-block budgets
|
|
239
239
|
|
|
240
|
-
Per-block budgets prevent one block from consuming the entire checkpoint budget.
|
|
240
|
+
Per-block budgets prevent one block from consuming the entire checkpoint budget. The checkpoint builder dynamically computes per-block limits before each block based on the remaining checkpoint budget and the number of remaining blocks.
|
|
241
241
|
|
|
242
|
-
**Proposer**:
|
|
242
|
+
**Proposer**: When building a proposal (`isBuildingProposal: true`), the `CheckpointProposalJob` passes `maxBlocksPerCheckpoint` (from the timetable) and `perBlockAllocationMultiplier` (default 1.2) via opts to `CheckpointBuilder.buildBlock`. The builder computes a fair share as `min(perBlockLimit, ceil(remainingBudget / remainingBlocks * multiplier), remainingBudget)`. The multiplier greater than 1 allows early blocks to use more than their even share, since different blocks hit different limit dimensions (L2 gas, DA gas, blob fields) — a strict even split would waste capacity. As prior blocks consume budget, later blocks see tightened limits. This applies to all four dimensions (L2 gas, DA gas, blob fields, transaction count). Operators can set hard per-block caps via `SEQ_MAX_L2_BLOCK_GAS` / `SEQ_MAX_DA_BLOCK_GAS` / `SEQ_MAX_TX_PER_BLOCK` (capped at checkpoint limits at startup); these act as additional upper bounds alongside the redistribution.
|
|
243
243
|
|
|
244
|
-
**Validator**:
|
|
245
|
-
|
|
246
|
-
**Checkpoint-level capping**: `CheckpointBuilder.capLimitsByCheckpointBudgets()` always runs before tx processing, capping per-block limits by `checkpointBudget - sum(used by prior blocks)` for all three gas dimensions and for transaction count (when `SEQ_MAX_TX_PER_CHECKPOINT` is set). This applies to both proposer and validator paths.
|
|
244
|
+
**Validator**: When re-executing a proposal (`isBuildingProposal` unset), `capLimitsByCheckpointBudgets` only caps by the per-block limit and the total remaining checkpoint budget — no redistribution or multiplier is applied. This avoids false rejections due to differences between proposer and validator fair-share calculations. Validators can optionally set hard per-block limits via `VALIDATOR_MAX_L2_BLOCK_GAS`, `VALIDATOR_MAX_DA_BLOCK_GAS`, and `VALIDATOR_MAX_TX_PER_BLOCK`. When unset, no per-block limit is enforced (checkpoint-level protocol limits still apply). These are independent of the `SEQ_` vars so operators can tune proposer and validation limits separately.
|
|
247
245
|
|
|
248
246
|
### Per-transaction enforcement
|
|
249
247
|
|
|
@@ -255,11 +253,12 @@ Per-block budgets prevent one block from consuming the entire checkpoint budget.
|
|
|
255
253
|
|
|
256
254
|
| Variable | Default | Description |
|
|
257
255
|
| --- | --- | --- |
|
|
258
|
-
| `SEQ_MAX_L2_BLOCK_GAS` | *
|
|
259
|
-
| `SEQ_MAX_DA_BLOCK_GAS` | *
|
|
260
|
-
| `SEQ_MAX_TX_PER_BLOCK` | *none* |
|
|
261
|
-
| `SEQ_MAX_TX_PER_CHECKPOINT` | *none* | Total txs across all blocks in a checkpoint. When set,
|
|
262
|
-
| `SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER` | 2 | Multiplier for per-block budget
|
|
256
|
+
| `SEQ_MAX_L2_BLOCK_GAS` | *none* | Hard per-block L2 gas cap. Capped at `rollupManaLimit` at startup. When unset, redistribution dynamically computes per-block limits. |
|
|
257
|
+
| `SEQ_MAX_DA_BLOCK_GAS` | *none* | Hard per-block DA gas cap. Capped at `MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT` at startup. When unset, redistribution handles it. |
|
|
258
|
+
| `SEQ_MAX_TX_PER_BLOCK` | *none* | Hard per-block tx count cap. Capped at `SEQ_MAX_TX_PER_CHECKPOINT` at startup (if set). |
|
|
259
|
+
| `SEQ_MAX_TX_PER_CHECKPOINT` | *none* | Total txs across all blocks in a checkpoint. When set, checkpoint-level capping and redistribution are enforced for tx count. |
|
|
260
|
+
| `SEQ_PER_BLOCK_ALLOCATION_MULTIPLIER` | 1.2 | Multiplier for per-block budget redistribution. Passed via opts to the checkpoint builder during proposal building. |
|
|
261
|
+
| `SEQ_REDISTRIBUTE_CHECKPOINT_BUDGET` | true | Legacy flag; redistribution is now always active during proposal building and inactive during validation. |
|
|
263
262
|
| `VALIDATOR_MAX_L2_BLOCK_GAS` | *none* | Per-block L2 gas limit for validation. Proposals exceeding this are rejected. |
|
|
264
263
|
| `VALIDATOR_MAX_DA_BLOCK_GAS` | *none* | Per-block DA gas limit for validation. Proposals exceeding this are rejected. |
|
|
265
264
|
| `VALIDATOR_MAX_TX_PER_BLOCK` | *none* | Per-block tx count limit for validation. Proposals exceeding this are rejected. |
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { EpochCache } from '@aztec/epoch-cache';
|
|
2
|
+
import { BlockNumber, CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
|
+
import type { P2P, PeerId } from '@aztec/p2p';
|
|
6
|
+
import { BlockProposalValidator } from '@aztec/p2p/msg_validators';
|
|
7
|
+
import type { L2Block, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
8
|
+
import type { ITxProvider, ValidatorClientFullConfig, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
9
|
+
import { type L1ToL2MessageSource } from '@aztec/stdlib/messaging';
|
|
10
|
+
import type { BlockProposal } from '@aztec/stdlib/p2p';
|
|
11
|
+
import type { FailedTx, Tx } from '@aztec/stdlib/tx';
|
|
12
|
+
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
13
|
+
import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
14
|
+
import type { ValidatorMetrics } from './metrics.js';
|
|
15
|
+
export type BlockProposalValidationFailureReason = 'invalid_proposal' | 'parent_block_not_found' | 'block_source_not_synced' | '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' | 'unknown_error';
|
|
16
|
+
type ReexecuteTransactionsResult = {
|
|
17
|
+
block: L2Block;
|
|
18
|
+
failedTxs: FailedTx[];
|
|
19
|
+
reexecutionTimeMs: number;
|
|
20
|
+
totalManaUsed: number;
|
|
21
|
+
};
|
|
22
|
+
export type BlockProposalValidationSuccessResult = {
|
|
23
|
+
isValid: true;
|
|
24
|
+
blockNumber: BlockNumber;
|
|
25
|
+
reexecutionResult?: ReexecuteTransactionsResult;
|
|
26
|
+
};
|
|
27
|
+
export type BlockProposalValidationFailureResult = {
|
|
28
|
+
isValid: false;
|
|
29
|
+
reason: BlockProposalValidationFailureReason;
|
|
30
|
+
blockNumber?: BlockNumber;
|
|
31
|
+
reexecutionResult?: ReexecuteTransactionsResult;
|
|
32
|
+
};
|
|
33
|
+
export type BlockProposalValidationResult = BlockProposalValidationSuccessResult | BlockProposalValidationFailureResult;
|
|
34
|
+
export declare class BlockProposalHandler {
|
|
35
|
+
private checkpointsBuilder;
|
|
36
|
+
private worldState;
|
|
37
|
+
private blockSource;
|
|
38
|
+
private l1ToL2MessageSource;
|
|
39
|
+
private txProvider;
|
|
40
|
+
private blockProposalValidator;
|
|
41
|
+
private epochCache;
|
|
42
|
+
private config;
|
|
43
|
+
private metrics?;
|
|
44
|
+
private dateProvider;
|
|
45
|
+
private log;
|
|
46
|
+
readonly tracer: Tracer;
|
|
47
|
+
constructor(checkpointsBuilder: FullNodeCheckpointsBuilder, worldState: WorldStateSynchronizer, blockSource: L2BlockSource & L2BlockSink, l1ToL2MessageSource: L1ToL2MessageSource, txProvider: ITxProvider, blockProposalValidator: BlockProposalValidator, epochCache: EpochCache, config: ValidatorClientFullConfig, metrics?: ValidatorMetrics | undefined, dateProvider?: DateProvider, telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
48
|
+
register(p2pClient: P2P, shouldReexecute: boolean): BlockProposalHandler;
|
|
49
|
+
handleBlockProposal(proposal: BlockProposal, proposalSender: PeerId, shouldReexecute: boolean): Promise<BlockProposalValidationResult>;
|
|
50
|
+
private getParentBlock;
|
|
51
|
+
private computeCheckpointNumber;
|
|
52
|
+
/**
|
|
53
|
+
* Validates that a non-first block in a checkpoint has consistent global variables with its parent.
|
|
54
|
+
* For blocks with indexWithinCheckpoint > 0, all global variables except blockNumber must match the parent.
|
|
55
|
+
* @returns A failure result if validation fails, undefined if validation passes
|
|
56
|
+
*/
|
|
57
|
+
private validateNonFirstBlockInCheckpoint;
|
|
58
|
+
private getReexecutionDeadline;
|
|
59
|
+
private waitForBlockSourceSync;
|
|
60
|
+
private getReexecuteFailureReason;
|
|
61
|
+
reexecuteTransactions(proposal: BlockProposal, blockNumber: BlockNumber, checkpointNumber: CheckpointNumber, txs: Tx[], l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[]): Promise<ReexecuteTransactionsResult>;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfcHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jsb2NrX3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBYyxNQUFNLGlDQUFpQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUlwRCxPQUFPLEVBQUUsWUFBWSxFQUFTLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBYSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRzFGLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSx5QkFBeUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RILE9BQU8sRUFBRSxLQUFLLG1CQUFtQixFQUFtQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3BHLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXZELE9BQU8sS0FBSyxFQUE2QixRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFRaEYsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFFLEtBQUssTUFBTSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBRWhHLE9BQU8sS0FBSyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFckQsTUFBTSxNQUFN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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block_proposal_handler.d.ts","sourceRoot":"","sources":["../src/block_proposal_handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -63,9 +63,7 @@ function _ts_dispose_resources(env) {
|
|
|
63
63
|
return next();
|
|
64
64
|
})(env);
|
|
65
65
|
}
|
|
66
|
-
import { encodeCheckpointBlobDataFromBlocks, getBlobsPerL1Block } from '@aztec/blob-lib';
|
|
67
66
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
68
|
-
import { validateFeeAssetPriceModifier } from '@aztec/ethereum/contracts';
|
|
69
67
|
import { BlockNumber, CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
70
68
|
import { pick } from '@aztec/foundation/collection';
|
|
71
69
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
@@ -73,14 +71,13 @@ import { TimeoutError } from '@aztec/foundation/error';
|
|
|
73
71
|
import { createLogger } from '@aztec/foundation/log';
|
|
74
72
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
75
73
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
76
|
-
import { validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
77
74
|
import { getEpochAtSlot, getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
78
75
|
import { Gas } from '@aztec/stdlib/gas';
|
|
79
|
-
import {
|
|
76
|
+
import { computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
80
77
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
81
78
|
import { ReExFailedTxsError, ReExInitialStateMismatchError, ReExStateMismatchError, ReExTimeoutError, TransactionsNotAvailableError } from '@aztec/stdlib/validators';
|
|
82
79
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
83
|
-
|
|
80
|
+
export class BlockProposalHandler {
|
|
84
81
|
checkpointsBuilder;
|
|
85
82
|
worldState;
|
|
86
83
|
blockSource;
|
|
@@ -89,12 +86,11 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
89
86
|
blockProposalValidator;
|
|
90
87
|
epochCache;
|
|
91
88
|
config;
|
|
92
|
-
blobClient;
|
|
93
89
|
metrics;
|
|
94
90
|
dateProvider;
|
|
95
91
|
log;
|
|
96
92
|
tracer;
|
|
97
|
-
constructor(checkpointsBuilder, worldState, blockSource, l1ToL2MessageSource, txProvider, blockProposalValidator, epochCache, config,
|
|
93
|
+
constructor(checkpointsBuilder, worldState, blockSource, l1ToL2MessageSource, txProvider, blockProposalValidator, epochCache, config, metrics, dateProvider = new DateProvider(), telemetry = getTelemetryClient(), log = createLogger('validator:block-proposal-handler')){
|
|
98
94
|
this.checkpointsBuilder = checkpointsBuilder;
|
|
99
95
|
this.worldState = worldState;
|
|
100
96
|
this.blockSource = blockSource;
|
|
@@ -103,22 +99,18 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
103
99
|
this.blockProposalValidator = blockProposalValidator;
|
|
104
100
|
this.epochCache = epochCache;
|
|
105
101
|
this.config = config;
|
|
106
|
-
this.blobClient = blobClient;
|
|
107
102
|
this.metrics = metrics;
|
|
108
103
|
this.dateProvider = dateProvider;
|
|
109
104
|
this.log = log;
|
|
110
105
|
if (config.fishermanMode) {
|
|
111
106
|
this.log = this.log.createChild('[FISHERMAN]');
|
|
112
107
|
}
|
|
113
|
-
this.tracer = telemetry.getTracer('
|
|
108
|
+
this.tracer = telemetry.getTracer('BlockProposalHandler');
|
|
114
109
|
}
|
|
115
|
-
|
|
116
|
-
* Registers non-validator handlers for block and checkpoint proposals on the p2p client.
|
|
117
|
-
* Block proposals are always registered. Checkpoint proposals are registered if the blob client can upload.
|
|
118
|
-
*/ register(p2pClient, shouldReexecute) {
|
|
110
|
+
register(p2pClient, shouldReexecute) {
|
|
119
111
|
// Non-validator handler that processes or re-executes for monitoring but does not attest.
|
|
120
112
|
// Returns boolean indicating whether the proposal was valid.
|
|
121
|
-
const
|
|
113
|
+
const handler = async (proposal, proposalSender)=>{
|
|
122
114
|
try {
|
|
123
115
|
const { slotNumber, blockNumber } = proposal;
|
|
124
116
|
const result = await this.handleBlockProposal(proposal, proposalSender, shouldReexecute);
|
|
@@ -145,30 +137,7 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
145
137
|
return false;
|
|
146
138
|
}
|
|
147
139
|
};
|
|
148
|
-
p2pClient.registerBlockProposalHandler(
|
|
149
|
-
// Register checkpoint proposal handler if blob uploads are enabled and we are reexecuting
|
|
150
|
-
if (this.blobClient.canUpload() && shouldReexecute) {
|
|
151
|
-
const checkpointHandler = async (checkpoint, _sender)=>{
|
|
152
|
-
try {
|
|
153
|
-
const proposalInfo = {
|
|
154
|
-
proposalSlotNumber: checkpoint.slotNumber,
|
|
155
|
-
archive: checkpoint.archive.toString(),
|
|
156
|
-
proposer: checkpoint.getSender()?.toString()
|
|
157
|
-
};
|
|
158
|
-
const result = await this.handleCheckpointProposal(checkpoint, proposalInfo);
|
|
159
|
-
if (result.isValid) {
|
|
160
|
-
this.log.info(`Non-validator checkpoint proposal at slot ${checkpoint.slotNumber} handled`, proposalInfo);
|
|
161
|
-
} else {
|
|
162
|
-
this.log.warn(`Non-validator checkpoint proposal at slot ${checkpoint.slotNumber} failed: ${result.reason}`, proposalInfo);
|
|
163
|
-
}
|
|
164
|
-
} catch (error) {
|
|
165
|
-
this.log.error('Error processing checkpoint proposal in non-validator handler', error);
|
|
166
|
-
}
|
|
167
|
-
// Non-validators don't attest
|
|
168
|
-
return undefined;
|
|
169
|
-
};
|
|
170
|
-
p2pClient.registerCheckpointProposalHandler(checkpointHandler);
|
|
171
|
-
}
|
|
140
|
+
p2pClient.registerBlockProposalHandler(handler);
|
|
172
141
|
return this;
|
|
173
142
|
}
|
|
174
143
|
async handleBlockProposal(proposal, proposalSender, shouldReexecute) {
|
|
@@ -583,6 +552,8 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
583
552
|
const deadline = this.getReexecutionDeadline(slot, config);
|
|
584
553
|
const maxBlockGas = this.config.validateMaxL2BlockGas !== undefined || this.config.validateMaxDABlockGas !== undefined ? new Gas(this.config.validateMaxDABlockGas ?? Infinity, this.config.validateMaxL2BlockGas ?? Infinity) : undefined;
|
|
585
554
|
const result = await checkpointBuilder.buildBlock(txs, blockNumber, blockHeader.globalVariables.timestamp, {
|
|
555
|
+
isBuildingProposal: false,
|
|
556
|
+
minValidTxs: 0,
|
|
586
557
|
deadline,
|
|
587
558
|
expectedEndState: blockHeader.state,
|
|
588
559
|
maxTransactions: this.config.validateMaxTxsPerBlock,
|
|
@@ -636,215 +607,4 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
636
607
|
if (result) await result;
|
|
637
608
|
}
|
|
638
609
|
}
|
|
639
|
-
/**
|
|
640
|
-
* Validates a checkpoint proposal and uploads blobs if configured.
|
|
641
|
-
* Used by both non-validator nodes (via register) and the validator client (via delegation).
|
|
642
|
-
*/ async handleCheckpointProposal(proposal, proposalInfo) {
|
|
643
|
-
const proposer = proposal.getSender();
|
|
644
|
-
if (!proposer) {
|
|
645
|
-
this.log.warn(`Received checkpoint proposal with invalid signature for slot ${proposal.slotNumber}`);
|
|
646
|
-
return {
|
|
647
|
-
isValid: false,
|
|
648
|
-
reason: 'invalid_signature'
|
|
649
|
-
};
|
|
650
|
-
}
|
|
651
|
-
if (!validateFeeAssetPriceModifier(proposal.feeAssetPriceModifier)) {
|
|
652
|
-
this.log.warn(`Received checkpoint proposal with invalid feeAssetPriceModifier ${proposal.feeAssetPriceModifier} for slot ${proposal.slotNumber}`);
|
|
653
|
-
return {
|
|
654
|
-
isValid: false,
|
|
655
|
-
reason: 'invalid_fee_asset_price_modifier'
|
|
656
|
-
};
|
|
657
|
-
}
|
|
658
|
-
const result = await this.validateCheckpointProposal(proposal, proposalInfo);
|
|
659
|
-
// Upload blobs to filestore if validation passed (fire and forget)
|
|
660
|
-
if (result.isValid) {
|
|
661
|
-
this.tryUploadBlobsForCheckpoint(proposal, proposalInfo);
|
|
662
|
-
}
|
|
663
|
-
return result;
|
|
664
|
-
}
|
|
665
|
-
/**
|
|
666
|
-
* Validates a checkpoint proposal by building the full checkpoint and comparing it with the proposal.
|
|
667
|
-
* @returns Validation result with isValid flag and reason if invalid.
|
|
668
|
-
*/ async validateCheckpointProposal(proposal, proposalInfo) {
|
|
669
|
-
const slot = proposal.slotNumber;
|
|
670
|
-
// Timeout block syncing at the start of the next slot
|
|
671
|
-
const config = this.checkpointsBuilder.getConfig();
|
|
672
|
-
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(slot + 1), config));
|
|
673
|
-
const timeoutSeconds = Math.max(1, nextSlotTimestampSeconds - Math.floor(this.dateProvider.now() / 1000));
|
|
674
|
-
// Wait for last block to sync by archive
|
|
675
|
-
let lastBlockHeader;
|
|
676
|
-
try {
|
|
677
|
-
lastBlockHeader = await retryUntil(async ()=>{
|
|
678
|
-
await this.blockSource.syncImmediate();
|
|
679
|
-
return this.blockSource.getBlockHeaderByArchive(proposal.archive);
|
|
680
|
-
}, `waiting for block with archive ${proposal.archive.toString()} for slot ${slot}`, timeoutSeconds, 0.5);
|
|
681
|
-
} catch (err) {
|
|
682
|
-
if (err instanceof TimeoutError) {
|
|
683
|
-
this.log.warn(`Timed out waiting for block with archive matching checkpoint proposal`, proposalInfo);
|
|
684
|
-
return {
|
|
685
|
-
isValid: false,
|
|
686
|
-
reason: 'last_block_not_found'
|
|
687
|
-
};
|
|
688
|
-
}
|
|
689
|
-
this.log.error(`Error fetching last block for checkpoint proposal`, err, proposalInfo);
|
|
690
|
-
return {
|
|
691
|
-
isValid: false,
|
|
692
|
-
reason: 'block_fetch_error'
|
|
693
|
-
};
|
|
694
|
-
}
|
|
695
|
-
if (!lastBlockHeader) {
|
|
696
|
-
this.log.warn(`Last block not found for checkpoint proposal`, proposalInfo);
|
|
697
|
-
return {
|
|
698
|
-
isValid: false,
|
|
699
|
-
reason: 'last_block_not_found'
|
|
700
|
-
};
|
|
701
|
-
}
|
|
702
|
-
// Get all full blocks for the slot and checkpoint
|
|
703
|
-
const blocks = await this.blockSource.getBlocksForSlot(slot);
|
|
704
|
-
if (blocks.length === 0) {
|
|
705
|
-
this.log.warn(`No blocks found for slot ${slot}`, proposalInfo);
|
|
706
|
-
return {
|
|
707
|
-
isValid: false,
|
|
708
|
-
reason: 'no_blocks_for_slot'
|
|
709
|
-
};
|
|
710
|
-
}
|
|
711
|
-
// Ensure the last block for this slot matches the archive in the checkpoint proposal
|
|
712
|
-
if (!blocks.at(-1)?.archive.root.equals(proposal.archive)) {
|
|
713
|
-
this.log.warn(`Last block archive mismatch for checkpoint proposal`, proposalInfo);
|
|
714
|
-
return {
|
|
715
|
-
isValid: false,
|
|
716
|
-
reason: 'last_block_archive_mismatch'
|
|
717
|
-
};
|
|
718
|
-
}
|
|
719
|
-
this.log.debug(`Found ${blocks.length} blocks for slot ${slot}`, {
|
|
720
|
-
...proposalInfo,
|
|
721
|
-
blockNumbers: blocks.map((b)=>b.number)
|
|
722
|
-
});
|
|
723
|
-
// Get checkpoint constants from first block
|
|
724
|
-
const firstBlock = blocks[0];
|
|
725
|
-
const constants = this.extractCheckpointConstants(firstBlock);
|
|
726
|
-
const checkpointNumber = firstBlock.checkpointNumber;
|
|
727
|
-
// Get L1-to-L2 messages for this checkpoint
|
|
728
|
-
const l1ToL2Messages = await this.l1ToL2MessageSource.getL1ToL2Messages(checkpointNumber);
|
|
729
|
-
// Collect the out hashes of all the checkpoints before this one in the same epoch
|
|
730
|
-
const epoch = getEpochAtSlot(slot, this.epochCache.getL1Constants());
|
|
731
|
-
const previousCheckpointOutHashes = (await this.blockSource.getCheckpointsDataForEpoch(epoch)).filter((c)=>c.checkpointNumber < checkpointNumber).map((c)=>c.checkpointOutHash);
|
|
732
|
-
// Fork world state at the block before the first block
|
|
733
|
-
const parentBlockNumber = BlockNumber(firstBlock.number - 1);
|
|
734
|
-
const fork = await this.worldState.fork(parentBlockNumber);
|
|
735
|
-
try {
|
|
736
|
-
// Create checkpoint builder with all existing blocks
|
|
737
|
-
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, proposal.feeAssetPriceModifier, l1ToL2Messages, previousCheckpointOutHashes, fork, blocks, this.log.getBindings());
|
|
738
|
-
// Complete the checkpoint to get computed values
|
|
739
|
-
const computedCheckpoint = await checkpointBuilder.completeCheckpoint();
|
|
740
|
-
// Compare checkpoint header with proposal
|
|
741
|
-
if (!computedCheckpoint.header.equals(proposal.checkpointHeader)) {
|
|
742
|
-
this.log.warn(`Checkpoint header mismatch`, {
|
|
743
|
-
...proposalInfo,
|
|
744
|
-
computed: computedCheckpoint.header.toInspect(),
|
|
745
|
-
proposal: proposal.checkpointHeader.toInspect()
|
|
746
|
-
});
|
|
747
|
-
return {
|
|
748
|
-
isValid: false,
|
|
749
|
-
reason: 'checkpoint_header_mismatch'
|
|
750
|
-
};
|
|
751
|
-
}
|
|
752
|
-
// Compare archive root with proposal
|
|
753
|
-
if (!computedCheckpoint.archive.root.equals(proposal.archive)) {
|
|
754
|
-
this.log.warn(`Archive root mismatch`, {
|
|
755
|
-
...proposalInfo,
|
|
756
|
-
computed: computedCheckpoint.archive.root.toString(),
|
|
757
|
-
proposal: proposal.archive.toString()
|
|
758
|
-
});
|
|
759
|
-
return {
|
|
760
|
-
isValid: false,
|
|
761
|
-
reason: 'archive_mismatch'
|
|
762
|
-
};
|
|
763
|
-
}
|
|
764
|
-
// Check that the accumulated epoch out hash matches the value in the proposal.
|
|
765
|
-
// The epoch out hash is the accumulated hash of all checkpoint out hashes in the epoch.
|
|
766
|
-
const checkpointOutHash = computedCheckpoint.getCheckpointOutHash();
|
|
767
|
-
const computedEpochOutHash = accumulateCheckpointOutHashes([
|
|
768
|
-
...previousCheckpointOutHashes,
|
|
769
|
-
checkpointOutHash
|
|
770
|
-
]);
|
|
771
|
-
const proposalEpochOutHash = proposal.checkpointHeader.epochOutHash;
|
|
772
|
-
if (!computedEpochOutHash.equals(proposalEpochOutHash)) {
|
|
773
|
-
this.log.warn(`Epoch out hash mismatch`, {
|
|
774
|
-
proposalEpochOutHash: proposalEpochOutHash.toString(),
|
|
775
|
-
computedEpochOutHash: computedEpochOutHash.toString(),
|
|
776
|
-
checkpointOutHash: checkpointOutHash.toString(),
|
|
777
|
-
previousCheckpointOutHashes: previousCheckpointOutHashes.map((h)=>h.toString()),
|
|
778
|
-
...proposalInfo
|
|
779
|
-
});
|
|
780
|
-
return {
|
|
781
|
-
isValid: false,
|
|
782
|
-
reason: 'out_hash_mismatch'
|
|
783
|
-
};
|
|
784
|
-
}
|
|
785
|
-
// Final round of validations on the checkpoint, just in case.
|
|
786
|
-
try {
|
|
787
|
-
validateCheckpoint(computedCheckpoint, {
|
|
788
|
-
rollupManaLimit: this.checkpointsBuilder.getConfig().rollupManaLimit,
|
|
789
|
-
maxDABlockGas: this.config.validateMaxDABlockGas,
|
|
790
|
-
maxL2BlockGas: this.config.validateMaxL2BlockGas,
|
|
791
|
-
maxTxsPerBlock: this.config.validateMaxTxsPerBlock,
|
|
792
|
-
maxTxsPerCheckpoint: this.config.validateMaxTxsPerCheckpoint
|
|
793
|
-
});
|
|
794
|
-
} catch (err) {
|
|
795
|
-
this.log.warn(`Checkpoint validation failed: ${err}`, proposalInfo);
|
|
796
|
-
return {
|
|
797
|
-
isValid: false,
|
|
798
|
-
reason: 'checkpoint_validation_failed'
|
|
799
|
-
};
|
|
800
|
-
}
|
|
801
|
-
this.log.verbose(`Checkpoint proposal validation successful for slot ${slot}`, proposalInfo);
|
|
802
|
-
return {
|
|
803
|
-
isValid: true
|
|
804
|
-
};
|
|
805
|
-
} finally{
|
|
806
|
-
await fork.close();
|
|
807
|
-
}
|
|
808
|
-
}
|
|
809
|
-
/** Extracts checkpoint global variables from a block. */ extractCheckpointConstants(block) {
|
|
810
|
-
const gv = block.header.globalVariables;
|
|
811
|
-
return {
|
|
812
|
-
chainId: gv.chainId,
|
|
813
|
-
version: gv.version,
|
|
814
|
-
slotNumber: gv.slotNumber,
|
|
815
|
-
timestamp: gv.timestamp,
|
|
816
|
-
coinbase: gv.coinbase,
|
|
817
|
-
feeRecipient: gv.feeRecipient,
|
|
818
|
-
gasFees: gv.gasFees
|
|
819
|
-
};
|
|
820
|
-
}
|
|
821
|
-
/** Triggers blob upload for a checkpoint if the blob client can upload (fire and forget). */ tryUploadBlobsForCheckpoint(proposal, proposalInfo) {
|
|
822
|
-
if (this.blobClient.canUpload()) {
|
|
823
|
-
void this.uploadBlobsForCheckpoint(proposal, proposalInfo);
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
/** Uploads blobs for a checkpoint to the filestore. */ async uploadBlobsForCheckpoint(proposal, proposalInfo) {
|
|
827
|
-
try {
|
|
828
|
-
const lastBlockHeader = await this.blockSource.getBlockHeaderByArchive(proposal.archive);
|
|
829
|
-
if (!lastBlockHeader) {
|
|
830
|
-
this.log.warn(`Failed to get last block header for blob upload`, proposalInfo);
|
|
831
|
-
return;
|
|
832
|
-
}
|
|
833
|
-
const blocks = await this.blockSource.getBlocksForSlot(proposal.slotNumber);
|
|
834
|
-
if (blocks.length === 0) {
|
|
835
|
-
this.log.warn(`No blocks found for blob upload`, proposalInfo);
|
|
836
|
-
return;
|
|
837
|
-
}
|
|
838
|
-
const blockBlobData = blocks.map((b)=>b.toBlockBlobData());
|
|
839
|
-
const blobFields = encodeCheckpointBlobDataFromBlocks(blockBlobData);
|
|
840
|
-
const blobs = await getBlobsPerL1Block(blobFields);
|
|
841
|
-
await this.blobClient.sendBlobsToFilestore(blobs);
|
|
842
|
-
this.log.debug(`Uploaded ${blobs.length} blobs to filestore for checkpoint at slot ${proposal.slotNumber}`, {
|
|
843
|
-
...proposalInfo,
|
|
844
|
-
numBlobs: blobs.length
|
|
845
|
-
});
|
|
846
|
-
} catch (err) {
|
|
847
|
-
this.log.warn(`Failed to upload blobs for checkpoint: ${err}`, proposalInfo);
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
610
|
}
|
|
@@ -3,12 +3,12 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
3
3
|
import { type LoggerBindings } from '@aztec/foundation/log';
|
|
4
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
5
5
|
import { LightweightCheckpointBuilder } from '@aztec/prover-client/light';
|
|
6
|
-
import { PublicProcessor } from '@aztec/simulator/server';
|
|
6
|
+
import { PublicContractsDB, PublicProcessor } from '@aztec/simulator/server';
|
|
7
7
|
import { L2Block } from '@aztec/stdlib/block';
|
|
8
8
|
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
9
9
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
10
10
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
-
import { type BuildBlockInCheckpointResult, type FullNodeBlockBuilderConfig, type ICheckpointBlockBuilder, type ICheckpointsBuilder, type MerkleTreeWriteOperations, type PublicProcessorLimits, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
11
|
+
import { type BlockBuilderOptions, type BuildBlockInCheckpointResult, type FullNodeBlockBuilderConfig, type ICheckpointBlockBuilder, type ICheckpointsBuilder, type MerkleTreeWriteOperations, type PublicProcessorLimits, type WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
12
12
|
import { type DebugLogStore } from '@aztec/stdlib/logs';
|
|
13
13
|
import { type CheckpointGlobalVariables, GlobalVariables, StateReference, Tx } from '@aztec/stdlib/tx';
|
|
14
14
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -26,15 +26,16 @@ export declare class CheckpointBuilder implements ICheckpointBlockBuilder {
|
|
|
26
26
|
private telemetryClient;
|
|
27
27
|
private debugLogStore;
|
|
28
28
|
private log;
|
|
29
|
+
/** Persistent contracts DB shared across all blocks in this checkpoint. */
|
|
30
|
+
protected contractsDB: PublicContractsDB;
|
|
29
31
|
constructor(checkpointBuilder: LightweightCheckpointBuilder, fork: MerkleTreeWriteOperations, config: FullNodeBlockBuilderConfig, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient: TelemetryClient, bindings?: LoggerBindings, debugLogStore?: DebugLogStore);
|
|
30
32
|
getConstantData(): CheckpointGlobalVariables;
|
|
31
33
|
/**
|
|
32
34
|
* Builds a single block within this checkpoint.
|
|
33
35
|
* Automatically caps gas and blob field limits based on checkpoint-level budgets and prior blocks.
|
|
34
36
|
*/
|
|
35
|
-
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts
|
|
37
|
+
buildBlock(pendingTxs: Iterable<Tx> | AsyncIterable<Tx>, blockNumber: BlockNumber, timestamp: bigint, opts: BlockBuilderOptions & {
|
|
36
38
|
expectedEndState?: StateReference;
|
|
37
|
-
minValidTxs?: number;
|
|
38
39
|
}): Promise<BuildBlockInCheckpointResult>;
|
|
39
40
|
/** Completes the checkpoint and returns it. */
|
|
40
41
|
completeCheckpoint(): Promise<Checkpoint>;
|
|
@@ -42,10 +43,11 @@ export declare class CheckpointBuilder implements ICheckpointBlockBuilder {
|
|
|
42
43
|
getCheckpoint(): Promise<Checkpoint>;
|
|
43
44
|
/**
|
|
44
45
|
* Caps per-block gas and blob field limits by remaining checkpoint-level budgets.
|
|
45
|
-
*
|
|
46
|
-
*
|
|
46
|
+
* When building a proposal (isBuildingProposal=true), computes a fair share of remaining budget
|
|
47
|
+
* across remaining blocks scaled by the multiplier. When validating, only caps by per-block limit
|
|
48
|
+
* and remaining checkpoint budget (no redistribution or multiplier).
|
|
47
49
|
*/
|
|
48
|
-
protected capLimitsByCheckpointBudgets(opts:
|
|
50
|
+
protected capLimitsByCheckpointBudgets(opts: BlockBuilderOptions): Pick<PublicProcessorLimits, 'maxBlockGas' | 'maxBlobFields' | 'maxTransactions'>;
|
|
49
51
|
protected makeBlockBuilderDeps(globalVariables: GlobalVariables, fork: MerkleTreeWriteOperations): Promise<{
|
|
50
52
|
processor: PublicProcessor;
|
|
51
53
|
validator: import("@aztec/stdlib/interfaces/server").PublicProcessorValidator;
|
|
@@ -74,4 +76,4 @@ export declare class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
|
74
76
|
/** Returns a fork of the world state at the given block number. */
|
|
75
77
|
getFork(blockNumber: BlockNumber): Promise<MerkleTreeWriteOperations>;
|
|
76
78
|
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9idWlsZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2hlY2twb2ludF9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFBRSxZQUFZLEVBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLGVBQWUsRUFFaEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRSxPQUFPLEVBQ0wsS0FBSyxtQkFBbUIsRUFDeEIsS0FBSyw0QkFBNEIsRUFDakMsS0FBSywwQkFBMEIsRUFFL0IsS0FBSyx1QkFBdUIsRUFDNUIsS0FBSyxtQkFBbUIsRUFFeEIsS0FBSyx5QkFBeUIsRUFDOUIsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyxzQkFBc0IsRUFDNUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxhQUFhLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFFM0UsT0FBTyxFQUFFLEtBQUsseUJBQXlCLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxr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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_builder.d.ts","sourceRoot":"","sources":["../src/checkpoint_builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAW,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"checkpoint_builder.d.ts","sourceRoot":"","sources":["../src/checkpoint_builder.ts"],"names":[],"mappings":"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"}
|