@aztec/world-state 5.0.0-nightly.20260708 → 5.0.0-nightly.20260710
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/native/native_world_state_instance.d.ts +1 -1
- package/dest/native/native_world_state_instance.d.ts.map +1 -1
- package/dest/native/native_world_state_instance.js +10 -1
- package/dest/testing.d.ts +2 -2
- package/dest/testing.d.ts.map +1 -1
- package/dest/testing.js +14 -6
- package/package.json +10 -10
- package/src/native/native_world_state_instance.ts +13 -0
- package/src/testing.ts +13 -6
|
@@ -47,4 +47,4 @@ export declare class NativeWorldState implements NativeWorldStateInstance {
|
|
|
47
47
|
close(): Promise<void>;
|
|
48
48
|
private _sendMessage;
|
|
49
49
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF0aXZlX3dvcmxkX3N0YXRlX2luc3RhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmF0aXZlL25hdGl2ZV93b3JsZF9zdGF0ZV9pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHdkYsT0FBTyxFQUFzQixLQUFLLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBS2pGLE9BQU8sS0FBSyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdkYsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLEtBQUssaUJBQWlCLEVBQ3RCLEtBQUssMkJBQTJCLEVBQ2hDLEtBQUssa0JBQWtCLEVBSXhCLE1BQU0sY0FBYyxDQUFDO0FBS3RCLE1BQU0sV0FBVyx3QkFBd0I7SUFDdkMsSUFBSSxDQUFDLENBQUMsU0FBUyxxQkFBcUIsRUFDbEMsV0FBVyxFQUFFLENBQUMsRUFDZCxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsMkJBQTJCLEdBQ3ZELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWxDLFNBQVMsSUFBSSxHQUFHLENBQUM7Q0FDbEI7QUFFRDs7R0FFRztBQUNILHFCQUFhLGdCQUFpQixZQUFXLHdCQUF3QjtJQVU3RCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU87SUFDeEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjO0lBQy9CLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTztJQUN4QixPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWU7SUFFaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHO0lBQ3BCLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUztJQWY1QixPQUFPLENBQUMsSUFBSSxDQUFRO0lBR3BCLE9BQU8sQ0FBQyxNQUFNLENBQXlDO0lBRXZELE9BQU8sQ0FBQyxRQUFRLENBQStFO0lBRS9GLCtDQUErQztJQUMvQyxZQUNtQixPQUFPLEVBQUUsTUFBTSxFQUNmLGNBQWMsRUFBRSxzQkFBc0IsRUFDdEMsT0FBTyx5QkFBa0MsRUFDekMsZUFBZSxFQUFFLHlCQUF5QixFQUMzRCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBQ1IsR0FBRyxHQUFFLE1BQXVELEVBQzVELFNBQVMsR0FBRSxPQUFlLEVBc0Q1QztJQUVNLFVBQVUsV0FFaEI7SUFFTSxLQUFLLHFCQVVYO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxJQUFJLEdBQUcsQ0FpQnRCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNVLElBQUksQ0FBQyxDQUFDLFNBQVMscUJBQXFCLEVBQy9DLFdBQVcsRUFBRSxDQUFDLEVBQ2QsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLDJCQUEyQixFQUV4RCxlQUFlLDZEQUF1RSxFQUN0RixZQUFZLHNCQUFvQixHQUMvQixPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0E0RGhDO0lBRUQ7O09BRUc7SUFDVSxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQWVsQztZQUVhLFlBQVk7Q0E4RDNCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAGvF,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKjF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAIxB,MAAM,cAAc,CAAC;AAKtB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAClC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,SAAS,IAAI,GAAG,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IAU7D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAf5B,OAAO,CAAC,IAAI,CAAQ;IAGpB,OAAO,CAAC,MAAM,CAAyC;IAEvD,OAAO,CAAC,QAAQ,CAA+E;IAE/F,+CAA+C;IAC/C,YACmB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,sBAAsB,EACtC,OAAO,yBAAkC,EACzC,eAAe,EAAE,yBAAyB,EAC3D,QAAQ,CAAC,EAAE,cAAc,EACR,GAAG,GAAE,MAAuD,EAC5D,SAAS,GAAE,OAAe,
|
|
1
|
+
{"version":3,"file":"native_world_state_instance.d.ts","sourceRoot":"","sources":["../../src/native/native_world_state_instance.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAGvF,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAKjF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EAIxB,MAAM,cAAc,CAAC;AAKtB,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAClC,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,GACvD,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAElC,SAAS,IAAI,GAAG,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,wBAAwB;IAU7D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAf5B,OAAO,CAAC,IAAI,CAAQ;IAGpB,OAAO,CAAC,MAAM,CAAyC;IAEvD,OAAO,CAAC,QAAQ,CAA+E;IAE/F,+CAA+C;IAC/C,YACmB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,sBAAsB,EACtC,OAAO,yBAAkC,EACzC,eAAe,EAAE,yBAAyB,EAC3D,QAAQ,CAAC,EAAE,cAAc,EACR,GAAG,GAAE,MAAuD,EAC5D,SAAS,GAAE,OAAe,EAsD5C;IAEM,UAAU,WAEhB;IAEM,KAAK,qBAUX;IAED;;;;;;OAMG;IACI,SAAS,IAAI,GAAG,CAiBtB;IAED;;;;;;;OAOG;IACU,IAAI,CAAC,CAAC,SAAS,qBAAqB,EAC/C,WAAW,EAAE,CAAC,EACd,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,2BAA2B,EAExD,eAAe,6DAAuE,EACtF,YAAY,sBAAoB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CA4DhC;IAED;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAelC;YAEa,YAAY;CA8D3B"}
|
|
@@ -36,6 +36,15 @@ const MAX_WORLD_STATE_THREADS = +(process.env.HARDWARE_CONCURRENCY || '16');
|
|
|
36
36
|
d.slot.toBuffer(),
|
|
37
37
|
d.value.toBuffer()
|
|
38
38
|
]);
|
|
39
|
+
// Nullifiers to pre-insert into the genesis nullifier tree (empty by default, so production genesis roots are
|
|
40
|
+
// unchanged). The native indexed nullifier tree requires its prefilled leaves to be unique and strictly
|
|
41
|
+
// increasing, so we enforce that here before handing them over rather than failing deep inside the C++ tree
|
|
42
|
+
// construction.
|
|
43
|
+
const prefilledNullifiers = genesis.prefilledNullifiers ?? [];
|
|
44
|
+
for(let i = 1; i < prefilledNullifiers.length; i++){
|
|
45
|
+
assert(prefilledNullifiers[i].toBigInt() > prefilledNullifiers[i - 1].toBigInt(), 'Prefilled genesis nullifiers must be unique and strictly increasing');
|
|
46
|
+
}
|
|
47
|
+
const prefilledNullifiersBufferArray = prefilledNullifiers.map((n)=>n.toBuffer());
|
|
39
48
|
const ws = new BaseNativeWorldState(dataDir, {
|
|
40
49
|
[MerkleTreeId.NULLIFIER_TREE]: NULLIFIER_TREE_HEIGHT,
|
|
41
50
|
[MerkleTreeId.NOTE_HASH_TREE]: NOTE_HASH_TREE_HEIGHT,
|
|
@@ -45,7 +54,7 @@ const MAX_WORLD_STATE_THREADS = +(process.env.HARDWARE_CONCURRENCY || '16');
|
|
|
45
54
|
}, {
|
|
46
55
|
[MerkleTreeId.NULLIFIER_TREE]: 2 * MAX_NULLIFIERS_PER_TX,
|
|
47
56
|
[MerkleTreeId.PUBLIC_DATA_TREE]: 2 * MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX
|
|
48
|
-
}, prefilledPublicDataBufferArray, DomainSeparator.BLOCK_HEADER_HASH, Number(genesis.genesisTimestamp), {
|
|
57
|
+
}, prefilledPublicDataBufferArray, prefilledNullifiersBufferArray, DomainSeparator.BLOCK_HEADER_HASH, Number(genesis.genesisTimestamp), {
|
|
49
58
|
[MerkleTreeId.NULLIFIER_TREE]: wsTreeMapSizes.nullifierTreeMapSizeKb,
|
|
50
59
|
[MerkleTreeId.NOTE_HASH_TREE]: wsTreeMapSizes.noteHashTreeMapSizeKb,
|
|
51
60
|
[MerkleTreeId.PUBLIC_DATA_TREE]: wsTreeMapSizes.publicDataTreeMapSizeKb,
|
package/dest/testing.d.ts
CHANGED
|
@@ -3,9 +3,9 @@ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
3
3
|
import { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
4
4
|
import type { GenesisData } from '@aztec/stdlib/world-state';
|
|
5
5
|
export declare const defaultInitialAccountFeeJuice: Fr;
|
|
6
|
-
export declare function getGenesisValues(initialAccounts: AztecAddress[], initialAccountFeeJuice?: Fr, genesisPublicData?: PublicDataTreeLeaf[], genesisTimestamp?: bigint): Promise<{
|
|
6
|
+
export declare function getGenesisValues(initialAccounts: AztecAddress[], initialAccountFeeJuice?: Fr, genesisPublicData?: PublicDataTreeLeaf[], genesisTimestamp?: bigint, prefilledNullifiers?: Fr[]): Promise<{
|
|
7
7
|
genesisArchiveRoot: Fr;
|
|
8
8
|
genesis: GenesisData;
|
|
9
9
|
fundingNeeded: bigint;
|
|
10
10
|
}>;
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGluZy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQTBCN0QsZUFBTyxNQUFNLDZCQUE2QixJQUFxQixDQUFDO0FBRWhFLHdCQUFzQixnQkFBZ0IsQ0FDcEMsZUFBZSxFQUFFLFlBQVksRUFBRSxFQUMvQixzQkFBc0IsS0FBZ0MsRUFDdEQsaUJBQWlCLEdBQUUsa0JBQWtCLEVBQU8sRUFDNUMsZ0JBQWdCLEdBQUUsTUFBVyxFQUM3QixtQkFBbUIsR0FBRSxFQUFFLEVBQU87Ozs7R0EwQi9CIn0=
|
package/dest/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAgB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAgB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AA0B7D,eAAO,MAAM,6BAA6B,IAAqB,CAAC;AAEhE,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,YAAY,EAAE,EAC/B,sBAAsB,KAAgC,EACtD,iBAAiB,GAAE,kBAAkB,EAAO,EAC5C,gBAAgB,GAAE,MAAW,EAC7B,mBAAmB,GAAE,EAAE,EAAO;;;;GA0B/B"}
|
package/dest/testing.js
CHANGED
|
@@ -4,15 +4,17 @@ import { computeFeePayerBalanceLeafSlot } from '@aztec/protocol-contracts/fee-ju
|
|
|
4
4
|
import { MerkleTreeId, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
5
5
|
import { NativeWorldStateService } from './native/index.js';
|
|
6
6
|
async function generateGenesisValues(genesis) {
|
|
7
|
-
|
|
7
|
+
// The GENESIS_ARCHIVE_ROOT constant reflects the canonical empty genesis (no public data, no prefilled nullifiers,
|
|
8
|
+
// timestamp 0), so we can only short-circuit when this genesis adds none of those on top.
|
|
9
|
+
if (!genesis.prefilledPublicData.length && genesis.genesisTimestamp === 0n && !genesis.prefilledNullifiers?.length) {
|
|
8
10
|
return {
|
|
9
11
|
genesisArchiveRoot: new Fr(GENESIS_ARCHIVE_ROOT)
|
|
10
12
|
};
|
|
11
13
|
}
|
|
12
|
-
// Compute the genesis values on a throwaway world state. The archive root derives
|
|
13
|
-
// prefilled public data and the genesis timestamp, so the fsync-off ephemeral store (no
|
|
14
|
-
// manager, no crash-recoverability) produces an identical root while skipping the fsync overhead
|
|
15
|
-
//
|
|
14
|
+
// Compute the genesis values on a throwaway world state. The archive root derives deterministically from the
|
|
15
|
+
// prefilled public data, the prefilled nullifiers, and the genesis timestamp, so the fsync-off ephemeral store (no
|
|
16
|
+
// version manager, no crash-recoverability) produces an identical root while skipping the fsync overhead that `tmp`
|
|
17
|
+
// pays. close() removes the tmpdir.
|
|
16
18
|
const ws = await NativeWorldStateService.ephemeral(genesis);
|
|
17
19
|
const genesisArchiveRoot = new Fr((await ws.getCommitted().getTreeInfo(MerkleTreeId.ARCHIVE)).root);
|
|
18
20
|
await ws.close();
|
|
@@ -21,14 +23,20 @@ async function generateGenesisValues(genesis) {
|
|
|
21
23
|
};
|
|
22
24
|
}
|
|
23
25
|
export const defaultInitialAccountFeeJuice = new Fr(10n ** 22n);
|
|
24
|
-
export async function getGenesisValues(initialAccounts, initialAccountFeeJuice = defaultInitialAccountFeeJuice, genesisPublicData = [], genesisTimestamp = 0n) {
|
|
26
|
+
export async function getGenesisValues(initialAccounts, initialAccountFeeJuice = defaultInitialAccountFeeJuice, genesisPublicData = [], genesisTimestamp = 0n, prefilledNullifiers = []) {
|
|
25
27
|
// Top up the accounts with fee juice.
|
|
26
28
|
let prefilledPublicData = await Promise.all(initialAccounts.map(async (address)=>new PublicDataTreeLeaf(await computeFeePayerBalanceLeafSlot(address), initialAccountFeeJuice)));
|
|
27
29
|
// Add user-defined public data
|
|
28
30
|
prefilledPublicData = prefilledPublicData.concat(genesisPublicData);
|
|
29
31
|
prefilledPublicData.sort((a, b)=>b.slot.lt(a.slot) ? 1 : -1);
|
|
32
|
+
// The indexed nullifier tree requires its prefilled leaves to be unique and strictly increasing, so sort ascending
|
|
33
|
+
// here (a copy, to avoid mutating the caller's array) rather than relying on the caller's ordering.
|
|
34
|
+
const sortedNullifiers = [
|
|
35
|
+
...prefilledNullifiers
|
|
36
|
+
].sort((a, b)=>a.toBigInt() < b.toBigInt() ? -1 : 1);
|
|
30
37
|
const genesis = {
|
|
31
38
|
prefilledPublicData,
|
|
39
|
+
prefilledNullifiers: sortedNullifiers,
|
|
32
40
|
genesisTimestamp
|
|
33
41
|
};
|
|
34
42
|
const { genesisArchiveRoot } = await generateGenesisValues(genesis);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/world-state",
|
|
3
|
-
"version": "5.0.0-nightly.
|
|
3
|
+
"version": "5.0.0-nightly.20260710",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -64,20 +64,20 @@
|
|
|
64
64
|
]
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@aztec/bb.js": "5.0.0-nightly.
|
|
68
|
-
"@aztec/constants": "5.0.0-nightly.
|
|
69
|
-
"@aztec/foundation": "5.0.0-nightly.
|
|
70
|
-
"@aztec/kv-store": "5.0.0-nightly.
|
|
71
|
-
"@aztec/native": "5.0.0-nightly.
|
|
72
|
-
"@aztec/protocol-contracts": "5.0.0-nightly.
|
|
73
|
-
"@aztec/stdlib": "5.0.0-nightly.
|
|
74
|
-
"@aztec/telemetry-client": "5.0.0-nightly.
|
|
67
|
+
"@aztec/bb.js": "5.0.0-nightly.20260710",
|
|
68
|
+
"@aztec/constants": "5.0.0-nightly.20260710",
|
|
69
|
+
"@aztec/foundation": "5.0.0-nightly.20260710",
|
|
70
|
+
"@aztec/kv-store": "5.0.0-nightly.20260710",
|
|
71
|
+
"@aztec/native": "5.0.0-nightly.20260710",
|
|
72
|
+
"@aztec/protocol-contracts": "5.0.0-nightly.20260710",
|
|
73
|
+
"@aztec/stdlib": "5.0.0-nightly.20260710",
|
|
74
|
+
"@aztec/telemetry-client": "5.0.0-nightly.20260710",
|
|
75
75
|
"msgpackr": "^1.11.2",
|
|
76
76
|
"tslib": "^2.4.0",
|
|
77
77
|
"zod": "^4"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
|
-
"@aztec/archiver": "5.0.0-nightly.
|
|
80
|
+
"@aztec/archiver": "5.0.0-nightly.20260710",
|
|
81
81
|
"@jest/globals": "^30.0.0",
|
|
82
82
|
"@types/jest": "^30.0.0",
|
|
83
83
|
"@types/node": "^22.15.17",
|
|
@@ -71,6 +71,18 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
71
71
|
d.slot.toBuffer(),
|
|
72
72
|
d.value.toBuffer(),
|
|
73
73
|
]);
|
|
74
|
+
// Nullifiers to pre-insert into the genesis nullifier tree (empty by default, so production genesis roots are
|
|
75
|
+
// unchanged). The native indexed nullifier tree requires its prefilled leaves to be unique and strictly
|
|
76
|
+
// increasing, so we enforce that here before handing them over rather than failing deep inside the C++ tree
|
|
77
|
+
// construction.
|
|
78
|
+
const prefilledNullifiers = genesis.prefilledNullifiers ?? [];
|
|
79
|
+
for (let i = 1; i < prefilledNullifiers.length; i++) {
|
|
80
|
+
assert(
|
|
81
|
+
prefilledNullifiers[i].toBigInt() > prefilledNullifiers[i - 1].toBigInt(),
|
|
82
|
+
'Prefilled genesis nullifiers must be unique and strictly increasing',
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
const prefilledNullifiersBufferArray = prefilledNullifiers.map(n => n.toBuffer());
|
|
74
86
|
const ws = new BaseNativeWorldState(
|
|
75
87
|
dataDir,
|
|
76
88
|
{
|
|
@@ -85,6 +97,7 @@ export class NativeWorldState implements NativeWorldStateInstance {
|
|
|
85
97
|
[MerkleTreeId.PUBLIC_DATA_TREE]: 2 * MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
86
98
|
},
|
|
87
99
|
prefilledPublicDataBufferArray,
|
|
100
|
+
prefilledNullifiersBufferArray,
|
|
88
101
|
DomainSeparator.BLOCK_HEADER_HASH,
|
|
89
102
|
Number(genesis.genesisTimestamp),
|
|
90
103
|
{
|
package/src/testing.ts
CHANGED
|
@@ -8,16 +8,18 @@ import type { GenesisData } from '@aztec/stdlib/world-state';
|
|
|
8
8
|
import { NativeWorldStateService } from './native/index.js';
|
|
9
9
|
|
|
10
10
|
async function generateGenesisValues(genesis: GenesisData) {
|
|
11
|
-
|
|
11
|
+
// The GENESIS_ARCHIVE_ROOT constant reflects the canonical empty genesis (no public data, no prefilled nullifiers,
|
|
12
|
+
// timestamp 0), so we can only short-circuit when this genesis adds none of those on top.
|
|
13
|
+
if (!genesis.prefilledPublicData.length && genesis.genesisTimestamp === 0n && !genesis.prefilledNullifiers?.length) {
|
|
12
14
|
return {
|
|
13
15
|
genesisArchiveRoot: new Fr(GENESIS_ARCHIVE_ROOT),
|
|
14
16
|
};
|
|
15
17
|
}
|
|
16
18
|
|
|
17
|
-
// Compute the genesis values on a throwaway world state. The archive root derives
|
|
18
|
-
// prefilled public data and the genesis timestamp, so the fsync-off ephemeral store (no
|
|
19
|
-
// manager, no crash-recoverability) produces an identical root while skipping the fsync overhead
|
|
20
|
-
//
|
|
19
|
+
// Compute the genesis values on a throwaway world state. The archive root derives deterministically from the
|
|
20
|
+
// prefilled public data, the prefilled nullifiers, and the genesis timestamp, so the fsync-off ephemeral store (no
|
|
21
|
+
// version manager, no crash-recoverability) produces an identical root while skipping the fsync overhead that `tmp`
|
|
22
|
+
// pays. close() removes the tmpdir.
|
|
21
23
|
const ws = await NativeWorldStateService.ephemeral(genesis);
|
|
22
24
|
const genesisArchiveRoot = new Fr((await ws.getCommitted().getTreeInfo(MerkleTreeId.ARCHIVE)).root);
|
|
23
25
|
await ws.close();
|
|
@@ -34,6 +36,7 @@ export async function getGenesisValues(
|
|
|
34
36
|
initialAccountFeeJuice = defaultInitialAccountFeeJuice,
|
|
35
37
|
genesisPublicData: PublicDataTreeLeaf[] = [],
|
|
36
38
|
genesisTimestamp: bigint = 0n,
|
|
39
|
+
prefilledNullifiers: Fr[] = [],
|
|
37
40
|
) {
|
|
38
41
|
// Top up the accounts with fee juice.
|
|
39
42
|
let prefilledPublicData = await Promise.all(
|
|
@@ -47,7 +50,11 @@ export async function getGenesisValues(
|
|
|
47
50
|
|
|
48
51
|
prefilledPublicData.sort((a, b) => (b.slot.lt(a.slot) ? 1 : -1));
|
|
49
52
|
|
|
50
|
-
|
|
53
|
+
// The indexed nullifier tree requires its prefilled leaves to be unique and strictly increasing, so sort ascending
|
|
54
|
+
// here (a copy, to avoid mutating the caller's array) rather than relying on the caller's ordering.
|
|
55
|
+
const sortedNullifiers = [...prefilledNullifiers].sort((a, b) => (a.toBigInt() < b.toBigInt() ? -1 : 1));
|
|
56
|
+
|
|
57
|
+
const genesis: GenesisData = { prefilledPublicData, prefilledNullifiers: sortedNullifiers, genesisTimestamp };
|
|
51
58
|
const { genesisArchiveRoot } = await generateGenesisValues(genesis);
|
|
52
59
|
|
|
53
60
|
return {
|