@aztec/world-state 0.84.0 → 0.85.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/dest/native/native_world_state.js +7 -2
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +3 -2
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +12 -3
- package/package.json +10 -13
- package/src/native/native_world_state.ts +5 -5
- package/src/synchronizer/server_world_state_synchronizer.ts +13 -3
|
@@ -36,8 +36,13 @@ export class NativeWorldStateService {
|
|
|
36
36
|
static async new(rollupAddress, dataDir, dbMapSizeKb, prefilledPublicData = [], instrumentation = new WorldStateInstrumentation(getTelemetryClient()), log = createLogger('world-state:database'), cleanup = ()=>Promise.resolve()) {
|
|
37
37
|
const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
|
|
38
38
|
// Create a version manager to handle versioning
|
|
39
|
-
const versionManager = new DatabaseVersionManager(
|
|
40
|
-
|
|
39
|
+
const versionManager = new DatabaseVersionManager({
|
|
40
|
+
schemaVersion: WORLD_STATE_DB_VERSION,
|
|
41
|
+
rollupAddress,
|
|
42
|
+
dataDirectory: worldStateDirectory,
|
|
43
|
+
onOpen: (dir)=>{
|
|
44
|
+
return Promise.resolve(new NativeWorldState(dir, dbMapSizeKb, prefilledPublicData, instrumentation));
|
|
45
|
+
}
|
|
41
46
|
});
|
|
42
47
|
const [instance] = await versionManager.open();
|
|
43
48
|
const worldState = new this(instance, instrumentation, log, cleanup);
|
|
@@ -43,10 +43,11 @@ export declare class ServerWorldStateSynchronizer implements WorldStateSynchroni
|
|
|
43
43
|
resumeSync(): void;
|
|
44
44
|
/**
|
|
45
45
|
* Forces an immediate sync.
|
|
46
|
-
* @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
|
|
46
|
+
* @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
|
|
47
|
+
* @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
|
|
47
48
|
* @returns A promise that resolves with the block number the world state was synced to
|
|
48
49
|
*/
|
|
49
|
-
syncImmediate(targetBlockNumber?: number): Promise<number>;
|
|
50
|
+
syncImmediate(targetBlockNumber?: number, skipThrowIfTargetNotReached?: boolean): Promise<number>;
|
|
50
51
|
/** Returns the L2 block hash for a given number. Used by the L2BlockStream for detecting reorgs. */
|
|
51
52
|
getL2BlockHash(number: number): Promise<string | undefined>;
|
|
52
53
|
/** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server_world_state_synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/server_world_state_synchronizer.ts"],"names":[],"mappings":";;AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAKlE,OAAO,KAAK,EAGV,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,yBAAyB,EACzB,8BAA8B,EAC9B,MAAM,EACP,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;AAEpD,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;;;GAIG;AACH,qBAAa,4BACX,YAAW,sBAAsB,EAAE,8BAA8B,EAAE,yBAAyB;IAa1F,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAftB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA2B;IAE/D,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,oBAAoB,CAA4E;IAExG,OAAO,CAAC,WAAW,CAAgC;IACnD,SAAS,CAAC,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;gBAG9B,YAAY,EAAE,uBAAuB,EACrC,aAAa,EAAE,aAAa,GAAG,mBAAmB,EAClD,MAAM,EAAE,gBAAgB,EACjC,eAAe,4BAAsD,EAC5D,GAAG,GAAE,MAAoC;IAWrD,YAAY,IAAI,wBAAwB;IAIxC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB;IAI1D,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAI9D,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAItG,KAAK;IAgClB,SAAS,CAAC,iBAAiB,IAAI,aAAa;IAU/B,IAAI;IASJ,MAAM,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAe/C,oBAAoB;IAIpB,QAAQ;IAMd,UAAU;IASjB
|
|
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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"}
|
|
@@ -125,9 +125,10 @@ import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js
|
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
127
127
|
* Forces an immediate sync.
|
|
128
|
-
* @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
|
|
128
|
+
* @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
|
|
129
|
+
* @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
|
|
129
130
|
* @returns A promise that resolves with the block number the world state was synced to
|
|
130
|
-
*/ async syncImmediate(targetBlockNumber) {
|
|
131
|
+
*/ async syncImmediate(targetBlockNumber, skipThrowIfTargetNotReached) {
|
|
131
132
|
if (this.currentState !== WorldStateRunningState.RUNNING || this.blockStream === undefined) {
|
|
132
133
|
throw new Error(`World State is not running. Unable to perform sync.`);
|
|
133
134
|
}
|
|
@@ -137,11 +138,19 @@ import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js
|
|
|
137
138
|
return currentBlockNumber;
|
|
138
139
|
}
|
|
139
140
|
this.log.debug(`World State at ${currentBlockNumber} told to sync to ${targetBlockNumber ?? 'latest'}`);
|
|
141
|
+
// If the archiver is behind the target block, force an archiver sync
|
|
142
|
+
if (targetBlockNumber) {
|
|
143
|
+
const archiverLatestBlock = await this.l2BlockSource.getBlockNumber();
|
|
144
|
+
if (archiverLatestBlock < targetBlockNumber) {
|
|
145
|
+
this.log.debug(`Archiver is at ${archiverLatestBlock} behind target block ${targetBlockNumber}.`);
|
|
146
|
+
await this.l2BlockSource.syncImmediate();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
140
149
|
// Force the block stream to sync against the archiver now
|
|
141
150
|
await this.blockStream.sync();
|
|
142
151
|
// If we have been given a block number to sync to and we have not reached that number then fail
|
|
143
152
|
const updatedBlockNumber = await this.getLatestBlockNumber();
|
|
144
|
-
if (targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
|
|
153
|
+
if (!skipThrowIfTargetNotReached && targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
|
|
145
154
|
throw new Error(`Unable to sync to block number ${targetBlockNumber} (last synced is ${updatedBlockNumber})`);
|
|
146
155
|
}
|
|
147
156
|
return updatedBlockNumber;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.85.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -62,27 +62,24 @@
|
|
|
62
62
|
]
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@aztec/constants": "0.
|
|
66
|
-
"@aztec/foundation": "0.
|
|
67
|
-
"@aztec/kv-store": "0.
|
|
68
|
-
"@aztec/merkle-tree": "0.
|
|
69
|
-
"@aztec/native": "0.
|
|
70
|
-
"@aztec/protocol-contracts": "0.
|
|
71
|
-
"@aztec/stdlib": "0.
|
|
72
|
-
"@aztec/telemetry-client": "0.
|
|
65
|
+
"@aztec/constants": "0.85.0",
|
|
66
|
+
"@aztec/foundation": "0.85.0",
|
|
67
|
+
"@aztec/kv-store": "0.85.0",
|
|
68
|
+
"@aztec/merkle-tree": "0.85.0",
|
|
69
|
+
"@aztec/native": "0.85.0",
|
|
70
|
+
"@aztec/protocol-contracts": "0.85.0",
|
|
71
|
+
"@aztec/stdlib": "0.85.0",
|
|
72
|
+
"@aztec/telemetry-client": "0.85.0",
|
|
73
73
|
"tslib": "^2.4.0",
|
|
74
74
|
"zod": "^3.23.8"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
|
-
"@aztec/archiver": "0.
|
|
77
|
+
"@aztec/archiver": "0.85.0",
|
|
78
78
|
"@jest/globals": "^29.5.0",
|
|
79
79
|
"@types/jest": "^29.5.0",
|
|
80
|
-
"@types/levelup": "^5.1.2",
|
|
81
|
-
"@types/memdown": "^3.0.0",
|
|
82
80
|
"@types/node": "^18.7.23",
|
|
83
81
|
"jest": "^29.5.0",
|
|
84
82
|
"jest-mock-extended": "^3.0.5",
|
|
85
|
-
"memdown": "^6.1.1",
|
|
86
83
|
"ts-node": "^10.9.1",
|
|
87
84
|
"typescript": "^5.0.4"
|
|
88
85
|
},
|
|
@@ -64,14 +64,14 @@ export class NativeWorldStateService implements MerkleTreeDatabase {
|
|
|
64
64
|
): Promise<NativeWorldStateService> {
|
|
65
65
|
const worldStateDirectory = join(dataDir, WORLD_STATE_DIR);
|
|
66
66
|
// Create a version manager to handle versioning
|
|
67
|
-
const versionManager = new DatabaseVersionManager(
|
|
68
|
-
WORLD_STATE_DB_VERSION,
|
|
67
|
+
const versionManager = new DatabaseVersionManager({
|
|
68
|
+
schemaVersion: WORLD_STATE_DB_VERSION,
|
|
69
69
|
rollupAddress,
|
|
70
|
-
worldStateDirectory,
|
|
71
|
-
(dir: string) => {
|
|
70
|
+
dataDirectory: worldStateDirectory,
|
|
71
|
+
onOpen: (dir: string) => {
|
|
72
72
|
return Promise.resolve(new NativeWorldState(dir, dbMapSizeKb, prefilledPublicData, instrumentation));
|
|
73
73
|
},
|
|
74
|
-
);
|
|
74
|
+
});
|
|
75
75
|
|
|
76
76
|
const [instance] = await versionManager.open();
|
|
77
77
|
const worldState = new this(instance, instrumentation, log, cleanup);
|
|
@@ -171,10 +171,11 @@ export class ServerWorldStateSynchronizer
|
|
|
171
171
|
|
|
172
172
|
/**
|
|
173
173
|
* Forces an immediate sync.
|
|
174
|
-
* @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
|
|
174
|
+
* @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
|
|
175
|
+
* @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
|
|
175
176
|
* @returns A promise that resolves with the block number the world state was synced to
|
|
176
177
|
*/
|
|
177
|
-
public async syncImmediate(targetBlockNumber?: number): Promise<number> {
|
|
178
|
+
public async syncImmediate(targetBlockNumber?: number, skipThrowIfTargetNotReached?: boolean): Promise<number> {
|
|
178
179
|
if (this.currentState !== WorldStateRunningState.RUNNING || this.blockStream === undefined) {
|
|
179
180
|
throw new Error(`World State is not running. Unable to perform sync.`);
|
|
180
181
|
}
|
|
@@ -186,12 +187,21 @@ export class ServerWorldStateSynchronizer
|
|
|
186
187
|
}
|
|
187
188
|
this.log.debug(`World State at ${currentBlockNumber} told to sync to ${targetBlockNumber ?? 'latest'}`);
|
|
188
189
|
|
|
190
|
+
// If the archiver is behind the target block, force an archiver sync
|
|
191
|
+
if (targetBlockNumber) {
|
|
192
|
+
const archiverLatestBlock = await this.l2BlockSource.getBlockNumber();
|
|
193
|
+
if (archiverLatestBlock < targetBlockNumber) {
|
|
194
|
+
this.log.debug(`Archiver is at ${archiverLatestBlock} behind target block ${targetBlockNumber}.`);
|
|
195
|
+
await this.l2BlockSource.syncImmediate();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
189
199
|
// Force the block stream to sync against the archiver now
|
|
190
200
|
await this.blockStream.sync();
|
|
191
201
|
|
|
192
202
|
// If we have been given a block number to sync to and we have not reached that number then fail
|
|
193
203
|
const updatedBlockNumber = await this.getLatestBlockNumber();
|
|
194
|
-
if (targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
|
|
204
|
+
if (!skipThrowIfTargetNotReached && targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
|
|
195
205
|
throw new Error(`Unable to sync to block number ${targetBlockNumber} (last synced is ${updatedBlockNumber})`);
|
|
196
206
|
}
|
|
197
207
|
|