@aztec/end-to-end 3.0.0-nightly.20251025 → 3.0.0-nightly.20251030-2
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/bench/client_flows/benchmark.js +2 -2
- package/dest/bench/client_flows/data_extractor.js +3 -3
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +2 -2
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +3 -0
- package/dest/e2e_p2p/p2p_network.d.ts +11 -0
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +24 -0
- package/dest/fixtures/get_bb_config.js +1 -1
- package/package.json +37 -37
- package/src/bench/client_flows/benchmark.ts +2 -2
- package/src/bench/client_flows/data_extractor.ts +3 -3
- package/src/e2e_l1_publisher/write_json.ts +2 -2
- package/src/e2e_p2p/inactivity_slash_test.ts +4 -0
- package/src/e2e_p2p/p2p_network.ts +43 -0
- package/src/fixtures/get_bb_config.ts +1 -1
|
@@ -234,13 +234,13 @@ export async function captureProfile(label, interaction, opts, expectedSteps) {
|
|
|
234
234
|
const benchmark = generateBenchmark(label, logs, result.stats, result.executionSteps, 'wasm', undefined);
|
|
235
235
|
const ivcFolder = process.env.CAPTURE_IVC_FOLDER;
|
|
236
236
|
if (ivcFolder) {
|
|
237
|
-
logger.info(`Capturing
|
|
237
|
+
logger.info(`Capturing chonk execution profile for ${label}`);
|
|
238
238
|
const resultsDirectory = join(ivcFolder, label);
|
|
239
239
|
logger.info(`Writing private execution steps to ${resultsDirectory}`);
|
|
240
240
|
await mkdir(resultsDirectory, {
|
|
241
241
|
recursive: true
|
|
242
242
|
});
|
|
243
|
-
// Write the
|
|
243
|
+
// Write the chonk files read by the prover.
|
|
244
244
|
const ivcInputsPath = join(resultsDirectory, 'ivc-inputs.msgpack');
|
|
245
245
|
await writeFile(ivcInputsPath, serializePrivateExecutionSteps(result.executionSteps));
|
|
246
246
|
await writeFile(join(resultsDirectory, 'logs.json'), JSON.stringify(logs, null, 2));
|
|
@@ -40,7 +40,7 @@ async function main() {
|
|
|
40
40
|
bbBinaryPath: process.env.BB_BINARY_PATH,
|
|
41
41
|
bbWorkingDirectory: process.env.BB_WORKING_DIRECTORY
|
|
42
42
|
}, proxyLogger.createLogger('bb:prover'));
|
|
43
|
-
const userLog = createLogger('
|
|
43
|
+
const userLog = createLogger('chonk_flows:data_processor');
|
|
44
44
|
for (const flow of flows){
|
|
45
45
|
userLog.info(`Processing flow ${flow}`);
|
|
46
46
|
const ivcInputs = await readFile(join(ivcFolder, flow, 'ivc-inputs.msgpack'));
|
|
@@ -73,10 +73,10 @@ async function main() {
|
|
|
73
73
|
let provingTime;
|
|
74
74
|
try {
|
|
75
75
|
const provingTimer = new Timer();
|
|
76
|
-
await prover.
|
|
76
|
+
await prover.createChonkProof(privateExecutionSteps);
|
|
77
77
|
provingTime = provingTimer.ms();
|
|
78
78
|
} catch (e) {
|
|
79
|
-
userLog.error(`Failed to generate
|
|
79
|
+
userLog.error(`Failed to generate chonk proof for ${flow}`, e);
|
|
80
80
|
error = e.message;
|
|
81
81
|
}
|
|
82
82
|
// Extract logs from this run from the proxy and write them to disk unconditionally
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write_json.d.ts","sourceRoot":"","sources":["../../src/e2e_l1_publisher/write_json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"write_json.d.ts","sourceRoot":"","sources":["../../src/e2e_l1_publisher/write_json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,IAAI,EAAiC,MAAM,iBAAiB,CAAC;AAOnF;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,EAAE,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,WAAW,EAAE,WAAW,EACxB,gBAAgB,EAAE,YAAY,EAC9B,eAAe,EAAE,KAAK,MAAM,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CAqDf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
|
|
2
2
|
import { writeFile } from 'fs/promises';
|
|
3
3
|
const AZTEC_GENERATE_TEST_DATA = !!process.env.AZTEC_GENERATE_TEST_DATA;
|
|
4
4
|
/**
|
|
@@ -27,7 +27,7 @@ const AZTEC_GENERATE_TEST_DATA = !!process.env.AZTEC_GENERATE_TEST_DATA;
|
|
|
27
27
|
// The json formatting in forge is a bit brittle, so we convert Fr to a number in the few values below.
|
|
28
28
|
// This should not be a problem for testing as long as the values are not larger than u32.
|
|
29
29
|
archive: asHex(block.archive.root),
|
|
30
|
-
blobCommitments:
|
|
30
|
+
blobCommitments: getPrefixedEthBlobCommitments(blobs),
|
|
31
31
|
batchedBlobInputs: batchedBlob.getEthBlobEvaluationInputs(),
|
|
32
32
|
blockNumber: block.number,
|
|
33
33
|
body: `0x${block.body.toBuffer().toString('hex')}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inactivity_slash_test.d.ts","sourceRoot":"","sources":["../../src/e2e_p2p/inactivity_slash_test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,eAAe,CAAC;AAKvB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBlD,qBAAa,iBAAiB;aAaV,IAAI,EAAE,cAAc;IAZ/B,KAAK,EAAG,gBAAgB,EAAE,CAAC;IAC3B,WAAW,EAAG,gBAAgB,EAAE,CAAC;IACjC,aAAa,EAAG,gBAAgB,EAAE,CAAC;IAEnC,MAAM,EAAG,cAAc,CAAC;IACxB,iBAAiB,EAAG,UAAU,EAAE,CAAC;IAExC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAU;gBAGf,IAAI,EAAE,cAAc,EACpC,IAAI,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;WAOnD,MAAM,CACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;QAAE,wCAAwC,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAgCrG,KAAK;
|
|
1
|
+
{"version":3,"file":"inactivity_slash_test.d.ts","sourceRoot":"","sources":["../../src/e2e_p2p/inactivity_slash_test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,eAAe,CAAC;AAKvB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAiBlD,qBAAa,iBAAiB;aAaV,IAAI,EAAE,cAAc;IAZ/B,KAAK,EAAG,gBAAgB,EAAE,CAAC;IAC3B,WAAW,EAAG,gBAAgB,EAAE,CAAC;IACjC,aAAa,EAAG,gBAAgB,EAAE,CAAC;IAEnC,MAAM,EAAG,cAAc,CAAC;IACxB,iBAAiB,EAAG,UAAU,EAAE,CAAC;IAExC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAU;gBAGf,IAAI,EAAE,cAAc,EACpC,IAAI,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;WAOnD,MAAM,CACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;QAAE,wCAAwC,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAgCrG,KAAK;IA4EL,QAAQ;IAQrB,IAAW,GAAG,gEAEb;IAED,IAAW,MAAM,2CAEhB;IAED,IAAW,cAAc,WAExB;CACF"}
|
|
@@ -105,6 +105,9 @@ export class P2PInactivityTest {
|
|
|
105
105
|
validators: this.test.validators,
|
|
106
106
|
offlineValidators: this.offlineValidators
|
|
107
107
|
});
|
|
108
|
+
// Wait for P2P mesh to be fully formed before starting slashing period
|
|
109
|
+
// This prevents race conditions where validators propose blocks before the network is ready
|
|
110
|
+
await this.test.waitForP2PMeshConnectivity(this.nodes, NUM_NODES);
|
|
108
111
|
this.test.logger.warn(`Advancing to epoch ${SETUP_EPOCH_DURATION + 1} to start slashing`);
|
|
109
112
|
await this.test.ctx.cheatCodes.rollup.advanceToEpoch(SETUP_EPOCH_DURATION + 1);
|
|
110
113
|
return this;
|
|
@@ -86,6 +86,17 @@ export declare class P2PNetworkTest {
|
|
|
86
86
|
private _sendDummyTx;
|
|
87
87
|
setup(): Promise<void>;
|
|
88
88
|
stopNodes(nodes: AztecNodeService[]): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Wait for P2P mesh to be fully formed across all nodes.
|
|
91
|
+
* This ensures that all nodes are connected to each other before proceeding,
|
|
92
|
+
* preventing race conditions where validators propose blocks before the network is ready.
|
|
93
|
+
*
|
|
94
|
+
* @param nodes - Array of nodes to check for P2P connectivity
|
|
95
|
+
* @param expectedNodeCount - Expected number of nodes in the network (defaults to nodes.length)
|
|
96
|
+
* @param timeoutSeconds - Maximum time to wait for connections (default: 30 seconds)
|
|
97
|
+
* @param checkIntervalSeconds - How often to check connectivity (default: 0.1 seconds)
|
|
98
|
+
*/
|
|
99
|
+
waitForP2PMeshConnectivity(nodes: AztecNodeService[], expectedNodeCount?: number, timeoutSeconds?: number, checkIntervalSeconds?: number): Promise<void>;
|
|
89
100
|
teardown(): Promise<void>;
|
|
90
101
|
getContracts(): Promise<{
|
|
91
102
|
rollup: RollupContract;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"p2p_network.d.ts","sourceRoot":"","sources":["../../src/e2e_p2p/p2p_network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAc,MAAM,2BAA2B,CAAC;AAErE,OAAO,EACL,KAAK,8BAA8B,EAInC,KAAK,QAAQ,EACb,cAAc,EACd,KAAK,6BAA6B,EAClC,KAAK,UAAU,EAIhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"p2p_network.d.ts","sourceRoot":"","sources":["../../src/e2e_p2p/p2p_network.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { GSEContract, MultiAdderArtifact, RollupContract, createL1TxUtilsFromVie
|
|
|
4
4
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
5
5
|
import { SecretValue } from '@aztec/foundation/config';
|
|
6
6
|
import { createLogger } from '@aztec/foundation/log';
|
|
7
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
7
8
|
import { RollupAbi, SlasherAbi, TestERC20Abi } from '@aztec/l1-artifacts';
|
|
8
9
|
import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
9
10
|
import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
|
|
@@ -266,6 +267,29 @@ export class P2PNetworkTest {
|
|
|
266
267
|
await Promise.all(nodes.map((node)=>node.stop()));
|
|
267
268
|
this.logger.info('Nodes stopped');
|
|
268
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Wait for P2P mesh to be fully formed across all nodes.
|
|
272
|
+
* This ensures that all nodes are connected to each other before proceeding,
|
|
273
|
+
* preventing race conditions where validators propose blocks before the network is ready.
|
|
274
|
+
*
|
|
275
|
+
* @param nodes - Array of nodes to check for P2P connectivity
|
|
276
|
+
* @param expectedNodeCount - Expected number of nodes in the network (defaults to nodes.length)
|
|
277
|
+
* @param timeoutSeconds - Maximum time to wait for connections (default: 30 seconds)
|
|
278
|
+
* @param checkIntervalSeconds - How often to check connectivity (default: 0.1 seconds)
|
|
279
|
+
*/ async waitForP2PMeshConnectivity(nodes, expectedNodeCount, timeoutSeconds = 30, checkIntervalSeconds = 0.1) {
|
|
280
|
+
const nodeCount = expectedNodeCount ?? nodes.length;
|
|
281
|
+
const minPeerCount = nodeCount - 1;
|
|
282
|
+
this.logger.warn(`Waiting for all ${nodeCount} nodes to connect to P2P mesh (at least ${minPeerCount} peers each)...`);
|
|
283
|
+
await Promise.all(nodes.map(async (node, index)=>{
|
|
284
|
+
const p2p = node.getP2P();
|
|
285
|
+
await retryUntil(async ()=>{
|
|
286
|
+
const peers = await p2p.getPeers();
|
|
287
|
+
// Each node should be connected to at least N-1 other nodes
|
|
288
|
+
return peers.length >= minPeerCount ? true : undefined;
|
|
289
|
+
}, `Node ${index} to connect to at least ${minPeerCount} peers`, timeoutSeconds, checkIntervalSeconds);
|
|
290
|
+
}));
|
|
291
|
+
this.logger.warn('All nodes connected to P2P mesh');
|
|
292
|
+
}
|
|
269
293
|
async teardown() {
|
|
270
294
|
await this.monitor.stop();
|
|
271
295
|
await tryStop(this.bootstrapNode, this.logger);
|
|
@@ -6,7 +6,7 @@ import { fileURLToPath } from 'url';
|
|
|
6
6
|
const { BB_RELEASE_DIR = 'barretenberg/cpp/build/bin', BB_BINARY_PATH, BB_SKIP_CLEANUP = '', TEMP_DIR = tmpdir(), BB_WORKING_DIRECTORY = '', BB_NUM_IVC_VERIFIERS = '1', BB_IVC_CONCURRENCY = '1' } = process.env;
|
|
7
7
|
export const getBBConfig = async (logger)=>{
|
|
8
8
|
try {
|
|
9
|
-
const bbBinaryPath = BB_BINARY_PATH ?? path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../', BB_RELEASE_DIR, 'bb');
|
|
9
|
+
const bbBinaryPath = BB_BINARY_PATH ?? path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../', BB_RELEASE_DIR, 'bb-avm');
|
|
10
10
|
await fs.access(bbBinaryPath, fs.constants.R_OK);
|
|
11
11
|
let bbWorkingDirectory;
|
|
12
12
|
let directoryToCleanup;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/end-to-end",
|
|
3
|
-
"version": "3.0.0-nightly.
|
|
3
|
+
"version": "3.0.0-nightly.20251030-2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": "./dest/index.js",
|
|
6
6
|
"inherits": [
|
|
@@ -25,42 +25,42 @@
|
|
|
25
25
|
"formatting": "run -T prettier --check ./src && run -T eslint ./src"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@aztec/accounts": "3.0.0-nightly.
|
|
29
|
-
"@aztec/archiver": "3.0.0-nightly.
|
|
30
|
-
"@aztec/aztec": "3.0.0-nightly.
|
|
31
|
-
"@aztec/aztec-node": "3.0.0-nightly.
|
|
32
|
-
"@aztec/aztec.js": "3.0.0-nightly.
|
|
33
|
-
"@aztec/bb-prover": "3.0.0-nightly.
|
|
34
|
-
"@aztec/blob-lib": "3.0.0-nightly.
|
|
35
|
-
"@aztec/blob-sink": "3.0.0-nightly.
|
|
36
|
-
"@aztec/bot": "3.0.0-nightly.
|
|
37
|
-
"@aztec/cli": "3.0.0-nightly.
|
|
38
|
-
"@aztec/constants": "3.0.0-nightly.
|
|
39
|
-
"@aztec/entrypoints": "3.0.0-nightly.
|
|
40
|
-
"@aztec/epoch-cache": "3.0.0-nightly.
|
|
41
|
-
"@aztec/ethereum": "3.0.0-nightly.
|
|
42
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
43
|
-
"@aztec/kv-store": "3.0.0-nightly.
|
|
44
|
-
"@aztec/l1-artifacts": "3.0.0-nightly.
|
|
45
|
-
"@aztec/merkle-tree": "3.0.0-nightly.
|
|
46
|
-
"@aztec/node-keystore": "3.0.0-nightly.
|
|
47
|
-
"@aztec/noir-contracts.js": "3.0.0-nightly.
|
|
48
|
-
"@aztec/noir-noirc_abi": "3.0.0-nightly.
|
|
49
|
-
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.
|
|
50
|
-
"@aztec/noir-test-contracts.js": "3.0.0-nightly.
|
|
51
|
-
"@aztec/p2p": "3.0.0-nightly.
|
|
52
|
-
"@aztec/protocol-contracts": "3.0.0-nightly.
|
|
53
|
-
"@aztec/prover-client": "3.0.0-nightly.
|
|
54
|
-
"@aztec/prover-node": "3.0.0-nightly.
|
|
55
|
-
"@aztec/pxe": "3.0.0-nightly.
|
|
56
|
-
"@aztec/sequencer-client": "3.0.0-nightly.
|
|
57
|
-
"@aztec/simulator": "3.0.0-nightly.
|
|
58
|
-
"@aztec/slasher": "3.0.0-nightly.
|
|
59
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
60
|
-
"@aztec/telemetry-client": "3.0.0-nightly.
|
|
61
|
-
"@aztec/test-wallet": "3.0.0-nightly.
|
|
62
|
-
"@aztec/validator-client": "3.0.0-nightly.
|
|
63
|
-
"@aztec/world-state": "3.0.0-nightly.
|
|
28
|
+
"@aztec/accounts": "3.0.0-nightly.20251030-2",
|
|
29
|
+
"@aztec/archiver": "3.0.0-nightly.20251030-2",
|
|
30
|
+
"@aztec/aztec": "3.0.0-nightly.20251030-2",
|
|
31
|
+
"@aztec/aztec-node": "3.0.0-nightly.20251030-2",
|
|
32
|
+
"@aztec/aztec.js": "3.0.0-nightly.20251030-2",
|
|
33
|
+
"@aztec/bb-prover": "3.0.0-nightly.20251030-2",
|
|
34
|
+
"@aztec/blob-lib": "3.0.0-nightly.20251030-2",
|
|
35
|
+
"@aztec/blob-sink": "3.0.0-nightly.20251030-2",
|
|
36
|
+
"@aztec/bot": "3.0.0-nightly.20251030-2",
|
|
37
|
+
"@aztec/cli": "3.0.0-nightly.20251030-2",
|
|
38
|
+
"@aztec/constants": "3.0.0-nightly.20251030-2",
|
|
39
|
+
"@aztec/entrypoints": "3.0.0-nightly.20251030-2",
|
|
40
|
+
"@aztec/epoch-cache": "3.0.0-nightly.20251030-2",
|
|
41
|
+
"@aztec/ethereum": "3.0.0-nightly.20251030-2",
|
|
42
|
+
"@aztec/foundation": "3.0.0-nightly.20251030-2",
|
|
43
|
+
"@aztec/kv-store": "3.0.0-nightly.20251030-2",
|
|
44
|
+
"@aztec/l1-artifacts": "3.0.0-nightly.20251030-2",
|
|
45
|
+
"@aztec/merkle-tree": "3.0.0-nightly.20251030-2",
|
|
46
|
+
"@aztec/node-keystore": "3.0.0-nightly.20251030-2",
|
|
47
|
+
"@aztec/noir-contracts.js": "3.0.0-nightly.20251030-2",
|
|
48
|
+
"@aztec/noir-noirc_abi": "3.0.0-nightly.20251030-2",
|
|
49
|
+
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251030-2",
|
|
50
|
+
"@aztec/noir-test-contracts.js": "3.0.0-nightly.20251030-2",
|
|
51
|
+
"@aztec/p2p": "3.0.0-nightly.20251030-2",
|
|
52
|
+
"@aztec/protocol-contracts": "3.0.0-nightly.20251030-2",
|
|
53
|
+
"@aztec/prover-client": "3.0.0-nightly.20251030-2",
|
|
54
|
+
"@aztec/prover-node": "3.0.0-nightly.20251030-2",
|
|
55
|
+
"@aztec/pxe": "3.0.0-nightly.20251030-2",
|
|
56
|
+
"@aztec/sequencer-client": "3.0.0-nightly.20251030-2",
|
|
57
|
+
"@aztec/simulator": "3.0.0-nightly.20251030-2",
|
|
58
|
+
"@aztec/slasher": "3.0.0-nightly.20251030-2",
|
|
59
|
+
"@aztec/stdlib": "3.0.0-nightly.20251030-2",
|
|
60
|
+
"@aztec/telemetry-client": "3.0.0-nightly.20251030-2",
|
|
61
|
+
"@aztec/test-wallet": "3.0.0-nightly.20251030-2",
|
|
62
|
+
"@aztec/validator-client": "3.0.0-nightly.20251030-2",
|
|
63
|
+
"@aztec/world-state": "3.0.0-nightly.20251030-2",
|
|
64
64
|
"@iarna/toml": "^2.2.5",
|
|
65
65
|
"@jest/globals": "^30.0.0",
|
|
66
66
|
"@noble/curves": "=1.0.0",
|
|
@@ -315,12 +315,12 @@ export async function captureProfile(
|
|
|
315
315
|
|
|
316
316
|
const ivcFolder = process.env.CAPTURE_IVC_FOLDER;
|
|
317
317
|
if (ivcFolder) {
|
|
318
|
-
logger.info(`Capturing
|
|
318
|
+
logger.info(`Capturing chonk execution profile for ${label}`);
|
|
319
319
|
|
|
320
320
|
const resultsDirectory = join(ivcFolder, label);
|
|
321
321
|
logger.info(`Writing private execution steps to ${resultsDirectory}`);
|
|
322
322
|
await mkdir(resultsDirectory, { recursive: true });
|
|
323
|
-
// Write the
|
|
323
|
+
// Write the chonk files read by the prover.
|
|
324
324
|
const ivcInputsPath = join(resultsDirectory, 'ivc-inputs.msgpack');
|
|
325
325
|
await writeFile(ivcInputsPath, serializePrivateExecutionSteps(result.executionSteps));
|
|
326
326
|
await writeFile(join(resultsDirectory, 'logs.json'), JSON.stringify(logs, null, 2));
|
|
@@ -46,7 +46,7 @@ async function main() {
|
|
|
46
46
|
proxyLogger.createLogger('bb:prover'),
|
|
47
47
|
);
|
|
48
48
|
|
|
49
|
-
const userLog = createLogger('
|
|
49
|
+
const userLog = createLogger('chonk_flows:data_processor');
|
|
50
50
|
|
|
51
51
|
for (const flow of flows) {
|
|
52
52
|
userLog.info(`Processing flow ${flow}`);
|
|
@@ -84,10 +84,10 @@ async function main() {
|
|
|
84
84
|
let provingTime;
|
|
85
85
|
try {
|
|
86
86
|
const provingTimer = new Timer();
|
|
87
|
-
await prover.
|
|
87
|
+
await prover.createChonkProof(privateExecutionSteps);
|
|
88
88
|
provingTime = provingTimer.ms();
|
|
89
89
|
} catch (e) {
|
|
90
|
-
userLog.error(`Failed to generate
|
|
90
|
+
userLog.error(`Failed to generate chonk proof for ${flow}`, e);
|
|
91
91
|
error = (e as Error).message;
|
|
92
92
|
}
|
|
93
93
|
// Extract logs from this run from the proxy and write them to disk unconditionally
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
2
2
|
import type { L2Block } from '@aztec/aztec.js/block';
|
|
3
3
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
4
|
-
import { BatchedBlob, Blob } from '@aztec/blob-lib';
|
|
4
|
+
import { BatchedBlob, Blob, getPrefixedEthBlobCommitments } from '@aztec/blob-lib';
|
|
5
5
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
6
6
|
|
|
7
7
|
import { writeFile } from 'fs/promises';
|
|
@@ -45,7 +45,7 @@ export async function writeJson(
|
|
|
45
45
|
// The json formatting in forge is a bit brittle, so we convert Fr to a number in the few values below.
|
|
46
46
|
// This should not be a problem for testing as long as the values are not larger than u32.
|
|
47
47
|
archive: asHex(block.archive.root),
|
|
48
|
-
blobCommitments:
|
|
48
|
+
blobCommitments: getPrefixedEthBlobCommitments(blobs),
|
|
49
49
|
batchedBlobInputs: batchedBlob.getEthBlobEvaluationInputs(),
|
|
50
50
|
blockNumber: block.number,
|
|
51
51
|
body: `0x${block.body.toBuffer().toString('hex')}`,
|
|
@@ -146,6 +146,10 @@ export class P2PInactivityTest {
|
|
|
146
146
|
offlineValidators: this.offlineValidators,
|
|
147
147
|
});
|
|
148
148
|
|
|
149
|
+
// Wait for P2P mesh to be fully formed before starting slashing period
|
|
150
|
+
// This prevents race conditions where validators propose blocks before the network is ready
|
|
151
|
+
await this.test.waitForP2PMeshConnectivity(this.nodes, NUM_NODES);
|
|
152
|
+
|
|
149
153
|
this.test.logger.warn(`Advancing to epoch ${SETUP_EPOCH_DURATION + 1} to start slashing`);
|
|
150
154
|
await this.test.ctx.cheatCodes.rollup.advanceToEpoch(SETUP_EPOCH_DURATION + 1);
|
|
151
155
|
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
19
19
|
import { SecretValue } from '@aztec/foundation/config';
|
|
20
20
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
21
|
+
import { retryUntil } from '@aztec/foundation/retry';
|
|
21
22
|
import { RollupAbi, SlasherAbi, TestERC20Abi } from '@aztec/l1-artifacts';
|
|
22
23
|
import { SpamContract } from '@aztec/noir-test-contracts.js/Spam';
|
|
23
24
|
import type { BootstrapNode } from '@aztec/p2p/bootstrap';
|
|
@@ -389,6 +390,48 @@ export class P2PNetworkTest {
|
|
|
389
390
|
this.logger.info('Nodes stopped');
|
|
390
391
|
}
|
|
391
392
|
|
|
393
|
+
/**
|
|
394
|
+
* Wait for P2P mesh to be fully formed across all nodes.
|
|
395
|
+
* This ensures that all nodes are connected to each other before proceeding,
|
|
396
|
+
* preventing race conditions where validators propose blocks before the network is ready.
|
|
397
|
+
*
|
|
398
|
+
* @param nodes - Array of nodes to check for P2P connectivity
|
|
399
|
+
* @param expectedNodeCount - Expected number of nodes in the network (defaults to nodes.length)
|
|
400
|
+
* @param timeoutSeconds - Maximum time to wait for connections (default: 30 seconds)
|
|
401
|
+
* @param checkIntervalSeconds - How often to check connectivity (default: 0.1 seconds)
|
|
402
|
+
*/
|
|
403
|
+
async waitForP2PMeshConnectivity(
|
|
404
|
+
nodes: AztecNodeService[],
|
|
405
|
+
expectedNodeCount?: number,
|
|
406
|
+
timeoutSeconds = 30,
|
|
407
|
+
checkIntervalSeconds = 0.1,
|
|
408
|
+
) {
|
|
409
|
+
const nodeCount = expectedNodeCount ?? nodes.length;
|
|
410
|
+
const minPeerCount = nodeCount - 1;
|
|
411
|
+
|
|
412
|
+
this.logger.warn(
|
|
413
|
+
`Waiting for all ${nodeCount} nodes to connect to P2P mesh (at least ${minPeerCount} peers each)...`,
|
|
414
|
+
);
|
|
415
|
+
|
|
416
|
+
await Promise.all(
|
|
417
|
+
nodes.map(async (node, index) => {
|
|
418
|
+
const p2p = node.getP2P();
|
|
419
|
+
await retryUntil(
|
|
420
|
+
async () => {
|
|
421
|
+
const peers = await p2p.getPeers();
|
|
422
|
+
// Each node should be connected to at least N-1 other nodes
|
|
423
|
+
return peers.length >= minPeerCount ? true : undefined;
|
|
424
|
+
},
|
|
425
|
+
`Node ${index} to connect to at least ${minPeerCount} peers`,
|
|
426
|
+
timeoutSeconds,
|
|
427
|
+
checkIntervalSeconds,
|
|
428
|
+
);
|
|
429
|
+
}),
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
this.logger.warn('All nodes connected to P2P mesh');
|
|
433
|
+
}
|
|
434
|
+
|
|
392
435
|
async teardown() {
|
|
393
436
|
await this.monitor.stop();
|
|
394
437
|
await tryStop(this.bootstrapNode, this.logger);
|
|
@@ -23,7 +23,7 @@ export const getBBConfig = async (
|
|
|
23
23
|
try {
|
|
24
24
|
const bbBinaryPath =
|
|
25
25
|
BB_BINARY_PATH ??
|
|
26
|
-
path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../', BB_RELEASE_DIR, 'bb');
|
|
26
|
+
path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../', BB_RELEASE_DIR, 'bb-avm');
|
|
27
27
|
await fs.access(bbBinaryPath, fs.constants.R_OK);
|
|
28
28
|
|
|
29
29
|
let bbWorkingDirectory: string;
|