@aztec/world-state 5.3.0-rc.1 → 5.3.0
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 +20 -0
- package/dest/native/native_world_state.d.ts +1 -1
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +1 -0
- package/dest/synchronizer/config.d.ts +4 -1
- package/dest/synchronizer/config.d.ts.map +1 -1
- package/dest/synchronizer/config.js +6 -0
- package/dest/synchronizer/history.d.ts +9 -0
- package/dest/synchronizer/history.d.ts.map +1 -0
- package/dest/synchronizer/history.js +37 -0
- package/dest/synchronizer/index.d.ts +2 -1
- package/dest/synchronizer/index.d.ts.map +1 -1
- package/dest/synchronizer/index.js +1 -0
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +1 -2
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +18 -5
- package/package.json +10 -10
- package/src/native/native_world_state.ts +1 -0
- package/src/synchronizer/config.ts +10 -0
- package/src/synchronizer/history.ts +55 -0
- package/src/synchronizer/index.ts +1 -0
- package/src/synchronizer/server_world_state_synchronizer.ts +22 -9
package/README.md
CHANGED
|
@@ -33,6 +33,26 @@ Once a new block is received, the synchronizer checks the uncommitted root value
|
|
|
33
33
|
|
|
34
34
|
The interface to the Merkle Tree DB offers a unified asynchronous API to the set of trees available. Reads from the Merkle Trees need to be marked as to whether they should include uncommitted state. For this reason, the MerkleTreeReadOperationsFacade exists to abstract this detail away from the end consumer.
|
|
35
35
|
|
|
36
|
+
### History retention
|
|
37
|
+
|
|
38
|
+
By default, `WS_NUM_HISTORIC_CHECKPOINTS=64` retains a rolling window of finalized checkpoints, along with all newer state.
|
|
39
|
+
Setting this value to zero disables history pruning. Increasing the window accumulates more history as the chain advances;
|
|
40
|
+
it does not require an existing database or snapshot to contain that history already.
|
|
41
|
+
|
|
42
|
+
Set `WS_PRUNE_BEFORE_CHECKPOINT=N` to retain every block in checkpoint N and every later checkpoint permanently. This
|
|
43
|
+
overrides the rolling checkpoint setting. Set N to zero to retain all history from genesis. Pruning always stops at the
|
|
44
|
+
first block of a checkpoint; the checkpoint containing the finalized tip is always retained. Future checkpoint numbers
|
|
45
|
+
are supported.
|
|
46
|
+
|
|
47
|
+
When `WS_PRUNE_BEFORE_CHECKPOINT` is explicitly set, startup accepts a database with more history than requested and
|
|
48
|
+
rejects one missing required history, including with `SYNC_MODE=force-snapshot`. Rebuild using a fresh world-state
|
|
49
|
+
database to request older history.
|
|
50
|
+
|
|
51
|
+
When bootstrapping a fresh world-state database with a pin and snapshot sync enabled, the node tries compatible snapshots in
|
|
52
|
+
checkpoint N or earlier, newest first, then syncs forward while preserving complete checkpoints. Existing snapshot
|
|
53
|
+
indexes are mapped from block numbers using the archived checkpoint metadata. Missing or incompatible snapshots are
|
|
54
|
+
skipped. If none can be used, the node rebuilds from genesis. `SYNC_MODE=full` always skips snapshot downloads.
|
|
55
|
+
|
|
36
56
|
# Building/Testing
|
|
37
57
|
|
|
38
58
|
Building the package is as simple as calling `yarn build` from the package root.
|
|
@@ -88,4 +88,4 @@ export declare class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
88
88
|
backupTo(dstPath: string, compact?: boolean): Promise<Record<Exclude<SnapshotDataKeys, 'archiver'>, string>>;
|
|
89
89
|
}
|
|
90
90
|
export declare const NATIVE_WORLD_STATE_DBS: readonly [readonly ["l1-to-l2-message-tree", "L1ToL2MessageTree"], readonly ["archive-tree", "ArchiveTree"], readonly ["public-data-tree", "PublicDataTree"], readonly ["note-hash-tree", "NoteHashTree"], readonly ["nullifier-tree", "NullifierTree"]];
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL25hdGl2ZV93b3JsZF9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsT0FBTyxLQUFLLEVBQ1YsYUFBYSxFQUNiLHdCQUF3QixFQUN4Qix5QkFBeUIsRUFDMUIsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBK0IsS0FBSyxxQkFBcUIsRUFBc0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNsSCxPQUFPLEVBQUUsV0FBVyxFQUEwRCxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZHLE9BQU8sRUFBc0IsS0FBSyxXQUFXLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFRckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbEYsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEtBQUssRUFBRSx1QkFBdUIsSUFBSSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRXpHLE9BQU8sRUFFTCxLQUFLLG9CQUFvQixFQUN6QixLQUFLLHVCQUF1QixFQUs3QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EACV,aAAa,EACb,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAA+B,KAAK,qBAAqB,EAAsB,MAAM,qBAAqB,CAAC;AAClH,OAAO,EAAE,WAAW,EAA0D,MAAM,kBAAkB,CAAC;AACvG,OAAO,EAAsB,KAAK,WAAW,EAAsB,MAAM,2BAA2B,CAAC;AAQrG,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,KAAK,EAAE,uBAAuB,IAAI,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzG,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAK7B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIpE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAyB7C,qBAAa,uBAAwB,YAAW,kBAAkB;IAM9D,SAAS,CAAC,QAAQ,EAAE,gBAAgB;IACpC,SAAS,CAAC,QAAQ,CAAC,yBAAyB,EAAE,yBAAyB;IACvE,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,SAAS,CAAC,aAAa,EAAE,WAAW,GAAG,SAAS,CAAC;IAEjD,OAAO,CAAC,mBAAmB,CAAsC;IAEjE,SAAS,aACG,QAAQ,EAAE,gBAAgB,EACjB,yBAAyB,EAAE,yBAAyB,EACpD,GAAG,EAAE,MAAM,EACb,OAAO,GAAE,WAAgC,EACzC,OAAO,sBAA0B,EAChD;IAEJ;;;;OAIG;IACH,OAAa,GAAG,CACd,aAAa,EAAE,UAAU,EACzB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,sBAAsB,EACtC,OAAO,GAAE,WAAgC,EACzC,eAAe,4BAAsD,EACrE,QAAQ,CAAC,EAAE,cAAc,EACzB,OAAO,sBAA0B,GAChC,OAAO,CAAC,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { type ConfigMappingsType } from '@aztec/foundation/config';
|
|
2
3
|
/** World State synchronizer configuration values. */
|
|
3
4
|
export interface WorldStateConfig {
|
|
@@ -21,6 +22,8 @@ export interface WorldStateConfig {
|
|
|
21
22
|
worldStateDataDirectory?: string;
|
|
22
23
|
/** The number of historic checkpoints worth of blocks to maintain */
|
|
23
24
|
worldStateCheckpointHistory: number;
|
|
25
|
+
/** Retain this checkpoint and every later checkpoint, overriding the rolling checkpoint window. */
|
|
26
|
+
worldStatePruneBeforeCheckpoint?: CheckpointNumber;
|
|
24
27
|
}
|
|
25
28
|
export declare const worldStateConfigMappings: ConfigMappingsType<WorldStateConfig>;
|
|
26
29
|
/**
|
|
@@ -28,4 +31,4 @@ export declare const worldStateConfigMappings: ConfigMappingsType<WorldStateConf
|
|
|
28
31
|
* @returns The configuration values for the world state synchronizer.
|
|
29
32
|
*/
|
|
30
33
|
export declare function getWorldStateConfigFromEnv(): WorldStateConfig;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3luY2hyb25pemVyL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBMEIsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRyxPQUFPLEVBQ0wsS0FBSyxrQkFBa0IsRUFJeEIsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxxREFBcUQ7QUFDckQsTUFBTSxXQUFXLGdCQUFnQjtJQUMvQix1Q0FBdUM7SUFDdkMsOEJBQThCLEVBQUUsTUFBTSxDQUFDO0lBRXZDLDJGQUEyRjtJQUMzRiwrQkFBK0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUV6QyxtSkFBbUo7SUFDbkoscUJBQXFCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFL0IsMkpBQTJKO0lBQzNKLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRTlCLDZKQUE2SjtJQUM3SixzQkFBc0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVoQyw2SkFBNko7SUFDN0oscUJBQXFCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFL0IsMkpBQTJKO0lBQzNKLG9CQUFvQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRTlCLCtKQUErSjtJQUMvSix1QkFBdUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVqQywyR0FBMkc7SUFDM0csdUJBQXVCLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFakMscUVBQXFFO0lBQ3JFLDJCQUEyQixFQUFFLE1BQU0sQ0FBQztJQUVwQyxtR0FBbUc7SUFDbkcsK0JBQStCLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQztDQUNwRDtBQUVELGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0ErRHpFLENBQUM7QUFFRjs7O0dBR0c7QUFDSCx3QkFBZ0IsMEJBQTBCLElBQUksZ0JBQWdCLENBRTdEIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/synchronizer/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,0BAA0B,CAAC;AAElC,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,8BAA8B,EAAE,MAAM,CAAC;IAEvC,2FAA2F;IAC3F,+BAA+B,CAAC,EAAE,MAAM,CAAC;IAEzC,mJAAmJ;IACnJ,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,6JAA6J;IAC7J,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC,6JAA6J;IAC7J,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,+JAA+J;IAC/J,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,2GAA2G;IAC3G,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,qEAAqE;IACrE,2BAA2B,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/synchronizer/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAA0B,MAAM,iCAAiC,CAAC;AAChG,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,0BAA0B,CAAC;AAElC,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,uCAAuC;IACvC,8BAA8B,EAAE,MAAM,CAAC;IAEvC,2FAA2F;IAC3F,+BAA+B,CAAC,EAAE,MAAM,CAAC;IAEzC,mJAAmJ;IACnJ,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,6JAA6J;IAC7J,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC,6JAA6J;IAC7J,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,2JAA2J;IAC3J,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,+JAA+J;IAC/J,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,2GAA2G;IAC3G,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,qEAAqE;IACrE,2BAA2B,EAAE,MAAM,CAAC;IAEpC,mGAAmG;IACnG,+BAA+B,CAAC,EAAE,gBAAgB,CAAC;CACpD;AAED,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CA+DzE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,gBAAgB,CAE7D"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CheckpointNumberSchema } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { getConfigFromMappings, numberConfigHelper, optionalNumberConfigHelper } from '@aztec/foundation/config';
|
|
2
3
|
export const worldStateConfigMappings = {
|
|
3
4
|
worldStateBlockCheckIntervalMS: {
|
|
@@ -51,6 +52,11 @@ export const worldStateConfigMappings = {
|
|
|
51
52
|
'WS_NUM_HISTORIC_BLOCKS'
|
|
52
53
|
],
|
|
53
54
|
...numberConfigHelper(64)
|
|
55
|
+
},
|
|
56
|
+
worldStatePruneBeforeCheckpoint: {
|
|
57
|
+
env: 'WS_PRUNE_BEFORE_CHECKPOINT',
|
|
58
|
+
description: 'Retain world state from the start of this checkpoint onwards, overriding WS_NUM_HISTORIC_CHECKPOINTS. Set to 0 to retain all history.',
|
|
59
|
+
parseEnv: (value)=>CheckpointNumberSchema.parse(value)
|
|
54
60
|
}
|
|
55
61
|
};
|
|
56
62
|
/**
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
3
|
+
import type { WorldStateStatusSummary } from '../native/message.js';
|
|
4
|
+
import type { WorldStateConfig } from './config.js';
|
|
5
|
+
/** Returns the fixed checkpoint boundary, or undefined for a rolling checkpoint window. */
|
|
6
|
+
export declare function getWorldStateHistoryStartCheckpoint(config: Pick<WorldStateConfig, 'worldStatePruneBeforeCheckpoint' | 'worldStateCheckpointHistory'>): CheckpointNumber | undefined;
|
|
7
|
+
/** Rejects a database whose retained history cannot satisfy the configured pruning policy. */
|
|
8
|
+
export declare function validateWorldStateHistory(config: Pick<WorldStateConfig, 'worldStatePruneBeforeCheckpoint' | 'worldStateCheckpointHistory'>, summary: WorldStateStatusSummary, blockSource?: Pick<L2BlockSource, 'getBlockData'>): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9oaXN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSxpQ0FBaUMsQ0FBQztBQUMzRixPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV6RCxPQUFPLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BFLE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBELDJGQUEyRjtBQUMzRix3QkFBZ0IsbUNBQW1DLENBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsaUNBQWlDLEdBQUcsNkJBQTZCLENBQUMsR0FDaEcsZ0JBQWdCLEdBQUcsU0FBUyxDQUs5QjtBQUVELDhGQUE4RjtBQUM5Rix3QkFBc0IseUJBQXlCLENBQzdDLE1BQU0sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsaUNBQWlDLEdBQUcsNkJBQTZCLENBQUMsRUFDakcsT0FBTyxFQUFFLHVCQUF1QixFQUNoQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxHQUNoRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBaUNmIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/synchronizer/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAA0B,MAAM,iCAAiC,CAAC;AAC3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,2FAA2F;AAC3F,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,iCAAiC,GAAG,6BAA6B,CAAC,GAChG,gBAAgB,GAAG,SAAS,CAK9B;AAED,8FAA8F;AAC9F,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,iCAAiC,GAAG,6BAA6B,CAAC,EACjG,OAAO,EAAE,uBAAuB,EAChC,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,GAChD,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CheckpointNumber, CheckpointNumberSchema } from '@aztec/foundation/branded-types';
|
|
2
|
+
/** Returns the fixed checkpoint boundary, or undefined for a rolling checkpoint window. */ export function getWorldStateHistoryStartCheckpoint(config) {
|
|
3
|
+
if (config.worldStatePruneBeforeCheckpoint !== undefined) {
|
|
4
|
+
return CheckpointNumberSchema.parse(config.worldStatePruneBeforeCheckpoint);
|
|
5
|
+
}
|
|
6
|
+
return config.worldStateCheckpointHistory < 1 ? CheckpointNumber.ZERO : undefined;
|
|
7
|
+
}
|
|
8
|
+
/** Rejects a database whose retained history cannot satisfy the configured pruning policy. */ export async function validateWorldStateHistory(config, summary, blockSource) {
|
|
9
|
+
const startCheckpoint = getWorldStateHistoryStartCheckpoint(config);
|
|
10
|
+
const { oldestHistoricalBlock, unfinalizedBlockNumber, finalizedBlockNumber } = summary;
|
|
11
|
+
if (oldestHistoricalBlock <= 1) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const available = `World state retains blocks ${oldestHistoricalBlock} to ${unfinalizedBlockNumber}`;
|
|
15
|
+
const recovery = 'Use a fresh world-state database to rebuild the required history from a snapshot or genesis.';
|
|
16
|
+
if (startCheckpoint === CheckpointNumber.ZERO) {
|
|
17
|
+
throw new Error(`${available}, but all checkpoint history is required. ${recovery}`);
|
|
18
|
+
}
|
|
19
|
+
const oldest = await blockSource?.getBlockData({
|
|
20
|
+
number: oldestHistoricalBlock
|
|
21
|
+
});
|
|
22
|
+
let requiredCheckpoint = startCheckpoint;
|
|
23
|
+
if (requiredCheckpoint === undefined) {
|
|
24
|
+
const finalized = await blockSource?.getBlockData({
|
|
25
|
+
number: finalizedBlockNumber
|
|
26
|
+
});
|
|
27
|
+
if (finalized) {
|
|
28
|
+
requiredCheckpoint = CheckpointNumber(Math.max(1, finalized.checkpointNumber - config.worldStateCheckpointHistory + 1));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (!oldest || requiredCheckpoint === undefined) {
|
|
32
|
+
throw new Error(`${available}, but its checkpoint history could not be verified against the archiver.`);
|
|
33
|
+
}
|
|
34
|
+
if (oldest.checkpointNumber > requiredCheckpoint || oldest.checkpointNumber === requiredCheckpoint && oldest.indexWithinCheckpoint !== 0) {
|
|
35
|
+
throw new Error(`${available}, but history is required from the start of checkpoint ${requiredCheckpoint}. ${recovery}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './server_world_state_synchronizer.js';
|
|
2
2
|
export * from './factory.js';
|
|
3
3
|
export * from './errors.js';
|
|
4
|
-
|
|
4
|
+
export * from './history.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGNBQWMsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/synchronizer/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/synchronizer/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
@@ -22,7 +22,6 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
22
22
|
private readonly log;
|
|
23
23
|
private readonly merkleTreeCommitted;
|
|
24
24
|
private latestBlockNumberAtStart;
|
|
25
|
-
private historyToKeep;
|
|
26
25
|
private currentState;
|
|
27
26
|
private syncPromise;
|
|
28
27
|
protected blockStream: EventDrivenL2BlockStream | undefined;
|
|
@@ -71,4 +70,4 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
71
70
|
*/
|
|
72
71
|
private setCurrentState;
|
|
73
72
|
}
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zZXJ2ZXJfd29ybGRfc3RhdGVfc3luY2hyb25pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQW9CLE1BQU0saUNBQWlDLENBQUM7QUFFaEYsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR2xFLE9BQU8sRUFDTCxLQUFLLFNBQVMsRUFDZCx3QkFBd0IsRUFFeEIsS0FBSyxhQUFhLEVBQ2xCLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUsseUJBQXlCLEVBQzlCLEtBQUssOEJBQThCLEVBQ25DLEtBQUssY0FBYyxFQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFHTCxLQUFLLHNCQUFzQixFQUMzQixLQUFLLDRCQUE0QixFQUNsQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRSxPQUFPLEVBQWdCLEtBQUssd0JBQXdCLEVBQUUsS0FBSyx5QkFBeUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xILE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRWxGLE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbkYsT0FBTyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJcEQsWUFBWSxFQUFFLGdCQUFnQixFQUFFLENBQUM7QUFFakM7Ozs7R0FJRztBQUNILHFCQUFhLDRCQUNYLFlBQVcsc0JBQXNCLEVBQUUsOEJBQThCLEVBQUUseUJBQXlCO0lBZTFGLE9BQU8s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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAoB,MAAM,iCAAiC,CAAC;AAEhF,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EACL,KAAK,SAAS,EACd,wBAAwB,EAExB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,8BAA8B,EACnC,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,4BAA4B,EAClC,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAgB,KAAK,wBAAwB,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGlH,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAElF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
|
8
8
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
9
9
|
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
10
10
|
import { WorldStateSynchronizerError } from './errors.js';
|
|
11
|
+
import { getWorldStateHistoryStartCheckpoint, validateWorldStateHistory } from './history.js';
|
|
11
12
|
/**
|
|
12
13
|
* Synchronizes the world state with the L2 blocks from a L2BlockSource via a block stream.
|
|
13
14
|
* The synchronizer will download the L2 blocks from the L2BlockSource and update the merkle trees.
|
|
@@ -20,7 +21,6 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
20
21
|
log;
|
|
21
22
|
merkleTreeCommitted;
|
|
22
23
|
latestBlockNumberAtStart;
|
|
23
|
-
historyToKeep;
|
|
24
24
|
currentState;
|
|
25
25
|
syncPromise;
|
|
26
26
|
blockStream;
|
|
@@ -37,8 +37,10 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
37
37
|
this.currentState = WorldStateRunningState.IDLE;
|
|
38
38
|
this.syncPromise = promiseWithResolvers();
|
|
39
39
|
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
40
|
-
this.
|
|
41
|
-
|
|
40
|
+
this.log.info('Created world state synchronizer', {
|
|
41
|
+
historyStartCheckpoint: getWorldStateHistoryStartCheckpoint(config),
|
|
42
|
+
checkpointHistory: config.worldStateCheckpointHistory
|
|
43
|
+
});
|
|
42
44
|
}
|
|
43
45
|
getCommitted() {
|
|
44
46
|
return this.merkleTreeDb.getCommitted();
|
|
@@ -95,6 +97,16 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
95
97
|
if (this.currentState !== WorldStateRunningState.IDLE) {
|
|
96
98
|
return this.syncPromise;
|
|
97
99
|
}
|
|
100
|
+
const summary = await this.merkleTreeDb.getStatusSummary();
|
|
101
|
+
if (this.config.worldStatePruneBeforeCheckpoint !== undefined) {
|
|
102
|
+
await validateWorldStateHistory(this.config, summary, this.l2BlockSource);
|
|
103
|
+
}
|
|
104
|
+
this.log.info('World state history available at startup', {
|
|
105
|
+
oldestHistoricBlock: summary.oldestHistoricalBlock,
|
|
106
|
+
latestBlock: summary.unfinalizedBlockNumber,
|
|
107
|
+
historyStartCheckpoint: getWorldStateHistoryStartCheckpoint(this.config),
|
|
108
|
+
checkpointHistory: this.config.worldStateCheckpointHistory
|
|
109
|
+
});
|
|
98
110
|
// Get the current latest block number
|
|
99
111
|
this.latestBlockNumberAtStart = BlockNumber(await this.l2BlockSource.getBlockNumber());
|
|
100
112
|
const blockToDownloadFrom = await this.getLatestBlockNumber() + 1;
|
|
@@ -353,7 +365,8 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
353
365
|
return;
|
|
354
366
|
}
|
|
355
367
|
const summary = await this.merkleTreeDb.setFinalized(blockNumber);
|
|
356
|
-
|
|
368
|
+
const historyStartCheckpoint = getWorldStateHistoryStartCheckpoint(this.config);
|
|
369
|
+
if (historyStartCheckpoint === CheckpointNumber.ZERO) {
|
|
357
370
|
return;
|
|
358
371
|
}
|
|
359
372
|
const finalisedBlockData = await this.l2BlockSource.getBlockData({
|
|
@@ -364,7 +377,7 @@ import { WorldStateSynchronizerError } from './errors.js';
|
|
|
364
377
|
return;
|
|
365
378
|
}
|
|
366
379
|
// Compute the required historic checkpoint number
|
|
367
|
-
const newHistoricCheckpointNumber = finalisedBlockData.checkpointNumber - this.
|
|
380
|
+
const newHistoricCheckpointNumber = historyStartCheckpoint === undefined ? finalisedBlockData.checkpointNumber - this.config.worldStateCheckpointHistory + 1 : Math.min(historyStartCheckpoint, finalisedBlockData.checkpointNumber);
|
|
368
381
|
if (newHistoricCheckpointNumber <= 1) {
|
|
369
382
|
return;
|
|
370
383
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "5.3.0
|
|
3
|
+
"version": "5.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -64,20 +64,20 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/bb.js": "5.3.0
|
|
68
|
-
"@aztec/constants": "5.3.0
|
|
69
|
-
"@aztec/foundation": "5.3.0
|
|
70
|
-
"@aztec/kv-store": "5.3.0
|
|
71
|
-
"@aztec/native": "5.3.0
|
|
72
|
-
"@aztec/protocol-contracts": "5.3.0
|
|
73
|
-
"@aztec/stdlib": "5.3.0
|
|
74
|
-
"@aztec/telemetry-client": "5.3.0
|
|
67
|
+
"@aztec/bb.js": "5.3.0",
|
|
68
|
+
"@aztec/constants": "5.3.0",
|
|
69
|
+
"@aztec/foundation": "5.3.0",
|
|
70
|
+
"@aztec/kv-store": "5.3.0",
|
|
71
|
+
"@aztec/native": "5.3.0",
|
|
72
|
+
"@aztec/protocol-contracts": "5.3.0",
|
|
73
|
+
"@aztec/stdlib": "5.3.0",
|
|
74
|
+
"@aztec/telemetry-client": "5.3.0",
|
|
75
75
|
"msgpackr": "^1.11.2",
|
|
76
76
|
"tslib": "^2.4.0",
|
|
77
77
|
"zod": "~4.4.3"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
-
"@aztec/archiver": "5.3.0
|
|
80
|
+
"@aztec/archiver": "5.3.0",
|
|
81
81
|
"@jest/globals": "^30.0.0",
|
|
82
82
|
"@types/jest": "^30.0.0",
|
|
83
83
|
"@types/node": "^22.15.17",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type CheckpointNumber, CheckpointNumberSchema } from '@aztec/foundation/branded-types';
|
|
1
2
|
import {
|
|
2
3
|
type ConfigMappingsType,
|
|
3
4
|
getConfigFromMappings,
|
|
@@ -36,6 +37,9 @@ export interface WorldStateConfig {
|
|
|
36
37
|
|
|
37
38
|
/** The number of historic checkpoints worth of blocks to maintain */
|
|
38
39
|
worldStateCheckpointHistory: number;
|
|
40
|
+
|
|
41
|
+
/** Retain this checkpoint and every later checkpoint, overriding the rolling checkpoint window. */
|
|
42
|
+
worldStatePruneBeforeCheckpoint?: CheckpointNumber;
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
export const worldStateConfigMappings: ConfigMappingsType<WorldStateConfig> = {
|
|
@@ -95,6 +99,12 @@ export const worldStateConfigMappings: ConfigMappingsType<WorldStateConfig> = {
|
|
|
95
99
|
fallback: ['WS_NUM_HISTORIC_BLOCKS'],
|
|
96
100
|
...numberConfigHelper(64),
|
|
97
101
|
},
|
|
102
|
+
worldStatePruneBeforeCheckpoint: {
|
|
103
|
+
env: 'WS_PRUNE_BEFORE_CHECKPOINT',
|
|
104
|
+
description:
|
|
105
|
+
'Retain world state from the start of this checkpoint onwards, overriding WS_NUM_HISTORIC_CHECKPOINTS. Set to 0 to retain all history.',
|
|
106
|
+
parseEnv: value => CheckpointNumberSchema.parse(value),
|
|
107
|
+
},
|
|
98
108
|
};
|
|
99
109
|
|
|
100
110
|
/**
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { CheckpointNumber, CheckpointNumberSchema } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
3
|
+
|
|
4
|
+
import type { WorldStateStatusSummary } from '../native/message.js';
|
|
5
|
+
import type { WorldStateConfig } from './config.js';
|
|
6
|
+
|
|
7
|
+
/** Returns the fixed checkpoint boundary, or undefined for a rolling checkpoint window. */
|
|
8
|
+
export function getWorldStateHistoryStartCheckpoint(
|
|
9
|
+
config: Pick<WorldStateConfig, 'worldStatePruneBeforeCheckpoint' | 'worldStateCheckpointHistory'>,
|
|
10
|
+
): CheckpointNumber | undefined {
|
|
11
|
+
if (config.worldStatePruneBeforeCheckpoint !== undefined) {
|
|
12
|
+
return CheckpointNumberSchema.parse(config.worldStatePruneBeforeCheckpoint);
|
|
13
|
+
}
|
|
14
|
+
return config.worldStateCheckpointHistory < 1 ? CheckpointNumber.ZERO : undefined;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Rejects a database whose retained history cannot satisfy the configured pruning policy. */
|
|
18
|
+
export async function validateWorldStateHistory(
|
|
19
|
+
config: Pick<WorldStateConfig, 'worldStatePruneBeforeCheckpoint' | 'worldStateCheckpointHistory'>,
|
|
20
|
+
summary: WorldStateStatusSummary,
|
|
21
|
+
blockSource?: Pick<L2BlockSource, 'getBlockData'>,
|
|
22
|
+
): Promise<void> {
|
|
23
|
+
const startCheckpoint = getWorldStateHistoryStartCheckpoint(config);
|
|
24
|
+
const { oldestHistoricalBlock, unfinalizedBlockNumber, finalizedBlockNumber } = summary;
|
|
25
|
+
if (oldestHistoricalBlock <= 1) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const available = `World state retains blocks ${oldestHistoricalBlock} to ${unfinalizedBlockNumber}`;
|
|
29
|
+
const recovery = 'Use a fresh world-state database to rebuild the required history from a snapshot or genesis.';
|
|
30
|
+
if (startCheckpoint === CheckpointNumber.ZERO) {
|
|
31
|
+
throw new Error(`${available}, but all checkpoint history is required. ${recovery}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const oldest = await blockSource?.getBlockData({ number: oldestHistoricalBlock });
|
|
35
|
+
let requiredCheckpoint = startCheckpoint;
|
|
36
|
+
if (requiredCheckpoint === undefined) {
|
|
37
|
+
const finalized = await blockSource?.getBlockData({ number: finalizedBlockNumber });
|
|
38
|
+
if (finalized) {
|
|
39
|
+
requiredCheckpoint = CheckpointNumber(
|
|
40
|
+
Math.max(1, finalized.checkpointNumber - config.worldStateCheckpointHistory + 1),
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!oldest || requiredCheckpoint === undefined) {
|
|
45
|
+
throw new Error(`${available}, but its checkpoint history could not be verified against the archiver.`);
|
|
46
|
+
}
|
|
47
|
+
if (
|
|
48
|
+
oldest.checkpointNumber > requiredCheckpoint ||
|
|
49
|
+
(oldest.checkpointNumber === requiredCheckpoint && oldest.indexWithinCheckpoint !== 0)
|
|
50
|
+
) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
`${available}, but history is required from the start of checkpoint ${requiredCheckpoint}. ${recovery}`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -30,6 +30,7 @@ import type { WorldStateStatusFull } from '../native/message.js';
|
|
|
30
30
|
import type { MerkleTreeAdminDatabase } from '../world-state-db/merkle_tree_db.js';
|
|
31
31
|
import type { WorldStateConfig } from './config.js';
|
|
32
32
|
import { WorldStateSynchronizerError } from './errors.js';
|
|
33
|
+
import { getWorldStateHistoryStartCheckpoint, validateWorldStateHistory } from './history.js';
|
|
33
34
|
|
|
34
35
|
export type { SnapshotDataKeys };
|
|
35
36
|
|
|
@@ -44,7 +45,6 @@ export class ServerWorldStateSynchronizer
|
|
|
44
45
|
private readonly merkleTreeCommitted: MerkleTreeReadOperations;
|
|
45
46
|
|
|
46
47
|
private latestBlockNumberAtStart = BlockNumber.ZERO;
|
|
47
|
-
private historyToKeep: number | undefined;
|
|
48
48
|
private currentState: WorldStateRunningState = WorldStateRunningState.IDLE;
|
|
49
49
|
|
|
50
50
|
private syncPromise = promiseWithResolvers<void>();
|
|
@@ -62,12 +62,10 @@ export class ServerWorldStateSynchronizer
|
|
|
62
62
|
private readonly log: Logger = createLogger('world_state'),
|
|
63
63
|
) {
|
|
64
64
|
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
65
|
-
this.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}`,
|
|
70
|
-
);
|
|
65
|
+
this.log.info('Created world state synchronizer', {
|
|
66
|
+
historyStartCheckpoint: getWorldStateHistoryStartCheckpoint(config),
|
|
67
|
+
checkpointHistory: config.worldStateCheckpointHistory,
|
|
68
|
+
});
|
|
71
69
|
}
|
|
72
70
|
|
|
73
71
|
public getCommitted(): MerkleTreeReadOperations {
|
|
@@ -138,6 +136,17 @@ export class ServerWorldStateSynchronizer
|
|
|
138
136
|
return this.syncPromise;
|
|
139
137
|
}
|
|
140
138
|
|
|
139
|
+
const summary = await this.merkleTreeDb.getStatusSummary();
|
|
140
|
+
if (this.config.worldStatePruneBeforeCheckpoint !== undefined) {
|
|
141
|
+
await validateWorldStateHistory(this.config, summary, this.l2BlockSource);
|
|
142
|
+
}
|
|
143
|
+
this.log.info('World state history available at startup', {
|
|
144
|
+
oldestHistoricBlock: summary.oldestHistoricalBlock,
|
|
145
|
+
latestBlock: summary.unfinalizedBlockNumber,
|
|
146
|
+
historyStartCheckpoint: getWorldStateHistoryStartCheckpoint(this.config),
|
|
147
|
+
checkpointHistory: this.config.worldStateCheckpointHistory,
|
|
148
|
+
});
|
|
149
|
+
|
|
141
150
|
// Get the current latest block number
|
|
142
151
|
this.latestBlockNumberAtStart = BlockNumber(await this.l2BlockSource.getBlockNumber());
|
|
143
152
|
|
|
@@ -439,7 +448,8 @@ export class ServerWorldStateSynchronizer
|
|
|
439
448
|
return;
|
|
440
449
|
}
|
|
441
450
|
const summary = await this.merkleTreeDb.setFinalized(blockNumber);
|
|
442
|
-
|
|
451
|
+
const historyStartCheckpoint = getWorldStateHistoryStartCheckpoint(this.config);
|
|
452
|
+
if (historyStartCheckpoint === CheckpointNumber.ZERO) {
|
|
443
453
|
return;
|
|
444
454
|
}
|
|
445
455
|
const finalisedBlockData = await this.l2BlockSource.getBlockData({ number: summary.finalizedBlockNumber });
|
|
@@ -450,7 +460,10 @@ export class ServerWorldStateSynchronizer
|
|
|
450
460
|
return;
|
|
451
461
|
}
|
|
452
462
|
// Compute the required historic checkpoint number
|
|
453
|
-
const newHistoricCheckpointNumber =
|
|
463
|
+
const newHistoricCheckpointNumber =
|
|
464
|
+
historyStartCheckpoint === undefined
|
|
465
|
+
? finalisedBlockData.checkpointNumber - this.config.worldStateCheckpointHistory + 1
|
|
466
|
+
: Math.min(historyStartCheckpoint, finalisedBlockData.checkpointNumber);
|
|
454
467
|
if (newHistoricCheckpointNumber <= 1) {
|
|
455
468
|
return;
|
|
456
469
|
}
|