@aztec/end-to-end 0.0.1-commit.b655e406 → 0.0.1-commit.c0b82b2
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.d.ts +3 -2
- package/dest/bench/client_flows/benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/benchmark.js +21 -1
- package/dest/bench/client_flows/client_flows_benchmark.d.ts +22 -16
- package/dest/bench/client_flows/client_flows_benchmark.d.ts.map +1 -1
- package/dest/bench/client_flows/client_flows_benchmark.js +133 -122
- 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/client_flows/data_extractor.d.ts +1 -1
- package/dest/bench/client_flows/data_extractor.js +7 -27
- package/dest/bench/utils.d.ts +8 -7
- package/dest/bench/utils.d.ts.map +1 -1
- package/dest/bench/utils.js +27 -18
- package/dest/e2e_blacklist_token_contract/blacklist_token_contract_test.d.ts +9 -8
- 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 +106 -112
- package/dest/e2e_cross_chain_messaging/cross_chain_messaging_test.d.ts +20 -14
- 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 +92 -70
- package/dest/e2e_deploy_contract/deploy_test.d.ts +6 -5
- package/dest/e2e_deploy_contract/deploy_test.d.ts.map +1 -1
- package/dest/e2e_deploy_contract/deploy_test.js +18 -13
- package/dest/e2e_epochs/epochs_test.d.ts +25 -15
- package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
- package/dest/e2e_epochs/epochs_test.js +103 -53
- package/dest/e2e_fees/bridging_race.notest.d.ts +1 -1
- package/dest/e2e_fees/bridging_race.notest.js +5 -7
- package/dest/e2e_fees/fees_test.d.ts +21 -17
- package/dest/e2e_fees/fees_test.d.ts.map +1 -1
- package/dest/e2e_fees/fees_test.js +129 -141
- package/dest/e2e_l1_publisher/write_json.d.ts +4 -3
- package/dest/e2e_l1_publisher/write_json.d.ts.map +1 -1
- package/dest/e2e_l1_publisher/write_json.js +18 -19
- package/dest/e2e_multi_validator/utils.d.ts +1 -1
- package/dest/e2e_multi_validator/utils.js +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.d.ts +6 -9
- package/dest/e2e_nested_contract/nested_contract_test.d.ts.map +1 -1
- package/dest/e2e_nested_contract/nested_contract_test.js +31 -38
- package/dest/e2e_p2p/inactivity_slash_test.d.ts +3 -3
- package/dest/e2e_p2p/inactivity_slash_test.d.ts.map +1 -1
- package/dest/e2e_p2p/inactivity_slash_test.js +7 -6
- package/dest/e2e_p2p/p2p_network.d.ts +226 -19
- package/dest/e2e_p2p/p2p_network.d.ts.map +1 -1
- package/dest/e2e_p2p/p2p_network.js +136 -111
- package/dest/e2e_p2p/reqresp/utils.d.ts +22 -0
- package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -0
- package/dest/e2e_p2p/reqresp/utils.js +177 -0
- package/dest/e2e_p2p/shared.d.ts +11 -11
- package/dest/e2e_p2p/shared.d.ts.map +1 -1
- package/dest/e2e_p2p/shared.js +20 -22
- 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 +19 -10
- package/dest/e2e_token_contract/token_contract_test.d.ts.map +1 -1
- package/dest/e2e_token_contract/token_contract_test.js +99 -91
- 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 +15 -21
- package/dest/fixtures/e2e_prover_test.d.ts.map +1 -1
- package/dest/fixtures/e2e_prover_test.js +123 -138
- 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 +6 -3
- package/dest/fixtures/fixtures.d.ts.map +1 -1
- package/dest/fixtures/fixtures.js +8 -3
- package/dest/fixtures/get_acvm_config.d.ts +1 -1
- package/dest/fixtures/get_acvm_config.js +1 -1
- package/dest/fixtures/get_bb_config.d.ts +1 -1
- package/dest/fixtures/get_bb_config.d.ts.map +1 -1
- package/dest/fixtures/ha_setup.d.ts +71 -0
- package/dest/fixtures/ha_setup.d.ts.map +1 -0
- package/dest/fixtures/ha_setup.js +116 -0
- package/dest/fixtures/index.d.ts +2 -1
- package/dest/fixtures/index.d.ts.map +1 -1
- package/dest/fixtures/index.js +1 -0
- package/dest/fixtures/l1_to_l2_messaging.d.ts +4 -3
- package/dest/fixtures/l1_to_l2_messaging.d.ts.map +1 -1
- package/dest/fixtures/l1_to_l2_messaging.js +2 -2
- package/dest/fixtures/logging.d.ts +1 -1
- package/dest/fixtures/setup.d.ts +234 -0
- package/dest/fixtures/setup.d.ts.map +1 -0
- package/dest/fixtures/setup.js +605 -0
- package/dest/fixtures/setup_p2p_test.d.ts +17 -10
- package/dest/fixtures/setup_p2p_test.d.ts.map +1 -1
- package/dest/fixtures/setup_p2p_test.js +55 -36
- package/dest/fixtures/token_utils.d.ts +6 -3
- package/dest/fixtures/token_utils.d.ts.map +1 -1
- package/dest/fixtures/token_utils.js +16 -9
- package/dest/fixtures/utils.d.ts +5 -192
- package/dest/fixtures/utils.d.ts.map +1 -1
- package/dest/fixtures/utils.js +4 -648
- package/dest/fixtures/web3signer.d.ts +1 -1
- package/dest/fixtures/web3signer.js +1 -1
- package/dest/fixtures/with_telemetry_utils.d.ts +2 -2
- package/dest/fixtures/with_telemetry_utils.d.ts.map +1 -1
- package/dest/fixtures/with_telemetry_utils.js +2 -2
- package/dest/index.d.ts +1 -1
- package/dest/quality_of_service/grafana_client.d.ts +41 -0
- package/dest/quality_of_service/grafana_client.d.ts.map +1 -0
- package/dest/quality_of_service/{alert_checker.js → grafana_client.js} +1 -1
- package/dest/quality_of_service/prometheus_client.d.ts +38 -0
- package/dest/quality_of_service/prometheus_client.d.ts.map +1 -0
- package/dest/quality_of_service/prometheus_client.js +67 -0
- package/dest/shared/cross_chain_test_harness.d.ts +7 -6
- package/dest/shared/cross_chain_test_harness.d.ts.map +1 -1
- package/dest/shared/cross_chain_test_harness.js +14 -14
- package/dest/shared/gas_portal_test_harness.d.ts +2 -2
- package/dest/shared/gas_portal_test_harness.d.ts.map +1 -1
- package/dest/shared/gas_portal_test_harness.js +2 -2
- package/dest/shared/index.d.ts +3 -2
- package/dest/shared/index.d.ts.map +1 -1
- package/dest/shared/index.js +1 -0
- package/dest/shared/jest_setup.d.ts +1 -1
- 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 +4 -4
- package/dest/shared/submit-transactions.d.ts.map +1 -1
- package/dest/shared/submit-transactions.js +9 -11
- package/dest/shared/uniswap_l1_l2.d.ts +3 -27
- package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
- package/dest/shared/uniswap_l1_l2.js +57 -35
- package/dest/simulators/index.d.ts +1 -1
- package/dest/simulators/lending_simulator.d.ts +2 -2
- package/dest/simulators/lending_simulator.d.ts.map +1 -1
- package/dest/simulators/lending_simulator.js +6 -4
- 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 +2 -23
- package/dest/spartan/setup_test_wallets.d.ts +16 -6
- package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
- package/dest/spartan/setup_test_wallets.js +115 -23
- package/dest/spartan/tx_metrics.d.ts +88 -0
- package/dest/spartan/tx_metrics.d.ts.map +1 -0
- package/dest/spartan/tx_metrics.js +422 -0
- package/dest/spartan/utils/bot.d.ts +28 -0
- package/dest/spartan/utils/bot.d.ts.map +1 -0
- package/dest/spartan/utils/bot.js +142 -0
- package/dest/spartan/utils/chaos.d.ts +79 -0
- package/dest/spartan/utils/chaos.d.ts.map +1 -0
- package/dest/spartan/utils/chaos.js +142 -0
- package/dest/spartan/utils/clients.d.ts +39 -0
- package/dest/spartan/utils/clients.d.ts.map +1 -0
- package/dest/spartan/utils/clients.js +90 -0
- package/dest/spartan/utils/config.d.ts +42 -0
- package/dest/spartan/utils/config.d.ts.map +1 -0
- package/dest/spartan/utils/config.js +22 -0
- package/dest/spartan/utils/health.d.ts +63 -0
- package/dest/spartan/utils/health.d.ts.map +1 -0
- package/dest/spartan/utils/health.js +202 -0
- package/dest/spartan/utils/helm.d.ts +15 -0
- package/dest/spartan/utils/helm.d.ts.map +1 -0
- package/dest/spartan/utils/helm.js +47 -0
- package/dest/spartan/utils/index.d.ts +10 -0
- package/dest/spartan/utils/index.d.ts.map +1 -0
- package/dest/spartan/utils/index.js +20 -0
- package/dest/spartan/utils/k8s.d.ts +128 -0
- package/dest/spartan/utils/k8s.d.ts.map +1 -0
- package/dest/spartan/utils/k8s.js +381 -0
- package/dest/spartan/utils/nodes.d.ts +40 -0
- package/dest/spartan/utils/nodes.d.ts.map +1 -0
- package/dest/spartan/utils/nodes.js +461 -0
- package/dest/spartan/utils/scripts.d.ts +30 -0
- package/dest/spartan/utils/scripts.d.ts.map +1 -0
- package/dest/spartan/utils/scripts.js +81 -0
- package/dest/spartan/utils.d.ts +2 -218
- package/dest/spartan/utils.d.ts.map +1 -1
- package/dest/spartan/utils.js +1 -749
- 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 +50 -44
- package/src/bench/client_flows/benchmark.ts +24 -2
- package/src/bench/client_flows/client_flows_benchmark.ts +156 -177
- package/src/bench/client_flows/config.ts +9 -1
- package/src/bench/client_flows/data_extractor.ts +6 -28
- package/src/bench/utils.ts +31 -21
- package/src/e2e_blacklist_token_contract/blacklist_token_contract_test.ts +114 -143
- package/src/e2e_cross_chain_messaging/cross_chain_messaging_test.ts +140 -125
- package/src/e2e_deploy_contract/deploy_test.ts +23 -16
- package/src/e2e_epochs/epochs_test.ts +166 -116
- package/src/e2e_fees/bridging_race.notest.ts +6 -12
- package/src/e2e_fees/fees_test.ts +172 -226
- package/src/e2e_l1_publisher/write_json.ts +20 -19
- package/src/e2e_multi_validator/utils.ts +1 -1
- package/src/e2e_nested_contract/nested_contract_test.ts +33 -55
- package/src/e2e_p2p/inactivity_slash_test.ts +8 -7
- package/src/e2e_p2p/p2p_network.ts +205 -182
- package/src/e2e_p2p/reqresp/utils.ts +235 -0
- package/src/e2e_p2p/shared.ts +37 -29
- 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 +113 -119
- 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 +138 -186
- package/src/fixtures/elu_monitor.ts +126 -0
- package/src/fixtures/fixtures.ts +12 -5
- package/src/fixtures/get_acvm_config.ts +1 -1
- package/src/fixtures/ha_setup.ts +186 -0
- package/src/fixtures/index.ts +1 -0
- package/src/fixtures/l1_to_l2_messaging.ts +4 -2
- package/src/fixtures/setup.ts +895 -0
- package/src/fixtures/setup_p2p_test.ts +58 -48
- package/src/fixtures/token_utils.ts +9 -7
- package/src/fixtures/utils.ts +27 -947
- package/src/fixtures/web3signer.ts +1 -1
- package/src/fixtures/with_telemetry_utils.ts +2 -2
- package/src/guides/up_quick_start.sh +4 -4
- package/src/quality_of_service/{alert_checker.ts → grafana_client.ts} +1 -1
- package/src/quality_of_service/prometheus_client.ts +113 -0
- package/src/shared/cross_chain_test_harness.ts +19 -36
- package/src/shared/gas_portal_test_harness.ts +3 -3
- package/src/shared/index.ts +2 -1
- package/src/shared/jest_setup.ts +51 -1
- package/src/shared/mock_state_view.ts +188 -0
- package/src/shared/submit-transactions.ts +14 -16
- package/src/shared/uniswap_l1_l2.ts +66 -89
- package/src/simulators/lending_simulator.ts +7 -5
- package/src/simulators/token_simulator.ts +1 -29
- package/src/spartan/DEVELOP.md +7 -0
- package/src/spartan/setup_test_wallets.ts +173 -28
- package/src/spartan/tx_metrics.ts +376 -0
- package/src/spartan/utils/bot.ts +188 -0
- package/src/spartan/utils/chaos.ts +253 -0
- package/src/spartan/utils/clients.ts +100 -0
- package/src/spartan/utils/config.ts +28 -0
- package/src/spartan/utils/health.ts +255 -0
- package/src/spartan/utils/helm.ts +84 -0
- package/src/spartan/utils/index.ts +68 -0
- package/src/spartan/utils/k8s.ts +535 -0
- package/src/spartan/utils/nodes.ts +543 -0
- package/src/spartan/utils/scripts.ts +99 -0
- package/src/spartan/utils.ts +1 -942
- 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
- package/dest/fixtures/setup_l1_contracts.d.ts +0 -6
- package/dest/fixtures/setup_l1_contracts.d.ts.map +0 -1
- package/dest/fixtures/setup_l1_contracts.js +0 -17
- package/dest/fixtures/snapshot_manager.d.ts +0 -95
- package/dest/fixtures/snapshot_manager.d.ts.map +0 -1
- package/dest/fixtures/snapshot_manager.js +0 -505
- package/dest/quality_of_service/alert_checker.d.ts +0 -41
- package/dest/quality_of_service/alert_checker.d.ts.map +0 -1
- package/src/fixtures/setup_l1_contracts.ts +0 -26
- package/src/fixtures/snapshot_manager.ts +0 -665
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
import { generateSchnorrAccounts } from '@aztec/accounts/testing';
|
|
2
2
|
import { AztecAddress } from '@aztec/aztec.js/addresses';
|
|
3
|
+
import { NO_WAIT } from '@aztec/aztec.js/contracts';
|
|
3
4
|
import { L1FeeJuicePortalManager } from '@aztec/aztec.js/ethereum';
|
|
4
5
|
import { FeeJuicePaymentMethodWithClaim } from '@aztec/aztec.js/fee';
|
|
5
6
|
import { type FeePaymentMethod, SponsoredFeePaymentMethod } from '@aztec/aztec.js/fee';
|
|
6
7
|
import { Fr } from '@aztec/aztec.js/fields';
|
|
7
|
-
import { type AztecNode, createAztecNodeClient } from '@aztec/aztec.js/node';
|
|
8
|
+
import { type AztecNode, createAztecNodeClient, waitForTx } from '@aztec/aztec.js/node';
|
|
8
9
|
import type { Wallet } from '@aztec/aztec.js/wallet';
|
|
9
|
-
import { createEthereumChain
|
|
10
|
+
import { createEthereumChain } from '@aztec/ethereum/chain';
|
|
11
|
+
import { createExtendedL1Client } from '@aztec/ethereum/client';
|
|
10
12
|
import type { Logger } from '@aztec/foundation/log';
|
|
11
13
|
import { retryUntil } from '@aztec/foundation/retry';
|
|
12
14
|
import { TokenContract } from '@aztec/noir-contracts.js/Token';
|
|
13
15
|
import type { AztecNodeAdmin } from '@aztec/stdlib/interfaces/client';
|
|
14
|
-
import {
|
|
16
|
+
import { registerInitialLocalNetworkAccountsInWallet } from '@aztec/wallets/testing';
|
|
15
17
|
|
|
16
18
|
import { getACVMConfig } from '../fixtures/get_acvm_config.js';
|
|
17
19
|
import { getBBConfig } from '../fixtures/get_bb_config.js';
|
|
18
20
|
import { getSponsoredFPCAddress, registerSponsoredFPC } from '../fixtures/utils.js';
|
|
21
|
+
import { TestWallet } from '../test-wallet/test_wallet.js';
|
|
22
|
+
import { proveInteraction } from '../test-wallet/utils.js';
|
|
23
|
+
import { WorkerWallet } from '../test-wallet/worker_wallet.js';
|
|
19
24
|
|
|
20
25
|
export interface TestAccounts {
|
|
21
26
|
aztecNode: AztecNode;
|
|
@@ -28,6 +33,11 @@ export interface TestAccounts {
|
|
|
28
33
|
tokenAddress: AztecAddress;
|
|
29
34
|
}
|
|
30
35
|
|
|
36
|
+
export type TestAccountsWithoutTokens = Omit<
|
|
37
|
+
TestAccounts,
|
|
38
|
+
'tokenAddress' | 'tokenContract' | 'tokenName' | 'tokenAdminAddress'
|
|
39
|
+
>;
|
|
40
|
+
|
|
31
41
|
const TOKEN_NAME = 'USDC';
|
|
32
42
|
const TOKEN_SYMBOL = 'USD';
|
|
33
43
|
const TOKEN_DECIMALS = 18n;
|
|
@@ -42,14 +52,14 @@ export async function setupTestAccountsWithTokens(
|
|
|
42
52
|
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
43
53
|
const wallet = await TestWallet.create(aztecNode);
|
|
44
54
|
|
|
45
|
-
const [recipientAccount, ...accounts] = (await
|
|
55
|
+
const [recipientAccount, ...accounts] = (await registerInitialLocalNetworkAccountsInWallet(wallet)).slice(
|
|
46
56
|
0,
|
|
47
57
|
ACCOUNT_COUNT + 1,
|
|
48
58
|
);
|
|
49
59
|
|
|
50
60
|
const tokenAdmin = accounts[0];
|
|
51
61
|
const tokenAddress = await deployTokenAndMint(wallet, accounts, tokenAdmin, mintAmount, undefined, logger);
|
|
52
|
-
const tokenContract =
|
|
62
|
+
const tokenContract = TokenContract.at(tokenAddress, wallet);
|
|
53
63
|
|
|
54
64
|
return {
|
|
55
65
|
aztecNode,
|
|
@@ -63,7 +73,7 @@ export async function setupTestAccountsWithTokens(
|
|
|
63
73
|
};
|
|
64
74
|
}
|
|
65
75
|
|
|
66
|
-
export async function
|
|
76
|
+
export async function deploySponsoredTestAccountsWithTokens(
|
|
67
77
|
wallet: TestWallet,
|
|
68
78
|
aztecNode: AztecNode,
|
|
69
79
|
mintAmount: bigint,
|
|
@@ -78,11 +88,19 @@ export async function deploySponsoredTestAccounts(
|
|
|
78
88
|
|
|
79
89
|
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
80
90
|
const recipientDeployMethod = await recipientAccount.getDeployMethod();
|
|
81
|
-
await recipientDeployMethod.send({
|
|
91
|
+
await recipientDeployMethod.send({
|
|
92
|
+
from: AztecAddress.ZERO,
|
|
93
|
+
fee: { paymentMethod },
|
|
94
|
+
wait: { timeout: 2400 },
|
|
95
|
+
});
|
|
82
96
|
await Promise.all(
|
|
83
97
|
fundedAccounts.map(async a => {
|
|
84
98
|
const deployMethod = await a.getDeployMethod();
|
|
85
|
-
await deployMethod.send({
|
|
99
|
+
await deployMethod.send({
|
|
100
|
+
from: AztecAddress.ZERO,
|
|
101
|
+
fee: { paymentMethod },
|
|
102
|
+
wait: { timeout: 2400 },
|
|
103
|
+
}); // increase timeout on purpose in order to account for two empty epochs
|
|
86
104
|
logger.info(`Account deployed at ${a.address}`);
|
|
87
105
|
}),
|
|
88
106
|
);
|
|
@@ -96,7 +114,7 @@ export async function deploySponsoredTestAccounts(
|
|
|
96
114
|
new SponsoredFeePaymentMethod(await getSponsoredFPCAddress()),
|
|
97
115
|
logger,
|
|
98
116
|
);
|
|
99
|
-
const tokenContract =
|
|
117
|
+
const tokenContract = TokenContract.at(tokenAddress, wallet);
|
|
100
118
|
|
|
101
119
|
return {
|
|
102
120
|
aztecNode,
|
|
@@ -110,6 +128,84 @@ export async function deploySponsoredTestAccounts(
|
|
|
110
128
|
};
|
|
111
129
|
}
|
|
112
130
|
|
|
131
|
+
async function deployAccountWithDiagnostics(
|
|
132
|
+
account: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any },
|
|
133
|
+
paymentMethod: SponsoredFeePaymentMethod,
|
|
134
|
+
aztecNode: AztecNode,
|
|
135
|
+
logger: Logger,
|
|
136
|
+
accountLabel: string,
|
|
137
|
+
): Promise<void> {
|
|
138
|
+
const deployMethod = await account.getDeployMethod();
|
|
139
|
+
let txHash;
|
|
140
|
+
try {
|
|
141
|
+
txHash = await deployMethod.send({
|
|
142
|
+
from: AztecAddress.ZERO,
|
|
143
|
+
fee: { paymentMethod },
|
|
144
|
+
wait: NO_WAIT,
|
|
145
|
+
});
|
|
146
|
+
await waitForTx(aztecNode, txHash, { timeout: 2400 });
|
|
147
|
+
logger.info(`${accountLabel} deployed at ${account.address}`);
|
|
148
|
+
} catch (error) {
|
|
149
|
+
const blockNumber = await aztecNode.getBlockNumber();
|
|
150
|
+
let receipt;
|
|
151
|
+
try {
|
|
152
|
+
receipt = await aztecNode.getTxReceipt(txHash);
|
|
153
|
+
} catch {
|
|
154
|
+
receipt = 'unavailable';
|
|
155
|
+
}
|
|
156
|
+
logger.error(`${accountLabel} deployment failed`, {
|
|
157
|
+
txHash: txHash.toString(),
|
|
158
|
+
receipt: JSON.stringify(receipt),
|
|
159
|
+
currentBlockNumber: blockNumber,
|
|
160
|
+
error: String(error),
|
|
161
|
+
});
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async function deployAccountsInBatches(
|
|
167
|
+
accounts: { getDeployMethod: () => Promise<{ send: (opts: any) => any }>; address: any }[],
|
|
168
|
+
paymentMethod: SponsoredFeePaymentMethod,
|
|
169
|
+
aztecNode: AztecNode,
|
|
170
|
+
logger: Logger,
|
|
171
|
+
labelPrefix: string,
|
|
172
|
+
batchSize = 2,
|
|
173
|
+
): Promise<void> {
|
|
174
|
+
for (let i = 0; i < accounts.length; i += batchSize) {
|
|
175
|
+
const batch = accounts.slice(i, i + batchSize);
|
|
176
|
+
await Promise.all(
|
|
177
|
+
batch.map((account, idx) =>
|
|
178
|
+
deployAccountWithDiagnostics(account, paymentMethod, aztecNode, logger, `${labelPrefix}${i + idx + 1}`),
|
|
179
|
+
),
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export async function deploySponsoredTestAccounts(
|
|
185
|
+
wallet: TestWallet,
|
|
186
|
+
aztecNode: AztecNode,
|
|
187
|
+
logger: Logger,
|
|
188
|
+
numberOfFundedWallets = 1,
|
|
189
|
+
): Promise<TestAccountsWithoutTokens> {
|
|
190
|
+
const [recipient, ...funded] = await generateSchnorrAccounts(numberOfFundedWallets + 1);
|
|
191
|
+
const recipientAccount = await wallet.createSchnorrAccount(recipient.secret, recipient.salt);
|
|
192
|
+
const fundedAccounts = await Promise.all(funded.map(a => wallet.createSchnorrAccount(a.secret, a.salt)));
|
|
193
|
+
|
|
194
|
+
await registerSponsoredFPC(wallet);
|
|
195
|
+
|
|
196
|
+
const paymentMethod = new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
197
|
+
|
|
198
|
+
await deployAccountWithDiagnostics(recipientAccount, paymentMethod, aztecNode, logger, 'Recipient account');
|
|
199
|
+
await deployAccountsInBatches(fundedAccounts, paymentMethod, aztecNode, logger, 'Funded account ', 2);
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
aztecNode,
|
|
203
|
+
wallet,
|
|
204
|
+
accounts: fundedAccounts.map(acc => acc.address),
|
|
205
|
+
recipientAddress: recipientAccount.address,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
113
209
|
export async function deployTestAccountsWithTokens(
|
|
114
210
|
nodeUrl: string,
|
|
115
211
|
l1RpcUrls: string[],
|
|
@@ -138,7 +234,7 @@ export async function deployTestAccountsWithTokens(
|
|
|
138
234
|
fundedAccounts.map(async (a, i) => {
|
|
139
235
|
const paymentMethod = new FeeJuicePaymentMethodWithClaim(a.address, claims[i]);
|
|
140
236
|
const deployMethod = await a.getDeployMethod();
|
|
141
|
-
await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } })
|
|
237
|
+
await deployMethod.send({ from: AztecAddress.ZERO, fee: { paymentMethod } });
|
|
142
238
|
logger.info(`Account deployed at ${a.address}`);
|
|
143
239
|
}),
|
|
144
240
|
);
|
|
@@ -152,7 +248,7 @@ export async function deployTestAccountsWithTokens(
|
|
|
152
248
|
undefined,
|
|
153
249
|
logger,
|
|
154
250
|
);
|
|
155
|
-
const tokenContract =
|
|
251
|
+
const tokenContract = TokenContract.at(tokenAddress, wallet);
|
|
156
252
|
|
|
157
253
|
return {
|
|
158
254
|
aztecNode,
|
|
@@ -214,25 +310,29 @@ async function deployTokenAndMint(
|
|
|
214
310
|
logger: Logger,
|
|
215
311
|
) {
|
|
216
312
|
logger.verbose(`Deploying TokenContract...`);
|
|
217
|
-
const tokenContract = await TokenContract.deploy(
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
313
|
+
const { contract: tokenContract } = await TokenContract.deploy(
|
|
314
|
+
wallet,
|
|
315
|
+
admin,
|
|
316
|
+
TOKEN_NAME,
|
|
317
|
+
TOKEN_SYMBOL,
|
|
318
|
+
TOKEN_DECIMALS,
|
|
319
|
+
).send({
|
|
320
|
+
from: admin,
|
|
321
|
+
fee: {
|
|
322
|
+
paymentMethod,
|
|
323
|
+
},
|
|
324
|
+
wait: { timeout: 600, returnReceipt: true },
|
|
325
|
+
});
|
|
225
326
|
|
|
226
327
|
const tokenAddress = tokenContract.address;
|
|
227
328
|
|
|
228
329
|
logger.verbose(`Minting ${mintAmount} public assets to the ${accounts.length} accounts...`);
|
|
229
330
|
|
|
230
331
|
await Promise.all(
|
|
231
|
-
accounts.map(
|
|
232
|
-
|
|
233
|
-
.mint_to_public(acc, mintAmount)
|
|
234
|
-
.send({ from: admin, fee: { paymentMethod } })
|
|
235
|
-
.wait({ timeout: 600 }),
|
|
332
|
+
accounts.map(acc =>
|
|
333
|
+
TokenContract.at(tokenAddress, wallet)
|
|
334
|
+
.methods.mint_to_public(acc, mintAmount)
|
|
335
|
+
.send({ from: admin, fee: { paymentMethod }, wait: { timeout: 600 } }),
|
|
236
336
|
),
|
|
237
337
|
);
|
|
238
338
|
|
|
@@ -260,8 +360,8 @@ export async function performTransfers({
|
|
|
260
360
|
// Default to sponsored fee payment if no fee method is provided
|
|
261
361
|
const defaultFeePaymentMethod = feePaymentMethod || new SponsoredFeePaymentMethod(await getSponsoredFPCAddress());
|
|
262
362
|
for (let i = 0; i < rounds; i++) {
|
|
263
|
-
const txs = testAccounts.accounts.map(
|
|
264
|
-
const token =
|
|
363
|
+
const txs = testAccounts.accounts.map(acc => {
|
|
364
|
+
const token = TokenContract.at(testAccounts.tokenAddress, testAccounts.wallet);
|
|
265
365
|
return proveInteraction(wallet, token.methods.transfer_in_public(acc, recipient, transferAmount, 0), {
|
|
266
366
|
from: acc,
|
|
267
367
|
fee: {
|
|
@@ -272,17 +372,23 @@ export async function performTransfers({
|
|
|
272
372
|
|
|
273
373
|
const provenTxs = await Promise.all(txs);
|
|
274
374
|
|
|
275
|
-
await Promise.all(provenTxs.map(t => t.send(
|
|
375
|
+
await Promise.all(provenTxs.map(t => t.send({ wait: { timeout: 600 } })));
|
|
276
376
|
|
|
277
377
|
logger.info(`Completed round ${i + 1} / ${rounds}`);
|
|
278
378
|
}
|
|
279
379
|
}
|
|
280
380
|
|
|
381
|
+
export type WalletWrapper = {
|
|
382
|
+
wallet: TestWallet;
|
|
383
|
+
aztecNode: AztecNode;
|
|
384
|
+
cleanup: () => Promise<void>;
|
|
385
|
+
};
|
|
386
|
+
|
|
281
387
|
export async function createWalletAndAztecNodeClient(
|
|
282
388
|
nodeUrl: string,
|
|
283
389
|
proverEnabled: boolean,
|
|
284
390
|
logger: Logger,
|
|
285
|
-
): Promise<
|
|
391
|
+
): Promise<WalletWrapper> {
|
|
286
392
|
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
287
393
|
const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
|
|
288
394
|
const pxeConfig = {
|
|
@@ -304,3 +410,42 @@ export async function createWalletAndAztecNodeClient(
|
|
|
304
410
|
},
|
|
305
411
|
};
|
|
306
412
|
}
|
|
413
|
+
|
|
414
|
+
export type WorkerWalletWrapper = {
|
|
415
|
+
wallet: WorkerWallet;
|
|
416
|
+
aztecNode: AztecNode;
|
|
417
|
+
cleanup: () => Promise<void>;
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
export async function createWorkerWalletClient(
|
|
421
|
+
nodeUrl: string,
|
|
422
|
+
proverEnabled: boolean,
|
|
423
|
+
logger: Logger,
|
|
424
|
+
): Promise<WorkerWalletWrapper> {
|
|
425
|
+
const aztecNode = createAztecNodeClient(nodeUrl);
|
|
426
|
+
const [bbConfig, acvmConfig] = await Promise.all([getBBConfig(logger), getACVMConfig(logger)]);
|
|
427
|
+
|
|
428
|
+
// Strip cleanup functions — they can't be structured-cloned for worker transfer
|
|
429
|
+
const { cleanup: bbCleanup, ...bbPaths } = bbConfig ?? {};
|
|
430
|
+
const { cleanup: acvmCleanup, ...acvmPaths } = acvmConfig ?? {};
|
|
431
|
+
|
|
432
|
+
const pxeConfig = {
|
|
433
|
+
dataDirectory: undefined,
|
|
434
|
+
dataStoreMapSizeKb: 1024 * 1024,
|
|
435
|
+
...bbPaths,
|
|
436
|
+
...acvmPaths,
|
|
437
|
+
proverEnabled,
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
const wallet = await WorkerWallet.create(nodeUrl, pxeConfig);
|
|
441
|
+
|
|
442
|
+
return {
|
|
443
|
+
wallet,
|
|
444
|
+
aztecNode,
|
|
445
|
+
async cleanup() {
|
|
446
|
+
await wallet.stop();
|
|
447
|
+
await bbCleanup?.();
|
|
448
|
+
await acvmCleanup?.();
|
|
449
|
+
},
|
|
450
|
+
};
|
|
451
|
+
}
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import type { AztecNode } from '@aztec/aztec.js/node';
|
|
2
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
3
|
+
import type { L2Block } from '@aztec/stdlib/block';
|
|
4
|
+
import type { TopicType } from '@aztec/stdlib/p2p';
|
|
5
|
+
import { Tx, type TxReceipt } from '@aztec/stdlib/tx';
|
|
6
|
+
|
|
7
|
+
import { createHistogram } from 'perf_hooks';
|
|
8
|
+
|
|
9
|
+
/** Metrics class for proving-related benchmarks. */
|
|
10
|
+
export class ProvingMetrics {
|
|
11
|
+
private successfulTxs: number | undefined;
|
|
12
|
+
private proofDuration: number | undefined;
|
|
13
|
+
private activeAgents: number | undefined;
|
|
14
|
+
private avgQueueTime: number | undefined;
|
|
15
|
+
private jobRetries: number | undefined;
|
|
16
|
+
private jobDuration: number | undefined;
|
|
17
|
+
private timedOutJobs: number | undefined;
|
|
18
|
+
private resolvedJobs: number | undefined;
|
|
19
|
+
private rejectedJobs: number | undefined;
|
|
20
|
+
private epochProvingDuration: number | undefined;
|
|
21
|
+
private provenTransactions: number | undefined;
|
|
22
|
+
private provenBlocks: number | undefined;
|
|
23
|
+
|
|
24
|
+
constructor(private prefix: string) {}
|
|
25
|
+
|
|
26
|
+
recordSuccessfulTxs(count: number): void {
|
|
27
|
+
this.successfulTxs = count;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
recordProofDuration(seconds: number): void {
|
|
31
|
+
this.proofDuration = seconds;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
recordActiveAgents(count: number): void {
|
|
35
|
+
this.activeAgents = count;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
recordAvgQueueTime(ms: number): void {
|
|
39
|
+
this.avgQueueTime = ms;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
recordJobRetries(count: number): void {
|
|
43
|
+
this.jobRetries = count;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
recordJobDuration(ms: number): void {
|
|
47
|
+
this.jobDuration = ms;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
recordTimedOutJobs(count: number): void {
|
|
51
|
+
this.timedOutJobs = count;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
recordResolvedJobs(count: number): void {
|
|
55
|
+
this.resolvedJobs = count;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
recordRejectedJobs(count: number): void {
|
|
59
|
+
this.rejectedJobs = count;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
recordEpochProvingDuration(seconds: number): void {
|
|
63
|
+
this.epochProvingDuration = seconds;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
recordProvenTransactions(count: number): void {
|
|
67
|
+
this.provenTransactions = count;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
recordProvenBlocks(count: number): void {
|
|
71
|
+
this.provenBlocks = count;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
toGithubActionBenchmarkJSON(): Array<{ name: string; unit: string; value: number }> {
|
|
75
|
+
const data: Array<{ name: string; unit: string; value: number }> = [];
|
|
76
|
+
|
|
77
|
+
if (this.successfulTxs !== undefined) {
|
|
78
|
+
data.push({ name: `${this.prefix}/successful_txs`, unit: 'count', value: this.successfulTxs });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (this.proofDuration !== undefined) {
|
|
82
|
+
data.push({ name: `${this.prefix}/proof_duration`, unit: 's', value: this.proofDuration });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (this.activeAgents !== undefined) {
|
|
86
|
+
data.push({ name: `${this.prefix}/active_agents`, unit: 'count', value: this.activeAgents });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (this.avgQueueTime !== undefined) {
|
|
90
|
+
data.push({ name: `${this.prefix}/avg_queue_time`, unit: 'ms', value: this.avgQueueTime });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (this.jobRetries !== undefined) {
|
|
94
|
+
data.push({ name: `${this.prefix}/job_retries`, unit: 'count', value: this.jobRetries });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (this.jobDuration !== undefined) {
|
|
98
|
+
data.push({ name: `${this.prefix}/job_duration`, unit: 'ms', value: this.jobDuration });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (this.timedOutJobs !== undefined) {
|
|
102
|
+
data.push({ name: `${this.prefix}/timed_out_jobs`, unit: 'count', value: this.timedOutJobs });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (this.resolvedJobs !== undefined) {
|
|
106
|
+
data.push({ name: `${this.prefix}/resolved_jobs`, unit: 'count', value: this.resolvedJobs });
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (this.rejectedJobs !== undefined) {
|
|
110
|
+
data.push({ name: `${this.prefix}/rejected_jobs`, unit: 'count', value: this.rejectedJobs });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (this.epochProvingDuration !== undefined) {
|
|
114
|
+
data.push({ name: `${this.prefix}/epoch_proving_duration`, unit: 's', value: this.epochProvingDuration });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (this.provenTransactions !== undefined) {
|
|
118
|
+
data.push({ name: `${this.prefix}/proven_transactions`, unit: 'count', value: this.provenTransactions });
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (this.provenBlocks !== undefined) {
|
|
122
|
+
data.push({ name: `${this.prefix}/proven_blocks`, unit: 'count', value: this.provenBlocks });
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const scenario = process.env.BENCH_SCENARIO?.trim();
|
|
126
|
+
if (!scenario) {
|
|
127
|
+
return data;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const scenarioPrefix = `scenario/${scenario}/`;
|
|
131
|
+
return data.map(entry => ({ ...entry, name: `${scenarioPrefix}${entry.name}` }));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export type TxInclusionData = {
|
|
136
|
+
txHash: string;
|
|
137
|
+
sentAt: number;
|
|
138
|
+
minedAt: number;
|
|
139
|
+
attestedAt: number;
|
|
140
|
+
blocknumber: number;
|
|
141
|
+
priorityFee: number;
|
|
142
|
+
totalFee: number;
|
|
143
|
+
positionInBlock: number;
|
|
144
|
+
group: string;
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
export class TxInclusionMetrics {
|
|
148
|
+
private data = new Map<string, TxInclusionData>();
|
|
149
|
+
private groups = new Set<string>();
|
|
150
|
+
private blocks = new Map<number, Promise<L2Block | undefined>>();
|
|
151
|
+
|
|
152
|
+
private p2pGossipLatencyByTopic: Partial<Record<TopicType, { p50: number; p95: number }>> = {};
|
|
153
|
+
|
|
154
|
+
private attestationLatency: { p50: number; p95: number } | undefined;
|
|
155
|
+
private attestationCounts: { success: number; failedBad: number; failedNode: number } | undefined;
|
|
156
|
+
private reqRespStats: { fraction: number; delayP50: number; delayP95: number } | undefined;
|
|
157
|
+
private peerStats: { avgCount: number; connectionDurationP50: number; connectionDurationP95: number } | undefined;
|
|
158
|
+
private mempoolMinedDelay:
|
|
159
|
+
| { txP50: number; txP95: number; attestationP50: number; attestationP95: number }
|
|
160
|
+
| undefined;
|
|
161
|
+
|
|
162
|
+
constructor(
|
|
163
|
+
private aztecNode: AztecNode,
|
|
164
|
+
private logger?: Logger,
|
|
165
|
+
) {}
|
|
166
|
+
|
|
167
|
+
recordSentTx(tx: Tx, group: string): void {
|
|
168
|
+
const txHash = tx.getTxHash().toString();
|
|
169
|
+
const priorityFees = tx.getGasSettings().maxPriorityFeesPerGas;
|
|
170
|
+
|
|
171
|
+
if (this.data.has(txHash)) {
|
|
172
|
+
this.logger?.debug(`Overwriting tx inclusion data for ${txHash}`, { txHash, group });
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
this.data.set(txHash, {
|
|
176
|
+
txHash,
|
|
177
|
+
sentAt: Math.trunc(Date.now() / 1000),
|
|
178
|
+
minedAt: -1,
|
|
179
|
+
attestedAt: -1,
|
|
180
|
+
blocknumber: -1,
|
|
181
|
+
priorityFee: Number(priorityFees.feePerDaGas + priorityFees.feePerL2Gas),
|
|
182
|
+
totalFee: -1,
|
|
183
|
+
positionInBlock: -1,
|
|
184
|
+
group,
|
|
185
|
+
});
|
|
186
|
+
this.groups.add(group);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async recordMinedTx(txReceipt: TxReceipt): Promise<void> {
|
|
190
|
+
const { txHash, blockNumber } = txReceipt;
|
|
191
|
+
if (!txReceipt.isMined() || !txReceipt.hasExecutionSucceeded() || !blockNumber) {
|
|
192
|
+
this.logger?.debug('Skipping mined tx record due to receipt status', {
|
|
193
|
+
txHash: txHash.toString(),
|
|
194
|
+
status: txReceipt.status,
|
|
195
|
+
blockNumber,
|
|
196
|
+
});
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (!this.blocks.has(blockNumber)) {
|
|
201
|
+
this.blocks.set(blockNumber, this.aztecNode.getBlock(blockNumber));
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const block = await this.blocks.get(blockNumber)!;
|
|
205
|
+
if (!block) {
|
|
206
|
+
this.logger?.warn('Failed to load block for mined tx receipt', { txHash: txHash.toString(), blockNumber });
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const data = this.data.get(txHash.toString());
|
|
210
|
+
if (!data) {
|
|
211
|
+
const message = `Missing sent tx record for mined tx ${txHash.toString()}`;
|
|
212
|
+
this.logger?.warn(message, { txHash: txHash.toString(), blockNumber });
|
|
213
|
+
throw new Error(message);
|
|
214
|
+
}
|
|
215
|
+
data.blocknumber = blockNumber;
|
|
216
|
+
data.minedAt = Number(block.header.globalVariables.timestamp);
|
|
217
|
+
data.attestedAt = -1;
|
|
218
|
+
data.totalFee = Number(txReceipt.transactionFee ?? 0n);
|
|
219
|
+
data.positionInBlock = block.body.txEffects.findIndex(txEffect => txEffect.txHash.equals(txHash));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public inclusionTimeInSeconds(group: string): {
|
|
223
|
+
count: number;
|
|
224
|
+
group: string;
|
|
225
|
+
min: number;
|
|
226
|
+
mean: number;
|
|
227
|
+
max: number;
|
|
228
|
+
median: number;
|
|
229
|
+
p99: number;
|
|
230
|
+
} {
|
|
231
|
+
const histogram = createHistogram({});
|
|
232
|
+
for (const tx of this.data.values()) {
|
|
233
|
+
if (!tx.blocknumber || tx.group !== group || tx.minedAt === -1) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
histogram.record(tx.minedAt - tx.sentAt);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (histogram.count === 0) {
|
|
241
|
+
return {
|
|
242
|
+
group,
|
|
243
|
+
count: 0,
|
|
244
|
+
mean: 0,
|
|
245
|
+
max: 0,
|
|
246
|
+
median: 0,
|
|
247
|
+
min: 0,
|
|
248
|
+
p99: 0,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
group,
|
|
254
|
+
count: histogram.count,
|
|
255
|
+
mean: histogram.mean,
|
|
256
|
+
max: histogram.max,
|
|
257
|
+
median: histogram.percentile(50),
|
|
258
|
+
min: histogram.min,
|
|
259
|
+
p99: histogram.percentile(99),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public recordP2PGossipLatency(topicName: TopicType, p50: number, p95: number): void {
|
|
264
|
+
this.p2pGossipLatencyByTopic[topicName] = { p50, p95 };
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
public recordAttestationLatency(p50: number, p95: number): void {
|
|
268
|
+
this.attestationLatency = { p50, p95 };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
public recordAttestationCounts(success: number, failedBad: number, failedNode: number): void {
|
|
272
|
+
this.attestationCounts = { success, failedBad, failedNode };
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
public recordReqRespStats(fraction: number, delayP50: number, delayP95: number): void {
|
|
276
|
+
this.reqRespStats = { fraction, delayP50, delayP95 };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
public recordPeerStats(avgCount: number, connectionDurationP50: number, connectionDurationP95: number): void {
|
|
280
|
+
this.peerStats = { avgCount, connectionDurationP50, connectionDurationP95 };
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
public recordMempoolMinedDelay(txP50: number, txP95: number, attestationP50: number, attestationP95: number): void {
|
|
284
|
+
this.mempoolMinedDelay = { txP50, txP95, attestationP50, attestationP95 };
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
toGithubActionBenchmarkJSON(): Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> {
|
|
288
|
+
const data: Array<{ name: string; unit: string; value: number; range?: number; extra?: string }> = [];
|
|
289
|
+
for (const group of this.groups) {
|
|
290
|
+
const stats = this.inclusionTimeInSeconds(group);
|
|
291
|
+
|
|
292
|
+
data.push(
|
|
293
|
+
{
|
|
294
|
+
name: `${group}/avg_inclusion`,
|
|
295
|
+
unit: 's',
|
|
296
|
+
value: stats.mean,
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
name: `${group}/median_inclusion`,
|
|
300
|
+
unit: 's',
|
|
301
|
+
value: stats.median,
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: `${group}/p99_inclusion`,
|
|
305
|
+
unit: 's',
|
|
306
|
+
value: stats.p99,
|
|
307
|
+
},
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
for (const [topic, { p50, p95 }] of Object.entries(this.p2pGossipLatencyByTopic)) {
|
|
312
|
+
data.push({
|
|
313
|
+
name: `p2p_gossip_latency/${topic}/p50`,
|
|
314
|
+
unit: 'ms',
|
|
315
|
+
value: p50,
|
|
316
|
+
});
|
|
317
|
+
data.push({
|
|
318
|
+
name: `p2p_gossip_latency/${topic}/p95`,
|
|
319
|
+
unit: 'ms',
|
|
320
|
+
value: p95,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (this.attestationLatency) {
|
|
325
|
+
data.push(
|
|
326
|
+
{ name: 'attestation_latency/p50', unit: 'ms', value: this.attestationLatency.p50 },
|
|
327
|
+
{ name: 'attestation_latency/p95', unit: 'ms', value: this.attestationLatency.p95 },
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (this.attestationCounts) {
|
|
332
|
+
const { success, failedBad, failedNode } = this.attestationCounts;
|
|
333
|
+
const total = success + failedBad + failedNode;
|
|
334
|
+
const ratio = total > 0 ? success / total : 0;
|
|
335
|
+
data.push(
|
|
336
|
+
{ name: 'attestation/success_count', unit: 'count', value: success },
|
|
337
|
+
{ name: 'attestation/failed_bad_proposal_count', unit: 'count', value: failedBad },
|
|
338
|
+
{ name: 'attestation/failed_node_issue_count', unit: 'count', value: failedNode },
|
|
339
|
+
{ name: 'attestation/success_ratio', unit: 'ratio', value: ratio },
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (this.reqRespStats) {
|
|
344
|
+
data.push(
|
|
345
|
+
{ name: 'req_resp/txs_requested_fraction', unit: 'ratio', value: this.reqRespStats.fraction },
|
|
346
|
+
{ name: 'req_resp/delay_p50', unit: 'ms', value: this.reqRespStats.delayP50 },
|
|
347
|
+
{ name: 'req_resp/delay_p95', unit: 'ms', value: this.reqRespStats.delayP95 },
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (this.peerStats) {
|
|
352
|
+
data.push(
|
|
353
|
+
{ name: 'peers/avg_count', unit: 'peers', value: this.peerStats.avgCount },
|
|
354
|
+
{ name: 'peers/connection_duration_p50', unit: 'ms', value: this.peerStats.connectionDurationP50 },
|
|
355
|
+
{ name: 'peers/connection_duration_p95', unit: 'ms', value: this.peerStats.connectionDurationP95 },
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if (this.mempoolMinedDelay) {
|
|
360
|
+
data.push(
|
|
361
|
+
{ name: 'mempool/tx_mined_delay_p50', unit: 'ms', value: this.mempoolMinedDelay.txP50 },
|
|
362
|
+
{ name: 'mempool/tx_mined_delay_p95', unit: 'ms', value: this.mempoolMinedDelay.txP95 },
|
|
363
|
+
{ name: 'mempool/attestation_mined_delay_p50', unit: 'ms', value: this.mempoolMinedDelay.attestationP50 },
|
|
364
|
+
{ name: 'mempool/attestation_mined_delay_p95', unit: 'ms', value: this.mempoolMinedDelay.attestationP95 },
|
|
365
|
+
);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const scenario = process.env.BENCH_SCENARIO?.trim();
|
|
369
|
+
if (!scenario) {
|
|
370
|
+
return data;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const scenarioPrefix = `scenario/${scenario}/`;
|
|
374
|
+
return data.map(entry => ({ ...entry, name: `${scenarioPrefix}${entry.name}` }));
|
|
375
|
+
}
|
|
376
|
+
}
|