@aztec/validator-client 0.0.1-commit.3100065 → 0.0.1-commit.321f6a9
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/checkpoint_builder.d.ts +17 -7
- package/dest/checkpoint_builder.d.ts.map +1 -1
- package/dest/checkpoint_builder.js +22 -7
- package/dest/proposal_handler.d.ts +2 -2
- package/dest/proposal_handler.d.ts.map +1 -1
- package/dest/proposal_handler.js +48 -2
- package/package.json +19 -19
- package/src/checkpoint_builder.ts +24 -8
- package/src/proposal_handler.ts +47 -3
|
@@ -3,8 +3,8 @@ 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 { PublicContractsDB, PublicProcessor } from '@aztec/simulator/server';
|
|
7
|
-
import { L2Block } from '@aztec/stdlib/block';
|
|
6
|
+
import { type AvmSimulator, PublicContractsDB, PublicProcessor } from '@aztec/simulator/server';
|
|
7
|
+
import { type BlockHash, 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';
|
|
@@ -24,11 +24,12 @@ export declare class CheckpointBuilder implements ICheckpointBlockBuilder {
|
|
|
24
24
|
private contractDataSource;
|
|
25
25
|
private dateProvider;
|
|
26
26
|
private telemetryClient;
|
|
27
|
+
private avmSimulator;
|
|
27
28
|
private debugLogStore;
|
|
28
29
|
private log;
|
|
29
30
|
/** Persistent contracts DB shared across all blocks in this checkpoint. */
|
|
30
31
|
protected contractsDB: PublicContractsDB;
|
|
31
|
-
constructor(checkpointBuilder: LightweightCheckpointBuilder, fork: MerkleTreeWriteOperations, config: FullNodeBlockBuilderConfig, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient: TelemetryClient, bindings?: LoggerBindings, debugLogStore?: DebugLogStore);
|
|
32
|
+
constructor(checkpointBuilder: LightweightCheckpointBuilder, fork: MerkleTreeWriteOperations, config: FullNodeBlockBuilderConfig, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient: TelemetryClient, avmSimulator: AvmSimulator, bindings?: LoggerBindings, debugLogStore?: DebugLogStore);
|
|
32
33
|
getConstantData(): CheckpointGlobalVariables;
|
|
33
34
|
/**
|
|
34
35
|
* Builds a single block within this checkpoint.
|
|
@@ -59,10 +60,11 @@ export declare class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
|
59
60
|
private worldState;
|
|
60
61
|
private contractDataSource;
|
|
61
62
|
private dateProvider;
|
|
63
|
+
private avmSimulator;
|
|
62
64
|
private telemetryClient;
|
|
63
65
|
private debugLogStore;
|
|
64
66
|
private log;
|
|
65
|
-
constructor(config: FullNodeBlockBuilderConfig & Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>, worldState: WorldStateSynchronizer, contractDataSource: ContractDataSource, dateProvider: DateProvider, telemetryClient?: TelemetryClient, debugLogStore?: DebugLogStore);
|
|
67
|
+
constructor(config: FullNodeBlockBuilderConfig & Pick<L1RollupConstants, 'l1GenesisTime' | 'slotDuration'>, worldState: WorldStateSynchronizer, contractDataSource: ContractDataSource, dateProvider: DateProvider, avmSimulator: AvmSimulator, telemetryClient?: TelemetryClient, debugLogStore?: DebugLogStore);
|
|
66
68
|
getConfig(): FullNodeBlockBuilderConfig;
|
|
67
69
|
updateConfig(config: Partial<FullNodeBlockBuilderConfig>): void;
|
|
68
70
|
/**
|
|
@@ -73,7 +75,15 @@ export declare class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
|
73
75
|
* Opens a checkpoint, either starting fresh or resuming from existing blocks.
|
|
74
76
|
*/
|
|
75
77
|
openCheckpoint(checkpointNumber: CheckpointNumber, constants: CheckpointGlobalVariables, feeAssetPriceModifier: bigint, l1ToL2Messages: Fr[], previousCheckpointOutHashes: Fr[], fork: MerkleTreeWriteOperations, existingBlocks?: L2Block[], bindings?: LoggerBindings): Promise<CheckpointBuilder>;
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Syncs world state to the given block number and returns a fork of it at that block.
|
|
80
|
+
*
|
|
81
|
+
* Syncing first is required: the block source (archiver) can already hold a block while world state
|
|
82
|
+
* still trails it, and forking a not-yet-applied block throws a raw "initialize from future block"
|
|
83
|
+
* tree error. syncImmediate blocks until world state reaches the block, or throws a typed error if it
|
|
84
|
+
* genuinely cannot. When `blockHash` is provided it is verified against the synced block, triggering a
|
|
85
|
+
* resync on mismatch (reorg detection).
|
|
86
|
+
*/
|
|
87
|
+
getFork(blockNumber: BlockNumber, blockHash?: BlockHash): Promise<MerkleTreeWriteOperations>;
|
|
78
88
|
}
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9idWlsZGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2hlY2twb2ludF9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE9BQU8sRUFBRSxZQUFZLEVBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBQ0wsS0FBSyxZQUFZLEVBRWpCLGlCQUFpQixFQUNqQixlQUFlLEVBRWhCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsT0FBTyxFQUNMLEtBQUssbUJBQW1CLEVBQ3hCLEtBQUssNEJBQTRCLEVBQ2pDLEtBQUssMEJBQTBCLEVBRS9CLEtBQUssdUJBQXVCLEVBQzVCLEtBQUssbUJBQW1CLEVBRXhCLEtBQUsseUJBQXlCLEVBQzlCLEtBQUsscUJBQXFCLEVBQzFCLEtBQUssc0JBQXNCLEVBQzVCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLEtBQUssYUFBYSxFQUFxQixNQUFNLG9CQUFvQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxLQUFLLHlCQUF5QixFQUFFLGVBQWUs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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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"}
|
|
@@ -24,16 +24,18 @@ import { ForkCheckpoint } from '@aztec/world-state';
|
|
|
24
24
|
contractDataSource;
|
|
25
25
|
dateProvider;
|
|
26
26
|
telemetryClient;
|
|
27
|
+
avmSimulator;
|
|
27
28
|
debugLogStore;
|
|
28
29
|
log;
|
|
29
30
|
/** Persistent contracts DB shared across all blocks in this checkpoint. */ contractsDB;
|
|
30
|
-
constructor(checkpointBuilder, fork, config, contractDataSource, dateProvider, telemetryClient, bindings, debugLogStore = new NullDebugLogStore()){
|
|
31
|
+
constructor(checkpointBuilder, fork, config, contractDataSource, dateProvider, telemetryClient, avmSimulator, bindings, debugLogStore = new NullDebugLogStore()){
|
|
31
32
|
this.checkpointBuilder = checkpointBuilder;
|
|
32
33
|
this.fork = fork;
|
|
33
34
|
this.config = config;
|
|
34
35
|
this.contractDataSource = contractDataSource;
|
|
35
36
|
this.dateProvider = dateProvider;
|
|
36
37
|
this.telemetryClient = telemetryClient;
|
|
38
|
+
this.avmSimulator = avmSimulator;
|
|
37
39
|
this.debugLogStore = debugLogStore;
|
|
38
40
|
this.log = createLogger('checkpoint-builder', {
|
|
39
41
|
...bindings,
|
|
@@ -177,9 +179,11 @@ import { ForkCheckpoint } from '@aztec/world-state';
|
|
|
177
179
|
];
|
|
178
180
|
const contractsDB = this.contractsDB;
|
|
179
181
|
const guardedFork = new GuardedMerkleTreeOperations(fork);
|
|
180
|
-
const collectDebugLogs = this.debugLogStore.isEnabled;
|
|
181
182
|
const bindings = this.log.getBindings();
|
|
182
|
-
|
|
183
|
+
// Extract the WSDB fork ID so the C++ AVM can modify the same fork in-place; the simulator reads
|
|
184
|
+
// contract data from `contractsDB`, scoped to this fork for the duration of each simulation.
|
|
185
|
+
const wsdbForkId = fork.getRevision().forkId;
|
|
186
|
+
const publicTxSimulator = createPublicTxSimulatorForBlockBuilding(this.avmSimulator, globalVariables, contractsDB, wsdbForkId, this.telemetryClient, bindings, this.debugLogStore?.isEnabled ?? false);
|
|
183
187
|
const processor = new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient, createLogger('simulator:public-processor', bindings), this.config, this.debugLogStore);
|
|
184
188
|
const validator = createTxValidatorForBlockBuilding(fork, this.contractDataSource, globalVariables, txPublicSetupAllowList, this.log.getBindings());
|
|
185
189
|
return {
|
|
@@ -193,14 +197,16 @@ import { ForkCheckpoint } from '@aztec/world-state';
|
|
|
193
197
|
worldState;
|
|
194
198
|
contractDataSource;
|
|
195
199
|
dateProvider;
|
|
200
|
+
avmSimulator;
|
|
196
201
|
telemetryClient;
|
|
197
202
|
debugLogStore;
|
|
198
203
|
log;
|
|
199
|
-
constructor(config, worldState, contractDataSource, dateProvider, telemetryClient = getTelemetryClient(), debugLogStore = new NullDebugLogStore()){
|
|
204
|
+
constructor(config, worldState, contractDataSource, dateProvider, avmSimulator, telemetryClient = getTelemetryClient(), debugLogStore = new NullDebugLogStore()){
|
|
200
205
|
this.config = config;
|
|
201
206
|
this.worldState = worldState;
|
|
202
207
|
this.contractDataSource = contractDataSource;
|
|
203
208
|
this.dateProvider = dateProvider;
|
|
209
|
+
this.avmSimulator = avmSimulator;
|
|
204
210
|
this.telemetryClient = telemetryClient;
|
|
205
211
|
this.debugLogStore = debugLogStore;
|
|
206
212
|
this.log = createLogger('checkpoint-builder');
|
|
@@ -225,7 +231,7 @@ import { ForkCheckpoint } from '@aztec/world-state';
|
|
|
225
231
|
feeAssetPriceModifier
|
|
226
232
|
});
|
|
227
233
|
const lightweightBuilder = await LightweightCheckpointBuilder.startNewCheckpoint(checkpointNumber, constants, l1ToL2Messages, previousCheckpointOutHashes, fork, bindings, feeAssetPriceModifier);
|
|
228
|
-
return new CheckpointBuilder(lightweightBuilder, fork, this.config, this.contractDataSource, this.dateProvider, this.telemetryClient, bindings, this.debugLogStore);
|
|
234
|
+
return new CheckpointBuilder(lightweightBuilder, fork, this.config, this.contractDataSource, this.dateProvider, this.telemetryClient, this.avmSimulator, bindings, this.debugLogStore);
|
|
229
235
|
}
|
|
230
236
|
/**
|
|
231
237
|
* Opens a checkpoint, either starting fresh or resuming from existing blocks.
|
|
@@ -245,9 +251,18 @@ import { ForkCheckpoint } from '@aztec/world-state';
|
|
|
245
251
|
feeAssetPriceModifier
|
|
246
252
|
});
|
|
247
253
|
const lightweightBuilder = await LightweightCheckpointBuilder.resumeCheckpoint(checkpointNumber, constants, feeAssetPriceModifier, l1ToL2Messages, previousCheckpointOutHashes, fork, existingBlocks, bindings);
|
|
248
|
-
return new CheckpointBuilder(lightweightBuilder, fork, this.config, this.contractDataSource, this.dateProvider, this.telemetryClient, bindings, this.debugLogStore);
|
|
254
|
+
return new CheckpointBuilder(lightweightBuilder, fork, this.config, this.contractDataSource, this.dateProvider, this.telemetryClient, this.avmSimulator, bindings, this.debugLogStore);
|
|
249
255
|
}
|
|
250
|
-
/**
|
|
256
|
+
/**
|
|
257
|
+
* Syncs world state to the given block number and returns a fork of it at that block.
|
|
258
|
+
*
|
|
259
|
+
* Syncing first is required: the block source (archiver) can already hold a block while world state
|
|
260
|
+
* still trails it, and forking a not-yet-applied block throws a raw "initialize from future block"
|
|
261
|
+
* tree error. syncImmediate blocks until world state reaches the block, or throws a typed error if it
|
|
262
|
+
* genuinely cannot. When `blockHash` is provided it is verified against the synced block, triggering a
|
|
263
|
+
* resync on mismatch (reorg detection).
|
|
264
|
+
*/ async getFork(blockNumber, blockHash) {
|
|
265
|
+
await this.worldState.syncImmediate(blockNumber, blockHash);
|
|
251
266
|
return this.worldState.fork(blockNumber);
|
|
252
267
|
}
|
|
253
268
|
}
|
|
@@ -36,7 +36,7 @@ export type BlockProposalValidationFailureResult = {
|
|
|
36
36
|
reexecutionResult?: ReexecuteTransactionsResult;
|
|
37
37
|
};
|
|
38
38
|
export type BlockProposalValidationResult = BlockProposalValidationSuccessResult | BlockProposalValidationFailureResult;
|
|
39
|
-
export type CheckpointProposalValidationFailureReason = 'invalid_signature' | 'invalid_fee_asset_price_modifier' | 'last_block_not_found' | 'block_fetch_error' | 'checkpoint_already_published' | 'no_blocks_for_slot' | 'last_block_archive_mismatch' | 'too_many_blocks_in_checkpoint' | 'checkpoint_header_mismatch' | 'archive_mismatch' | 'out_hash_mismatch' | 'checkpoint_validation_failed';
|
|
39
|
+
export type CheckpointProposalValidationFailureReason = 'invalid_signature' | 'invalid_fee_asset_price_modifier' | 'last_block_not_found' | 'block_fetch_error' | 'world_state_not_synced' | 'checkpoint_already_published' | 'no_blocks_for_slot' | 'last_block_archive_mismatch' | 'too_many_blocks_in_checkpoint' | 'initial_archive_mismatch' | 'checkpoint_header_mismatch' | 'archive_mismatch' | 'out_hash_mismatch' | 'checkpoint_validation_failed';
|
|
40
40
|
export type CheckpointProposalValidationSuccessResult = {
|
|
41
41
|
isValid: true;
|
|
42
42
|
checkpointNumber: CheckpointNumber;
|
|
@@ -162,4 +162,4 @@ export declare class ProposalHandler {
|
|
|
162
162
|
private setProposedCheckpoint;
|
|
163
163
|
}
|
|
164
164
|
export {};
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUVoQixVQUFVLEVBQ1gsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHcEQsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckQsT0FBTyxFQUFFLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQWEsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEtBQUssRUFBRSw0QkFBNEIsRUFBc0IsTUFBTSwwQkFBMEIsQ0FBQztBQUlqRyxPQUFPLEtBQUssRUFDVixXQUFXLEVBRVgseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLG1CQUFtQixFQUd6QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBeUIsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RyxPQUFPLEtBQUssRUFBRSxrQkFB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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,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EACL,WAAW,EACX,gBAAgB,EAEhB,UAAU,EACX,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAS,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAa,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,KAAK,EAAE,4BAA4B,EAAsB,MAAM,0BAA0B,CAAC;AAIjG,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
|
@@ -91,6 +91,8 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
91
91
|
checkpoint_already_published: undefined,
|
|
92
92
|
last_block_not_found: 'unvalidated',
|
|
93
93
|
block_fetch_error: 'unvalidated',
|
|
94
|
+
world_state_not_synced: 'unvalidated',
|
|
95
|
+
initial_archive_mismatch: 'unvalidated',
|
|
94
96
|
no_blocks_for_slot: 'unvalidated',
|
|
95
97
|
last_block_archive_mismatch: 'invalid',
|
|
96
98
|
too_many_blocks_in_checkpoint: 'invalid',
|
|
@@ -124,6 +126,9 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
124
126
|
['invalid_signature']: false,
|
|
125
127
|
['last_block_not_found']: false,
|
|
126
128
|
['block_fetch_error']: false,
|
|
129
|
+
['world_state_not_synced']: false,
|
|
130
|
+
// A reorg / divergent local chain, not a proposer offense (mirrors the block path's initial_state_mismatch).
|
|
131
|
+
['initial_archive_mismatch']: false,
|
|
127
132
|
['checkpoint_already_published']: false
|
|
128
133
|
};
|
|
129
134
|
/**
|
|
@@ -1049,9 +1054,50 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
1049
1054
|
pipeliningEnabled: true,
|
|
1050
1055
|
log: this.log
|
|
1051
1056
|
});
|
|
1052
|
-
// Fork world state at the block before the first block
|
|
1057
|
+
// Fork world state at the block before the first block. getFork syncs world state to the parent block
|
|
1058
|
+
// first (see its doc): the block source (archiver) can already hold the block while world state still
|
|
1059
|
+
// trails it by one, and forking a not-yet-applied block throws a raw tree error that would otherwise
|
|
1060
|
+
// escape as an uncaught gossipsub error. We pass the parent's expected block hash so the sync detects a
|
|
1061
|
+
// world-state reorg (undefined for the genesis parent, where no block exists to pin). On failure we map
|
|
1062
|
+
// to a clean validation result rather than letting it escape.
|
|
1053
1063
|
const parentBlockNumber = BlockNumber(firstBlock.number - 1);
|
|
1054
|
-
|
|
1064
|
+
let forkResult;
|
|
1065
|
+
try {
|
|
1066
|
+
const parentBlockHash = (await this.blockSource.getBlockData({
|
|
1067
|
+
number: parentBlockNumber
|
|
1068
|
+
}))?.blockHash;
|
|
1069
|
+
forkResult = await this.checkpointsBuilder.getFork(parentBlockNumber, parentBlockHash);
|
|
1070
|
+
} catch (err) {
|
|
1071
|
+
this.log.warn(`Failed to fork world state at block ${parentBlockNumber} for checkpoint proposal`, {
|
|
1072
|
+
...proposalInfo,
|
|
1073
|
+
parentBlockNumber,
|
|
1074
|
+
err
|
|
1075
|
+
});
|
|
1076
|
+
return {
|
|
1077
|
+
isValid: false,
|
|
1078
|
+
reason: 'world_state_not_synced',
|
|
1079
|
+
checkpointNumber
|
|
1080
|
+
};
|
|
1081
|
+
}
|
|
1082
|
+
const fork = _ts_add_disposable_resource(env, forkResult, true);
|
|
1083
|
+
// Verify the fork's archive root matches the checkpoint's expected starting archive (the archive after
|
|
1084
|
+
// the parent block). A mismatch means world state forked from a different chain than the proposal was
|
|
1085
|
+
// built on (e.g. a reorg), so recomputing the checkpoint against it would be meaningless. This mirrors
|
|
1086
|
+
// the block-proposal re-execution check and fails fast with a clean, non-slashable result instead of a
|
|
1087
|
+
// confusing downstream mismatch.
|
|
1088
|
+
const forkArchiveRoot = new Fr((await fork.getTreeInfo(MerkleTreeId.ARCHIVE)).root);
|
|
1089
|
+
if (!forkArchiveRoot.equals(proposal.checkpointHeader.lastArchiveRoot)) {
|
|
1090
|
+
this.log.warn(`Fork archive root does not match checkpoint proposal's last archive`, {
|
|
1091
|
+
...proposalInfo,
|
|
1092
|
+
forkArchiveRoot: forkArchiveRoot.toString(),
|
|
1093
|
+
expectedLastArchiveRoot: proposal.checkpointHeader.lastArchiveRoot.toString()
|
|
1094
|
+
});
|
|
1095
|
+
return {
|
|
1096
|
+
isValid: false,
|
|
1097
|
+
reason: 'initial_archive_mismatch',
|
|
1098
|
+
checkpointNumber
|
|
1099
|
+
};
|
|
1100
|
+
}
|
|
1055
1101
|
// Create checkpoint builder with all existing blocks
|
|
1056
1102
|
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, proposal.feeAssetPriceModifier, l1ToL2Messages, previousCheckpointOutHashes, fork, blocks, this.log.getBindings());
|
|
1057
1103
|
// Complete the checkpoint to get computed values
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/validator-client",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.321f6a9",
|
|
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": "0.0.1-commit.
|
|
68
|
-
"@aztec/blob-lib": "0.0.1-commit.
|
|
69
|
-
"@aztec/constants": "0.0.1-commit.
|
|
70
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
71
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
72
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
73
|
-
"@aztec/node-keystore": "0.0.1-commit.
|
|
74
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
75
|
-
"@aztec/p2p": "0.0.1-commit.
|
|
76
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
77
|
-
"@aztec/prover-client": "0.0.1-commit.
|
|
78
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
79
|
-
"@aztec/slasher": "0.0.1-commit.
|
|
80
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
81
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
82
|
-
"@aztec/validator-ha-signer": "0.0.1-commit.
|
|
67
|
+
"@aztec/blob-client": "0.0.1-commit.321f6a9",
|
|
68
|
+
"@aztec/blob-lib": "0.0.1-commit.321f6a9",
|
|
69
|
+
"@aztec/constants": "0.0.1-commit.321f6a9",
|
|
70
|
+
"@aztec/epoch-cache": "0.0.1-commit.321f6a9",
|
|
71
|
+
"@aztec/ethereum": "0.0.1-commit.321f6a9",
|
|
72
|
+
"@aztec/foundation": "0.0.1-commit.321f6a9",
|
|
73
|
+
"@aztec/node-keystore": "0.0.1-commit.321f6a9",
|
|
74
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.321f6a9",
|
|
75
|
+
"@aztec/p2p": "0.0.1-commit.321f6a9",
|
|
76
|
+
"@aztec/protocol-contracts": "0.0.1-commit.321f6a9",
|
|
77
|
+
"@aztec/prover-client": "0.0.1-commit.321f6a9",
|
|
78
|
+
"@aztec/simulator": "0.0.1-commit.321f6a9",
|
|
79
|
+
"@aztec/slasher": "0.0.1-commit.321f6a9",
|
|
80
|
+
"@aztec/stdlib": "0.0.1-commit.321f6a9",
|
|
81
|
+
"@aztec/telemetry-client": "0.0.1-commit.321f6a9",
|
|
82
|
+
"@aztec/validator-ha-signer": "0.0.1-commit.321f6a9",
|
|
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": "0.0.1-commit.
|
|
90
|
-
"@aztec/world-state": "0.0.1-commit.
|
|
89
|
+
"@aztec/archiver": "0.0.1-commit.321f6a9",
|
|
90
|
+
"@aztec/world-state": "0.0.1-commit.321f6a9",
|
|
91
91
|
"@electric-sql/pglite": "^0.3.14",
|
|
92
92
|
"@jest/globals": "^30.0.0",
|
|
93
93
|
"@types/jest": "^30.0.0",
|
|
@@ -9,12 +9,13 @@ import { DateProvider, elapsed } from '@aztec/foundation/timer';
|
|
|
9
9
|
import { createTxValidatorForBlockBuilding, getDefaultAllowedSetupFunctions } from '@aztec/p2p/msg_validators';
|
|
10
10
|
import { LightweightCheckpointBuilder } from '@aztec/prover-client/light';
|
|
11
11
|
import {
|
|
12
|
+
type AvmSimulator,
|
|
12
13
|
GuardedMerkleTreeOperations,
|
|
13
14
|
PublicContractsDB,
|
|
14
15
|
PublicProcessor,
|
|
15
16
|
createPublicTxSimulatorForBlockBuilding,
|
|
16
17
|
} from '@aztec/simulator/server';
|
|
17
|
-
import { L2Block } from '@aztec/stdlib/block';
|
|
18
|
+
import { type BlockHash, L2Block } from '@aztec/stdlib/block';
|
|
18
19
|
import { Checkpoint } from '@aztec/stdlib/checkpoint';
|
|
19
20
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
20
21
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
@@ -57,6 +58,7 @@ export class CheckpointBuilder implements ICheckpointBlockBuilder {
|
|
|
57
58
|
private contractDataSource: ContractDataSource,
|
|
58
59
|
private dateProvider: DateProvider,
|
|
59
60
|
private telemetryClient: TelemetryClient,
|
|
61
|
+
private avmSimulator: AvmSimulator,
|
|
60
62
|
bindings?: LoggerBindings,
|
|
61
63
|
private debugLogStore: DebugLogStore = new NullDebugLogStore(),
|
|
62
64
|
) {
|
|
@@ -243,16 +245,18 @@ export class CheckpointBuilder implements ICheckpointBlockBuilder {
|
|
|
243
245
|
const contractsDB = this.contractsDB;
|
|
244
246
|
const guardedFork = new GuardedMerkleTreeOperations(fork);
|
|
245
247
|
|
|
246
|
-
const collectDebugLogs = this.debugLogStore.isEnabled;
|
|
247
|
-
|
|
248
248
|
const bindings = this.log.getBindings();
|
|
249
|
+
// Extract the WSDB fork ID so the C++ AVM can modify the same fork in-place; the simulator reads
|
|
250
|
+
// contract data from `contractsDB`, scoped to this fork for the duration of each simulation.
|
|
251
|
+
const wsdbForkId = fork.getRevision().forkId;
|
|
249
252
|
const publicTxSimulator = createPublicTxSimulatorForBlockBuilding(
|
|
250
|
-
|
|
251
|
-
contractsDB,
|
|
253
|
+
this.avmSimulator,
|
|
252
254
|
globalVariables,
|
|
255
|
+
contractsDB,
|
|
256
|
+
wsdbForkId,
|
|
253
257
|
this.telemetryClient,
|
|
254
258
|
bindings,
|
|
255
|
-
|
|
259
|
+
this.debugLogStore?.isEnabled ?? false,
|
|
256
260
|
);
|
|
257
261
|
|
|
258
262
|
const processor = new PublicProcessor(
|
|
@@ -291,6 +295,7 @@ export class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
|
291
295
|
private worldState: WorldStateSynchronizer,
|
|
292
296
|
private contractDataSource: ContractDataSource,
|
|
293
297
|
private dateProvider: DateProvider,
|
|
298
|
+
private avmSimulator: AvmSimulator,
|
|
294
299
|
private telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
295
300
|
private debugLogStore: DebugLogStore = new NullDebugLogStore(),
|
|
296
301
|
) {
|
|
@@ -346,6 +351,7 @@ export class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
|
346
351
|
this.contractDataSource,
|
|
347
352
|
this.dateProvider,
|
|
348
353
|
this.telemetryClient,
|
|
354
|
+
this.avmSimulator,
|
|
349
355
|
bindings,
|
|
350
356
|
this.debugLogStore,
|
|
351
357
|
);
|
|
@@ -407,13 +413,23 @@ export class FullNodeCheckpointsBuilder implements ICheckpointsBuilder {
|
|
|
407
413
|
this.contractDataSource,
|
|
408
414
|
this.dateProvider,
|
|
409
415
|
this.telemetryClient,
|
|
416
|
+
this.avmSimulator,
|
|
410
417
|
bindings,
|
|
411
418
|
this.debugLogStore,
|
|
412
419
|
);
|
|
413
420
|
}
|
|
414
421
|
|
|
415
|
-
/**
|
|
416
|
-
|
|
422
|
+
/**
|
|
423
|
+
* Syncs world state to the given block number and returns a fork of it at that block.
|
|
424
|
+
*
|
|
425
|
+
* Syncing first is required: the block source (archiver) can already hold a block while world state
|
|
426
|
+
* still trails it, and forking a not-yet-applied block throws a raw "initialize from future block"
|
|
427
|
+
* tree error. syncImmediate blocks until world state reaches the block, or throws a typed error if it
|
|
428
|
+
* genuinely cannot. When `blockHash` is provided it is verified against the synced block, triggering a
|
|
429
|
+
* resync on mismatch (reorg detection).
|
|
430
|
+
*/
|
|
431
|
+
async getFork(blockNumber: BlockNumber, blockHash?: BlockHash): Promise<MerkleTreeWriteOperations> {
|
|
432
|
+
await this.worldState.syncImmediate(blockNumber, blockHash);
|
|
417
433
|
return this.worldState.fork(blockNumber);
|
|
418
434
|
}
|
|
419
435
|
}
|
package/src/proposal_handler.ts
CHANGED
|
@@ -25,7 +25,12 @@ import type { CheckpointReexecutionTracker, ReexecutionOutcome } from '@aztec/st
|
|
|
25
25
|
import { getPreviousCheckpointOutHashes, validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
26
26
|
import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
27
27
|
import { Gas } from '@aztec/stdlib/gas';
|
|
28
|
-
import type {
|
|
28
|
+
import type {
|
|
29
|
+
ITxProvider,
|
|
30
|
+
MerkleTreeWriteOperations,
|
|
31
|
+
ValidatorClientFullConfig,
|
|
32
|
+
WorldStateSynchronizer,
|
|
33
|
+
} from '@aztec/stdlib/interfaces/server';
|
|
29
34
|
import {
|
|
30
35
|
type L1ToL2MessageSource,
|
|
31
36
|
accumulateCheckpointOutHashes,
|
|
@@ -91,10 +96,12 @@ export type CheckpointProposalValidationFailureReason =
|
|
|
91
96
|
| 'invalid_fee_asset_price_modifier'
|
|
92
97
|
| 'last_block_not_found'
|
|
93
98
|
| 'block_fetch_error'
|
|
99
|
+
| 'world_state_not_synced'
|
|
94
100
|
| 'checkpoint_already_published'
|
|
95
101
|
| 'no_blocks_for_slot'
|
|
96
102
|
| 'last_block_archive_mismatch'
|
|
97
103
|
| 'too_many_blocks_in_checkpoint'
|
|
104
|
+
| 'initial_archive_mismatch'
|
|
98
105
|
| 'checkpoint_header_mismatch'
|
|
99
106
|
| 'archive_mismatch'
|
|
100
107
|
| 'out_hash_mismatch'
|
|
@@ -115,6 +122,8 @@ const CHECKPOINT_VALIDATION_REASON_TO_OUTCOME: Record<
|
|
|
115
122
|
checkpoint_already_published: undefined,
|
|
116
123
|
last_block_not_found: 'unvalidated',
|
|
117
124
|
block_fetch_error: 'unvalidated',
|
|
125
|
+
world_state_not_synced: 'unvalidated',
|
|
126
|
+
initial_archive_mismatch: 'unvalidated',
|
|
118
127
|
no_blocks_for_slot: 'unvalidated',
|
|
119
128
|
last_block_archive_mismatch: 'invalid',
|
|
120
129
|
too_many_blocks_in_checkpoint: 'invalid',
|
|
@@ -186,6 +195,9 @@ export const SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT: Record<
|
|
|
186
195
|
['invalid_signature']: false,
|
|
187
196
|
['last_block_not_found']: false,
|
|
188
197
|
['block_fetch_error']: false,
|
|
198
|
+
['world_state_not_synced']: false,
|
|
199
|
+
// A reorg / divergent local chain, not a proposer offense (mirrors the block path's initial_state_mismatch).
|
|
200
|
+
['initial_archive_mismatch']: false,
|
|
189
201
|
['checkpoint_already_published']: false,
|
|
190
202
|
};
|
|
191
203
|
|
|
@@ -1161,9 +1173,41 @@ export class ProposalHandler {
|
|
|
1161
1173
|
log: this.log,
|
|
1162
1174
|
});
|
|
1163
1175
|
|
|
1164
|
-
// Fork world state at the block before the first block
|
|
1176
|
+
// Fork world state at the block before the first block. getFork syncs world state to the parent block
|
|
1177
|
+
// first (see its doc): the block source (archiver) can already hold the block while world state still
|
|
1178
|
+
// trails it by one, and forking a not-yet-applied block throws a raw tree error that would otherwise
|
|
1179
|
+
// escape as an uncaught gossipsub error. We pass the parent's expected block hash so the sync detects a
|
|
1180
|
+
// world-state reorg (undefined for the genesis parent, where no block exists to pin). On failure we map
|
|
1181
|
+
// to a clean validation result rather than letting it escape.
|
|
1165
1182
|
const parentBlockNumber = BlockNumber(firstBlock.number - 1);
|
|
1166
|
-
|
|
1183
|
+
let forkResult: MerkleTreeWriteOperations;
|
|
1184
|
+
try {
|
|
1185
|
+
const parentBlockHash = (await this.blockSource.getBlockData({ number: parentBlockNumber }))?.blockHash;
|
|
1186
|
+
forkResult = await this.checkpointsBuilder.getFork(parentBlockNumber, parentBlockHash);
|
|
1187
|
+
} catch (err) {
|
|
1188
|
+
this.log.warn(`Failed to fork world state at block ${parentBlockNumber} for checkpoint proposal`, {
|
|
1189
|
+
...proposalInfo,
|
|
1190
|
+
parentBlockNumber,
|
|
1191
|
+
err,
|
|
1192
|
+
});
|
|
1193
|
+
return { isValid: false, reason: 'world_state_not_synced', checkpointNumber };
|
|
1194
|
+
}
|
|
1195
|
+
await using fork = forkResult;
|
|
1196
|
+
|
|
1197
|
+
// Verify the fork's archive root matches the checkpoint's expected starting archive (the archive after
|
|
1198
|
+
// the parent block). A mismatch means world state forked from a different chain than the proposal was
|
|
1199
|
+
// built on (e.g. a reorg), so recomputing the checkpoint against it would be meaningless. This mirrors
|
|
1200
|
+
// the block-proposal re-execution check and fails fast with a clean, non-slashable result instead of a
|
|
1201
|
+
// confusing downstream mismatch.
|
|
1202
|
+
const forkArchiveRoot = new Fr((await fork.getTreeInfo(MerkleTreeId.ARCHIVE)).root);
|
|
1203
|
+
if (!forkArchiveRoot.equals(proposal.checkpointHeader.lastArchiveRoot)) {
|
|
1204
|
+
this.log.warn(`Fork archive root does not match checkpoint proposal's last archive`, {
|
|
1205
|
+
...proposalInfo,
|
|
1206
|
+
forkArchiveRoot: forkArchiveRoot.toString(),
|
|
1207
|
+
expectedLastArchiveRoot: proposal.checkpointHeader.lastArchiveRoot.toString(),
|
|
1208
|
+
});
|
|
1209
|
+
return { isValid: false, reason: 'initial_archive_mismatch', checkpointNumber };
|
|
1210
|
+
}
|
|
1167
1211
|
|
|
1168
1212
|
// Create checkpoint builder with all existing blocks
|
|
1169
1213
|
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(
|