@aztec/end-to-end 0.0.1-commit.ee80a48 → 0.0.1-commit.ef17749e1
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/client_flows_benchmark.d.ts +2 -2
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +19 -11
- package/dest/bench/client_flows/config.d.ts +2 -2
- package/dest/bench/client_flows/config.d.ts.map +1 -1
- package/dest/bench/client_flows/config.js +18 -0
- package/dest/bench/utils.d.ts +1 -1
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +6 -3
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +4 -2
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts.map +1 -1
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.js +22 -12
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +2 -2
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts.map +1 -1
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.js +3 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts +2 -2
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.d.ts +9 -7
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +58 -33
- package/dest/e2e_fees/fees_test.d.ts +2 -2
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +18 -11
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +4 -6
- package/dest/e2e_p2p/p2p_network.d.ts +5 -4
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +24 -7
- package/dest/e2e_p2p/reqresp/utils.d.ts +3 -3
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
- package/dest/e2e_p2p/reqresp/utils.js +32 -8
- package/dest/e2e_p2p/shared.d.ts +16 -2
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +30 -3
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts +2 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fetcher.js +184 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts +18 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.d.ts.map +1 -0
- package/dest/e2e_storage_proof/fixtures/storage_proof_fixture.js +120 -0
- package/dest/e2e_token_contract/token_contract_test.d.ts +4 -2
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +19 -9
- package/dest/fixtures/authwit_proxy.d.ts +15 -0
- package/dest/fixtures/authwit_proxy.d.ts.map +1 -0
- package/dest/fixtures/authwit_proxy.js +30 -0
- package/dest/fixtures/e2e_prover_test.d.ts +4 -4
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +33 -40
- package/dest/fixtures/elu_monitor.d.ts +21 -0
- package/dest/fixtures/elu_monitor.d.ts.map +1 -0
- package/dest/fixtures/elu_monitor.js +102 -0
- package/dest/fixtures/fixtures.d.ts +5 -1
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +6 -0
- package/dest/fixtures/ha_setup.d.ts +1 -1
- package/dest/fixtures/ha_setup.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.js +3 -1
- package/dest/fixtures/setup.d.ts +39 -23
- package/dest/fixtures/setup.d.ts.map +1 -1
- package/dest/fixtures/setup.js +62 -152
- package/dest/fixtures/setup_p2p_test.d.ts +15 -7
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +18 -12
- package/dest/fixtures/token_utils.d.ts +2 -2
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +5 -4
- package/dest/shared/cross_chain_test_harness.d.ts +1 -1
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +13 -13
- package/dest/shared/gas_portal_test_harness.js +2 -2
- package/dest/shared/index.d.ts +2 -1
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.js +41 -1
- package/dest/shared/mock_state_view.d.ts +86 -0
- package/dest/shared/mock_state_view.d.ts.map +1 -0
- package/dest/shared/mock_state_view.js +186 -0
- package/dest/shared/submit-transactions.d.ts +2 -2
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts +1 -1
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +13 -11
- package/dest/simulators/lending_simulator.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +2 -2
- package/dest/simulators/token_simulator.d.ts +1 -1
- package/dest/simulators/token_simulator.d.ts.map +1 -1
- package/dest/simulators/token_simulator.js +3 -24
- package/dest/spartan/setup_test_wallets.d.ts +9 -2
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +35 -4
- package/dest/spartan/tx_metrics.js +1 -1
- package/dest/spartan/utils/bot.d.ts +3 -2
- package/dest/spartan/utils/bot.d.ts.map +1 -1
- package/dest/spartan/utils/bot.js +2 -1
- package/dest/spartan/utils/config.d.ts +4 -1
- package/dest/spartan/utils/config.d.ts.map +1 -1
- package/dest/spartan/utils/config.js +2 -1
- package/dest/spartan/utils/index.d.ts +3 -2
- package/dest/spartan/utils/index.d.ts.map +1 -1
- package/dest/spartan/utils/index.js +3 -1
- package/dest/spartan/utils/k8s.d.ts +3 -1
- package/dest/spartan/utils/k8s.d.ts.map +1 -1
- package/dest/spartan/utils/k8s.js +6 -0
- package/dest/spartan/utils/nodes.d.ts +4 -5
- package/dest/spartan/utils/nodes.d.ts.map +1 -1
- package/dest/spartan/utils/nodes.js +9 -9
- package/dest/test-wallet/test_wallet.d.ts +83 -0
- package/dest/test-wallet/test_wallet.d.ts.map +1 -0
- package/dest/test-wallet/test_wallet.js +214 -0
- package/dest/test-wallet/utils.d.ts +41 -0
- package/dest/test-wallet/utils.d.ts.map +1 -0
- package/dest/test-wallet/utils.js +71 -0
- package/dest/test-wallet/wallet_worker_script.d.ts +2 -0
- package/dest/test-wallet/wallet_worker_script.d.ts.map +1 -0
- package/dest/test-wallet/wallet_worker_script.js +48 -0
- package/dest/test-wallet/worker_wallet.d.ts +52 -0
- package/dest/test-wallet/worker_wallet.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet.js +151 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts +274 -0
- package/dest/test-wallet/worker_wallet_schema.d.ts.map +1 -0
- package/dest/test-wallet/worker_wallet_schema.js +10 -0
- package/package.json +43 -43
- package/src/bench/client_flows/client_flows_benchmark.ts +42 -38
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/utils.ts +8 -3
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +28 -15
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +7 -8
- package/src/e2e_deploy_contract/deploy_test.ts +3 -3
- package/src/e2e_epochs/epochs_test.ts +73 -63
- package/src/e2e_fees/bridging_race.notest.ts +1 -1
- package/src/e2e_fees/fees_test.ts +20 -28
- package/src/e2e_nested_contract/nested_contract_test.ts +7 -5
- package/src/e2e_p2p/inactivity_slash_test.ts +4 -4
- package/src/e2e_p2p/p2p_network.ts +36 -10
- package/src/e2e_p2p/reqresp/utils.ts +40 -12
- package/src/e2e_p2p/shared.ts +48 -3
- package/src/e2e_storage_proof/fixtures/storage_proof.json +915 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fetcher.ts +190 -0
- package/src/e2e_storage_proof/fixtures/storage_proof_fixture.ts +173 -0
- package/src/e2e_token_contract/token_contract_test.ts +26 -9
- package/src/fixtures/authwit_proxy.ts +50 -0
- package/src/fixtures/dumps/epoch_proof_result.json +1 -1
- package/src/fixtures/e2e_prover_test.ts +39 -43
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +10 -0
- package/src/fixtures/ha_setup.ts +3 -1
- package/src/fixtures/setup.ts +94 -214
- package/src/fixtures/setup_p2p_test.ts +25 -24
- package/src/fixtures/token_utils.ts +6 -3
- package/src/guides/up_quick_start.sh +3 -3
- package/src/shared/cross_chain_test_harness.ts +13 -9
- package/src/shared/gas_portal_test_harness.ts +1 -1
- package/src/shared/index.ts +1 -0
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +3 -2
- package/src/shared/uniswap_l1_l2.ts +15 -15
- package/src/simulators/lending_simulator.ts +4 -2
- package/src/simulators/token_simulator.ts +6 -30
- package/src/spartan/setup_test_wallets.ts +59 -12
- package/src/spartan/tx_metrics.ts +1 -1
- package/src/spartan/utils/bot.ts +4 -1
- package/src/spartan/utils/config.ts +1 -0
- package/src/spartan/utils/index.ts +4 -0
- package/src/spartan/utils/k8s.ts +8 -0
- package/src/spartan/utils/nodes.ts +15 -10
- package/src/test-wallet/test_wallet.ts +306 -0
- package/src/test-wallet/utils.ts +112 -0
- package/src/test-wallet/wallet_worker_script.ts +60 -0
- package/src/test-wallet/worker_wallet.ts +213 -0
- package/src/test-wallet/worker_wallet_schema.ts +13 -0
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import type { Operator } from '@aztec/ethereum/deploy-aztec-l1-contracts';
|
|
13
13
|
import { deployL1Contract } from '@aztec/ethereum/deploy-l1-contract';
|
|
14
14
|
import { MultiAdderArtifact } from '@aztec/ethereum/l1-artifacts';
|
|
15
|
-
import {
|
|
15
|
+
import { createL1TxUtils } from '@aztec/ethereum/l1-tx-utils';
|
|
16
16
|
import { ChainMonitor } from '@aztec/ethereum/test';
|
|
17
17
|
import type { ExtendedViemWalletClient, ViemClient } from '@aztec/ethereum/types';
|
|
18
18
|
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
@@ -25,9 +25,9 @@ import type { BootstrapNode } from '@aztec/p2p/bootstrap';
|
|
|
25
25
|
import { createBootstrapNodeFromPrivateKey, getBootstrapNodeEnr } from '@aztec/p2p/test-helpers';
|
|
26
26
|
import { tryStop } from '@aztec/stdlib/interfaces/server';
|
|
27
27
|
import { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
28
|
+
import { TopicType } from '@aztec/stdlib/p2p';
|
|
28
29
|
import type { PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
29
30
|
import { ZkPassportProofParams } from '@aztec/stdlib/zkpassport';
|
|
30
|
-
import type { TestWallet } from '@aztec/test-wallet/server';
|
|
31
31
|
import { getGenesisValues } from '@aztec/world-state/testing';
|
|
32
32
|
|
|
33
33
|
import getPort from 'get-port';
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
generatePrivateKeys,
|
|
50
50
|
} from '../fixtures/setup_p2p_test.js';
|
|
51
51
|
import { getEndToEndTestTelemetryClient } from '../fixtures/with_telemetry_utils.js';
|
|
52
|
+
import type { TestWallet } from '../test-wallet/test_wallet.js';
|
|
52
53
|
|
|
53
54
|
// Use a fixed bootstrap node private key so that we can re-use the same snapshot and the nodes can find each other
|
|
54
55
|
const BOOTSTRAP_NODE_PRIVATE_KEY = '080212208f988fc0899e4a73a5aee4d271a5f20670603a756ad8d84f2c94263a6427c591';
|
|
@@ -58,7 +59,7 @@ export const WAIT_FOR_TX_TIMEOUT = l1ContractsConfig.aztecSlotDuration * 3;
|
|
|
58
59
|
export const SHORTENED_BLOCK_TIME_CONFIG_NO_PRUNES = {
|
|
59
60
|
aztecSlotDuration: 12,
|
|
60
61
|
ethereumSlotDuration: 4,
|
|
61
|
-
|
|
62
|
+
aztecProofSubmissionEpochs: 640,
|
|
62
63
|
};
|
|
63
64
|
|
|
64
65
|
export class P2PNetworkTest {
|
|
@@ -322,8 +323,9 @@ export class P2PNetworkTest {
|
|
|
322
323
|
throw new Error('Call setupAccount before deploying spam contract');
|
|
323
324
|
}
|
|
324
325
|
|
|
325
|
-
|
|
326
|
-
|
|
326
|
+
({ contract: this.spamContract } = await SpamContract.deploy(this.wallet).send({
|
|
327
|
+
from: this.defaultAccountAddress!,
|
|
328
|
+
}));
|
|
327
329
|
}
|
|
328
330
|
|
|
329
331
|
async removeInitialNode() {
|
|
@@ -333,9 +335,9 @@ export class P2PNetworkTest {
|
|
|
333
335
|
const block = await this.context.deployL1ContractsValues.l1Client.getBlock({
|
|
334
336
|
blockNumber: receipt.blockNumber,
|
|
335
337
|
});
|
|
336
|
-
this.context.dateProvider
|
|
338
|
+
this.context.dateProvider.setTime(Number(block.timestamp) * 1000);
|
|
337
339
|
|
|
338
|
-
await this.context.aztecNodeService
|
|
340
|
+
await this.context.aztecNodeService.stop();
|
|
339
341
|
}
|
|
340
342
|
|
|
341
343
|
async sendDummyTx() {
|
|
@@ -343,7 +345,7 @@ export class P2PNetworkTest {
|
|
|
343
345
|
}
|
|
344
346
|
|
|
345
347
|
private async _sendDummyTx(l1Client: ExtendedViemWalletClient) {
|
|
346
|
-
const l1TxUtils =
|
|
348
|
+
const l1TxUtils = createL1TxUtils(l1Client);
|
|
347
349
|
return await l1TxUtils.sendAndMonitorTransaction({
|
|
348
350
|
to: l1Client.account!.address,
|
|
349
351
|
value: 1n,
|
|
@@ -374,8 +376,8 @@ export class P2PNetworkTest {
|
|
|
374
376
|
this.prefilledPublicData = prefilledPublicData;
|
|
375
377
|
|
|
376
378
|
const rollupContract = RollupContract.getFromL1ContractsValues(this.context.deployL1ContractsValues);
|
|
377
|
-
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider
|
|
378
|
-
this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider
|
|
379
|
+
this.monitor = new ChainMonitor(rollupContract, this.context.dateProvider).start();
|
|
380
|
+
this.monitor.on('l1-block', ({ timestamp }) => this.context.dateProvider.setTime(Number(timestamp) * 1000));
|
|
379
381
|
}
|
|
380
382
|
|
|
381
383
|
async stopNodes(nodes: AztecNodeService[]) {
|
|
@@ -406,6 +408,7 @@ export class P2PNetworkTest {
|
|
|
406
408
|
expectedNodeCount?: number,
|
|
407
409
|
timeoutSeconds = 30,
|
|
408
410
|
checkIntervalSeconds = 0.1,
|
|
411
|
+
topics: TopicType[] = [TopicType.tx],
|
|
409
412
|
) {
|
|
410
413
|
const nodeCount = expectedNodeCount ?? nodes.length;
|
|
411
414
|
const minPeerCount = nodeCount - 1;
|
|
@@ -431,6 +434,29 @@ export class P2PNetworkTest {
|
|
|
431
434
|
);
|
|
432
435
|
|
|
433
436
|
this.logger.warn('All nodes connected to P2P mesh');
|
|
437
|
+
|
|
438
|
+
// Wait for GossipSub mesh to form for all specified topics.
|
|
439
|
+
// We only require at least 1 mesh peer per node because GossipSub
|
|
440
|
+
// stops grafting once it reaches Dlo peers and won't fill the mesh to all available peers.
|
|
441
|
+
for (const topic of topics) {
|
|
442
|
+
this.logger.warn(`Waiting for GossipSub mesh to form for ${topic} topic...`);
|
|
443
|
+
await Promise.all(
|
|
444
|
+
nodes.map(async (node, index) => {
|
|
445
|
+
const p2p = node.getP2P();
|
|
446
|
+
await retryUntil(
|
|
447
|
+
async () => {
|
|
448
|
+
const meshPeers = await p2p.getGossipMeshPeerCount(topic);
|
|
449
|
+
this.logger.debug(`Node ${index} has ${meshPeers} gossip mesh peers for ${topic} topic`);
|
|
450
|
+
return meshPeers >= 1 ? true : undefined;
|
|
451
|
+
},
|
|
452
|
+
`Node ${index} to have gossip mesh peers for ${topic} topic`,
|
|
453
|
+
timeoutSeconds,
|
|
454
|
+
checkIntervalSeconds,
|
|
455
|
+
);
|
|
456
|
+
}),
|
|
457
|
+
);
|
|
458
|
+
this.logger.warn(`All nodes have gossip mesh peers for ${topic} topic`);
|
|
459
|
+
}
|
|
434
460
|
}
|
|
435
461
|
|
|
436
462
|
async teardown() {
|
|
@@ -3,24 +3,24 @@ import { createLogger } from '@aztec/aztec.js/log';
|
|
|
3
3
|
import { waitForTx } from '@aztec/aztec.js/node';
|
|
4
4
|
import { Tx } from '@aztec/aztec.js/tx';
|
|
5
5
|
import { RollupContract } from '@aztec/ethereum/contracts';
|
|
6
|
-
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
6
|
+
import { CheckpointNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
7
7
|
import { timesAsync } from '@aztec/foundation/collection';
|
|
8
8
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
9
9
|
|
|
10
|
-
import { jest } from '@jest/globals';
|
|
10
|
+
import { expect, jest } from '@jest/globals';
|
|
11
11
|
import fs from 'fs';
|
|
12
12
|
import os from 'os';
|
|
13
13
|
import path from 'path';
|
|
14
14
|
|
|
15
|
-
import { shouldCollectMetrics } from '../../fixtures/fixtures.js';
|
|
15
|
+
import { getBootNodeUdpPort, shouldCollectMetrics } from '../../fixtures/fixtures.js';
|
|
16
16
|
import { createNodes } from '../../fixtures/setup_p2p_test.js';
|
|
17
|
-
import { P2PNetworkTest,
|
|
17
|
+
import { P2PNetworkTest, WAIT_FOR_TX_TIMEOUT } from '../p2p_network.js';
|
|
18
18
|
import { prepareTransactions } from '../shared.js';
|
|
19
19
|
|
|
20
20
|
// Don't set this to a higher value than 9 because each node will use a different L1 publisher account and anvil seeds
|
|
21
21
|
export const NUM_VALIDATORS = 6;
|
|
22
|
-
export const NUM_TXS_PER_NODE =
|
|
23
|
-
export const BOOT_NODE_UDP_PORT =
|
|
22
|
+
export const NUM_TXS_PER_NODE = 4;
|
|
23
|
+
export const BOOT_NODE_UDP_PORT = getBootNodeUdpPort();
|
|
24
24
|
|
|
25
25
|
export const createReqrespDataDir = () => fs.mkdtempSync(path.join(os.tmpdir(), 'reqresp-'));
|
|
26
26
|
|
|
@@ -38,8 +38,14 @@ export async function createReqrespTest(options: ReqrespOptions = {}): Promise<P
|
|
|
38
38
|
// To collect metrics - run in aztec-packages `docker compose --profile metrics up`
|
|
39
39
|
metricsPort: shouldCollectMetrics(),
|
|
40
40
|
initialConfig: {
|
|
41
|
-
|
|
42
|
-
aztecSlotDuration:
|
|
41
|
+
ethereumSlotDuration: 8,
|
|
42
|
+
aztecSlotDuration: 36,
|
|
43
|
+
blockDurationMs: 6000,
|
|
44
|
+
l1PublishingTime: 8,
|
|
45
|
+
minTxsPerBlock: 1,
|
|
46
|
+
maxTxsPerBlock: 2,
|
|
47
|
+
enforceTimeTable: true,
|
|
48
|
+
aztecProofSubmissionEpochs: 1024, // effectively do not reorg
|
|
43
49
|
...(disableStatusHandshake ? { p2pDisableStatusHandshake: true } : {}),
|
|
44
50
|
listenAddress: '127.0.0.1',
|
|
45
51
|
aztecEpochDuration: 64, // stable committee
|
|
@@ -81,7 +87,7 @@ export async function runReqrespTxTest(params: {
|
|
|
81
87
|
|
|
82
88
|
const nodes = await createNodes(
|
|
83
89
|
aztecNodeConfig,
|
|
84
|
-
t.ctx.dateProvider
|
|
90
|
+
t.ctx.dateProvider,
|
|
85
91
|
t.bootstrapNodeEnr,
|
|
86
92
|
NUM_VALIDATORS,
|
|
87
93
|
BOOT_NODE_UDP_PORT,
|
|
@@ -95,7 +101,7 @@ export async function runReqrespTxTest(params: {
|
|
|
95
101
|
|
|
96
102
|
await t.setupAccount();
|
|
97
103
|
|
|
98
|
-
const targetBlockNumber = await t.ctx.aztecNodeService
|
|
104
|
+
const targetBlockNumber = await t.ctx.aztecNodeService.getBlockNumber();
|
|
99
105
|
await retryUntil(
|
|
100
106
|
async () => {
|
|
101
107
|
const blockNumbers = await Promise.all(nodes.map(node => node.getBlockNumber()));
|
|
@@ -108,7 +114,7 @@ export async function runReqrespTxTest(params: {
|
|
|
108
114
|
|
|
109
115
|
t.logger.info('Preparing transactions to send');
|
|
110
116
|
const txBatches = await timesAsync(2, () =>
|
|
111
|
-
prepareTransactions(t.logger, t.ctx.aztecNodeService
|
|
117
|
+
prepareTransactions(t.logger, t.ctx.aztecNodeService, NUM_TXS_PER_NODE, t.fundedAccount),
|
|
112
118
|
);
|
|
113
119
|
|
|
114
120
|
t.logger.info('Removing initial node');
|
|
@@ -116,7 +122,7 @@ export async function runReqrespTxTest(params: {
|
|
|
116
122
|
|
|
117
123
|
t.logger.info('Starting fresh slot');
|
|
118
124
|
const [timestamp] = await t.ctx.cheatCodes.rollup.advanceToNextSlot();
|
|
119
|
-
t.ctx.dateProvider
|
|
125
|
+
t.ctx.dateProvider.setTime(Number(timestamp) * 1000);
|
|
120
126
|
const startSlotTimestamp = BigInt(timestamp);
|
|
121
127
|
|
|
122
128
|
const { proposerIndexes, nodesToTurnOffTxGossip } = await getProposerIndexes(t, startSlotTimestamp);
|
|
@@ -170,6 +176,28 @@ export async function runReqrespTxTest(params: {
|
|
|
170
176
|
|
|
171
177
|
t.logger.info('All transactions mined');
|
|
172
178
|
|
|
179
|
+
// Assert that multiple blocks were built for at least one slot
|
|
180
|
+
t.logger.info('Verifying multiple blocks for at least one checkpoint');
|
|
181
|
+
const checkpoints = await nodes[0].getCheckpoints(CheckpointNumber(1), 50);
|
|
182
|
+
expect(checkpoints.length).toBeGreaterThan(0);
|
|
183
|
+
|
|
184
|
+
let mbpsFound = false;
|
|
185
|
+
let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;
|
|
186
|
+
|
|
187
|
+
for (const published of checkpoints) {
|
|
188
|
+
const blockCount = published.checkpoint.blocks.length;
|
|
189
|
+
mbpsFound = mbpsFound || blockCount >= 2;
|
|
190
|
+
|
|
191
|
+
for (let i = 0; i < blockCount; i++) {
|
|
192
|
+
const block = published.checkpoint.blocks[i];
|
|
193
|
+
expect(block.indexWithinCheckpoint).toBe(i);
|
|
194
|
+
expect(block.checkpointNumber).toBe(published.checkpoint.number);
|
|
195
|
+
expect(block.number).toBe(expectedBlockNumber);
|
|
196
|
+
expectedBlockNumber++;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
expect(mbpsFound).toBe(true);
|
|
173
201
|
return nodes;
|
|
174
202
|
}
|
|
175
203
|
|
package/src/e2e_p2p/shared.ts
CHANGED
|
@@ -6,12 +6,13 @@ import { Fr } from '@aztec/aztec.js/fields';
|
|
|
6
6
|
import type { Logger } from '@aztec/aztec.js/log';
|
|
7
7
|
import { TxHash } from '@aztec/aztec.js/tx';
|
|
8
8
|
import type { RollupCheatCodes } from '@aztec/aztec/testing';
|
|
9
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
9
10
|
import type {
|
|
10
11
|
EmpireSlashingProposerContract,
|
|
11
12
|
RollupContract,
|
|
12
13
|
TallySlashingProposerContract,
|
|
13
14
|
} from '@aztec/ethereum/contracts';
|
|
14
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
15
|
+
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
15
16
|
import { timesAsync, unique } from '@aztec/foundation/collection';
|
|
16
17
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
17
18
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
@@ -22,9 +23,10 @@ import { getPXEConfig, getPXEConfig as getRpcConfig } from '@aztec/pxe/server';
|
|
|
22
23
|
import { getRoundForOffense } from '@aztec/slasher';
|
|
23
24
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
24
25
|
import type { SlashFactoryContract } from '@aztec/stdlib/l1-contracts';
|
|
25
|
-
import { type ProvenTx, TestWallet, proveInteraction } from '@aztec/test-wallet/server';
|
|
26
26
|
|
|
27
27
|
import { submitTxsTo } from '../shared/submit-transactions.js';
|
|
28
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
29
|
+
import { type ProvenTx, proveInteraction } from '../test-wallet/utils.js';
|
|
28
30
|
|
|
29
31
|
// submits a set of transactions to the provided Private eXecution Environment (PXE)
|
|
30
32
|
export const submitComplexTxsTo = async (
|
|
@@ -40,7 +42,7 @@ export const submitComplexTxsTo = async (
|
|
|
40
42
|
const spamCount = 15;
|
|
41
43
|
for (let i = 0; i < numTxs; i++) {
|
|
42
44
|
const method = spamContract.methods.spam(seed + BigInt(i * spamCount), spamCount, !!opts.callPublic);
|
|
43
|
-
const txHash = await method.send({ from, wait: NO_WAIT });
|
|
45
|
+
const { txHash } = await method.send({ from, wait: NO_WAIT });
|
|
44
46
|
logger.info(`Tx sent with hash ${txHash.toString()}`);
|
|
45
47
|
txs.push(txHash);
|
|
46
48
|
}
|
|
@@ -145,9 +147,52 @@ export async function awaitCommitteeExists({
|
|
|
145
147
|
'non-empty committee',
|
|
146
148
|
60,
|
|
147
149
|
);
|
|
150
|
+
logger.warn(`Committee has been formed`, { committee: committee!.map(c => c.toString()) });
|
|
148
151
|
return committee!.map(c => c.toString() as `0x${string}`);
|
|
149
152
|
}
|
|
150
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Advance epochs until we find one where the target proposer is selected for at least one slot.
|
|
156
|
+
* With N validators and M slots per epoch, a specific proposer may not be selected in any given epoch.
|
|
157
|
+
* For example, with 4 validators and 2 slots/epoch, there is about a 44% chance per epoch.
|
|
158
|
+
*/
|
|
159
|
+
export async function awaitEpochWithProposer({
|
|
160
|
+
epochCache,
|
|
161
|
+
cheatCodes,
|
|
162
|
+
targetProposer,
|
|
163
|
+
logger,
|
|
164
|
+
maxAttempts = 20,
|
|
165
|
+
}: {
|
|
166
|
+
epochCache: EpochCacheInterface;
|
|
167
|
+
cheatCodes: RollupCheatCodes;
|
|
168
|
+
targetProposer: EthAddress;
|
|
169
|
+
logger: Logger;
|
|
170
|
+
maxAttempts?: number;
|
|
171
|
+
}): Promise<void> {
|
|
172
|
+
const { epochDuration } = await cheatCodes.getConfig();
|
|
173
|
+
|
|
174
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
175
|
+
const currentEpoch = await cheatCodes.getEpoch();
|
|
176
|
+
const startSlot = Number(currentEpoch) * Number(epochDuration);
|
|
177
|
+
const endSlot = startSlot + Number(epochDuration);
|
|
178
|
+
|
|
179
|
+
logger.info(`Checking epoch ${currentEpoch} (slots ${startSlot}-${endSlot - 1}) for proposer ${targetProposer}`);
|
|
180
|
+
|
|
181
|
+
for (let s = startSlot; s < endSlot; s++) {
|
|
182
|
+
const proposer = await epochCache.getProposerAttesterAddressInSlot(SlotNumber(s));
|
|
183
|
+
if (proposer && proposer.equals(targetProposer)) {
|
|
184
|
+
logger.warn(`Found target proposer ${targetProposer} in slot ${s} of epoch ${currentEpoch}`);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
logger.info(`Target proposer not found in epoch ${currentEpoch}, advancing to next epoch`);
|
|
190
|
+
await cheatCodes.advanceToNextEpoch();
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
throw new Error(`Target proposer ${targetProposer} not found in any slot after ${maxAttempts} epoch attempts`);
|
|
194
|
+
}
|
|
195
|
+
|
|
151
196
|
export async function awaitOffenseDetected({
|
|
152
197
|
logger,
|
|
153
198
|
nodeAdmin,
|