@aztec/world-state 0.57.0 → 0.59.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 +1 -1
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/native/merkle_trees_facade.d.ts +34 -0
- package/dest/native/merkle_trees_facade.d.ts.map +1 -0
- package/dest/native/merkle_trees_facade.js +193 -0
- package/dest/native/message.d.ts +78 -19
- package/dest/native/message.d.ts.map +1 -1
- package/dest/native/message.js +27 -26
- package/dest/native/native_world_state.d.ts +39 -38
- package/dest/native/native_world_state.d.ts.map +1 -1
- package/dest/native/native_world_state.js +108 -254
- package/dest/native/native_world_state_instance.d.ts +40 -0
- package/dest/native/native_world_state_instance.d.ts.map +1 -0
- package/dest/native/native_world_state_instance.js +183 -0
- package/dest/synchronizer/config.d.ts +2 -2
- package/dest/synchronizer/config.d.ts.map +1 -1
- package/dest/synchronizer/config.js +6 -7
- package/dest/synchronizer/factory.d.ts +3 -0
- package/dest/synchronizer/factory.d.ts.map +1 -1
- package/dest/synchronizer/factory.js +13 -4
- package/dest/synchronizer/server_world_state_synchronizer.d.ts +41 -41
- package/dest/synchronizer/server_world_state_synchronizer.d.ts.map +1 -1
- package/dest/synchronizer/server_world_state_synchronizer.js +126 -151
- package/dest/test/utils.d.ts +14 -0
- package/dest/test/utils.d.ts.map +1 -0
- package/dest/test/utils.js +67 -0
- package/dest/world-state-db/index.d.ts +1 -1
- package/dest/world-state-db/index.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_db.d.ts +42 -32
- package/dest/world-state-db/merkle_tree_db.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_db.js +1 -1
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts +8 -37
- package/dest/world-state-db/merkle_tree_operations_facade.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_operations_facade.js +6 -45
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts +4 -13
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.d.ts.map +1 -1
- package/dest/world-state-db/merkle_tree_snapshot_operations_facade.js +2 -29
- package/dest/world-state-db/merkle_trees.d.ts +17 -19
- package/dest/world-state-db/merkle_trees.d.ts.map +1 -1
- package/dest/world-state-db/merkle_trees.js +39 -36
- package/package.json +15 -12
- package/src/index.ts +1 -0
- package/src/native/merkle_trees_facade.ts +279 -0
- package/src/native/message.ts +97 -20
- package/src/native/native_world_state.ts +125 -346
- package/src/native/native_world_state_instance.ts +262 -0
- package/src/synchronizer/config.ts +8 -9
- package/src/synchronizer/factory.ts +20 -3
- package/src/synchronizer/server_world_state_synchronizer.ts +149 -178
- package/src/test/utils.ts +123 -0
- package/src/world-state-db/index.ts +1 -1
- package/src/world-state-db/merkle_tree_db.ts +55 -49
- package/src/world-state-db/merkle_tree_operations_facade.ts +10 -55
- package/src/world-state-db/merkle_tree_snapshot_operations_facade.ts +7 -46
- package/src/world-state-db/merkle_trees.ts +50 -45
|
@@ -1,58 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { L2BlockDownloader, WorldStateRunningState, } from '@aztec/circuit-types';
|
|
1
|
+
import { L2BlockStream, MerkleTreeId, WorldStateRunningState, } from '@aztec/circuit-types';
|
|
4
2
|
import { MerkleTreeCalculator } from '@aztec/circuits.js';
|
|
5
3
|
import { L1_TO_L2_MSG_SUBTREE_HEIGHT } from '@aztec/circuits.js/constants';
|
|
6
4
|
import { createDebugLogger } from '@aztec/foundation/log';
|
|
7
5
|
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
8
|
-
import { SerialQueue } from '@aztec/foundation/queue';
|
|
9
6
|
import { elapsed } from '@aztec/foundation/timer';
|
|
10
7
|
import { SHA256Trunc } from '@aztec/merkle-tree';
|
|
11
|
-
import { MerkleTreeAdminOperationsFacade, MerkleTreeOperationsFacade, } from '../world-state-db/merkle_tree_operations_facade.js';
|
|
12
|
-
import { MerkleTreeSnapshotOperationsFacade } from '../world-state-db/merkle_tree_snapshot_operations_facade.js';
|
|
13
8
|
/**
|
|
14
|
-
* Synchronizes the world state with the L2 blocks from a L2BlockSource.
|
|
15
|
-
* The synchronizer will download the L2 blocks from the L2BlockSource and
|
|
16
|
-
*
|
|
9
|
+
* Synchronizes the world state with the L2 blocks from a L2BlockSource via a block stream.
|
|
10
|
+
* The synchronizer will download the L2 blocks from the L2BlockSource and update the merkle trees.
|
|
11
|
+
* Handles chain reorgs via the L2BlockStream.
|
|
17
12
|
*/
|
|
18
13
|
export class ServerWorldStateSynchronizer {
|
|
19
|
-
constructor(
|
|
20
|
-
_ServerWorldStateSynchronizer_instances.add(this);
|
|
14
|
+
constructor(merkleTreeDb, l2BlockSource, config, log = createDebugLogger('aztec:world_state')) {
|
|
21
15
|
this.merkleTreeDb = merkleTreeDb;
|
|
22
16
|
this.l2BlockSource = l2BlockSource;
|
|
23
17
|
this.config = config;
|
|
24
18
|
this.log = log;
|
|
25
19
|
this.latestBlockNumberAtStart = 0;
|
|
26
|
-
this.syncPromise = Promise.resolve();
|
|
27
|
-
this.syncResolve = undefined;
|
|
28
|
-
this.jobQueue = new SerialQueue();
|
|
29
|
-
this.stopping = false;
|
|
30
|
-
this.runningPromise = Promise.resolve();
|
|
31
|
-
this.pausedPromise = undefined;
|
|
32
|
-
this.pausedResolve = undefined;
|
|
33
20
|
this.currentState = WorldStateRunningState.IDLE;
|
|
34
|
-
this.
|
|
35
|
-
this.
|
|
36
|
-
maxQueueSize: config.l2QueueSize,
|
|
37
|
-
pollIntervalMS: config.worldStateBlockCheckIntervalMS,
|
|
38
|
-
proven: config.worldStateProvenBlocksOnly,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
getLatest() {
|
|
42
|
-
return new MerkleTreeAdminOperationsFacade(this.merkleTreeDb, true);
|
|
21
|
+
this.syncPromise = promiseWithResolvers();
|
|
22
|
+
this.merkleTreeCommitted = this.merkleTreeDb.getCommitted();
|
|
43
23
|
}
|
|
44
24
|
getCommitted() {
|
|
45
|
-
return
|
|
25
|
+
return this.merkleTreeDb.getCommitted();
|
|
46
26
|
}
|
|
47
27
|
getSnapshot(blockNumber) {
|
|
48
|
-
return
|
|
28
|
+
return this.merkleTreeDb.getSnapshot(blockNumber);
|
|
49
29
|
}
|
|
50
|
-
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
async getFork(includeUncommitted) {
|
|
54
|
-
this.log.verbose(`Forking world state at ${this.blockNumber.get()}`);
|
|
55
|
-
return new MerkleTreeAdminOperationsFacade(await this.merkleTreeDb.fork(), includeUncommitted);
|
|
30
|
+
fork(blockNumber) {
|
|
31
|
+
return this.merkleTreeDb.fork(blockNumber);
|
|
56
32
|
}
|
|
57
33
|
async start() {
|
|
58
34
|
if (this.currentState === WorldStateRunningState.STOPPED) {
|
|
@@ -61,77 +37,50 @@ export class ServerWorldStateSynchronizer {
|
|
|
61
37
|
if (this.currentState !== WorldStateRunningState.IDLE) {
|
|
62
38
|
return this.syncPromise;
|
|
63
39
|
}
|
|
64
|
-
//
|
|
40
|
+
// Get the current latest block number
|
|
65
41
|
this.latestBlockNumberAtStart = await (this.config.worldStateProvenBlocksOnly
|
|
66
42
|
? this.l2BlockSource.getProvenBlockNumber()
|
|
67
43
|
: this.l2BlockSource.getBlockNumber());
|
|
68
|
-
const blockToDownloadFrom = this.
|
|
69
|
-
// if there are blocks to be retrieved, go to a synching state
|
|
44
|
+
const blockToDownloadFrom = (await this.getLatestBlockNumber()) + 1;
|
|
70
45
|
if (blockToDownloadFrom <= this.latestBlockNumberAtStart) {
|
|
46
|
+
// If there are blocks to be retrieved, go to a synching state
|
|
71
47
|
this.setCurrentState(WorldStateRunningState.SYNCHING);
|
|
72
|
-
this.
|
|
73
|
-
this.syncResolve = resolve;
|
|
74
|
-
});
|
|
75
|
-
this.log.info(`Starting sync from ${blockToDownloadFrom}, latest block ${this.latestBlockNumberAtStart}`);
|
|
48
|
+
this.log.verbose(`Starting sync from ${blockToDownloadFrom} to latest block ${this.latestBlockNumberAtStart}`);
|
|
76
49
|
}
|
|
77
50
|
else {
|
|
78
|
-
//
|
|
51
|
+
// If no blocks to be retrieved, go straight to running
|
|
79
52
|
this.setCurrentState(WorldStateRunningState.RUNNING);
|
|
80
|
-
this.syncPromise
|
|
81
|
-
this.log.debug(`Next block ${blockToDownloadFrom} already beyond latest block
|
|
53
|
+
this.syncPromise.resolve();
|
|
54
|
+
this.log.debug(`Next block ${blockToDownloadFrom} already beyond latest block ${this.latestBlockNumberAtStart}`);
|
|
82
55
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
this.l2BlockDownloader.start(blockToDownloadFrom);
|
|
95
|
-
this.log.info(`Started block downloader from block ${blockToDownloadFrom}`);
|
|
96
|
-
return this.syncPromise;
|
|
56
|
+
this.blockStream = this.createBlockStream();
|
|
57
|
+
this.blockStream.start();
|
|
58
|
+
this.log.info(`Started world state synchronizer from block ${blockToDownloadFrom}`);
|
|
59
|
+
return this.syncPromise.promise;
|
|
60
|
+
}
|
|
61
|
+
createBlockStream() {
|
|
62
|
+
return new L2BlockStream(this.l2BlockSource, this, this, {
|
|
63
|
+
proven: this.config.worldStateProvenBlocksOnly,
|
|
64
|
+
pollIntervalMS: this.config.worldStateBlockCheckIntervalMS,
|
|
65
|
+
batchSize: this.config.worldStateBlockRequestBatchSize,
|
|
66
|
+
});
|
|
97
67
|
}
|
|
98
68
|
async stop() {
|
|
99
|
-
this.log.debug('Stopping
|
|
100
|
-
this.
|
|
101
|
-
|
|
102
|
-
this.
|
|
103
|
-
await this.jobQueue.cancel();
|
|
104
|
-
this.log.debug('Stopping Merkle trees');
|
|
105
|
-
await this.merkleTreeDb.stop();
|
|
106
|
-
this.log.debug('Awaiting promise');
|
|
107
|
-
await this.runningPromise;
|
|
69
|
+
this.log.debug('Stopping block stream...');
|
|
70
|
+
await this.blockStream?.stop();
|
|
71
|
+
this.log.debug('Stopping merkle trees...');
|
|
72
|
+
await this.merkleTreeDb.close();
|
|
108
73
|
this.setCurrentState(WorldStateRunningState.STOPPED);
|
|
109
|
-
this.log.info(`Stopped`);
|
|
110
|
-
}
|
|
111
|
-
get currentL2BlockNum() {
|
|
112
|
-
return this.blockNumber.get() ?? 0;
|
|
113
|
-
}
|
|
114
|
-
async pause() {
|
|
115
|
-
this.log.debug('Pausing world state synchronizer');
|
|
116
|
-
({ promise: this.pausedPromise, resolve: this.pausedResolve } = promiseWithResolvers());
|
|
117
|
-
await this.jobQueue.syncPoint();
|
|
118
|
-
this.log.debug('Paused world state synchronizer');
|
|
119
|
-
}
|
|
120
|
-
resume() {
|
|
121
|
-
if (this.pausedResolve) {
|
|
122
|
-
this.log.debug('Resuming world state synchronizer');
|
|
123
|
-
this.pausedResolve();
|
|
124
|
-
this.pausedResolve = undefined;
|
|
125
|
-
this.pausedPromise = undefined;
|
|
126
|
-
this.log.debug('Resumed world state synchronizer');
|
|
127
|
-
}
|
|
74
|
+
this.log.info(`Stopped world state synchronizer`);
|
|
128
75
|
}
|
|
129
|
-
status() {
|
|
130
|
-
|
|
131
|
-
syncedToL2Block: this.
|
|
76
|
+
async status() {
|
|
77
|
+
return {
|
|
78
|
+
syncedToL2Block: (await this.getL2Tips()).latest,
|
|
132
79
|
state: this.currentState,
|
|
133
80
|
};
|
|
134
|
-
|
|
81
|
+
}
|
|
82
|
+
async getLatestBlockNumber() {
|
|
83
|
+
return (await this.getL2Tips()).latest.number;
|
|
135
84
|
}
|
|
136
85
|
/**
|
|
137
86
|
* Forces an immediate sync.
|
|
@@ -139,69 +88,80 @@ export class ServerWorldStateSynchronizer {
|
|
|
139
88
|
* @returns A promise that resolves with the block number the world state was synced to
|
|
140
89
|
*/
|
|
141
90
|
async syncImmediate(targetBlockNumber) {
|
|
142
|
-
if (this.currentState !== WorldStateRunningState.RUNNING) {
|
|
143
|
-
throw new Error(`World State is not running
|
|
91
|
+
if (this.currentState !== WorldStateRunningState.RUNNING || this.blockStream === undefined) {
|
|
92
|
+
throw new Error(`World State is not running. Unable to perform sync.`);
|
|
144
93
|
}
|
|
145
|
-
// If we have been given a block number to sync to and we have reached that number then return
|
|
146
|
-
|
|
147
|
-
|
|
94
|
+
// If we have been given a block number to sync to and we have reached that number then return
|
|
95
|
+
const currentBlockNumber = await this.getLatestBlockNumber();
|
|
96
|
+
if (targetBlockNumber !== undefined && targetBlockNumber <= currentBlockNumber) {
|
|
97
|
+
return currentBlockNumber;
|
|
148
98
|
}
|
|
149
|
-
this.log.debug(`World State at ${
|
|
150
|
-
//
|
|
151
|
-
await this.
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
// Poll for more blocks, requesting even unproven blocks.
|
|
158
|
-
const numBlocks = await this.l2BlockDownloader.pollImmediate(targetBlockNumber, false);
|
|
159
|
-
this.log.debug(`Block download immediate poll yielded ${numBlocks} blocks`);
|
|
160
|
-
if (numBlocks) {
|
|
161
|
-
// More blocks were received, process them and go round again
|
|
162
|
-
await this.jobQueue.put(() => this.collectAndProcessBlocks());
|
|
163
|
-
continue;
|
|
164
|
-
}
|
|
165
|
-
// No blocks are available, if we have been given a block number then we can't achieve it
|
|
166
|
-
if (targetBlockNumber !== undefined) {
|
|
167
|
-
throw new Error(`Unable to sync to block number ${targetBlockNumber}, currently synced to block ${this.currentL2BlockNum}`);
|
|
168
|
-
}
|
|
169
|
-
return this.currentL2BlockNum;
|
|
99
|
+
this.log.debug(`World State at ${currentBlockNumber} told to sync to ${targetBlockNumber ?? 'latest'}`);
|
|
100
|
+
// Force the block stream to sync against the archiver now
|
|
101
|
+
await this.blockStream.sync();
|
|
102
|
+
// If we have been given a block number to sync to and we have not reached that number then fail
|
|
103
|
+
const updatedBlockNumber = await this.getLatestBlockNumber();
|
|
104
|
+
if (targetBlockNumber !== undefined && targetBlockNumber > updatedBlockNumber) {
|
|
105
|
+
throw new Error(`Unable to sync to block number ${targetBlockNumber} (last synced is ${updatedBlockNumber})`);
|
|
170
106
|
}
|
|
107
|
+
return updatedBlockNumber;
|
|
108
|
+
}
|
|
109
|
+
/** Returns the L2 block hash for a given number. Used by the L2BlockStream for detecting reorgs. */
|
|
110
|
+
getL2BlockHash(number) {
|
|
111
|
+
return number === 0
|
|
112
|
+
? Promise.resolve(this.merkleTreeCommitted.getInitialHeader().hash().toString())
|
|
113
|
+
: this.merkleTreeCommitted.getLeafValue(MerkleTreeId.ARCHIVE, BigInt(number)).then(leaf => leaf?.toString());
|
|
114
|
+
}
|
|
115
|
+
/** Returns the latest L2 block number for each tip of the chain (latest, proven, finalized). */
|
|
116
|
+
async getL2Tips() {
|
|
117
|
+
const status = await this.merkleTreeDb.getStatus();
|
|
118
|
+
const unfinalisedBlockHash = await this.getL2BlockHash(Number(status.unfinalisedBlockNumber));
|
|
119
|
+
const latestBlockId = { number: Number(status.unfinalisedBlockNumber), hash: unfinalisedBlockHash };
|
|
120
|
+
return {
|
|
121
|
+
latest: latestBlockId,
|
|
122
|
+
finalized: { number: Number(status.finalisedBlockNumber), hash: '' },
|
|
123
|
+
proven: { number: Number(status.finalisedBlockNumber), hash: '' }, // TODO(palla/reorg): Using finalised as proven for now
|
|
124
|
+
};
|
|
171
125
|
}
|
|
172
|
-
|
|
126
|
+
/** Handles an event emitted by the block stream. */
|
|
127
|
+
async handleBlockStreamEvent(event) {
|
|
173
128
|
try {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
129
|
+
switch (event.type) {
|
|
130
|
+
case 'blocks-added':
|
|
131
|
+
await this.handleL2Blocks(event.blocks);
|
|
132
|
+
break;
|
|
133
|
+
case 'chain-pruned':
|
|
134
|
+
await this.handleChainPruned(event.blockNumber);
|
|
135
|
+
break;
|
|
136
|
+
case 'chain-proven':
|
|
137
|
+
await this.handleChainProven(event.blockNumber);
|
|
138
|
+
break;
|
|
139
|
+
case 'chain-finalized':
|
|
140
|
+
await this.handleChainFinalized(event.blockNumber);
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
177
143
|
}
|
|
178
|
-
|
|
179
|
-
this.
|
|
144
|
+
catch (err) {
|
|
145
|
+
this.log.error('Error processing block stream', err);
|
|
180
146
|
}
|
|
181
147
|
}
|
|
182
|
-
/**
|
|
183
|
-
* Checks for the availability of new blocks and processes them.
|
|
184
|
-
*/
|
|
185
|
-
async collectAndProcessBlocks() {
|
|
186
|
-
// This request for blocks will timeout after 1 second if no blocks are received
|
|
187
|
-
const blocks = await this.l2BlockDownloader.getBlocks(1);
|
|
188
|
-
const messagePromises = blocks.map(block => this.l2BlockSource.getL1ToL2Messages(BigInt(block.number)));
|
|
189
|
-
const l1ToL2Messages = await Promise.all(messagePromises);
|
|
190
|
-
await this.handleL2BlocksAndMessages(blocks, l1ToL2Messages);
|
|
191
|
-
}
|
|
192
148
|
/**
|
|
193
149
|
* Handles a list of L2 blocks (i.e. Inserts the new note hashes into the merkle tree).
|
|
194
150
|
* @param l2Blocks - The L2 blocks to handle.
|
|
195
|
-
* @param l1ToL2Messages - The L1 to L2 messages for each block.
|
|
196
151
|
* @returns Whether the block handled was produced by this same node.
|
|
197
152
|
*/
|
|
198
|
-
async
|
|
153
|
+
async handleL2Blocks(l2Blocks) {
|
|
154
|
+
this.log.verbose(`Handling new L2 blocks from ${l2Blocks[0].number} to ${l2Blocks[l2Blocks.length - 1].number}`);
|
|
155
|
+
const messagePromises = l2Blocks.map(block => this.l2BlockSource.getL1ToL2Messages(BigInt(block.number)));
|
|
156
|
+
const l1ToL2Messages = await Promise.all(messagePromises);
|
|
199
157
|
for (let i = 0; i < l2Blocks.length; i++) {
|
|
200
|
-
const [duration, result] = await elapsed(() => this.
|
|
158
|
+
const [duration, result] = await elapsed(() => this.handleL2Block(l2Blocks[i], l1ToL2Messages[i]));
|
|
201
159
|
this.log.verbose(`Handled new L2 block`, {
|
|
202
160
|
eventName: 'l2-block-handled',
|
|
203
161
|
duration,
|
|
204
|
-
|
|
162
|
+
unfinalisedBlockNumber: result.unfinalisedBlockNumber,
|
|
163
|
+
finalisedBlockNumber: result.finalisedBlockNumber,
|
|
164
|
+
oldestHistoricBlock: result.oldestHistoricalBlock,
|
|
205
165
|
...l2Blocks[i].getStats(),
|
|
206
166
|
});
|
|
207
167
|
}
|
|
@@ -212,23 +172,32 @@ export class ServerWorldStateSynchronizer {
|
|
|
212
172
|
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
213
173
|
* @returns Whether the block handled was produced by this same node.
|
|
214
174
|
*/
|
|
215
|
-
async
|
|
175
|
+
async handleL2Block(l2Block, l1ToL2Messages) {
|
|
216
176
|
// First we check that the L1 to L2 messages hash to the block inHash.
|
|
217
177
|
// Note that we cannot optimize this check by checking the root of the subtree after inserting the messages
|
|
218
178
|
// to the real L1_TO_L2_MESSAGE_TREE (like we do in merkleTreeDb.handleL2BlockAndMessages(...)) because that
|
|
219
179
|
// tree uses pedersen and we don't have access to the converted root.
|
|
220
|
-
|
|
180
|
+
this.verifyMessagesHashToInHash(l1ToL2Messages, l2Block.header.contentCommitment.inHash);
|
|
221
181
|
// If the above check succeeds, we can proceed to handle the block.
|
|
222
182
|
const result = await this.merkleTreeDb.handleL2BlockAndMessages(l2Block, l1ToL2Messages);
|
|
223
|
-
await this.blockNumber.set(l2Block.number);
|
|
224
183
|
if (this.currentState === WorldStateRunningState.SYNCHING && l2Block.number >= this.latestBlockNumberAtStart) {
|
|
225
184
|
this.setCurrentState(WorldStateRunningState.RUNNING);
|
|
226
|
-
|
|
227
|
-
this.syncResolve();
|
|
228
|
-
}
|
|
185
|
+
this.syncPromise.resolve();
|
|
229
186
|
}
|
|
230
187
|
return result;
|
|
231
188
|
}
|
|
189
|
+
async handleChainFinalized(blockNumber) {
|
|
190
|
+
this.log.verbose(`Chain finalized at block ${blockNumber}`);
|
|
191
|
+
await this.merkleTreeDb.setFinalised(BigInt(blockNumber));
|
|
192
|
+
}
|
|
193
|
+
handleChainProven(blockNumber) {
|
|
194
|
+
this.log.verbose(`Chain proven at block ${blockNumber}`);
|
|
195
|
+
return Promise.resolve();
|
|
196
|
+
}
|
|
197
|
+
async handleChainPruned(blockNumber) {
|
|
198
|
+
this.log.info(`Chain pruned to block ${blockNumber}`);
|
|
199
|
+
await this.merkleTreeDb.unwindBlocks(BigInt(blockNumber));
|
|
200
|
+
}
|
|
232
201
|
/**
|
|
233
202
|
* Method to set the value of the current state.
|
|
234
203
|
* @param newState - New state value.
|
|
@@ -237,12 +206,18 @@ export class ServerWorldStateSynchronizer {
|
|
|
237
206
|
this.currentState = newState;
|
|
238
207
|
this.log.debug(`Moved to state ${WorldStateRunningState[this.currentState]}`);
|
|
239
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Verifies that the L1 to L2 messages hash to the block inHash.
|
|
211
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
212
|
+
* @param inHash - The inHash of the block.
|
|
213
|
+
* @throws If the L1 to L2 messages do not hash to the block inHash.
|
|
214
|
+
*/
|
|
215
|
+
verifyMessagesHashToInHash(l1ToL2Messages, inHash) {
|
|
216
|
+
const treeCalculator = new MerkleTreeCalculator(L1_TO_L2_MSG_SUBTREE_HEIGHT, Buffer.alloc(32), new SHA256Trunc().hash);
|
|
217
|
+
const root = treeCalculator.computeTreeRoot(l1ToL2Messages.map(msg => msg.toBuffer()));
|
|
218
|
+
if (!root.equals(inHash)) {
|
|
219
|
+
throw new Error('Obtained L1 to L2 messages failed to be hashed to the block inHash');
|
|
220
|
+
}
|
|
221
|
+
}
|
|
240
222
|
}
|
|
241
|
-
_ServerWorldStateSynchronizer_instances = new WeakSet(), _ServerWorldStateSynchronizer_verifyMessagesHashToInHash = function _ServerWorldStateSynchronizer_verifyMessagesHashToInHash(l1ToL2Messages, inHash) {
|
|
242
|
-
const treeCalculator = new MerkleTreeCalculator(L1_TO_L2_MSG_SUBTREE_HEIGHT, Buffer.alloc(32), new SHA256Trunc().hash);
|
|
243
|
-
const root = treeCalculator.computeTreeRoot(l1ToL2Messages.map(msg => msg.toBuffer()));
|
|
244
|
-
if (!root.equals(inHash)) {
|
|
245
|
-
throw new Error('Obtained L1 to L2 messages failed to be hashed to the block inHash');
|
|
246
|
-
}
|
|
247
|
-
};
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvc2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFJTCxpQkFBaUIsRUFHakIsc0JBQXNCLEdBR3ZCLE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFakQsT0FBTyxFQUNMLCtCQUErQixFQUMvQiwwQkFBMEIsR0FDM0IsTUFBTSxvREFBb0QsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUlqSDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLDRCQUE0QjtJQWdCdkMsWUFDRSxLQUFtQixFQUNYLFlBQXlCLEVBQ3pCLGFBQWtELEVBQ2xELE1BQXdCLEVBQ3hCLE1BQU0saUJBQWlCLENBQUMsbUJBQW1CLENBQUM7O1FBSDVDLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLGtCQUFhLEdBQWIsYUFBYSxDQUFxQztRQUNsRCxXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUF5QztRQXBCOUMsNkJBQXdCLEdBQUcsQ0FBQyxDQUFDO1FBSzdCLGdCQUFXLEdBQWtCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQyxnQkFBVyxHQUFnQixTQUFTLENBQUM7UUFDckMsYUFBUSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDN0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixtQkFBYyxHQUFrQixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEQsa0JBQWEsR0FBbUIsU0FBUyxDQUFDO1FBQzFDLGtCQUFhLEdBQWdCLFNBQVMsQ0FBQztRQUN2QyxpQkFBWSxHQUEyQixzQkFBc0IsQ0FBQyxJQUFJLENBQUM7UUFVekUsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLENBQUMsYUFBYSxFQUFFO1lBQzVELFlBQVksRUFBRSxNQUFNLENBQUMsV0FBVztZQUNoQyxjQUFjLEVBQUUsTUFBTSxDQUFDLDhCQUE4QjtZQUNyRCxNQUFNLEVBQUUsTUFBTSxDQUFDLDBCQUEwQjtTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sU0FBUztRQUNkLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTSxXQUFXLENBQUMsV0FBbUI7UUFDcEMsT0FBTyxJQUFJLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsa0JBQTJCO1FBQy9DLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDBCQUEwQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRSxPQUFPLElBQUksK0JBQStCLENBQUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCO1lBQzNFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFO1lBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFekMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBRXZELDhEQUE4RDtRQUM5RCxJQUFJLG1CQUFtQixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsbUJBQW1CLGtCQUFrQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLENBQUM7YUFBTSxDQUFDO1lBQ04sdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ1osY0FBYyxtQkFBbUIsbUNBQW1DLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUNwRyxDQUFDO1FBQ0osQ0FBQztRQUVELG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBRyxLQUFLLElBQUksRUFBRTtZQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7Z0JBQzlELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDeEMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDbkMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQVksaUJBQWlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLO1FBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTyxNQUFNO1FBQ1osSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7WUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7WUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLE1BQU07UUFDWCxNQUFNLE1BQU0sR0FBRztZQUNiLGVBQWUsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtTQUNMLENBQUM7UUFDdEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLGFBQWEsQ0FBQyxpQkFBMEI7UUFDbkQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsK0ZBQStGO1FBQy9GLElBQUksaUJBQWlCLEtBQUssU0FBUyxJQUFJLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ25GLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLGlCQUFpQixvQkFBb0IsaUJBQWlCLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM1RywyREFBMkQ7UUFDM0QsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWhDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDWiwrQkFBK0I7WUFDL0IsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLElBQUksaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ25GLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ2hDLENBQUM7WUFDRCx5REFBeUQ7WUFDekQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxTQUFTLFNBQVMsQ0FBQyxDQUFDO1lBQzVFLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsNkRBQTZEO2dCQUM3RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7Z0JBQzlELFNBQVM7WUFDWCxDQUFDO1lBQ0QseUZBQXlGO1lBQ3pGLElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0NBQWtDLGlCQUFpQiwrQkFBK0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQzNHLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsb0JBQW9CLENBQy9CLGlCQUF5QixFQUN6QixzQkFBK0I7UUFFL0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUMsT0FBTyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNwRCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyx1QkFBdUI7UUFDbkMsZ0ZBQWdGO1FBQ2hGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RyxNQUFNLGNBQWMsR0FBVyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFbEUsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxRQUFtQixFQUFFLGNBQXNCO1FBQ2pGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUU7Z0JBQ3ZDLFNBQVMsRUFBRSxrQkFBa0I7Z0JBQzdCLFFBQVE7Z0JBQ1IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7YUFDSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyx3QkFBd0IsQ0FDcEMsT0FBZ0IsRUFDaEIsY0FBb0I7UUFFcEIsc0VBQXNFO1FBQ3RFLDJHQUEyRztRQUMzRyw0R0FBNEc7UUFDNUcscUVBQXFFO1FBQ3JFLHVCQUFBLElBQUkseUdBQTRCLE1BQWhDLElBQUksRUFBNkIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFMUYsbUVBQW1FO1FBQ25FLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDekYsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0MsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLHNCQUFzQixDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQzdHLElBQUksQ0FBQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZUFBZSxDQUFDLFFBQWdDO1FBQ3RELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7Q0FxQkY7c0xBYjZCLGNBQW9CLEVBQUUsTUFBYztJQUM5RCxNQUFNLGNBQWMsR0FBRyxJQUFJLG9CQUFvQixDQUM3QywyQkFBMkIsRUFDM0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFDaEIsSUFBSSxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQ3ZCLENBQUM7SUFFRixNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXZGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7QUFDSCxDQUFDIn0=
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jaHJvbml6ZXIvc2VydmVyX3dvcmxkX3N0YXRlX3N5bmNocm9uaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBS0wsYUFBYSxFQUtiLFlBQVksRUFHWixzQkFBc0IsR0FHdkIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTWpEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sNEJBQTRCO0lBV3ZDLFlBQ21CLFlBQXFDLEVBQ3JDLGFBQWtELEVBQ2xELE1BQXdCLEVBQ3hCLE1BQU0saUJBQWlCLENBQUMsbUJBQW1CLENBQUM7UUFINUMsaUJBQVksR0FBWixZQUFZLENBQXlCO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQztRQUNsRCxXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQUN4QixRQUFHLEdBQUgsR0FBRyxDQUF5QztRQVZ2RCw2QkFBd0IsR0FBRyxDQUFDLENBQUM7UUFDN0IsaUJBQVksR0FBMkIsc0JBQXNCLENBQUMsSUFBSSxDQUFDO1FBRW5FLGdCQUFXLEdBQUcsb0JBQW9CLEVBQVEsQ0FBQztRQVNqRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5RCxDQUFDO0lB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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { L2Block, type MerkleTreeReadOperations, type MerkleTreeWriteOperations } from '@aztec/circuit-types';
|
|
2
|
+
import { Fr } from '@aztec/circuits.js';
|
|
3
|
+
import { type NativeWorldStateService } from '../native/native_world_state.js';
|
|
4
|
+
export declare function mockBlock(blockNum: number, size: number, fork: MerkleTreeWriteOperations): Promise<{
|
|
5
|
+
block: L2Block;
|
|
6
|
+
messages: Fr[];
|
|
7
|
+
}>;
|
|
8
|
+
export declare function mockBlocks(from: number, count: number, numTxs: number, worldState: NativeWorldStateService): Promise<{
|
|
9
|
+
blocks: L2Block[];
|
|
10
|
+
messages: Fr[][];
|
|
11
|
+
}>;
|
|
12
|
+
export declare function assertSameState(forkA: MerkleTreeReadOperations, forkB: MerkleTreeReadOperations): Promise<void>;
|
|
13
|
+
export declare function compareChains(left: MerkleTreeReadOperations, right: MerkleTreeReadOperations): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAEP,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAG/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,EAAE,EAQH,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAE/E,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB;;;GA2D9F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,uBAAuB;;;GAchH;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,wBAAwB,iBAQrG;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,wBAAwB,iBAYlG"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { L2Block, MerkleTreeId, PublicDataWrite, TxEffect, } from '@aztec/circuit-types';
|
|
2
|
+
import { AppendOnlyTreeSnapshot, Fr, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NULLIFIER_SUBTREE_HEIGHT, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, PUBLIC_DATA_SUBTREE_HEIGHT, PublicDataTreeLeaf, } from '@aztec/circuits.js';
|
|
3
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
4
|
+
export async function mockBlock(blockNum, size, fork) {
|
|
5
|
+
const l2Block = L2Block.random(blockNum, size);
|
|
6
|
+
const l1ToL2Messages = Array(16).fill(0).map(Fr.random);
|
|
7
|
+
const paddedTxEffects = padArrayEnd(l2Block.body.txEffects, TxEffect.empty(), l2Block.body.numberOfTxsIncludingPadded);
|
|
8
|
+
// Sync the append only trees
|
|
9
|
+
{
|
|
10
|
+
const noteHashesPadded = paddedTxEffects.flatMap(txEffect => padArrayEnd(txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
|
|
11
|
+
await fork.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, noteHashesPadded);
|
|
12
|
+
const l1ToL2MessagesPadded = padArrayEnd(l1ToL2Messages, Fr.ZERO, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP);
|
|
13
|
+
await fork.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, l1ToL2MessagesPadded);
|
|
14
|
+
}
|
|
15
|
+
// Sync the indexed trees
|
|
16
|
+
{
|
|
17
|
+
// We insert the public data tree leaves with one batch per tx to avoid updating the same key twice
|
|
18
|
+
for (const txEffect of paddedTxEffects) {
|
|
19
|
+
const publicDataWrites = padArrayEnd(txEffect.publicDataWrites, PublicDataWrite.empty(), MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
20
|
+
await fork.batchInsert(MerkleTreeId.PUBLIC_DATA_TREE, publicDataWrites.map(write => new PublicDataTreeLeaf(write.leafIndex, write.newValue).toBuffer()), PUBLIC_DATA_SUBTREE_HEIGHT);
|
|
21
|
+
const nullifiersPadded = padArrayEnd(txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX);
|
|
22
|
+
await fork.batchInsert(MerkleTreeId.NULLIFIER_TREE, nullifiersPadded.map(nullifier => nullifier.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const state = await fork.getStateReference();
|
|
26
|
+
l2Block.header.state = state;
|
|
27
|
+
await fork.updateArchive(l2Block.header);
|
|
28
|
+
const archiveState = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
29
|
+
l2Block.archive = new AppendOnlyTreeSnapshot(Fr.fromBuffer(archiveState.root), Number(archiveState.size));
|
|
30
|
+
return {
|
|
31
|
+
block: l2Block,
|
|
32
|
+
messages: l1ToL2Messages,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function mockBlocks(from, count, numTxs, worldState) {
|
|
36
|
+
const tempFork = await worldState.fork(from - 1);
|
|
37
|
+
const blocks = [];
|
|
38
|
+
const messagesArray = [];
|
|
39
|
+
for (let blockNumber = from; blockNumber < from + count; blockNumber++) {
|
|
40
|
+
const { block, messages } = await mockBlock(blockNumber, numTxs, tempFork);
|
|
41
|
+
blocks.push(block);
|
|
42
|
+
messagesArray.push(messages);
|
|
43
|
+
}
|
|
44
|
+
await tempFork.close();
|
|
45
|
+
return { blocks, messages: messagesArray };
|
|
46
|
+
}
|
|
47
|
+
export async function assertSameState(forkA, forkB) {
|
|
48
|
+
const nativeStateRef = await forkA.getStateReference();
|
|
49
|
+
const nativeArchive = await forkA.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
50
|
+
const legacyStateRef = await forkB.getStateReference();
|
|
51
|
+
const legacyArchive = await forkB.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
52
|
+
expect(nativeStateRef).toEqual(legacyStateRef);
|
|
53
|
+
expect(nativeArchive).toEqual(legacyArchive);
|
|
54
|
+
}
|
|
55
|
+
export async function compareChains(left, right) {
|
|
56
|
+
for (const treeId of [
|
|
57
|
+
MerkleTreeId.ARCHIVE,
|
|
58
|
+
MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
|
|
59
|
+
MerkleTreeId.NOTE_HASH_TREE,
|
|
60
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
61
|
+
MerkleTreeId.PUBLIC_DATA_TREE,
|
|
62
|
+
]) {
|
|
63
|
+
expect(await left.getTreeInfo(treeId)).toEqual(await right.getTreeInfo(treeId));
|
|
64
|
+
expect(await left.getSiblingPath(treeId, 0n)).toEqual(await right.getSiblingPath(treeId, 0n));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsT0FBTyxFQUNQLFlBQVksRUFHWixlQUFlLEVBQ2YsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixFQUFFLEVBQ0Ysc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiw0Q0FBNEMsRUFDNUMsd0JBQXdCLEVBQ3hCLG1DQUFtQyxFQUNuQywwQkFBMEIsRUFDMUIsa0JBQWtCLEdBQ25CLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSTNELE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxDQUFDLFFBQWdCLEVBQUUsSUFBWSxFQUFFLElBQStCO0lBQzdGLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV4RCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUN0QixRQUFRLENBQUMsS0FBSyxFQUFFLEVBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQ3hDLENBQUM7SUFFRiw2QkFBNkI7SUFDN0IsQ0FBQztRQUNDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUMxRCxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLENBQ2xFLENBQUM7UUFDRixNQUFN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
|
|
@@ -2,5 +2,5 @@ export * from './merkle_trees.js';
|
|
|
2
2
|
export * from './merkle_tree_db.js';
|
|
3
3
|
export * from './merkle_tree_operations_facade.js';
|
|
4
4
|
export * from './merkle_tree_snapshot_operations_facade.js';
|
|
5
|
-
export {
|
|
5
|
+
export { MerkleTreeReadOperations } from '@aztec/circuit-types/interfaces';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/world-state-db/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oCAAoC,CAAC;AACnD,cAAc,6CAA6C,CAAC;AAE5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/world-state-db/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oCAAoC,CAAC;AACnD,cAAc,6CAA6C,CAAC;AAE5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { type MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
-
import { type
|
|
1
|
+
import { type L2Block, type MerkleTreeId } from '@aztec/circuit-types';
|
|
2
|
+
import { type MerkleTreeReadOperations, type MerkleTreeWriteOperations } from '@aztec/circuit-types/interfaces';
|
|
3
3
|
import { type Fr } from '@aztec/circuits.js';
|
|
4
4
|
import { type IndexedTreeSnapshot, type TreeSnapshot } from '@aztec/merkle-tree';
|
|
5
|
+
import { type WorldStateStatus } from '../native/message.js';
|
|
5
6
|
/**
|
|
6
7
|
*
|
|
7
8
|
* @remarks Short explanation:
|
|
@@ -19,15 +20,6 @@ import { type IndexedTreeSnapshot, type TreeSnapshot } from '@aztec/merkle-tree'
|
|
|
19
20
|
*/
|
|
20
21
|
export declare const INITIAL_NULLIFIER_TREE_SIZE: number;
|
|
21
22
|
export declare const INITIAL_PUBLIC_DATA_TREE_SIZE: number;
|
|
22
|
-
/**
|
|
23
|
-
* Adds a last boolean flag in each function on the type.
|
|
24
|
-
*/
|
|
25
|
-
type WithIncludeUncommitted<F> = F extends (...args: [...infer Rest]) => infer Return ? (...args: [...Rest, boolean]) => Return : F;
|
|
26
|
-
/**
|
|
27
|
-
* Defines the names of the setters on Merkle Trees.
|
|
28
|
-
*/
|
|
29
|
-
type MerkleTreeSetters = 'appendLeaves' | 'updateLeaf' | 'batchInsert';
|
|
30
|
-
type MerkleTreeAdmin = 'commit' | 'rollback' | 'handleL2BlockAndMessages';
|
|
31
23
|
export type TreeSnapshots = {
|
|
32
24
|
[MerkleTreeId.NULLIFIER_TREE]: IndexedTreeSnapshot;
|
|
33
25
|
[MerkleTreeId.NOTE_HASH_TREE]: TreeSnapshot<Fr>;
|
|
@@ -35,33 +27,51 @@ export type TreeSnapshots = {
|
|
|
35
27
|
[MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: TreeSnapshot<Fr>;
|
|
36
28
|
[MerkleTreeId.ARCHIVE]: TreeSnapshot<Fr>;
|
|
37
29
|
};
|
|
38
|
-
|
|
39
|
-
export type MerkleTreeDb = {
|
|
40
|
-
[Property in keyof MerkleTreeOperations as Exclude<Property, MerkleTreeSetters>]: WithIncludeUncommitted<MerkleTreeOperations[Property]>;
|
|
41
|
-
} & Pick<MerkleTreeOperations, MerkleTreeSetters> & {
|
|
30
|
+
export interface MerkleTreeAdminDatabase {
|
|
42
31
|
/**
|
|
43
|
-
*
|
|
44
|
-
* @param block - The block
|
|
32
|
+
* Handles a single L2 block (i.e. Inserts the new note hashes into the merkle tree).
|
|
33
|
+
* @param block - The L2 block to handle.
|
|
34
|
+
* @param l1ToL2Messages - The L1 to L2 messages for the block.
|
|
45
35
|
*/
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
} & Pick<MerkleTreeAdminOperations, MerkleTreeSetters | MerkleTreeAdmin> & {
|
|
36
|
+
handleL2BlockAndMessages(block: L2Block, l1ToL2Messages: Fr[]): Promise<WorldStateStatus>;
|
|
37
|
+
/**
|
|
38
|
+
* Gets a handle that allows reading the latest committed state
|
|
39
|
+
*/
|
|
40
|
+
getCommitted(): MerkleTreeReadOperations;
|
|
52
41
|
/**
|
|
53
|
-
*
|
|
54
|
-
* @param
|
|
42
|
+
* Gets a handle that allows reading the state as it was at the given block number
|
|
43
|
+
* @param blockNumber - The block number to get the snapshot for
|
|
55
44
|
*/
|
|
56
|
-
getSnapshot(
|
|
45
|
+
getSnapshot(blockNumber: number): MerkleTreeReadOperations;
|
|
57
46
|
/**
|
|
58
47
|
* Forks the database at its current state.
|
|
48
|
+
* @param blockNumber - The block number to fork at. If not provided, the current block number is used.
|
|
49
|
+
*/
|
|
50
|
+
fork(blockNumber?: number): Promise<MerkleTreeWriteOperations>;
|
|
51
|
+
/**
|
|
52
|
+
* Removes all historical snapshots up to but not including the given block number
|
|
53
|
+
* @param toBlockNumber The block number of the new oldest historical block
|
|
54
|
+
* @returns The new WorldStateStatus
|
|
55
|
+
*/
|
|
56
|
+
removeHistoricalBlocks(toBlockNumber: bigint): Promise<WorldStateStatus>;
|
|
57
|
+
/**
|
|
58
|
+
* Removes all pending blocks down to but not including the given block number
|
|
59
|
+
* @param toBlockNumber The block number of the new tip of the pending chain,
|
|
60
|
+
* @returns The new WorldStateStatus
|
|
61
|
+
*/
|
|
62
|
+
unwindBlocks(toBlockNumber: bigint): Promise<WorldStateStatus>;
|
|
63
|
+
/**
|
|
64
|
+
* Advances the finalised block number to be the number provided
|
|
65
|
+
* @param toBlockNumber The block number that is now the tip of the finalised chain
|
|
66
|
+
* @returns The new WorldStateStatus
|
|
67
|
+
*/
|
|
68
|
+
setFinalised(toBlockNumber: bigint): Promise<WorldStateStatus>;
|
|
69
|
+
/**
|
|
70
|
+
* Gets the current status of the database.
|
|
71
|
+
* @returns The current WorldStateStatus.
|
|
59
72
|
*/
|
|
60
|
-
|
|
61
|
-
/** Deletes this database. */
|
|
62
|
-
delete(): Promise<void>;
|
|
73
|
+
getStatus(): Promise<WorldStateStatus>;
|
|
63
74
|
/** Stops the database */
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
export {};
|
|
75
|
+
close(): Promise<void>;
|
|
76
|
+
}
|
|
67
77
|
//# sourceMappingURL=merkle_tree_db.d.ts.map
|