@aztec/world-state 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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/index.js +0 -1
- package/dest/instrumentation/instrumentation.js +29 -20
- package/dest/native/index.js +0 -1
- package/dest/native/merkle_trees_facade.js +69 -72
- package/dest/native/message.js +31 -17
- package/dest/native/native_world_state.js +78 -53
- package/dest/native/native_world_state_instance.js +37 -38
- package/dest/native/world_state_ops_queue.js +18 -29
- package/dest/native/world_state_version.js +7 -8
- package/dest/synchronizer/config.js +12 -14
- package/dest/synchronizer/factory.js +5 -5
- package/dest/synchronizer/index.js +0 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +66 -61
- package/dest/test/index.js +0 -1
- package/dest/test/utils.js +14 -12
- package/dest/world-state-db/index.js +0 -1
- package/dest/world-state-db/merkle_tree_db.js +1 -3
- package/package.json +10 -10
- package/src/world-state-db/index.ts +1 -1
- package/dest/index.d.ts +0 -5
- package/dest/index.d.ts.map +0 -1
- package/dest/instrumentation/instrumentation.d.ts +0 -20
- package/dest/instrumentation/instrumentation.d.ts.map +0 -1
- package/dest/native/index.d.ts +0 -2
- package/dest/native/index.d.ts.map +0 -1
- package/dest/native/merkle_trees_facade.d.ts +0 -37
- package/dest/native/merkle_trees_facade.d.ts.map +0 -1
- package/dest/native/message.d.ts +0 -320
- package/dest/native/message.d.ts.map +0 -1
- package/dest/native/native_world_state.d.ts +0 -54
- package/dest/native/native_world_state.d.ts.map +0 -1
- package/dest/native/native_world_state_instance.d.ts +0 -32
- package/dest/native/native_world_state_instance.d.ts.map +0 -1
- package/dest/native/world_state_ops_queue.d.ts +0 -19
- package/dest/native/world_state_ops_queue.d.ts.map +0 -1
- package/dest/native/world_state_version.d.ts +0 -24
- package/dest/native/world_state_version.d.ts.map +0 -1
- package/dest/synchronizer/config.d.ts +0 -23
- package/dest/synchronizer/config.d.ts.map +0 -1
- package/dest/synchronizer/factory.d.ts +0 -10
- package/dest/synchronizer/factory.d.ts.map +0 -1
- package/dest/synchronizer/index.d.ts +0 -3
- package/dest/synchronizer/index.d.ts.map +0 -1
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +0 -76
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +0 -1
- package/dest/test/index.d.ts +0 -2
- package/dest/test/index.d.ts.map +0 -1
- package/dest/test/utils.d.ts +0 -14
- package/dest/test/utils.d.ts.map +0 -1
- package/dest/world-state-db/index.d.ts +0 -3
- package/dest/world-state-db/index.d.ts.map +0 -1
- package/dest/world-state-db/merkle_tree_db.d.ts +0 -67
- package/dest/world-state-db/merkle_tree_db.d.ts.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { MerkleTreeId
|
|
2
|
-
import { BlockHeader, EthAddress, Fr, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeaf, PartialStateReference, PublicDataTreeLeaf, StateReference
|
|
1
|
+
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
+
import { BlockHeader, EthAddress, Fr, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeaf, PartialStateReference, PublicDataTreeLeaf, StateReference } from '@aztec/circuits.js';
|
|
3
3
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -9,7 +9,7 @@ import { tmpdir } from 'os';
|
|
|
9
9
|
import { join } from 'path';
|
|
10
10
|
import { WorldStateInstrumentation } from '../instrumentation/instrumentation.js';
|
|
11
11
|
import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
|
|
12
|
-
import { WorldStateMessageType, blockStateReference, sanitiseFullStatus, sanitiseSummary, treeStateReferenceToSnapshot, worldStateRevision
|
|
12
|
+
import { WorldStateMessageType, blockStateReference, sanitiseFullStatus, sanitiseSummary, treeStateReferenceToSnapshot, worldStateRevision } from './message.js';
|
|
13
13
|
import { NativeWorldState } from './native_world_state_instance.js';
|
|
14
14
|
import { WorldStateVersion } from './world_state_version.js';
|
|
15
15
|
export const WORLD_STATE_VERSION_FILE = 'version';
|
|
@@ -20,37 +20,52 @@ export const WORLD_STATE_VERSION_FILE = 'version';
|
|
|
20
20
|
// the state if a change is detected
|
|
21
21
|
export const WORLD_STATE_DB_VERSION = 1; // The initial version
|
|
22
22
|
export class NativeWorldStateService {
|
|
23
|
-
|
|
23
|
+
instance;
|
|
24
|
+
worldStateInstrumentation;
|
|
25
|
+
log;
|
|
26
|
+
cleanup;
|
|
27
|
+
initialHeader;
|
|
28
|
+
// This is read heavily and only changes when data is persisted, so we cache it
|
|
29
|
+
cachedStatusSummary;
|
|
30
|
+
constructor(instance, worldStateInstrumentation, log = createLogger('world-state:database'), cleanup = ()=>Promise.resolve()){
|
|
24
31
|
this.instance = instance;
|
|
25
32
|
this.worldStateInstrumentation = worldStateInstrumentation;
|
|
26
33
|
this.log = log;
|
|
27
34
|
this.cleanup = cleanup;
|
|
28
35
|
}
|
|
29
|
-
static async new(rollupAddress, dataDir, dbMapSizeKb, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), log = createLogger('world-state:database'), cleanup = ()
|
|
36
|
+
static async new(rollupAddress, dataDir, dbMapSizeKb, instrumentation = new WorldStateInstrumentation(getTelemetryClient()), log = createLogger('world-state:database'), cleanup = ()=>Promise.resolve()) {
|
|
30
37
|
const worldStateDirectory = join(dataDir, 'world_state');
|
|
31
38
|
const versionFile = join(worldStateDirectory, WORLD_STATE_VERSION_FILE);
|
|
32
39
|
const storedWorldStateVersion = await WorldStateVersion.readVersion(versionFile);
|
|
33
40
|
if (!storedWorldStateVersion) {
|
|
34
41
|
log.warn('No world state version found, deleting world state directory');
|
|
35
|
-
await rm(worldStateDirectory, {
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
await rm(worldStateDirectory, {
|
|
43
|
+
recursive: true,
|
|
44
|
+
force: true
|
|
45
|
+
});
|
|
46
|
+
} else if (!rollupAddress.equals(storedWorldStateVersion.rollupAddress)) {
|
|
38
47
|
log.warn('Rollup address changed, deleting world state directory');
|
|
39
|
-
await rm(worldStateDirectory, {
|
|
40
|
-
|
|
41
|
-
|
|
48
|
+
await rm(worldStateDirectory, {
|
|
49
|
+
recursive: true,
|
|
50
|
+
force: true
|
|
51
|
+
});
|
|
52
|
+
} else if (storedWorldStateVersion.version != WORLD_STATE_DB_VERSION) {
|
|
42
53
|
log.warn('World state version change detected, deleting world state directory');
|
|
43
|
-
await rm(worldStateDirectory, {
|
|
54
|
+
await rm(worldStateDirectory, {
|
|
55
|
+
recursive: true,
|
|
56
|
+
force: true
|
|
57
|
+
});
|
|
44
58
|
}
|
|
45
59
|
const newWorldStateVersion = new WorldStateVersion(WORLD_STATE_DB_VERSION, rollupAddress);
|
|
46
|
-
await mkdir(worldStateDirectory, {
|
|
60
|
+
await mkdir(worldStateDirectory, {
|
|
61
|
+
recursive: true
|
|
62
|
+
});
|
|
47
63
|
await newWorldStateVersion.writeVersionFile(versionFile);
|
|
48
64
|
const instance = new NativeWorldState(worldStateDirectory, dbMapSizeKb, instrumentation);
|
|
49
65
|
const worldState = new this(instance, instrumentation, log, cleanup);
|
|
50
66
|
try {
|
|
51
67
|
await worldState.init();
|
|
52
|
-
}
|
|
53
|
-
catch (e) {
|
|
68
|
+
} catch (e) {
|
|
54
69
|
log.error(`Error initialising world state: ${e}`);
|
|
55
70
|
throw e;
|
|
56
71
|
}
|
|
@@ -62,12 +77,14 @@ export class NativeWorldStateService {
|
|
|
62
77
|
const dbMapSizeKb = 10 * 1024 * 1024;
|
|
63
78
|
log.debug(`Created temporary world state database at: ${dataDir} with size: ${dbMapSizeKb}`);
|
|
64
79
|
// pass a cleanup callback because process.on('beforeExit', cleanup) does not work under Jest
|
|
65
|
-
const cleanup = async ()
|
|
80
|
+
const cleanup = async ()=>{
|
|
66
81
|
if (cleanupTmpDir) {
|
|
67
|
-
await rm(dataDir, {
|
|
82
|
+
await rm(dataDir, {
|
|
83
|
+
recursive: true,
|
|
84
|
+
force: true
|
|
85
|
+
});
|
|
68
86
|
log.debug(`Deleted temporary world state database: ${dataDir}`);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
87
|
+
} else {
|
|
71
88
|
log.debug(`Leaving temporary world state database: ${dataDir}`);
|
|
72
89
|
}
|
|
73
90
|
};
|
|
@@ -87,7 +104,9 @@ export class NativeWorldStateService {
|
|
|
87
104
|
}
|
|
88
105
|
// the initial header _must_ be the first element in the archive tree
|
|
89
106
|
// if this assertion fails, check that the hashing done in Header in yarn-project matches the initial header hash done in world_state.cpp
|
|
90
|
-
const indices = await committed.findLeafIndices(MerkleTreeId.ARCHIVE, [
|
|
107
|
+
const indices = await committed.findLeafIndices(MerkleTreeId.ARCHIVE, [
|
|
108
|
+
await this.initialHeader.hash()
|
|
109
|
+
]);
|
|
91
110
|
const initialHeaderIndex = indices[0];
|
|
92
111
|
assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
|
|
93
112
|
}
|
|
@@ -101,7 +120,7 @@ export class NativeWorldStateService {
|
|
|
101
120
|
const resp = await this.instance.call(WorldStateMessageType.CREATE_FORK, {
|
|
102
121
|
latest: blockNumber === undefined,
|
|
103
122
|
blockNumber: blockNumber ?? 0,
|
|
104
|
-
canonical: true
|
|
123
|
+
canonical: true
|
|
105
124
|
});
|
|
106
125
|
return new MerkleTreesForkFacade(this.instance, this.initialHeader, worldStateRevision(true, resp.forkId, 0));
|
|
107
126
|
}
|
|
@@ -110,13 +129,11 @@ export class NativeWorldStateService {
|
|
|
110
129
|
}
|
|
111
130
|
async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
|
|
112
131
|
// We have to pad both the values within tx effects because that's how the trees are built by circuits.
|
|
113
|
-
const paddedNoteHashes = l2Block.body.txEffects.flatMap(txEffect
|
|
132
|
+
const paddedNoteHashes = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
|
|
114
133
|
const paddedL1ToL2Messages = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
115
|
-
const paddedNullifiers = l2Block.body.txEffects
|
|
116
|
-
|
|
117
|
-
.map(
|
|
118
|
-
const publicDataWrites = l2Block.body.txEffects.flatMap(txEffect => {
|
|
119
|
-
return txEffect.publicDataWrites.map(write => {
|
|
134
|
+
const paddedNullifiers = l2Block.body.txEffects.flatMap((txEffect)=>padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX)).map((nullifier)=>new NullifierLeaf(nullifier));
|
|
135
|
+
const publicDataWrites = l2Block.body.txEffects.flatMap((txEffect)=>{
|
|
136
|
+
return txEffect.publicDataWrites.map((write)=>{
|
|
120
137
|
if (write.isEmpty()) {
|
|
121
138
|
throw new Error('Public data write must not be empty when syncing');
|
|
122
139
|
}
|
|
@@ -131,7 +148,7 @@ export class NativeWorldStateService {
|
|
|
131
148
|
paddedNullifiers: paddedNullifiers.map(serializeLeaf),
|
|
132
149
|
publicDataWrites: publicDataWrites.map(serializeLeaf),
|
|
133
150
|
blockStateRef: blockStateReference(l2Block.header.state),
|
|
134
|
-
canonical: true
|
|
151
|
+
canonical: true
|
|
135
152
|
}, this.sanitiseAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
|
|
136
153
|
}
|
|
137
154
|
async close() {
|
|
@@ -140,67 +157,75 @@ export class NativeWorldStateService {
|
|
|
140
157
|
}
|
|
141
158
|
async buildInitialHeader() {
|
|
142
159
|
const state = await this.getInitialStateReference();
|
|
143
|
-
return BlockHeader.empty({
|
|
160
|
+
return BlockHeader.empty({
|
|
161
|
+
state
|
|
162
|
+
});
|
|
144
163
|
}
|
|
145
164
|
sanitiseAndCacheSummaryFromFull(response) {
|
|
146
165
|
const sanitised = sanitiseFullStatus(response);
|
|
147
|
-
this.cachedStatusSummary = {
|
|
166
|
+
this.cachedStatusSummary = {
|
|
167
|
+
...sanitised.summary
|
|
168
|
+
};
|
|
148
169
|
return sanitised;
|
|
149
170
|
}
|
|
150
171
|
sanitiseAndCacheSummary(response) {
|
|
151
172
|
const sanitised = sanitiseSummary(response);
|
|
152
|
-
this.cachedStatusSummary = {
|
|
173
|
+
this.cachedStatusSummary = {
|
|
174
|
+
...sanitised
|
|
175
|
+
};
|
|
153
176
|
return sanitised;
|
|
154
177
|
}
|
|
155
178
|
deleteCachedSummary(_) {
|
|
156
179
|
this.cachedStatusSummary = undefined;
|
|
157
180
|
}
|
|
158
181
|
/**
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
async setFinalised(toBlockNumber) {
|
|
182
|
+
* Advances the finalised block number to be the number provided
|
|
183
|
+
* @param toBlockNumber The block number that is now the tip of the finalised chain
|
|
184
|
+
* @returns The new WorldStateStatus
|
|
185
|
+
*/ async setFinalised(toBlockNumber) {
|
|
164
186
|
await this.instance.call(WorldStateMessageType.FINALISE_BLOCKS, {
|
|
165
187
|
toBlockNumber,
|
|
166
|
-
canonical: true
|
|
188
|
+
canonical: true
|
|
167
189
|
}, this.sanitiseAndCacheSummary.bind(this), this.deleteCachedSummary.bind(this));
|
|
168
190
|
return this.getStatusSummary();
|
|
169
191
|
}
|
|
170
192
|
/**
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
async removeHistoricalBlocks(toBlockNumber) {
|
|
193
|
+
* Removes all historical snapshots up to but not including the given block number
|
|
194
|
+
* @param toBlockNumber The block number of the new oldest historical block
|
|
195
|
+
* @returns The new WorldStateStatus
|
|
196
|
+
*/ async removeHistoricalBlocks(toBlockNumber) {
|
|
176
197
|
return await this.instance.call(WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS, {
|
|
177
198
|
toBlockNumber,
|
|
178
|
-
canonical: true
|
|
199
|
+
canonical: true
|
|
179
200
|
}, this.sanitiseAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
|
|
180
201
|
}
|
|
181
202
|
/**
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
async unwindBlocks(toBlockNumber) {
|
|
203
|
+
* Removes all pending blocks down to but not including the given block number
|
|
204
|
+
* @param toBlockNumber The block number of the new tip of the pending chain,
|
|
205
|
+
* @returns The new WorldStateStatus
|
|
206
|
+
*/ async unwindBlocks(toBlockNumber) {
|
|
187
207
|
return await this.instance.call(WorldStateMessageType.UNWIND_BLOCKS, {
|
|
188
208
|
toBlockNumber,
|
|
189
|
-
canonical: true
|
|
209
|
+
canonical: true
|
|
190
210
|
}, this.sanitiseAndCacheSummaryFromFull.bind(this), this.deleteCachedSummary.bind(this));
|
|
191
211
|
}
|
|
192
212
|
async getStatusSummary() {
|
|
193
213
|
if (this.cachedStatusSummary !== undefined) {
|
|
194
|
-
return {
|
|
214
|
+
return {
|
|
215
|
+
...this.cachedStatusSummary
|
|
216
|
+
};
|
|
195
217
|
}
|
|
196
|
-
return await this.instance.call(WorldStateMessageType.GET_STATUS, {
|
|
218
|
+
return await this.instance.call(WorldStateMessageType.GET_STATUS, {
|
|
219
|
+
canonical: true
|
|
220
|
+
}, this.sanitiseAndCacheSummary.bind(this));
|
|
197
221
|
}
|
|
198
222
|
updateLeaf(_treeId, _leaf, _index) {
|
|
199
223
|
return Promise.reject(new Error('Method not implemented'));
|
|
200
224
|
}
|
|
201
225
|
async getInitialStateReference() {
|
|
202
|
-
const resp = await this.instance.call(WorldStateMessageType.GET_INITIAL_STATE_REFERENCE, {
|
|
226
|
+
const resp = await this.instance.call(WorldStateMessageType.GET_INITIAL_STATE_REFERENCE, {
|
|
227
|
+
canonical: true
|
|
228
|
+
});
|
|
203
229
|
return new StateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]), new PartialStateReference(treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NOTE_HASH_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.NULLIFIER_TREE]), treeStateReferenceToSnapshot(resp.state[MerkleTreeId.PUBLIC_DATA_TREE])));
|
|
204
230
|
}
|
|
205
231
|
}
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFlBQVksR0FHYixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxFQUNWLEVBQUUsRUFDRixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLG1DQUFtQyxFQUNuQyxhQUFhLEVBRWIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTdELE9BQU8sTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztBQUM1QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTVCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRWxGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRyxPQUFPLEVBQ0wscUJBQXFCLEVBR3JCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLDRCQUE0QixFQUM1QixrQkFBa0IsR0FDbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUs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
|
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
-
import { ARCHIVE_HEIGHT, GeneratorIndex, L1_TO_L2_MSG_TREE_HEIGHT, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT
|
|
2
|
+
import { ARCHIVE_HEIGHT, GeneratorIndex, L1_TO_L2_MSG_TREE_HEIGHT, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, PUBLIC_DATA_TREE_HEIGHT } from '@aztec/circuits.js';
|
|
3
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { NativeWorldState as BaseNativeWorldState, MsgpackChannel } from '@aztec/native';
|
|
5
5
|
import assert from 'assert';
|
|
6
6
|
import { cpus } from 'os';
|
|
7
|
-
import { WorldStateMessageType, isWithCanonical, isWithForkId, isWithRevision
|
|
7
|
+
import { WorldStateMessageType, isWithCanonical, isWithForkId, isWithRevision } from './message.js';
|
|
8
8
|
import { WorldStateOpsQueue } from './world_state_ops_queue.js';
|
|
9
9
|
const MAX_WORLD_STATE_THREADS = +(process.env.HARDWARE_CONCURRENCY || '16');
|
|
10
10
|
/**
|
|
11
11
|
* Strongly-typed interface to access the WorldState class in the native world_state_napi module.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
*/ export class NativeWorldState {
|
|
13
|
+
instrumentation;
|
|
14
|
+
log;
|
|
15
|
+
open;
|
|
16
|
+
// We maintain a map of queue to fork
|
|
17
|
+
queues;
|
|
18
|
+
instance;
|
|
19
|
+
/** Creates a new native WorldState instance */ constructor(dataDir, dbMapSizeKb, instrumentation, log = createLogger('world-state:database')){
|
|
16
20
|
this.instrumentation = instrumentation;
|
|
17
21
|
this.log = log;
|
|
18
22
|
this.open = true;
|
|
19
|
-
// We maintain a map of queue to fork
|
|
20
23
|
this.queues = new Map();
|
|
21
24
|
const threads = Math.min(cpus().length, MAX_WORLD_STATE_THREADS);
|
|
22
25
|
log.info(`Creating world state data store at directory ${dataDir} with map size ${dbMapSizeKb} KB and ${threads} threads.`);
|
|
@@ -25,26 +28,24 @@ export class NativeWorldState {
|
|
|
25
28
|
[MerkleTreeId.NOTE_HASH_TREE]: NOTE_HASH_TREE_HEIGHT,
|
|
26
29
|
[MerkleTreeId.PUBLIC_DATA_TREE]: PUBLIC_DATA_TREE_HEIGHT,
|
|
27
30
|
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: L1_TO_L2_MSG_TREE_HEIGHT,
|
|
28
|
-
[MerkleTreeId.ARCHIVE]: ARCHIVE_HEIGHT
|
|
31
|
+
[MerkleTreeId.ARCHIVE]: ARCHIVE_HEIGHT
|
|
29
32
|
}, {
|
|
30
33
|
[MerkleTreeId.NULLIFIER_TREE]: 2 * MAX_NULLIFIERS_PER_TX,
|
|
31
|
-
[MerkleTreeId.PUBLIC_DATA_TREE]: 2 * MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
|
|
34
|
+
[MerkleTreeId.PUBLIC_DATA_TREE]: 2 * MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
|
|
32
35
|
}, GeneratorIndex.BLOCK_HASH, dbMapSizeKb, threads);
|
|
33
36
|
this.instance = new MsgpackChannel(ws);
|
|
34
37
|
// Manually create the queue for the canonical fork
|
|
35
38
|
this.queues.set(0, new WorldStateOpsQueue());
|
|
36
39
|
}
|
|
37
40
|
/**
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// allows for the pre-processing of responses on the job queue before being passed back
|
|
47
|
-
responseHandler = (response) => response, errorHandler = (_) => { }) {
|
|
41
|
+
* Sends a message to the native instance and returns the response.
|
|
42
|
+
* @param messageType - The type of message to send
|
|
43
|
+
* @param body - The message body
|
|
44
|
+
* @param responseHandler - A callback accepting the response, executed on the job queue
|
|
45
|
+
* @param errorHandler - A callback called on request error, executed on the job queue
|
|
46
|
+
* @returns The response to the message
|
|
47
|
+
*/ async call(messageType, body, // allows for the pre-processing of responses on the job queue before being passed back
|
|
48
|
+
responseHandler = (response)=>response, errorHandler = (_)=>{}) {
|
|
48
49
|
// Here we determine which fork the request is being executed against and whether it requires uncommitted data
|
|
49
50
|
// We use the fork Id to select the appropriate request queue and the uncommitted data flag to pass to the queue
|
|
50
51
|
let forkId = -1;
|
|
@@ -55,15 +56,12 @@ export class NativeWorldState {
|
|
|
55
56
|
// These requests don't contain a fork ID
|
|
56
57
|
if (isWithCanonical(body)) {
|
|
57
58
|
forkId = 0;
|
|
58
|
-
}
|
|
59
|
-
else if (isWithForkId(body)) {
|
|
59
|
+
} else if (isWithForkId(body)) {
|
|
60
60
|
forkId = body.forkId;
|
|
61
|
-
}
|
|
62
|
-
else if (isWithRevision(body)) {
|
|
61
|
+
} else if (isWithRevision(body)) {
|
|
63
62
|
forkId = body.revision.forkId;
|
|
64
63
|
committedOnly = body.revision.includeUncommitted === false;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
64
|
+
} else {
|
|
67
65
|
const _ = body;
|
|
68
66
|
throw new Error(`Unable to determine forkId for message=${WorldStateMessageType[messageType]}`);
|
|
69
67
|
}
|
|
@@ -74,14 +72,13 @@ export class NativeWorldState {
|
|
|
74
72
|
this.queues.set(forkId, requestQueue);
|
|
75
73
|
}
|
|
76
74
|
// Enqueue the request and wait for the response
|
|
77
|
-
const response = await requestQueue.execute(async ()
|
|
75
|
+
const response = await requestQueue.execute(async ()=>{
|
|
78
76
|
assert.notEqual(messageType, WorldStateMessageType.CLOSE, 'Use close() to close the native instance');
|
|
79
77
|
assert.equal(this.open, true, 'Native instance is closed');
|
|
80
78
|
let response;
|
|
81
79
|
try {
|
|
82
80
|
response = await this._sendMessage(messageType, body);
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
81
|
+
} catch (error) {
|
|
85
82
|
errorHandler(error.message);
|
|
86
83
|
throw error;
|
|
87
84
|
}
|
|
@@ -95,16 +92,17 @@ export class NativeWorldState {
|
|
|
95
92
|
return response;
|
|
96
93
|
}
|
|
97
94
|
/**
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
async close() {
|
|
95
|
+
* Stops the native instance.
|
|
96
|
+
*/ async close() {
|
|
101
97
|
if (!this.open) {
|
|
102
98
|
return;
|
|
103
99
|
}
|
|
104
100
|
this.open = false;
|
|
105
101
|
const queue = this.queues.get(0);
|
|
106
|
-
await queue.execute(async ()
|
|
107
|
-
await this._sendMessage(WorldStateMessageType.CLOSE, {
|
|
102
|
+
await queue.execute(async ()=>{
|
|
103
|
+
await this._sendMessage(WorldStateMessageType.CLOSE, {
|
|
104
|
+
canonical: true
|
|
105
|
+
});
|
|
108
106
|
}, WorldStateMessageType.CLOSE, false);
|
|
109
107
|
await queue.stop();
|
|
110
108
|
}
|
|
@@ -115,7 +113,10 @@ export class NativeWorldState {
|
|
|
115
113
|
logMetadata['treeId'] = MerkleTreeId[body.treeId];
|
|
116
114
|
}
|
|
117
115
|
if ('revision' in body) {
|
|
118
|
-
logMetadata = {
|
|
116
|
+
logMetadata = {
|
|
117
|
+
...logMetadata,
|
|
118
|
+
...body.revision
|
|
119
|
+
};
|
|
119
120
|
}
|
|
120
121
|
if ('forkId' in body) {
|
|
121
122
|
logMetadata['forkId'] = body.forkId;
|
|
@@ -147,15 +148,13 @@ export class NativeWorldState {
|
|
|
147
148
|
const { duration, response } = await this.instance.sendMessage(messageType, body);
|
|
148
149
|
this.log.trace(`Call ${WorldStateMessageType[messageType]} took (ms)`, {
|
|
149
150
|
duration,
|
|
150
|
-
...logMetadata
|
|
151
|
+
...logMetadata
|
|
151
152
|
});
|
|
152
153
|
this.instrumentation.recordRoundTrip(duration.totalUs, messageType);
|
|
153
154
|
return response;
|
|
154
|
-
}
|
|
155
|
-
catch (error) {
|
|
155
|
+
} catch (error) {
|
|
156
156
|
this.log.error(`Call ${WorldStateMessageType[messageType]} failed: ${error}`, error, logMetadata);
|
|
157
157
|
throw error;
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlX2luc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGVfaW5zdGFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxjQUFjLEVBQ2QsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsNENBQTRDLEVBQzVDLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsdUJBQXVCLEdBQ3hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsSUFBSSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekYsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFHMUIsT0FBTyxFQUNMLHFCQUFxQixFQUlyQixlQUFlLEVBQ2YsWUFBWSxFQUNaLGNBQWMsR0FDZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxDQUFDO0FBUzVFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQVEzQiwrQ0FBK0M7SUFDL0MsWUFDRSxPQUFlLEVBQ2YsV0FBbUIsRUFDWCxlQUEwQyxFQUMxQyxNQUFNLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQztRQUQxQyxvQkFBZSxHQUFmLGVBQWUsQ0FBMkI7UUFDMUMsUUFBRyxHQUFILEdBQUcsQ0FBdUM7UUFaNUMsU0FBSSxHQUFHLElBQUks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
|
|
@@ -14,17 +14,17 @@ export const MUTATING_MSG_TYPES = new Set([
|
|
|
14
14
|
WorldStateMessageType.DELETE_FORK,
|
|
15
15
|
WorldStateMessageType.FINALISE_BLOCKS,
|
|
16
16
|
WorldStateMessageType.UNWIND_BLOCKS,
|
|
17
|
-
WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS
|
|
17
|
+
WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS
|
|
18
18
|
]);
|
|
19
19
|
// This class implements the per-fork operation queue
|
|
20
20
|
export class WorldStateOpsQueue {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
requests = [];
|
|
22
|
+
inFlightMutatingCount = 0;
|
|
23
|
+
inFlightCount = 0;
|
|
24
|
+
stopPromise;
|
|
25
|
+
stopResolve;
|
|
26
|
+
requestId = 0;
|
|
27
|
+
ops = new Map();
|
|
28
28
|
// The primary public api, this is where an operation is queued
|
|
29
29
|
// We return a promise that will ultimately be resolved/rejected with the response/error generated by the 'request' argument
|
|
30
30
|
execute(request, messageType, committedOnly) {
|
|
@@ -35,17 +35,15 @@ export class WorldStateOpsQueue {
|
|
|
35
35
|
requestId: this.requestId++,
|
|
36
36
|
mutating: MUTATING_MSG_TYPES.has(messageType),
|
|
37
37
|
request,
|
|
38
|
-
promise: promiseWithResolvers()
|
|
38
|
+
promise: promiseWithResolvers()
|
|
39
39
|
};
|
|
40
40
|
this.ops.set(op.requestId, op);
|
|
41
41
|
// Perform the appropriate action based upon the queueing rules
|
|
42
42
|
if (op.mutating) {
|
|
43
43
|
this.executeMutating(op);
|
|
44
|
-
}
|
|
45
|
-
else if (committedOnly === false) {
|
|
44
|
+
} else if (committedOnly === false) {
|
|
46
45
|
this.executeNonMutatingUncommitted(op);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
46
|
+
} else {
|
|
49
47
|
this.executeNonMutatingCommitted(op);
|
|
50
48
|
}
|
|
51
49
|
return op.promise.promise;
|
|
@@ -56,8 +54,7 @@ export class WorldStateOpsQueue {
|
|
|
56
54
|
// Otherwise add to the queue
|
|
57
55
|
if (this.inFlightCount === 0) {
|
|
58
56
|
this.sendEnqueuedRequest(op);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
57
|
+
} else {
|
|
61
58
|
this.requests.push(op);
|
|
62
59
|
}
|
|
63
60
|
}
|
|
@@ -69,17 +66,14 @@ export class WorldStateOpsQueue {
|
|
|
69
66
|
// If a mutating request is not in flight but something is queued then it must be a mutating request
|
|
70
67
|
if (this.inFlightMutatingCount == 0 && this.requests.length == 0) {
|
|
71
68
|
this.sendEnqueuedRequest(op);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
69
|
+
} else {
|
|
74
70
|
this.requests.push(op);
|
|
75
71
|
}
|
|
76
72
|
}
|
|
77
73
|
executeNonMutatingCommitted(op) {
|
|
78
74
|
// This is a non-mutating request for committed data
|
|
79
75
|
// It can always be sent
|
|
80
|
-
op.request()
|
|
81
|
-
.then(op.promise.resolve, op.promise.reject)
|
|
82
|
-
.finally(() => {
|
|
76
|
+
op.request().then(op.promise.resolve, op.promise.reject).finally(()=>{
|
|
83
77
|
this.ops.delete(op.requestId);
|
|
84
78
|
});
|
|
85
79
|
}
|
|
@@ -99,7 +93,7 @@ export class WorldStateOpsQueue {
|
|
|
99
93
|
// 1 mutating request if it is next in the queue
|
|
100
94
|
// As many non-mutating requests as we encounter until
|
|
101
95
|
// we exhaust the queue or we reach a mutating request
|
|
102
|
-
while
|
|
96
|
+
while(this.requests.length > 0){
|
|
103
97
|
const next = this.requests[0];
|
|
104
98
|
if (next.mutating) {
|
|
105
99
|
if (this.inFlightCount == 0) {
|
|
@@ -107,10 +101,8 @@ export class WorldStateOpsQueue {
|
|
|
107
101
|
this.requests.shift();
|
|
108
102
|
this.sendEnqueuedRequest(next);
|
|
109
103
|
}
|
|
110
|
-
// this request is mutating, we need to stop here
|
|
111
104
|
break;
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
105
|
+
} else {
|
|
114
106
|
// not mutating, send and go round again
|
|
115
107
|
this.requests.shift();
|
|
116
108
|
this.sendEnqueuedRequest(next);
|
|
@@ -128,9 +120,7 @@ export class WorldStateOpsQueue {
|
|
|
128
120
|
++this.inFlightMutatingCount;
|
|
129
121
|
}
|
|
130
122
|
// Make the request and pass the response/error through to the stored promise
|
|
131
|
-
op.request()
|
|
132
|
-
.then(op.promise.resolve, op.promise.reject)
|
|
133
|
-
.finally(() => {
|
|
123
|
+
op.request().then(op.promise.resolve, op.promise.reject).finally(()=>{
|
|
134
124
|
this.checkAndEnqueue(op);
|
|
135
125
|
this.ops.delete(op.requestId);
|
|
136
126
|
});
|
|
@@ -141,7 +131,7 @@ export class WorldStateOpsQueue {
|
|
|
141
131
|
return this.stopPromise;
|
|
142
132
|
}
|
|
143
133
|
// Otherwise create a new one and capture the resolve method
|
|
144
|
-
this.stopPromise = new Promise(resolve
|
|
134
|
+
this.stopPromise = new Promise((resolve)=>{
|
|
145
135
|
this.stopResolve = resolve;
|
|
146
136
|
});
|
|
147
137
|
// If no outstanding requests then immediately resolve the promise
|
|
@@ -151,4 +141,3 @@ export class WorldStateOpsQueue {
|
|
|
151
141
|
return this.stopPromise;
|
|
152
142
|
}
|
|
153
143
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGRfc3RhdGVfb3BzX3F1ZXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS93b3JsZF9zdGF0ZV9vcHNfcXVldWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFakUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBdUJyRCx3RUFBd0U7QUFDeEUsd0VBQXdFO0FBQ3hFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3hDLHFCQUFxQixDQUFDLGFBQWE7SUFDbkMscUJBQXFCLENBQUMsWUFBWTtJQUNsQyxxQkFBcUIsQ0FBQyxpQkFBaUI7SUFDdkMscUJBQXFCLENBQUMsY0FBYztJQUNwQyxxQkFBcUIsQ0FBQyxNQUFNO0lBQzVCLHFCQUFxQixDQUFDLFFBQVE7SUFDOUIscUJBQXFCLENBQUMsVUFBVTtJQUNoQyxxQkFBcUIsQ0FBQyxXQUFXO0lBQ2pDLHFCQUFxQixDQUFDLFdBQVc7SUFDakMscUJBQXFCLENBQUMsZUFBZTtJQUNyQyxxQkFBcUIsQ0FBQyxhQUFhO0lBQ25DLHFCQUFxQixDQUFDLHdCQUF3QjtDQUMvQyxDQUFDLENBQUM7QUFFSCxxREFBcUQ7QUFDckQsTUFBTSxPQUFPLGtCQUFrQjtJQUEvQjtRQUNVLGFBQVEsR0FBbUIsRUFBRSxDQUFDO1FBQzlCLDBCQUFxQixHQUFHLENBQUMsQ0FBQztRQUMxQixrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUdsQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsUUFBRyxHQUE4QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBd0lyRCxDQUFDO0lBdElDLCtEQUErRDtJQUMvRCw0SEFBNEg7SUFDckgsT0FBTyxDQUFDLE9BQTJCLEVBQUUsV0FBa0MsRUFBRSxhQUFzQjtRQUNwRyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FB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
|
|
@@ -3,12 +3,14 @@ import { jsonParseWithSchema, jsonStringify } from '@aztec/foundation/json-rpc';
|
|
|
3
3
|
import { readFile, writeFile } from 'fs/promises';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
export class WorldStateVersion {
|
|
6
|
-
|
|
6
|
+
version;
|
|
7
|
+
rollupAddress;
|
|
8
|
+
constructor(version, rollupAddress){
|
|
7
9
|
this.version = version;
|
|
8
10
|
this.rollupAddress = rollupAddress;
|
|
9
11
|
}
|
|
10
12
|
static async readVersion(filename) {
|
|
11
|
-
const versionData = await readFile(filename, 'utf-8').catch(()
|
|
13
|
+
const versionData = await readFile(filename, 'utf-8').catch(()=>undefined);
|
|
12
14
|
return versionData === undefined ? undefined : await jsonParseWithSchema(versionData, WorldStateVersion.schema);
|
|
13
15
|
}
|
|
14
16
|
async writeVersionFile(filename) {
|
|
@@ -16,15 +18,12 @@ export class WorldStateVersion {
|
|
|
16
18
|
await writeFile(filename, data, 'utf-8');
|
|
17
19
|
}
|
|
18
20
|
static get schema() {
|
|
19
|
-
return z
|
|
20
|
-
.object({
|
|
21
|
+
return z.object({
|
|
21
22
|
version: z.number(),
|
|
22
|
-
rollupAddress: EthAddress.schema
|
|
23
|
-
})
|
|
24
|
-
.transform(({ version, rollupAddress }) => new WorldStateVersion(version, rollupAddress));
|
|
23
|
+
rollupAddress: EthAddress.schema
|
|
24
|
+
}).transform(({ version, rollupAddress })=>new WorldStateVersion(version, rollupAddress));
|
|
25
25
|
}
|
|
26
26
|
static empty() {
|
|
27
27
|
return new WorldStateVersion(0, EthAddress.ZERO);
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGRfc3RhdGVfdmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYXRpdmUvd29ybGRfc3RhdGVfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhGLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUE0QixPQUFlLEVBQWtCLGFBQXlCO1FBQTFELFlBQU8sR0FBUCxPQUFPLENBQVE7UUFBa0Isa0JBQWEsR0FBYixhQUFhLENBQVk7SUFBRyxDQUFDO0lBRTFGLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQWdCO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0UsT0FBTyxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sbUJBQW1CLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xILENBQUM7SUFFTSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDNUMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE1BQU0sS0FBSyxNQUFNO1FBQ2YsT0FBTyxDQUFDO2FBQ0wsTUFBTSxDQUFDO1lBQ04sT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDbkIsYUFBYSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1NBQ2pDLENBQUM7YUFDRCxTQUFTLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUs7UUFDVixPQUFPLElBQUksaUJBQWlCLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YifQ==
|