@aztec/validator-client 0.0.1-commit.3100065 → 0.0.1-commit.330febf
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/metrics.d.ts +1 -1
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +3 -1
- package/dest/proposal_handler.d.ts +4 -3
- package/dest/proposal_handler.d.ts.map +1 -1
- package/dest/proposal_handler.js +104 -8
- package/dest/validator.d.ts +1 -1
- package/dest/validator.d.ts.map +1 -1
- package/dest/validator.js +3 -1
- package/package.json +19 -19
- package/src/checkpoint_builder.ts +24 -8
- package/src/metrics.ts +2 -0
- package/src/proposal_handler.ts +103 -8
- package/src/validator.ts +2 -0
|
@@ -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
|
}
|
package/dest/metrics.d.ts
CHANGED
|
@@ -28,4 +28,4 @@ export declare class ValidatorMetrics {
|
|
|
28
28
|
/** Increment the count of epochs in which the given attester submitted at least one attestation. */
|
|
29
29
|
incAttestedEpochCount(attester: EthAddress): void;
|
|
30
30
|
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ldHJpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUtMLEtBQUssZUFBZSxFQUdyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYscUJBQWEsZ0JBQWdCO0lBQzNCLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBZ0I7SUFDaEQsT0FBTyxDQUFDLDJCQUEyQixDQUFnQjtJQUNuRCxPQUFPLENBQUMsa0NBQWtDLENBQWdCO0lBQzFELE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBZ0I7SUFDeEQsT0FBTyxDQUFDLFlBQVksQ0FBUTtJQUM1QixPQUFPLENBQUMsa0JBQWtCLENBQWdCO0lBRTFDLE9BQU8sQ0FBQyxRQUFRLENBQVk7SUFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBWTtJQUMxQixPQUFPLENBQUMsWUFBWSxDQUFRO0lBQzVCLE9BQU8sQ0FBQywwQ0FBMEMsQ0FBWTtJQUM5RCxPQUFPLENBQUMsbURBQW1ELENBQVk7SUFFdkUsWUFBWSxlQUFlLEVBQUUsZUFBZSxFQTREM0M7SUFFTSxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBSTlEO0lBRU0sZ0RBQWdELENBQUMsVUFBVSxFQUFFLE1BQU0sUUFFekU7SUFFTSx5REFBeUQsQ0FBQyxRQUFRLEVBQUUsTUFBTSxRQUloRjtJQUVNLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxhQUFhLFFBTXJEO0lBRU0seUJBQXlCLENBQUMsR0FBRyxFQUFFLE1BQU0sUUFFM0M7SUFFTSxnQ0FBZ0MsQ0FDckMsR0FBRyxFQUFFLE1BQU0sRUFDWCxNQUFNLEVBQUUsb0NBQW9DLEVBQzVDLFdBQVcsRUFBRSxPQUFPLFFBTXJCO0lBRU0sOEJBQThCLENBQ25DLEdBQUcsRUFBRSxNQUFNLEVBQ1gsTUFBTSxFQUFFLG9DQUFvQyxFQUM1QyxXQUFXLEVBQUUsT0FBTyxRQU1yQjtJQUVELDJGQUEyRjtJQUNwRixlQUFlLENBQUMsS0FBSyxFQUFFLFdBQVcsUUFFeEM7SUFFRCxvR0FBb0c7SUFDN0YscUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsUUFFaEQ7Q0FDRiJ9
|
package/dest/metrics.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAElF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,wBAAwB,CAAgB;IAChD,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,kCAAkC,CAAgB;IAC1D,OAAO,CAAC,gCAAgC,CAAgB;IACxD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,kBAAkB,CAAgB;IAE1C,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,0CAA0C,CAAY;IAC9D,OAAO,CAAC,mDAAmD,CAAY;IAEvE,YAAY,eAAe,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAKL,KAAK,eAAe,EAGrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,uBAAuB,CAAC;AAElF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,wBAAwB,CAAgB;IAChD,OAAO,CAAC,2BAA2B,CAAgB;IACnD,OAAO,CAAC,kCAAkC,CAAgB;IAC1D,OAAO,CAAC,gCAAgC,CAAgB;IACxD,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,kBAAkB,CAAgB;IAE1C,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,0CAA0C,CAAY;IAC9D,OAAO,CAAC,mDAAmD,CAAY;IAEvE,YAAY,eAAe,EAAE,eAAe,EA4D3C;IAEM,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAI9D;IAEM,gDAAgD,CAAC,UAAU,EAAE,MAAM,QAEzE;IAEM,yDAAyD,CAAC,QAAQ,EAAE,MAAM,QAIhF;IAEM,uBAAuB,CAAC,QAAQ,EAAE,aAAa,QAMrD;IAEM,yBAAyB,CAAC,GAAG,EAAE,MAAM,QAE3C;IAEM,gCAAgC,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,oCAAoC,EAC5C,WAAW,EAAE,OAAO,QAMrB;IAEM,8BAA8B,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,oCAAoC,EAC5C,WAAW,EAAE,OAAO,QAMrB;IAED,2FAA2F;IACpF,eAAe,CAAC,KAAK,EAAE,WAAW,QAExC;IAED,oGAAoG;IAC7F,qBAAqB,CAAC,QAAQ,EAAE,UAAU,QAEhD;CACF"}
|
package/dest/metrics.js
CHANGED
|
@@ -17,7 +17,7 @@ import type { FailedTx, Tx } from '@aztec/stdlib/tx';
|
|
|
17
17
|
import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
|
|
18
18
|
import type { FullNodeCheckpointsBuilder } from './checkpoint_builder.js';
|
|
19
19
|
import type { ValidatorMetrics } from './metrics.js';
|
|
20
|
-
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
|
+
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' | 'duplicate_txs' | 'invalid_embedded_txs' | 'state_mismatch' | 'failed_txs' | 'initial_state_mismatch' | 'timeout' | 'block_proposal_beyond_checkpoint' | 'checkpoint_proposal_equivocation' | 'unknown_error';
|
|
21
21
|
type ReexecuteTransactionsResult = {
|
|
22
22
|
block: L2Block;
|
|
23
23
|
failedTxs: FailedTx[];
|
|
@@ -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;
|
|
@@ -123,6 +123,7 @@ export declare class ProposalHandler {
|
|
|
123
123
|
*/
|
|
124
124
|
register(p2pClient: P2P, shouldReexecute: boolean, archiver?: Pick<Archiver, 'addProposedCheckpoint' | 'getProposedCheckpointData'>, getOwnValidatorAddresses?: () => string[]): ProposalHandler;
|
|
125
125
|
handleBlockProposal(proposal: BlockProposal, proposalSender: PeerId, shouldReexecute: boolean): Promise<BlockProposalValidationResult>;
|
|
126
|
+
private collectProposalTxs;
|
|
126
127
|
private validateNewBlockInSlot;
|
|
127
128
|
private getParentBlock;
|
|
128
129
|
private resolveExistingBlockAtNumber;
|
|
@@ -162,4 +163,4 @@ export declare class ProposalHandler {
|
|
|
162
163
|
private setProposedCheckpoint;
|
|
163
164
|
}
|
|
164
165
|
export {};
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfaGFuZGxlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Byb3Bvc2FsX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGdCQUFnQixFQUVoQixVQUFVLEVBQ1gsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6QyxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFHcEQsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckQsT0FBTyxFQUFFLFlBQVksRUFBUyxNQUFNLHlCQUF5QixDQUFDO0FBRTlELE9BQU8sS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQWEsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEtBQUssRUFBRSw0QkFBNEIsRUFBc0IsTUFBTSwwQkFBMEIsQ0FBQztBQUlqRyxPQUFPLEtBQUssRUFDVixXQUFXLEVBRVgseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN2QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLG1CQUFtQixFQUd6QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBeUIsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RyxPQUFPLEtBQUssRUFBRSxrQkFB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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;
|
|
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
|
@@ -74,12 +74,13 @@ import { FifoSet } from '@aztec/foundation/fifo-set';
|
|
|
74
74
|
import { createLogger } from '@aztec/foundation/log';
|
|
75
75
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
76
76
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
77
|
+
import { isErrorClass } from '@aztec/foundation/types';
|
|
77
78
|
import { getPreviousCheckpointOutHashes, validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
78
79
|
import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
79
80
|
import { Gas } from '@aztec/stdlib/gas';
|
|
80
81
|
import { accumulateCheckpointOutHashes, computeInHashFromL1ToL2Messages } from '@aztec/stdlib/messaging';
|
|
81
82
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
82
|
-
import { ReExFailedTxsError, ReExInitialStateMismatchError, ReExStateMismatchError, ReExTimeoutError, TransactionsNotAvailableError } from '@aztec/stdlib/validators';
|
|
83
|
+
import { InvalidBlockProposalTxsError, ReExFailedTxsError, ReExInitialStateMismatchError, ReExStateMismatchError, ReExTimeoutError, TransactionsNotAvailableError } from '@aztec/stdlib/validators';
|
|
83
84
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
84
85
|
/**
|
|
85
86
|
* Mapping from a checkpoint-proposal validation failure reason to the tracker outcome that
|
|
@@ -91,6 +92,8 @@ import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
|
91
92
|
checkpoint_already_published: undefined,
|
|
92
93
|
last_block_not_found: 'unvalidated',
|
|
93
94
|
block_fetch_error: 'unvalidated',
|
|
95
|
+
world_state_not_synced: 'unvalidated',
|
|
96
|
+
initial_archive_mismatch: 'unvalidated',
|
|
94
97
|
no_blocks_for_slot: 'unvalidated',
|
|
95
98
|
last_block_archive_mismatch: 'invalid',
|
|
96
99
|
too_many_blocks_in_checkpoint: 'invalid',
|
|
@@ -106,7 +109,9 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
106
109
|
'global_variables_mismatch',
|
|
107
110
|
'invalid_proposal',
|
|
108
111
|
'parent_block_wrong_slot',
|
|
109
|
-
'in_hash_mismatch'
|
|
112
|
+
'in_hash_mismatch',
|
|
113
|
+
'duplicate_txs',
|
|
114
|
+
'invalid_embedded_txs'
|
|
110
115
|
];
|
|
111
116
|
/** Checkpoint-proposal validation failures that constitute a slashable invalid-checkpoint offense. */ export const SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT = {
|
|
112
117
|
// enabled
|
|
@@ -124,6 +129,9 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
124
129
|
['invalid_signature']: false,
|
|
125
130
|
['last_block_not_found']: false,
|
|
126
131
|
['block_fetch_error']: false,
|
|
132
|
+
['world_state_not_synced']: false,
|
|
133
|
+
// A reorg / divergent local chain, not a proposer offense (mirrors the block path's initial_state_mismatch).
|
|
134
|
+
['initial_archive_mismatch']: false,
|
|
127
135
|
['checkpoint_already_published']: false
|
|
128
136
|
};
|
|
129
137
|
/**
|
|
@@ -360,6 +368,22 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
360
368
|
reason: 'invalid_proposal'
|
|
361
369
|
};
|
|
362
370
|
}
|
|
371
|
+
// A tx can only appear once in a block: the second copy would emit nullifiers already emitted by the
|
|
372
|
+
// first. This is not a relaying-peer fault, so it passes gossip validation and is classified here as
|
|
373
|
+
// proposer misbehavior. Tx collection also reconciles a deduplicated hash set against the full list,
|
|
374
|
+
// so it must not be handed a proposal with repeated hashes.
|
|
375
|
+
const uniqueTxHashes = new Set(proposal.txHashes.map((txHash)=>txHash.toString()));
|
|
376
|
+
if (uniqueTxHashes.size !== proposal.txHashes.length) {
|
|
377
|
+
this.log.warn(`Proposal lists duplicate tx hashes, skipping processing`, {
|
|
378
|
+
...proposalInfo,
|
|
379
|
+
txCount: proposal.txHashes.length,
|
|
380
|
+
uniqueTxCount: uniqueTxHashes.size
|
|
381
|
+
});
|
|
382
|
+
return {
|
|
383
|
+
isValid: false,
|
|
384
|
+
reason: 'duplicate_txs'
|
|
385
|
+
};
|
|
386
|
+
}
|
|
363
387
|
const retainedSlotValidation = await this.validateNewBlockInSlot(proposal);
|
|
364
388
|
if (!retainedSlotValidation.isValid) {
|
|
365
389
|
this.log.info(`Block proposal conflicts with retained proposals, skipping archiver processing`, {
|
|
@@ -418,10 +442,15 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
418
442
|
}
|
|
419
443
|
// Collect txs from the proposal. We start doing this as early as possible,
|
|
420
444
|
// and we do it even if we don't plan to re-execute the txs, so that we have them if another node needs them.
|
|
421
|
-
const
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
445
|
+
const collected = await this.collectProposalTxs(proposal, blockNumber, proposalSender, proposalInfo);
|
|
446
|
+
if (collected === 'invalid_embedded_txs') {
|
|
447
|
+
return {
|
|
448
|
+
isValid: false,
|
|
449
|
+
blockNumber,
|
|
450
|
+
reason: collected
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
const { txs, missingTxs } = collected;
|
|
425
454
|
// Record the tx-collection outcome on the re-execution tracker
|
|
426
455
|
this.reexecutionTracker.recordTxsCollected(slotNumber, proposal.indexWithinCheckpoint, missingTxs.length === 0);
|
|
427
456
|
// If reexecution is disabled, bail. We were just interested in triggering tx collection.
|
|
@@ -512,6 +541,32 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
512
541
|
reexecutionResult
|
|
513
542
|
};
|
|
514
543
|
}
|
|
544
|
+
/**
|
|
545
|
+
* Collects the txs for a proposal, returning `invalid_embedded_txs` if the proposal carries a tx that fails
|
|
546
|
+
* minimum integrity validation. That is proposer misbehavior — the proposal signs both the tx hashes and the
|
|
547
|
+
* tx objects — so the caller turns it into an invalid-proposal result that reaches slashing and invalid-slot
|
|
548
|
+
* accounting, rather than letting it escape as an exception. Any other collection error is a local failure
|
|
549
|
+
* and keeps propagating.
|
|
550
|
+
*/ async collectProposalTxs(proposal, blockNumber, proposalSender, proposalInfo) {
|
|
551
|
+
try {
|
|
552
|
+
return await this.txProvider.getTxsForBlockProposal(proposal, blockNumber, {
|
|
553
|
+
pinnedPeer: proposalSender,
|
|
554
|
+
deadline: this.getReexecutionDeadline(proposal.slotNumber)
|
|
555
|
+
});
|
|
556
|
+
} catch (error) {
|
|
557
|
+
if (!isErrorClass(error, InvalidBlockProposalTxsError)) {
|
|
558
|
+
throw error;
|
|
559
|
+
}
|
|
560
|
+
this.log.warn(`Block proposal carries ${error.invalidTxs.length} invalid txs`, {
|
|
561
|
+
...proposalInfo,
|
|
562
|
+
invalidTxs: error.invalidTxs.map(({ txHash, reasons })=>({
|
|
563
|
+
txHash: txHash.toString(),
|
|
564
|
+
reasons
|
|
565
|
+
}))
|
|
566
|
+
});
|
|
567
|
+
return 'invalid_embedded_txs';
|
|
568
|
+
}
|
|
569
|
+
}
|
|
515
570
|
async validateNewBlockInSlot(blockProposal) {
|
|
516
571
|
if (!this.p2pClient) {
|
|
517
572
|
return {
|
|
@@ -1049,9 +1104,50 @@ const MAX_TRACKED_INVALID_PROPOSAL_SLOTS = 1000;
|
|
|
1049
1104
|
pipeliningEnabled: true,
|
|
1050
1105
|
log: this.log
|
|
1051
1106
|
});
|
|
1052
|
-
// Fork world state at the block before the first block
|
|
1107
|
+
// Fork world state at the block before the first block. getFork syncs world state to the parent block
|
|
1108
|
+
// first (see its doc): the block source (archiver) can already hold the block while world state still
|
|
1109
|
+
// trails it by one, and forking a not-yet-applied block throws a raw tree error that would otherwise
|
|
1110
|
+
// escape as an uncaught gossipsub error. We pass the parent's expected block hash so the sync detects a
|
|
1111
|
+
// world-state reorg (undefined for the genesis parent, where no block exists to pin). On failure we map
|
|
1112
|
+
// to a clean validation result rather than letting it escape.
|
|
1053
1113
|
const parentBlockNumber = BlockNumber(firstBlock.number - 1);
|
|
1054
|
-
|
|
1114
|
+
let forkResult;
|
|
1115
|
+
try {
|
|
1116
|
+
const parentBlockHash = (await this.blockSource.getBlockData({
|
|
1117
|
+
number: parentBlockNumber
|
|
1118
|
+
}))?.blockHash;
|
|
1119
|
+
forkResult = await this.checkpointsBuilder.getFork(parentBlockNumber, parentBlockHash);
|
|
1120
|
+
} catch (err) {
|
|
1121
|
+
this.log.warn(`Failed to fork world state at block ${parentBlockNumber} for checkpoint proposal`, {
|
|
1122
|
+
...proposalInfo,
|
|
1123
|
+
parentBlockNumber,
|
|
1124
|
+
err
|
|
1125
|
+
});
|
|
1126
|
+
return {
|
|
1127
|
+
isValid: false,
|
|
1128
|
+
reason: 'world_state_not_synced',
|
|
1129
|
+
checkpointNumber
|
|
1130
|
+
};
|
|
1131
|
+
}
|
|
1132
|
+
const fork = _ts_add_disposable_resource(env, forkResult, true);
|
|
1133
|
+
// Verify the fork's archive root matches the checkpoint's expected starting archive (the archive after
|
|
1134
|
+
// the parent block). A mismatch means world state forked from a different chain than the proposal was
|
|
1135
|
+
// built on (e.g. a reorg), so recomputing the checkpoint against it would be meaningless. This mirrors
|
|
1136
|
+
// the block-proposal re-execution check and fails fast with a clean, non-slashable result instead of a
|
|
1137
|
+
// confusing downstream mismatch.
|
|
1138
|
+
const forkArchiveRoot = new Fr((await fork.getTreeInfo(MerkleTreeId.ARCHIVE)).root);
|
|
1139
|
+
if (!forkArchiveRoot.equals(proposal.checkpointHeader.lastArchiveRoot)) {
|
|
1140
|
+
this.log.warn(`Fork archive root does not match checkpoint proposal's last archive`, {
|
|
1141
|
+
...proposalInfo,
|
|
1142
|
+
forkArchiveRoot: forkArchiveRoot.toString(),
|
|
1143
|
+
expectedLastArchiveRoot: proposal.checkpointHeader.lastArchiveRoot.toString()
|
|
1144
|
+
});
|
|
1145
|
+
return {
|
|
1146
|
+
isValid: false,
|
|
1147
|
+
reason: 'initial_archive_mismatch',
|
|
1148
|
+
checkpointNumber
|
|
1149
|
+
};
|
|
1150
|
+
}
|
|
1055
1151
|
// Create checkpoint builder with all existing blocks
|
|
1056
1152
|
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(checkpointNumber, constants, proposal.feeAssetPriceModifier, l1ToL2Messages, previousCheckpointOutHashes, fork, blocks, this.log.getBindings());
|
|
1057
1153
|
// Complete the checkpoint to get computed values
|
package/dest/validator.d.ts
CHANGED
|
@@ -134,4 +134,4 @@ export declare class ValidatorClient extends ValidatorClient_base implements Val
|
|
|
134
134
|
private handleAuthRequest;
|
|
135
135
|
}
|
|
136
136
|
export {};
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckUsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFlLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25ILE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFNUQsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEtBQUssRUFBMEUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV0SCxPQUFPLEVBSUwsS0FBSyxPQUFPLEVBQ1osS0FBSyxjQUFjLEVBRXBCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsK0JBQStCLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZHLE9BQU8sS0FBSyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0UsT0FBTyxLQUFLLEVBQ1YsV0FBVyxFQUNYLFNBQVMsRUFDVCx5QkFBeUIs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
|
package/dest/validator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../src/validator.ts"],"names":[],"mappings":"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"}
|
package/dest/validator.js
CHANGED
|
@@ -301,7 +301,9 @@ const MAX_TRACKED_BAD_ATTESTATIONS = 10_000;
|
|
|
301
301
|
'state_mismatch',
|
|
302
302
|
'failed_txs',
|
|
303
303
|
'in_hash_mismatch',
|
|
304
|
-
'parent_block_wrong_slot'
|
|
304
|
+
'parent_block_wrong_slot',
|
|
305
|
+
'duplicate_txs',
|
|
306
|
+
'invalid_embedded_txs'
|
|
305
307
|
];
|
|
306
308
|
if (badProposalReasons.includes(reason)) {
|
|
307
309
|
this.metrics.incFailedAttestationsBadProposal(1, reason, partOfCommittee);
|
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.330febf",
|
|
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/
|
|
75
|
-
"@aztec/
|
|
76
|
-
"@aztec/
|
|
77
|
-
"@aztec/
|
|
78
|
-
"@aztec/
|
|
79
|
-
"@aztec/
|
|
80
|
-
"@aztec/
|
|
81
|
-
"@aztec/
|
|
82
|
-
"@aztec/validator-ha-signer": "0.0.1-commit.3100065",
|
|
67
|
+
"@aztec/blob-client": "0.0.1-commit.330febf",
|
|
68
|
+
"@aztec/blob-lib": "0.0.1-commit.330febf",
|
|
69
|
+
"@aztec/constants": "0.0.1-commit.330febf",
|
|
70
|
+
"@aztec/epoch-cache": "0.0.1-commit.330febf",
|
|
71
|
+
"@aztec/ethereum": "0.0.1-commit.330febf",
|
|
72
|
+
"@aztec/foundation": "0.0.1-commit.330febf",
|
|
73
|
+
"@aztec/node-keystore": "0.0.1-commit.330febf",
|
|
74
|
+
"@aztec/p2p": "0.0.1-commit.330febf",
|
|
75
|
+
"@aztec/protocol-contracts": "0.0.1-commit.330febf",
|
|
76
|
+
"@aztec/prover-client": "0.0.1-commit.330febf",
|
|
77
|
+
"@aztec/simulator": "0.0.1-commit.330febf",
|
|
78
|
+
"@aztec/slasher": "0.0.1-commit.330febf",
|
|
79
|
+
"@aztec/stdlib": "0.0.1-commit.330febf",
|
|
80
|
+
"@aztec/telemetry-client": "0.0.1-commit.330febf",
|
|
81
|
+
"@aztec/validator-ha-signer": "0.0.1-commit.330febf",
|
|
83
82
|
"koa": "^2.16.1",
|
|
84
83
|
"koa-router": "^13.1.1",
|
|
85
84
|
"tslib": "^2.4.0",
|
|
86
85
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
87
86
|
},
|
|
88
87
|
"devDependencies": {
|
|
89
|
-
"@aztec/archiver": "0.0.1-commit.
|
|
90
|
-
"@aztec/
|
|
88
|
+
"@aztec/archiver": "0.0.1-commit.330febf",
|
|
89
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.330febf",
|
|
90
|
+
"@aztec/world-state": "0.0.1-commit.330febf",
|
|
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/metrics.ts
CHANGED
package/src/proposal_handler.ts
CHANGED
|
@@ -18,6 +18,7 @@ import type { LogData } from '@aztec/foundation/log';
|
|
|
18
18
|
import { createLogger } from '@aztec/foundation/log';
|
|
19
19
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
20
20
|
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
21
|
+
import { isErrorClass } from '@aztec/foundation/types';
|
|
21
22
|
import type { P2P, PeerId } from '@aztec/p2p';
|
|
22
23
|
import { BlockProposalValidator } from '@aztec/p2p/msg_validators';
|
|
23
24
|
import type { BlockData, L2Block, L2BlockSink, L2BlockSource } from '@aztec/stdlib/block';
|
|
@@ -25,7 +26,12 @@ import type { CheckpointReexecutionTracker, ReexecutionOutcome } from '@aztec/st
|
|
|
25
26
|
import { getPreviousCheckpointOutHashes, validateCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
26
27
|
import { getEpochAtSlot } from '@aztec/stdlib/epoch-helpers';
|
|
27
28
|
import { Gas } from '@aztec/stdlib/gas';
|
|
28
|
-
import type {
|
|
29
|
+
import type {
|
|
30
|
+
ITxProvider,
|
|
31
|
+
MerkleTreeWriteOperations,
|
|
32
|
+
ValidatorClientFullConfig,
|
|
33
|
+
WorldStateSynchronizer,
|
|
34
|
+
} from '@aztec/stdlib/interfaces/server';
|
|
29
35
|
import {
|
|
30
36
|
type L1ToL2MessageSource,
|
|
31
37
|
accumulateCheckpointOutHashes,
|
|
@@ -34,8 +40,9 @@ import {
|
|
|
34
40
|
import type { BlockProposal, CheckpointAttestation, CheckpointProposalCore } from '@aztec/stdlib/p2p';
|
|
35
41
|
import type { ConsensusTimetable } from '@aztec/stdlib/timetable';
|
|
36
42
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
37
|
-
import type { CheckpointGlobalVariables, FailedTx, Tx } from '@aztec/stdlib/tx';
|
|
43
|
+
import type { CheckpointGlobalVariables, FailedTx, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
38
44
|
import {
|
|
45
|
+
InvalidBlockProposalTxsError,
|
|
39
46
|
ReExFailedTxsError,
|
|
40
47
|
ReExInitialStateMismatchError,
|
|
41
48
|
ReExStateMismatchError,
|
|
@@ -56,6 +63,8 @@ export type BlockProposalValidationFailureReason =
|
|
|
56
63
|
| 'global_variables_mismatch'
|
|
57
64
|
| 'block_number_already_exists'
|
|
58
65
|
| 'txs_not_available'
|
|
66
|
+
| 'duplicate_txs'
|
|
67
|
+
| 'invalid_embedded_txs'
|
|
59
68
|
| 'state_mismatch'
|
|
60
69
|
| 'failed_txs'
|
|
61
70
|
| 'initial_state_mismatch'
|
|
@@ -91,10 +100,12 @@ export type CheckpointProposalValidationFailureReason =
|
|
|
91
100
|
| 'invalid_fee_asset_price_modifier'
|
|
92
101
|
| 'last_block_not_found'
|
|
93
102
|
| 'block_fetch_error'
|
|
103
|
+
| 'world_state_not_synced'
|
|
94
104
|
| 'checkpoint_already_published'
|
|
95
105
|
| 'no_blocks_for_slot'
|
|
96
106
|
| 'last_block_archive_mismatch'
|
|
97
107
|
| 'too_many_blocks_in_checkpoint'
|
|
108
|
+
| 'initial_archive_mismatch'
|
|
98
109
|
| 'checkpoint_header_mismatch'
|
|
99
110
|
| 'archive_mismatch'
|
|
100
111
|
| 'out_hash_mismatch'
|
|
@@ -115,6 +126,8 @@ const CHECKPOINT_VALIDATION_REASON_TO_OUTCOME: Record<
|
|
|
115
126
|
checkpoint_already_published: undefined,
|
|
116
127
|
last_block_not_found: 'unvalidated',
|
|
117
128
|
block_fetch_error: 'unvalidated',
|
|
129
|
+
world_state_not_synced: 'unvalidated',
|
|
130
|
+
initial_archive_mismatch: 'unvalidated',
|
|
118
131
|
no_blocks_for_slot: 'unvalidated',
|
|
119
132
|
last_block_archive_mismatch: 'invalid',
|
|
120
133
|
too_many_blocks_in_checkpoint: 'invalid',
|
|
@@ -163,6 +176,8 @@ export const SLASHABLE_BLOCK_PROPOSAL_VALIDATION_RESULT: BlockProposalValidation
|
|
|
163
176
|
'invalid_proposal',
|
|
164
177
|
'parent_block_wrong_slot',
|
|
165
178
|
'in_hash_mismatch',
|
|
179
|
+
'duplicate_txs',
|
|
180
|
+
'invalid_embedded_txs',
|
|
166
181
|
];
|
|
167
182
|
|
|
168
183
|
/** Checkpoint-proposal validation failures that constitute a slashable invalid-checkpoint offense. */
|
|
@@ -186,6 +201,9 @@ export const SLASHABLE_CHECKPOINT_PROPOSAL_VALIDATION_RESULT: Record<
|
|
|
186
201
|
['invalid_signature']: false,
|
|
187
202
|
['last_block_not_found']: false,
|
|
188
203
|
['block_fetch_error']: false,
|
|
204
|
+
['world_state_not_synced']: false,
|
|
205
|
+
// A reorg / divergent local chain, not a proposer offense (mirrors the block path's initial_state_mismatch).
|
|
206
|
+
['initial_archive_mismatch']: false,
|
|
189
207
|
['checkpoint_already_published']: false,
|
|
190
208
|
};
|
|
191
209
|
|
|
@@ -462,6 +480,20 @@ export class ProposalHandler {
|
|
|
462
480
|
return { isValid: false, reason: 'invalid_proposal' };
|
|
463
481
|
}
|
|
464
482
|
|
|
483
|
+
// A tx can only appear once in a block: the second copy would emit nullifiers already emitted by the
|
|
484
|
+
// first. This is not a relaying-peer fault, so it passes gossip validation and is classified here as
|
|
485
|
+
// proposer misbehavior. Tx collection also reconciles a deduplicated hash set against the full list,
|
|
486
|
+
// so it must not be handed a proposal with repeated hashes.
|
|
487
|
+
const uniqueTxHashes = new Set(proposal.txHashes.map(txHash => txHash.toString()));
|
|
488
|
+
if (uniqueTxHashes.size !== proposal.txHashes.length) {
|
|
489
|
+
this.log.warn(`Proposal lists duplicate tx hashes, skipping processing`, {
|
|
490
|
+
...proposalInfo,
|
|
491
|
+
txCount: proposal.txHashes.length,
|
|
492
|
+
uniqueTxCount: uniqueTxHashes.size,
|
|
493
|
+
});
|
|
494
|
+
return { isValid: false, reason: 'duplicate_txs' };
|
|
495
|
+
}
|
|
496
|
+
|
|
465
497
|
const retainedSlotValidation = await this.validateNewBlockInSlot(proposal);
|
|
466
498
|
if (!retainedSlotValidation.isValid) {
|
|
467
499
|
this.log.info(`Block proposal conflicts with retained proposals, skipping archiver processing`, {
|
|
@@ -515,10 +547,11 @@ export class ProposalHandler {
|
|
|
515
547
|
|
|
516
548
|
// Collect txs from the proposal. We start doing this as early as possible,
|
|
517
549
|
// and we do it even if we don't plan to re-execute the txs, so that we have them if another node needs them.
|
|
518
|
-
const
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
}
|
|
550
|
+
const collected = await this.collectProposalTxs(proposal, blockNumber, proposalSender, proposalInfo);
|
|
551
|
+
if (collected === 'invalid_embedded_txs') {
|
|
552
|
+
return { isValid: false, blockNumber, reason: collected };
|
|
553
|
+
}
|
|
554
|
+
const { txs, missingTxs } = collected;
|
|
522
555
|
|
|
523
556
|
// Record the tx-collection outcome on the re-execution tracker
|
|
524
557
|
this.reexecutionTracker.recordTxsCollected(slotNumber, proposal.indexWithinCheckpoint, missingTxs.length === 0);
|
|
@@ -603,6 +636,36 @@ export class ProposalHandler {
|
|
|
603
636
|
return { isValid: true, blockNumber, reexecutionResult };
|
|
604
637
|
}
|
|
605
638
|
|
|
639
|
+
/**
|
|
640
|
+
* Collects the txs for a proposal, returning `invalid_embedded_txs` if the proposal carries a tx that fails
|
|
641
|
+
* minimum integrity validation. That is proposer misbehavior — the proposal signs both the tx hashes and the
|
|
642
|
+
* tx objects — so the caller turns it into an invalid-proposal result that reaches slashing and invalid-slot
|
|
643
|
+
* accounting, rather than letting it escape as an exception. Any other collection error is a local failure
|
|
644
|
+
* and keeps propagating.
|
|
645
|
+
*/
|
|
646
|
+
private async collectProposalTxs(
|
|
647
|
+
proposal: BlockProposal,
|
|
648
|
+
blockNumber: BlockNumber,
|
|
649
|
+
proposalSender: PeerId,
|
|
650
|
+
proposalInfo: LogData,
|
|
651
|
+
): Promise<{ txs: Tx[]; missingTxs: TxHash[] } | 'invalid_embedded_txs'> {
|
|
652
|
+
try {
|
|
653
|
+
return await this.txProvider.getTxsForBlockProposal(proposal, blockNumber, {
|
|
654
|
+
pinnedPeer: proposalSender,
|
|
655
|
+
deadline: this.getReexecutionDeadline(proposal.slotNumber),
|
|
656
|
+
});
|
|
657
|
+
} catch (error) {
|
|
658
|
+
if (!isErrorClass(error, InvalidBlockProposalTxsError)) {
|
|
659
|
+
throw error;
|
|
660
|
+
}
|
|
661
|
+
this.log.warn(`Block proposal carries ${error.invalidTxs.length} invalid txs`, {
|
|
662
|
+
...proposalInfo,
|
|
663
|
+
invalidTxs: error.invalidTxs.map(({ txHash, reasons }) => ({ txHash: txHash.toString(), reasons })),
|
|
664
|
+
});
|
|
665
|
+
return 'invalid_embedded_txs';
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
|
|
606
669
|
private async validateNewBlockInSlot(blockProposal: BlockProposal): Promise<BlockProposalSlotValidationResult> {
|
|
607
670
|
if (!this.p2pClient) {
|
|
608
671
|
return { isValid: true };
|
|
@@ -1161,9 +1224,41 @@ export class ProposalHandler {
|
|
|
1161
1224
|
log: this.log,
|
|
1162
1225
|
});
|
|
1163
1226
|
|
|
1164
|
-
// Fork world state at the block before the first block
|
|
1227
|
+
// Fork world state at the block before the first block. getFork syncs world state to the parent block
|
|
1228
|
+
// first (see its doc): the block source (archiver) can already hold the block while world state still
|
|
1229
|
+
// trails it by one, and forking a not-yet-applied block throws a raw tree error that would otherwise
|
|
1230
|
+
// escape as an uncaught gossipsub error. We pass the parent's expected block hash so the sync detects a
|
|
1231
|
+
// world-state reorg (undefined for the genesis parent, where no block exists to pin). On failure we map
|
|
1232
|
+
// to a clean validation result rather than letting it escape.
|
|
1165
1233
|
const parentBlockNumber = BlockNumber(firstBlock.number - 1);
|
|
1166
|
-
|
|
1234
|
+
let forkResult: MerkleTreeWriteOperations;
|
|
1235
|
+
try {
|
|
1236
|
+
const parentBlockHash = (await this.blockSource.getBlockData({ number: parentBlockNumber }))?.blockHash;
|
|
1237
|
+
forkResult = await this.checkpointsBuilder.getFork(parentBlockNumber, parentBlockHash);
|
|
1238
|
+
} catch (err) {
|
|
1239
|
+
this.log.warn(`Failed to fork world state at block ${parentBlockNumber} for checkpoint proposal`, {
|
|
1240
|
+
...proposalInfo,
|
|
1241
|
+
parentBlockNumber,
|
|
1242
|
+
err,
|
|
1243
|
+
});
|
|
1244
|
+
return { isValid: false, reason: 'world_state_not_synced', checkpointNumber };
|
|
1245
|
+
}
|
|
1246
|
+
await using fork = forkResult;
|
|
1247
|
+
|
|
1248
|
+
// Verify the fork's archive root matches the checkpoint's expected starting archive (the archive after
|
|
1249
|
+
// the parent block). A mismatch means world state forked from a different chain than the proposal was
|
|
1250
|
+
// built on (e.g. a reorg), so recomputing the checkpoint against it would be meaningless. This mirrors
|
|
1251
|
+
// the block-proposal re-execution check and fails fast with a clean, non-slashable result instead of a
|
|
1252
|
+
// confusing downstream mismatch.
|
|
1253
|
+
const forkArchiveRoot = new Fr((await fork.getTreeInfo(MerkleTreeId.ARCHIVE)).root);
|
|
1254
|
+
if (!forkArchiveRoot.equals(proposal.checkpointHeader.lastArchiveRoot)) {
|
|
1255
|
+
this.log.warn(`Fork archive root does not match checkpoint proposal's last archive`, {
|
|
1256
|
+
...proposalInfo,
|
|
1257
|
+
forkArchiveRoot: forkArchiveRoot.toString(),
|
|
1258
|
+
expectedLastArchiveRoot: proposal.checkpointHeader.lastArchiveRoot.toString(),
|
|
1259
|
+
});
|
|
1260
|
+
return { isValid: false, reason: 'initial_archive_mismatch', checkpointNumber };
|
|
1261
|
+
}
|
|
1167
1262
|
|
|
1168
1263
|
// Create checkpoint builder with all existing blocks
|
|
1169
1264
|
const checkpointBuilder = await this.checkpointsBuilder.openCheckpoint(
|
package/src/validator.ts
CHANGED
|
@@ -480,6 +480,8 @@ export class ValidatorClient extends (EventEmitter as new () => WatcherEmitter)
|
|
|
480
480
|
'failed_txs',
|
|
481
481
|
'in_hash_mismatch',
|
|
482
482
|
'parent_block_wrong_slot',
|
|
483
|
+
'duplicate_txs',
|
|
484
|
+
'invalid_embedded_txs',
|
|
483
485
|
];
|
|
484
486
|
|
|
485
487
|
if (badProposalReasons.includes(reason as BlockProposalValidationFailureReason)) {
|