@aztec/world-state 0.56.0 → 0.58.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 +128 -163
- 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 +18 -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 +160 -186
- 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,44 +1,45 @@
|
|
|
1
1
|
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
-
import { type
|
|
3
|
-
import { Fr, Header, NullifierLeafPreimage
|
|
4
|
-
import type
|
|
5
|
-
import { type
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
private
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
protected constructor(instance: NativeInstance);
|
|
16
|
-
static create(dataDir: string, libraryName?: string, className?: string): Promise<NativeWorldStateService>;
|
|
2
|
+
import { type IndexedTreeId, type L2Block, type MerkleTreeReadOperations, type MerkleTreeWriteOperations } from '@aztec/circuit-types';
|
|
3
|
+
import { EthAddress, Fr, Header, type NullifierLeafPreimage } from '@aztec/circuits.js';
|
|
4
|
+
import { type MerkleTreeAdminDatabase as MerkleTreeDatabase } from '../world-state-db/merkle_tree_db.js';
|
|
5
|
+
import { type WorldStateStatus } from './message.js';
|
|
6
|
+
import { NativeWorldState } from './native_world_state_instance.js';
|
|
7
|
+
export declare class NativeWorldStateService implements MerkleTreeDatabase {
|
|
8
|
+
protected readonly instance: NativeWorldState;
|
|
9
|
+
protected readonly log: import("@aztec/foundation/log").Logger;
|
|
10
|
+
private readonly cleanup;
|
|
11
|
+
protected initialHeader: Header | undefined;
|
|
12
|
+
protected constructor(instance: NativeWorldState, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>);
|
|
13
|
+
static new(rollupAddress: EthAddress, dataDir: string, log?: import("@aztec/foundation/log").Logger, cleanup?: () => Promise<void>): Promise<NativeWorldStateService>;
|
|
14
|
+
static tmp(rollupAddress?: EthAddress, cleanupTmpDir?: boolean): Promise<NativeWorldStateService>;
|
|
17
15
|
protected init(): Promise<void>;
|
|
18
|
-
|
|
16
|
+
getCommitted(): MerkleTreeReadOperations;
|
|
17
|
+
getSnapshot(blockNumber: number): MerkleTreeReadOperations;
|
|
18
|
+
fork(blockNumber?: number): Promise<MerkleTreeWriteOperations>;
|
|
19
19
|
getInitialHeader(): Header;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
20
|
+
handleL2BlockAndMessages(l2Block: L2Block, l1ToL2Messages: Fr[]): Promise<WorldStateStatus>;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
private buildInitialHeader;
|
|
23
|
+
/**
|
|
24
|
+
* Advances the finalised block number to be the number provided
|
|
25
|
+
* @param toBlockNumber The block number that is now the tip of the finalised chain
|
|
26
|
+
* @returns The new WorldStateStatus
|
|
27
|
+
*/
|
|
28
|
+
setFinalised(toBlockNumber: bigint): Promise<WorldStateStatus>;
|
|
29
|
+
/**
|
|
30
|
+
* Removes all historical snapshots up to but not including the given block number
|
|
31
|
+
* @param toBlockNumber The block number of the new oldest historical block
|
|
32
|
+
* @returns The new WorldStateStatus
|
|
33
|
+
*/
|
|
34
|
+
removeHistoricalBlocks(toBlockNumber: bigint): Promise<WorldStateStatus>;
|
|
35
|
+
/**
|
|
36
|
+
* Removes all pending blocks down to but not including the given block number
|
|
37
|
+
* @param toBlockNumber The block number of the new tip of the pending chain,
|
|
38
|
+
* @returns The new WorldStateStatus
|
|
39
|
+
*/
|
|
40
|
+
unwindBlocks(toBlockNumber: bigint): Promise<WorldStateStatus>;
|
|
41
|
+
getStatus(): Promise<WorldStateStatus>;
|
|
38
42
|
updateLeaf<ID extends IndexedTreeId>(_treeId: ID, _leaf: NullifierLeafPreimage | Buffer, _index: bigint): Promise<void>;
|
|
39
|
-
private
|
|
40
|
-
stop(): Promise<void>;
|
|
41
|
-
delete(): Promise<void>;
|
|
42
|
-
fork(): Promise<MerkleTreeDb>;
|
|
43
|
+
private getInitialStateReference;
|
|
43
44
|
}
|
|
44
45
|
//# sourceMappingURL=native_world_state.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,KAAK,
|
|
1
|
+
{"version":3,"file":"native_world_state.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,OAAO,EAEZ,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAE/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,UAAU,EACV,EAAE,EACF,MAAM,EAMN,KAAK,qBAAqB,EAI3B,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EAAE,KAAK,uBAAuB,IAAI,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzG,OAAO,EAEL,KAAK,gBAAgB,EAItB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAIpE,qBAAa,uBAAwB,YAAW,kBAAkB;IAI9D,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB;IAC7C,SAAS,CAAC,QAAQ,CAAC,GAAG;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAE5C,SAAS,aACY,QAAQ,EAAE,gBAAgB,EAC1B,GAAG,yCAAkD,EACvD,OAAO,sBAA0B;WAGvC,GAAG,CACd,aAAa,EAAE,UAAU,EACzB,OAAO,EAAE,MAAM,EACf,GAAG,yCAAkD,EACrD,OAAO,sBAA0B,GAChC,OAAO,CAAC,uBAAuB,CAAC;WAmBtB,GAAG,CAAC,aAAa,aAAkB,EAAE,aAAa,UAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;cAkBzF,IAAI;IAgBb,YAAY,IAAI,wBAAwB;IAIxC,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,wBAAwB;IAIpD,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAQpE,gBAAgB,IAAI,MAAM;IAIpB,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2C3F,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAKrB,kBAAkB;IAKhC;;;;OAIG;IACU,YAAY,CAAC,aAAa,EAAE,MAAM;IAM/C;;;;OAIG;IACU,sBAAsB,CAAC,aAAa,EAAE,MAAM;IAMzD;;;;OAIG;IACU,YAAY,CAAC,aAAa,EAAE,MAAM;IAMlC,SAAS;IAItB,UAAU,CAAC,EAAE,SAAS,aAAa,EACjC,OAAO,EAAE,EAAE,EACX,KAAK,EAAE,qBAAqB,GAAG,MAAM,EACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;YAIF,wBAAwB;CAYvC"}
|
|
@@ -1,179 +1,80 @@
|
|
|
1
|
-
import { MerkleTreeId,
|
|
2
|
-
import { Fr, Header, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP, NullifierLeaf,
|
|
1
|
+
import { MerkleTreeId, TxEffect, } from '@aztec/circuit-types';
|
|
2
|
+
import { EthAddress, Fr, Header, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_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
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
// as raw, untagged, buffers. On the NodeJS side we don't know what the buffer represents
|
|
14
|
-
// Adding a tag would be a solution, but it would have to be done on both sides and it's unclear where else
|
|
15
|
-
// C++ fr instances are sent/received/stored.
|
|
16
|
-
addExtension({
|
|
17
|
-
Class: Fr,
|
|
18
|
-
write: fr => fr.toBuffer(),
|
|
19
|
-
});
|
|
4
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
5
|
+
import assert from 'assert/strict';
|
|
6
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'fs/promises';
|
|
7
|
+
import { tmpdir } from 'os';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { MerkleTreesFacade, MerkleTreesForkFacade, serializeLeaf } from './merkle_trees_facade.js';
|
|
10
|
+
import { WorldStateMessageType, blockStateReference, treeStateReferenceToSnapshot, worldStateRevision, } from './message.js';
|
|
11
|
+
import { NativeWorldState } from './native_world_state_instance.js';
|
|
12
|
+
const ROLLUP_ADDRESS_FILE = 'rollup_address';
|
|
20
13
|
export class NativeWorldStateService {
|
|
21
|
-
constructor(instance) {
|
|
14
|
+
constructor(instance, log = createDebugLogger('aztec:world-state:database'), cleanup = () => Promise.resolve()) {
|
|
22
15
|
this.instance = instance;
|
|
23
|
-
this.
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const library = bindings(libraryName);
|
|
39
|
-
const instance = new library[className](dataDir);
|
|
40
|
-
const worldState = new NativeWorldStateService(instance);
|
|
16
|
+
this.log = log;
|
|
17
|
+
this.cleanup = cleanup;
|
|
18
|
+
}
|
|
19
|
+
static async new(rollupAddress, dataDir, log = createDebugLogger('aztec:world-state:database'), cleanup = () => Promise.resolve()) {
|
|
20
|
+
const rollupAddressFile = join(dataDir, ROLLUP_ADDRESS_FILE);
|
|
21
|
+
const currentRollupStr = await readFile(rollupAddressFile, 'utf8').catch(() => undefined);
|
|
22
|
+
const currentRollupAddress = currentRollupStr ? EthAddress.fromString(currentRollupStr.trim()) : undefined;
|
|
23
|
+
if (currentRollupAddress && !rollupAddress.equals(currentRollupAddress)) {
|
|
24
|
+
log.warn('Rollup address changed, deleting database');
|
|
25
|
+
await rm(dataDir, { recursive: true, force: true });
|
|
26
|
+
}
|
|
27
|
+
await mkdir(dataDir, { recursive: true });
|
|
28
|
+
await writeFile(rollupAddressFile, rollupAddress.toString(), 'utf8');
|
|
29
|
+
const instance = new NativeWorldState(dataDir);
|
|
30
|
+
const worldState = new this(instance, log, cleanup);
|
|
41
31
|
await worldState.init();
|
|
42
32
|
return worldState;
|
|
43
33
|
}
|
|
44
|
-
async
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// const state = await this.getStateReference(ic);
|
|
58
|
-
// return new Header(
|
|
59
|
-
// AppendOnlyTreeSnapshot.zero(),
|
|
60
|
-
// ContentCommitment.empty(),
|
|
61
|
-
// state,
|
|
62
|
-
// GlobalVariables.empty(),
|
|
63
|
-
// Fr.ZERO,
|
|
64
|
-
// );
|
|
65
|
-
// }
|
|
66
|
-
getInitialHeader() {
|
|
67
|
-
// TODO (alexg) implement this
|
|
68
|
-
return Header.empty();
|
|
69
|
-
}
|
|
70
|
-
async appendLeaves(treeId, leaves) {
|
|
71
|
-
await this.call(WorldStateMessageType.APPEND_LEAVES, {
|
|
72
|
-
leaves: leaves.map(leaf => leaf),
|
|
73
|
-
treeId,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
async batchInsert(treeId, rawLeaves, subtreeHeight) {
|
|
77
|
-
const leaves = rawLeaves.map((leaf) => hydrateLeaf(treeId, leaf)).map(serializeLeaf);
|
|
78
|
-
const resp = await this.call(WorldStateMessageType.BATCH_INSERT, { leaves, treeId, subtreeDepth: subtreeHeight });
|
|
79
|
-
return {
|
|
80
|
-
newSubtreeSiblingPath: new SiblingPath(resp.subtree_path.length, resp.subtree_path),
|
|
81
|
-
sortedNewLeaves: resp.sorted_leaves
|
|
82
|
-
.map(([leaf]) => leaf)
|
|
83
|
-
.map(deserializeLeafValue)
|
|
84
|
-
.map(serializeToBuffer),
|
|
85
|
-
sortedNewLeavesIndexes: resp.sorted_leaves.map(([, index]) => index),
|
|
86
|
-
lowLeavesWitnessData: resp.low_leaf_witness_data.map(data => ({
|
|
87
|
-
index: BigInt(data.index),
|
|
88
|
-
leafPreimage: deserializeIndexedLeaf(data.leaf),
|
|
89
|
-
siblingPath: new SiblingPath(data.path.length, data.path),
|
|
90
|
-
})),
|
|
34
|
+
static async tmp(rollupAddress = EthAddress.ZERO, cleanupTmpDir = true) {
|
|
35
|
+
const log = createDebugLogger('aztec:world-state:database');
|
|
36
|
+
const dataDir = await mkdtemp(join(tmpdir(), 'aztec-world-state-'));
|
|
37
|
+
log.debug(`Created temporary world state database: ${dataDir}`);
|
|
38
|
+
// pass a cleanup callback because process.on('beforeExit', cleanup) does not work under Jest
|
|
39
|
+
const cleanup = async () => {
|
|
40
|
+
if (cleanupTmpDir) {
|
|
41
|
+
await rm(dataDir, { recursive: true, force: true });
|
|
42
|
+
log.debug(`Deleted temporary world state database: ${dataDir}`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
log.debug(`Leaving temporary world state database: ${dataDir}`);
|
|
46
|
+
}
|
|
91
47
|
};
|
|
48
|
+
return this.new(rollupAddress, dataDir, log, cleanup);
|
|
92
49
|
}
|
|
93
|
-
async
|
|
94
|
-
await this.
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const index = await this.call(WorldStateMessageType.FIND_LEAF_INDEX, {
|
|
101
|
-
leaf: serializeLeaf(hydrateLeaf(treeId, leaf)),
|
|
102
|
-
revision: worldStateRevision(includeUncommitted),
|
|
103
|
-
treeId,
|
|
104
|
-
startIndex,
|
|
105
|
-
});
|
|
106
|
-
if (typeof index === 'number' || typeof index === 'bigint') {
|
|
107
|
-
return BigInt(index);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
return undefined;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
async getLeafPreimage(treeId, leafIndex, args) {
|
|
114
|
-
const resp = await this.call(WorldStateMessageType.GET_LEAF_PREIMAGE, {
|
|
115
|
-
leafIndex,
|
|
116
|
-
revision: worldStateRevision(args),
|
|
117
|
-
treeId,
|
|
118
|
-
});
|
|
119
|
-
return resp ? deserializeIndexedLeaf(resp) : undefined;
|
|
120
|
-
}
|
|
121
|
-
async getLeafValue(treeId, leafIndex, includeUncommitted) {
|
|
122
|
-
const resp = await this.call(WorldStateMessageType.GET_LEAF_VALUE, {
|
|
123
|
-
leafIndex,
|
|
124
|
-
revision: worldStateRevision(includeUncommitted),
|
|
125
|
-
treeId,
|
|
126
|
-
});
|
|
127
|
-
if (!resp) {
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
const leaf = deserializeLeafValue(resp);
|
|
131
|
-
if (leaf instanceof Fr) {
|
|
132
|
-
return leaf;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
return leaf.toBuffer();
|
|
50
|
+
async init() {
|
|
51
|
+
this.initialHeader = await this.buildInitialHeader();
|
|
52
|
+
const committed = this.getCommitted();
|
|
53
|
+
// validate the initial state
|
|
54
|
+
const archive = await committed.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
55
|
+
if (archive.size === 0n) {
|
|
56
|
+
throw new Error("Archive tree can't be empty");
|
|
136
57
|
}
|
|
58
|
+
// the initial header _must_ be the first element in the archive tree
|
|
59
|
+
// if this assertion fails, check that the hashing done in Header in yarn-project matches the initial header hash done in world_state.cpp
|
|
60
|
+
const initialHeaderIndex = await committed.findLeafIndex(MerkleTreeId.ARCHIVE, this.initialHeader.hash());
|
|
61
|
+
assert.strictEqual(initialHeaderIndex, 0n, 'Invalid initial archive state');
|
|
137
62
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
key: new Fr(value),
|
|
141
|
-
revision: worldStateRevision(includeUncommitted),
|
|
142
|
-
treeId,
|
|
143
|
-
});
|
|
144
|
-
return {
|
|
145
|
-
alreadyPresent: resp.alreadyPresent,
|
|
146
|
-
index: BigInt(resp.index),
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
async getSiblingPath(treeId, leafIndex, includeUncommitted) {
|
|
150
|
-
const siblingPath = await this.call(WorldStateMessageType.GET_SIBLING_PATH, {
|
|
151
|
-
leafIndex,
|
|
152
|
-
revision: worldStateRevision(includeUncommitted),
|
|
153
|
-
treeId,
|
|
154
|
-
});
|
|
155
|
-
return new SiblingPath(siblingPath.length, siblingPath);
|
|
63
|
+
getCommitted() {
|
|
64
|
+
return new MerkleTreesFacade(this.instance, this.initialHeader, worldStateRevision(false, 0, 0));
|
|
156
65
|
}
|
|
157
|
-
getSnapshot(
|
|
158
|
-
return
|
|
66
|
+
getSnapshot(blockNumber) {
|
|
67
|
+
return new MerkleTreesFacade(this.instance, this.initialHeader, worldStateRevision(false, 0, blockNumber));
|
|
159
68
|
}
|
|
160
|
-
async
|
|
161
|
-
const resp = await this.call(WorldStateMessageType.
|
|
162
|
-
|
|
69
|
+
async fork(blockNumber) {
|
|
70
|
+
const resp = await this.instance.call(WorldStateMessageType.CREATE_FORK, {
|
|
71
|
+
latest: blockNumber === undefined,
|
|
72
|
+
blockNumber: blockNumber ?? 0,
|
|
163
73
|
});
|
|
164
|
-
return new
|
|
74
|
+
return new MerkleTreesForkFacade(this.instance, this.initialHeader, worldStateRevision(true, resp.forkId, 0));
|
|
165
75
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
treeId: treeId,
|
|
169
|
-
revision: worldStateRevision(includeUncommitted),
|
|
170
|
-
});
|
|
171
|
-
return {
|
|
172
|
-
depth: resp.depth,
|
|
173
|
-
root: resp.root,
|
|
174
|
-
size: BigInt(resp.size),
|
|
175
|
-
treeId,
|
|
176
|
-
};
|
|
76
|
+
getInitialHeader() {
|
|
77
|
+
return this.initialHeader;
|
|
177
78
|
}
|
|
178
79
|
async handleL2BlockAndMessages(l2Block, l1ToL2Messages) {
|
|
179
80
|
// We have to pad both the tx effects and the values within tx effects because that's how the trees are built
|
|
@@ -193,111 +94,64 @@ export class NativeWorldStateService {
|
|
|
193
94
|
}
|
|
194
95
|
batchesOfPaddedPublicDataWrites.push(batch);
|
|
195
96
|
}
|
|
196
|
-
|
|
197
|
-
|
|
97
|
+
const response = await this.instance.call(WorldStateMessageType.SYNC_BLOCK, {
|
|
98
|
+
blockNumber: l2Block.number,
|
|
99
|
+
blockHeaderHash: l2Block.header.hash(),
|
|
198
100
|
paddedL1ToL2Messages: paddedL1ToL2Messages.map(serializeLeaf),
|
|
199
101
|
paddedNoteHashes: paddedNoteHashes.map(serializeLeaf),
|
|
200
102
|
paddedNullifiers: paddedNullifiers.map(serializeLeaf),
|
|
201
103
|
batchesOfPaddedPublicDataWrites: batchesOfPaddedPublicDataWrites.map(batch => batch.map(serializeLeaf)),
|
|
202
104
|
blockStateRef: blockStateReference(l2Block.header.state),
|
|
203
105
|
});
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
106
|
+
return response.status;
|
|
107
|
+
}
|
|
108
|
+
async close() {
|
|
109
|
+
await this.instance.close();
|
|
110
|
+
await this.cleanup();
|
|
111
|
+
}
|
|
112
|
+
async buildInitialHeader() {
|
|
113
|
+
const state = await this.getInitialStateReference();
|
|
114
|
+
return Header.empty({ state });
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Advances the finalised block number to be the number provided
|
|
118
|
+
* @param toBlockNumber The block number that is now the tip of the finalised chain
|
|
119
|
+
* @returns The new WorldStateStatus
|
|
120
|
+
*/
|
|
121
|
+
async setFinalised(toBlockNumber) {
|
|
122
|
+
return await this.instance.call(WorldStateMessageType.FINALISE_BLOCKS, {
|
|
123
|
+
toBlockNumber,
|
|
212
124
|
});
|
|
213
125
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
const buf = Buffer.isBuffer(encodedResponse)
|
|
223
|
-
? encodedResponse
|
|
224
|
-
: isAnyArrayBuffer(encodedResponse)
|
|
225
|
-
? Buffer.from(encodedResponse)
|
|
226
|
-
: encodedResponse;
|
|
227
|
-
if (!Buffer.isBuffer(buf)) {
|
|
228
|
-
throw new TypeError('Invalid encoded response: expected Buffer or ArrayBuffer, got ' +
|
|
229
|
-
(encodedResponse === null ? 'null' : typeof encodedResponse));
|
|
230
|
-
}
|
|
231
|
-
const decodedResponse = this.decoder.unpack(buf);
|
|
232
|
-
if (!TypedMessage.isTypedMessageLike(decodedResponse)) {
|
|
233
|
-
throw new TypeError('Invalid response: expected TypedMessageLike, got ' +
|
|
234
|
-
(decodedResponse === null ? 'null' : typeof decodedResponse));
|
|
235
|
-
}
|
|
236
|
-
const response = TypedMessage.fromMessagePack(decodedResponse);
|
|
237
|
-
if (response.header.requestId !== request.header.messageId) {
|
|
238
|
-
throw new Error('Response ID does not match request: ' + response.header.requestId + ' != ' + request.header.messageId);
|
|
239
|
-
}
|
|
240
|
-
if (response.msgType !== messageType) {
|
|
241
|
-
throw new Error('Invalid response message type: ' + response.msgType + ' != ' + messageType);
|
|
242
|
-
}
|
|
243
|
-
return response.value;
|
|
126
|
+
/**
|
|
127
|
+
* Removes all historical snapshots up to but not including the given block number
|
|
128
|
+
* @param toBlockNumber The block number of the new oldest historical block
|
|
129
|
+
* @returns The new WorldStateStatus
|
|
130
|
+
*/
|
|
131
|
+
async removeHistoricalBlocks(toBlockNumber) {
|
|
132
|
+
return await this.instance.call(WorldStateMessageType.REMOVE_HISTORICAL_BLOCKS, {
|
|
133
|
+
toBlockNumber,
|
|
244
134
|
});
|
|
245
135
|
}
|
|
246
|
-
|
|
247
|
-
|
|
136
|
+
/**
|
|
137
|
+
* Removes all pending blocks down to but not including the given block number
|
|
138
|
+
* @param toBlockNumber The block number of the new tip of the pending chain,
|
|
139
|
+
* @returns The new WorldStateStatus
|
|
140
|
+
*/
|
|
141
|
+
async unwindBlocks(toBlockNumber) {
|
|
142
|
+
return await this.instance.call(WorldStateMessageType.UNWIND_BLOCKS, {
|
|
143
|
+
toBlockNumber,
|
|
144
|
+
});
|
|
248
145
|
}
|
|
249
|
-
|
|
250
|
-
return
|
|
146
|
+
async getStatus() {
|
|
147
|
+
return await this.instance.call(WorldStateMessageType.GET_STATUS, void 0);
|
|
251
148
|
}
|
|
252
|
-
|
|
149
|
+
updateLeaf(_treeId, _leaf, _index) {
|
|
253
150
|
return Promise.reject(new Error('Method not implemented'));
|
|
254
151
|
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
return leaf;
|
|
259
|
-
}
|
|
260
|
-
else if (treeId === MerkleTreeId.NULLIFIER_TREE) {
|
|
261
|
-
return NullifierLeaf.fromBuffer(leaf);
|
|
262
|
-
}
|
|
263
|
-
else if (treeId === MerkleTreeId.PUBLIC_DATA_TREE) {
|
|
264
|
-
return PublicDataTreeLeaf.fromBuffer(leaf);
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
return Fr.fromBuffer(leaf);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
function serializeLeaf(leaf) {
|
|
271
|
-
if (leaf instanceof Fr) {
|
|
272
|
-
return leaf.toBuffer();
|
|
273
|
-
}
|
|
274
|
-
else if (leaf instanceof NullifierLeaf) {
|
|
275
|
-
return { value: leaf.nullifier.toBuffer() };
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
return { value: leaf.value.toBuffer(), slot: leaf.slot.toBuffer() };
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
function deserializeLeafValue(leaf) {
|
|
282
|
-
if (Buffer.isBuffer(leaf)) {
|
|
283
|
-
return Fr.fromBuffer(leaf);
|
|
284
|
-
}
|
|
285
|
-
else if ('slot' in leaf) {
|
|
286
|
-
return new PublicDataTreeLeaf(Fr.fromBuffer(leaf.slot), Fr.fromBuffer(leaf.value));
|
|
287
|
-
}
|
|
288
|
-
else {
|
|
289
|
-
return new NullifierLeaf(Fr.fromBuffer(leaf.value));
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
function deserializeIndexedLeaf(leaf) {
|
|
293
|
-
if ('slot' in leaf.value) {
|
|
294
|
-
return new PublicDataTreeLeafPreimage(Fr.fromBuffer(leaf.value.slot), Fr.fromBuffer(leaf.value.value), Fr.fromBuffer(leaf.nextValue), BigInt(leaf.nextIndex));
|
|
295
|
-
}
|
|
296
|
-
else if ('value' in leaf.value) {
|
|
297
|
-
return new NullifierLeafPreimage(Fr.fromBuffer(leaf.value.value), Fr.fromBuffer(leaf.nextValue), BigInt(leaf.nextIndex));
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
throw new Error('Invalid leaf type');
|
|
152
|
+
async getInitialStateReference() {
|
|
153
|
+
const resp = await this.instance.call(WorldStateMessageType.GET_INITIAL_STATE_REFERENCE, void 0);
|
|
154
|
+
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])));
|
|
301
155
|
}
|
|
302
156
|
}
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQU1MLFlBQVksRUFFWixXQUFXLEVBRVgsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLEVBQUUsRUFDRixNQUFNLEVBQ04sc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiw0Q0FBNEMsRUFDNUMsbUNBQW1DLEVBQ25DLGFBQWEsRUFDYixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQiwwQkFBMEIsRUFDMUIsY0FBYyxHQUNmLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdoRSxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUc5QyxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUNyRyxPQUFPLEVBQ0wsYUFBYSxFQUdiLFlBQVksRUFDWixxQkFBcUIsRUFHckIsbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixrQkFBa0IsR0FDbkIsTUFBTSxjQUFjLENBQUM7QUFFdEIscUdBQXFHO0FBQ3JHLHNHQUFzRztBQUN0Ryx5RkFBeUY7QUFDekYsMkdBQTJHO0FBQzNHLDZDQUE2QztBQUM3QyxZQUFZLENBQUM7SUFDWCxLQUFLLEVBQUUsRUFBRTtJQUNULEtBQUss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
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25hdGl2ZS9uYXRpdmVfd29ybGRfc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLFlBQVksRUFHWixRQUFRLEdBQ1QsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLEVBQUUsRUFDRixNQUFNLEVBQ04sc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQiw0Q0FBNEMsRUFDNUMsbUNBQW1DLEVBQ25DLGFBQWEsRUFFYixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLGNBQWMsR0FDZixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQztBQUM1QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRyxPQUFPLEVBQ0wscUJBQXFCLEVBRXJCLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsa0JBQWtCLEdBQ25CLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE1BQU0sbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUM7QUFFN0MsTUFBTSxPQUFPLHVCQUF1QjtJQUdsQyxZQUNxQixRQUEw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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { WorldStateMessageType, type WorldStateRequest, type WorldStateResponse } from './message.js';
|
|
3
|
+
export interface NativeInstance {
|
|
4
|
+
call(msg: Buffer | Uint8Array): Promise<any>;
|
|
5
|
+
}
|
|
6
|
+
export interface NativeWorldStateInstance {
|
|
7
|
+
call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T]): Promise<WorldStateResponse[T]>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Strongly-typed interface to access the WorldState class in the native world_state_napi module.
|
|
11
|
+
*/
|
|
12
|
+
export declare class NativeWorldState implements NativeWorldStateInstance {
|
|
13
|
+
private log;
|
|
14
|
+
private open;
|
|
15
|
+
/** Each message needs a unique ID */
|
|
16
|
+
private nextMessageId;
|
|
17
|
+
/** A long-lived msgpack encoder */
|
|
18
|
+
private encoder;
|
|
19
|
+
/** A long-lived msgpack decoder */
|
|
20
|
+
private decoder;
|
|
21
|
+
/** The actual native instance */
|
|
22
|
+
private instance;
|
|
23
|
+
/** Calls to the same instance are serialized */
|
|
24
|
+
private queue;
|
|
25
|
+
/** Creates a new native WorldState instance */
|
|
26
|
+
constructor(dataDir: string, log?: import("@aztec/foundation/log").Logger);
|
|
27
|
+
/**
|
|
28
|
+
* Sends a message to the native instance and returns the response.
|
|
29
|
+
* @param messageType - The type of message to send
|
|
30
|
+
* @param body - The message body
|
|
31
|
+
* @returns The response to the message
|
|
32
|
+
*/
|
|
33
|
+
call<T extends WorldStateMessageType>(messageType: T, body: WorldStateRequest[T]): Promise<WorldStateResponse[T]>;
|
|
34
|
+
/**
|
|
35
|
+
* Stops the native instance.
|
|
36
|
+
*/
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
private _sendMessage;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=native_world_state_instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":";AAsBA,OAAO,EAGL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACxB,MAAM,cAAc,CAAC;AAYtB,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9C;AAQD,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;CACnH;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IA2BlC,OAAO,CAAC,GAAG;IA1BxC,OAAO,CAAC,IAAI,CAAQ;IAEpB,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAK;IAE1B,mCAAmC;IACnC,OAAO,CAAC,OAAO,CAKZ;IAEH,mCAAmC;IACnC,OAAO,CAAC,OAAO,CAGZ;IAEH,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAM;IAEtB,gDAAgD;IAChD,OAAO,CAAC,KAAK,CAAqB;IAElC,+CAA+C;gBACnC,OAAO,EAAE,MAAM,EAAU,GAAG,yCAAkD;IAqB1F;;;;;OAKG;IACI,IAAI,CAAC,CAAC,SAAS,qBAAqB,EACzC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAQjC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASrB,YAAY;CA+H3B"}
|