@aztec/p2p 0.0.1-commit.e6bd8901 → 0.0.1-commit.f146247c
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/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +6 -5
- package/dest/client/p2p_client.d.ts +1 -1
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +9 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +8 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +2 -0
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +2 -2
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +7 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +21 -11
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/size_validator.js +4 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +13 -1
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +39 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -3
- package/dest/services/libp2p/libp2p_service.d.ts +9 -3
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +37 -28
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +20 -5
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +8 -2
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/interface.d.ts +3 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -5
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -6
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +43 -13
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +58 -22
- package/dest/services/service.d.ts +4 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +4 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +9 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +16 -5
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +9 -2
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/tx_collection.d.ts +4 -4
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +5 -5
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +158 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +297 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +212 -131
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -44
- package/package.json +14 -14
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +6 -10
- package/src/client/p2p_client.ts +9 -2
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +6 -1
- package/src/mem_pools/instrumentation.ts +2 -1
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +8 -2
- package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -5
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
- package/src/msg_validators/tx_validator/data_validator.ts +6 -2
- package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
- package/src/msg_validators/tx_validator/factory.ts +64 -23
- package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
- package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +6 -2
- package/src/msg_validators/tx_validator/timestamp_validator.ts +6 -3
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +45 -0
- package/src/services/libp2p/instrumentation.ts +15 -2
- package/src/services/libp2p/libp2p_service.ts +60 -46
- package/src/services/peer-manager/metrics.ts +21 -4
- package/src/services/peer-manager/peer_scoring.ts +4 -1
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
- package/src/services/reqresp/interface.ts +3 -0
- package/src/services/reqresp/metrics.ts +34 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +51 -9
- package/src/services/reqresp/reqresp.ts +66 -19
- package/src/services/service.ts +4 -0
- package/src/services/tx_collection/config.ts +15 -1
- package/src/services/tx_collection/fast_tx_collection.ts +36 -13
- package/src/services/tx_collection/index.ts +5 -0
- package/src/services/tx_collection/instrumentation.ts +11 -2
- package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
- package/src/services/tx_collection/tx_collection.ts +4 -4
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +374 -0
- package/src/testbench/p2p_client_testbench_worker.ts +321 -122
- package/src/testbench/worker_client_manager.ts +304 -47
|
@@ -1,126 +1,97 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A testbench worker that creates a p2p client and listens for commands from the parent.
|
|
3
3
|
*
|
|
4
|
-
* Used when running testbench commands
|
|
4
|
+
* Used when running testbench commands.
|
|
5
5
|
*/
|
|
6
6
|
import { MockL2BlockSource } from '@aztec/archiver/test';
|
|
7
7
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
8
|
-
import {
|
|
8
|
+
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
9
9
|
import { SecretValue } from '@aztec/foundation/config';
|
|
10
|
-
import {
|
|
10
|
+
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
11
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
12
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
11
13
|
import { sleep } from '@aztec/foundation/sleep';
|
|
14
|
+
import { DateProvider, Timer } from '@aztec/foundation/timer';
|
|
12
15
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
13
16
|
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
17
|
+
import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
18
|
+
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
14
19
|
import type { L2BlockSource } from '@aztec/stdlib/block';
|
|
15
20
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
16
21
|
import type { ClientProtocolCircuitVerifier, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
17
|
-
import { P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
|
|
18
|
-
import {
|
|
22
|
+
import { type BlockProposal, P2PClientType, P2PMessage } from '@aztec/stdlib/p2p';
|
|
23
|
+
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
24
|
+
import { makeAztecAddress, makeBlockHeader, makeBlockProposal, mockTx } from '@aztec/stdlib/testing';
|
|
25
|
+
import { Tx, TxHash, type TxValidationResult } from '@aztec/stdlib/tx';
|
|
19
26
|
import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-client';
|
|
20
27
|
|
|
21
28
|
import type { Message, PeerId } from '@libp2p/interface';
|
|
22
29
|
import { TopicValidatorResult } from '@libp2p/interface';
|
|
23
|
-
import
|
|
30
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
24
31
|
|
|
32
|
+
import type { P2PClient } from '../client/p2p_client.js';
|
|
25
33
|
import type { P2PConfig } from '../config.js';
|
|
26
34
|
import { createP2PClient } from '../index.js';
|
|
27
|
-
import type { AttestationPool } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
28
35
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
29
|
-
import type { TxPool } from '../mem_pools/tx_pool/index.js';
|
|
30
36
|
import { LibP2PService } from '../services/libp2p/libp2p_service.js';
|
|
31
37
|
import type { PeerManager } from '../services/peer-manager/peer_manager.js';
|
|
38
|
+
import type { BatchTxRequesterLibP2PService } from '../services/reqresp/batch-tx-requester/interface.js';
|
|
39
|
+
import type { IBatchRequestTxValidator } from '../services/reqresp/batch-tx-requester/tx_validator.js';
|
|
40
|
+
import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
|
|
32
41
|
import type { ReqResp } from '../services/reqresp/reqresp.js';
|
|
33
42
|
import type { PeerDiscoveryService } from '../services/service.js';
|
|
43
|
+
import {
|
|
44
|
+
BatchTxRequesterCollector,
|
|
45
|
+
SendBatchRequestCollector,
|
|
46
|
+
} from '../services/tx_collection/proposal_tx_collector.js';
|
|
34
47
|
import { AlwaysTrueCircuitVerifier } from '../test-helpers/reqresp-nodes.js';
|
|
48
|
+
import {
|
|
49
|
+
BENCHMARK_CONSTANTS,
|
|
50
|
+
type CollectorType,
|
|
51
|
+
type DistributionPattern,
|
|
52
|
+
InMemoryAttestationPool,
|
|
53
|
+
InMemoryTxPool,
|
|
54
|
+
UNLIMITED_RATE_LIMIT_QUOTA,
|
|
55
|
+
createMockEpochCache,
|
|
56
|
+
createMockWorldStateSynchronizer,
|
|
57
|
+
filterTxsByDistribution,
|
|
58
|
+
} from '../test-helpers/testbench-utils.js';
|
|
35
59
|
import type { PubSubLibp2p } from '../util.js';
|
|
36
60
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// Mock all methods
|
|
40
|
-
const pool: Omit<TxPool, keyof EventEmitter> = {
|
|
41
|
-
isEmpty: () => Promise.resolve(false),
|
|
42
|
-
addTxs: () => Promise.resolve(1),
|
|
43
|
-
getTxByHash: () => Promise.resolve(undefined),
|
|
44
|
-
getArchivedTxByHash: () => Promise.resolve(undefined),
|
|
45
|
-
markAsMined: () => Promise.resolve(),
|
|
46
|
-
markMinedAsPending: () => Promise.resolve(),
|
|
47
|
-
deleteTxs: () => Promise.resolve(),
|
|
48
|
-
getAllTxs: () => Promise.resolve([]),
|
|
49
|
-
getAllTxHashes: () => Promise.resolve([]),
|
|
50
|
-
getPendingTxHashes: () => Promise.resolve([]),
|
|
51
|
-
getPendingTxCount: () => Promise.resolve(0),
|
|
52
|
-
getMinedTxHashes: () => Promise.resolve([]),
|
|
53
|
-
getTxStatus: () => Promise.resolve(TxStatus.PENDING),
|
|
54
|
-
getTxsByHash: () => Promise.resolve([]),
|
|
55
|
-
hasTxs: () => Promise.resolve([]),
|
|
56
|
-
hasTx: () => Promise.resolve(false),
|
|
57
|
-
updateConfig: () => {},
|
|
58
|
-
markTxsAsNonEvictable: () => Promise.resolve(),
|
|
59
|
-
clearNonEvictableTxs: () => Promise.resolve(),
|
|
60
|
-
cleanupDeletedMinedTxs: () => Promise.resolve(0),
|
|
61
|
-
};
|
|
62
|
-
return Object.assign(new EventEmitter(), pool);
|
|
63
|
-
}
|
|
61
|
+
export type { DistributionPattern, CollectorType } from '../test-helpers/testbench-utils.js';
|
|
62
|
+
export { COLLECTOR_DISPLAY_NAMES } from '../test-helpers/testbench-utils.js';
|
|
64
63
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
getCheckpointAttestationsForSlotAndProposal: () => Promise.resolve([]),
|
|
79
|
-
deleteCheckpointAttestationsOlderThan: () => Promise.resolve(),
|
|
80
|
-
hasReachedCheckpointProposalCap: () => Promise.resolve(false),
|
|
81
|
-
hasReachedCheckpointAttestationCap: () => Promise.resolve(false),
|
|
82
|
-
canAddCheckpointProposal: () => Promise.resolve(true),
|
|
83
|
-
canAddCheckpointAttestation: () => Promise.resolve(true),
|
|
84
|
-
hasCheckpointAttestation: () => Promise.resolve(false),
|
|
85
|
-
};
|
|
64
|
+
export interface BenchReqRespCommand {
|
|
65
|
+
type: 'BENCH_REQRESP';
|
|
66
|
+
txCount: number;
|
|
67
|
+
peerCount: number;
|
|
68
|
+
distribution: DistributionPattern;
|
|
69
|
+
collectorType: CollectorType;
|
|
70
|
+
timeoutMs: number;
|
|
71
|
+
isAggregator: boolean;
|
|
72
|
+
peerIndex: number;
|
|
73
|
+
pinnedPeerIndex?: number;
|
|
74
|
+
pinnedPeerId?: string;
|
|
75
|
+
blockNumber: number;
|
|
76
|
+
seed: number;
|
|
86
77
|
}
|
|
87
78
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
getCurrentAndNextSlot: () => ({
|
|
95
|
-
currentSlot: SlotNumber.ZERO,
|
|
96
|
-
nextSlot: SlotNumber.ZERO,
|
|
97
|
-
}),
|
|
98
|
-
getProposerAttesterAddressInSlot: () => Promise.resolve(undefined),
|
|
99
|
-
getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
|
|
100
|
-
isInCommittee: () => Promise.resolve(false),
|
|
101
|
-
getRegisteredValidators: () => Promise.resolve([]),
|
|
102
|
-
filterInCommittee: () => Promise.resolve([]),
|
|
103
|
-
};
|
|
79
|
+
export interface BenchResultMessage {
|
|
80
|
+
type: 'BENCH_RESULT';
|
|
81
|
+
durationMs: number;
|
|
82
|
+
fetchedCount: number;
|
|
83
|
+
success: boolean;
|
|
84
|
+
error?: string;
|
|
104
85
|
}
|
|
105
86
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
status: () =>
|
|
109
|
-
Promise.resolve({
|
|
110
|
-
syncSummary: {
|
|
111
|
-
latestBlockNumber: 0,
|
|
112
|
-
latestBlockHash: '',
|
|
113
|
-
finalizedBlockNumber: 0,
|
|
114
|
-
treesAreSynched: false,
|
|
115
|
-
oldestHistoricBlockNumber: 0,
|
|
116
|
-
},
|
|
117
|
-
}),
|
|
118
|
-
} as WorldStateSynchronizer;
|
|
87
|
+
export interface BenchReadyMessage {
|
|
88
|
+
type: 'BENCH_READY';
|
|
119
89
|
}
|
|
90
|
+
const txCache = new Map<number, Tx[]>();
|
|
120
91
|
|
|
121
92
|
class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends LibP2PService<T> {
|
|
122
93
|
private disableTxValidation: boolean;
|
|
123
|
-
private gossipMessageCount
|
|
94
|
+
private gossipMessageCount = 0;
|
|
124
95
|
|
|
125
96
|
constructor(
|
|
126
97
|
clientType: T,
|
|
@@ -189,10 +160,166 @@ class TestLibP2PService<T extends P2PClientType = P2PClientType.Full> extends Li
|
|
|
189
160
|
}
|
|
190
161
|
}
|
|
191
162
|
|
|
163
|
+
async function generateDeterministicTxs(txCount: number, seed: number, config: P2PConfig): Promise<Tx[]> {
|
|
164
|
+
const cached = txCache.get(seed) ?? [];
|
|
165
|
+
if (cached.length >= txCount) {
|
|
166
|
+
return cached.slice(0, txCount);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const includeByTimestampBase = BigInt(seed);
|
|
170
|
+
for (let i = cached.length; i < txCount; i++) {
|
|
171
|
+
const txSeed = seed * 10000 + i;
|
|
172
|
+
const tx = await mockTx(txSeed, {
|
|
173
|
+
chainId: new Fr(config.l1ChainId),
|
|
174
|
+
version: new Fr(config.rollupVersion),
|
|
175
|
+
vkTreeRoot: getVKTreeRoot(),
|
|
176
|
+
protocolContractsHash,
|
|
177
|
+
feePayer: makeAztecAddress(txSeed + 1),
|
|
178
|
+
chonkProof: ChonkProof.empty(),
|
|
179
|
+
numberOfNonRevertiblePublicCallRequests: 0,
|
|
180
|
+
numberOfRevertiblePublicCallRequests: 0,
|
|
181
|
+
numberOfRevertibleNullifiers: 0,
|
|
182
|
+
hasPublicTeardownCallRequest: false,
|
|
183
|
+
publicCalldataSize: 0,
|
|
184
|
+
});
|
|
185
|
+
tx.data.includeByTimestamp = includeByTimestampBase + BigInt(i);
|
|
186
|
+
await tx.recomputeHash();
|
|
187
|
+
cached.push(tx);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
txCache.set(seed, cached);
|
|
191
|
+
return cached.slice(0, txCount);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
async function createBlockProposal(blockNumber: number, txHashes: TxHash[], seed: number): Promise<BlockProposal> {
|
|
195
|
+
const archiveRoot = new Fr(BigInt(seed) * 1000000n + BigInt(blockNumber));
|
|
196
|
+
return await makeBlockProposal({
|
|
197
|
+
signer: Secp256k1Signer.random(),
|
|
198
|
+
blockHeader: makeBlockHeader(1, { blockNumber: BlockNumber(blockNumber) }),
|
|
199
|
+
archiveRoot,
|
|
200
|
+
txHashes,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function installUnlimitedRateLimits(client: P2PClient): void {
|
|
205
|
+
const reqResp = (client as any).p2pService.reqresp as any;
|
|
206
|
+
const rateLimiter = reqResp.rateLimiter as any;
|
|
207
|
+
|
|
208
|
+
rateLimiter.getRateLimits = () => UNLIMITED_RATE_LIMIT_QUOTA;
|
|
209
|
+
rateLimiter.allow = () => RateLimitStatus.Allowed;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function runAggregatorBenchmark(
|
|
213
|
+
client: P2PClient,
|
|
214
|
+
blockProposal: BlockProposal,
|
|
215
|
+
collectorType: CollectorType,
|
|
216
|
+
timeoutMs: number,
|
|
217
|
+
pinnedPeerId: string | undefined,
|
|
218
|
+
pinnedPeerIndex: number | undefined,
|
|
219
|
+
logger: Logger,
|
|
220
|
+
expectedPeerCount: number,
|
|
221
|
+
): Promise<BenchResultMessage> {
|
|
222
|
+
let timer = new Timer();
|
|
223
|
+
try {
|
|
224
|
+
installUnlimitedRateLimits(client);
|
|
225
|
+
|
|
226
|
+
const txHashes = blockProposal.txHashes;
|
|
227
|
+
logger.info(`[BENCH] Using block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`);
|
|
228
|
+
|
|
229
|
+
const p2pService = (client as any).p2pService;
|
|
230
|
+
const batchTxRequesterService: BatchTxRequesterLibP2PService = p2pService.getBatchTxRequesterService();
|
|
231
|
+
|
|
232
|
+
const minPeersRequired = Math.max(1, expectedPeerCount - 1);
|
|
233
|
+
const maxWaitMs = BENCHMARK_CONSTANTS.MAX_PEER_WAIT_MS;
|
|
234
|
+
const waitInterval = BENCHMARK_CONSTANTS.PEER_CHECK_INTERVAL_MS;
|
|
235
|
+
let waited = 0;
|
|
236
|
+
|
|
237
|
+
while (waited < maxWaitMs) {
|
|
238
|
+
const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
|
|
239
|
+
if (connectedPeers.length >= minPeersRequired) {
|
|
240
|
+
logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers, starting benchmark`);
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
logger.debug(`[BENCH] Waiting for peers: ${connectedPeers.length}/${minPeersRequired} (waited ${waited}ms)`);
|
|
244
|
+
await sleep(waitInterval);
|
|
245
|
+
waited += waitInterval;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const connectedPeers = batchTxRequesterService.connectionSampler.getPeerListSortedByConnectionCountAsc();
|
|
249
|
+
logger.info(`[BENCH] Aggregator has ${connectedPeers.length} connected peers`);
|
|
250
|
+
logger.info(
|
|
251
|
+
`[BENCH] Requesting ${txHashes.length} tx hashes: ${txHashes
|
|
252
|
+
.slice(0, 3)
|
|
253
|
+
.map(h => h.toString())
|
|
254
|
+
.join(', ')}...`,
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
let pinnedPeer: PeerId | undefined;
|
|
258
|
+
if (pinnedPeerId) {
|
|
259
|
+
pinnedPeer = peerIdFromString(pinnedPeerId);
|
|
260
|
+
} else if (pinnedPeerIndex !== undefined) {
|
|
261
|
+
if (pinnedPeerIndex > 0 && pinnedPeerIndex <= connectedPeers.length) {
|
|
262
|
+
pinnedPeer = connectedPeers[pinnedPeerIndex - 1];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const noopTxValidator: IBatchRequestTxValidator = {
|
|
267
|
+
validateRequestedTx: (_tx: Tx): Promise<TxValidationResult> => Promise.resolve({ result: 'valid' }),
|
|
268
|
+
validateRequestedTxs: (txs: Tx[]): Promise<TxValidationResult[]> =>
|
|
269
|
+
Promise.resolve(txs.map(() => ({ result: 'valid' }))),
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
timer = new Timer();
|
|
273
|
+
if (collectorType === 'batch-requester') {
|
|
274
|
+
const collector = new BatchTxRequesterCollector(
|
|
275
|
+
batchTxRequesterService,
|
|
276
|
+
logger,
|
|
277
|
+
new DateProvider(),
|
|
278
|
+
noopTxValidator,
|
|
279
|
+
);
|
|
280
|
+
const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
|
|
281
|
+
const durationMs = timer.ms();
|
|
282
|
+
return {
|
|
283
|
+
type: 'BENCH_RESULT',
|
|
284
|
+
durationMs,
|
|
285
|
+
fetchedCount: fetchedTxs.length,
|
|
286
|
+
success: fetchedTxs.length === txHashes.length,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const collector = new SendBatchRequestCollector(
|
|
291
|
+
batchTxRequesterService,
|
|
292
|
+
BENCHMARK_CONSTANTS.FIXED_MAX_PEERS,
|
|
293
|
+
BENCHMARK_CONSTANTS.FIXED_MAX_RETRY_ATTEMPTS,
|
|
294
|
+
);
|
|
295
|
+
const fetchedTxs = await collector.collectTxs(txHashes, blockProposal, pinnedPeer, timeoutMs);
|
|
296
|
+
const durationMs = timer.ms();
|
|
297
|
+
return {
|
|
298
|
+
type: 'BENCH_RESULT',
|
|
299
|
+
durationMs,
|
|
300
|
+
fetchedCount: fetchedTxs.length,
|
|
301
|
+
success: fetchedTxs.length === txHashes.length,
|
|
302
|
+
};
|
|
303
|
+
} catch (err: any) {
|
|
304
|
+
return {
|
|
305
|
+
type: 'BENCH_RESULT',
|
|
306
|
+
durationMs: timer.ms(),
|
|
307
|
+
fetchedCount: 0,
|
|
308
|
+
success: false,
|
|
309
|
+
error: err?.message ?? String(err),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
let workerClient: P2PClient | null = null;
|
|
315
|
+
let workerTxPool: InMemoryTxPool | null = null;
|
|
316
|
+
let workerAttestationPool: InMemoryAttestationPool | null = null;
|
|
317
|
+
let workerConfig: P2PConfig | null = null;
|
|
318
|
+
let workerLogger: Logger | null = null;
|
|
319
|
+
let kvStore: Awaited<ReturnType<typeof openTmpStore>> | null = null;
|
|
320
|
+
|
|
192
321
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
193
322
|
process.on('message', async msg => {
|
|
194
|
-
// Note: peerIdPrivateKey comes as a raw string (not SecretValue) because
|
|
195
|
-
// SecretValue's private fields can't be serialized via IPC
|
|
196
323
|
const {
|
|
197
324
|
type,
|
|
198
325
|
config: rawConfig,
|
|
@@ -202,47 +329,47 @@ process.on('message', async msg => {
|
|
|
202
329
|
config: Omit<P2PConfig, 'peerIdPrivateKey'> & { peerIdPrivateKey?: string };
|
|
203
330
|
clientIndex: number;
|
|
204
331
|
};
|
|
332
|
+
|
|
205
333
|
try {
|
|
206
334
|
if (type === 'START') {
|
|
207
|
-
// Re-wrap the peerIdPrivateKey with SecretValue
|
|
208
335
|
const config: P2PConfig = {
|
|
209
336
|
...rawConfig,
|
|
210
337
|
peerIdPrivateKey: rawConfig.peerIdPrivateKey ? new SecretValue(rawConfig.peerIdPrivateKey) : undefined,
|
|
211
338
|
} as P2PConfig;
|
|
212
339
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const
|
|
340
|
+
workerConfig = config;
|
|
341
|
+
workerTxPool = new InMemoryTxPool();
|
|
342
|
+
workerAttestationPool = new InMemoryAttestationPool();
|
|
343
|
+
const epochCache = createMockEpochCache();
|
|
344
|
+
const worldState = createMockWorldStateSynchronizer();
|
|
217
345
|
const l2BlockSource = new MockL2BlockSource();
|
|
218
346
|
|
|
219
347
|
const proofVerifier = new AlwaysTrueCircuitVerifier();
|
|
220
|
-
|
|
221
|
-
|
|
348
|
+
kvStore = await openTmpStore(`test-${clientIndex}`, true, BENCHMARK_CONSTANTS.KV_STORE_MAP_SIZE_KB);
|
|
349
|
+
workerLogger = createLogger(`p2p:${clientIndex}`);
|
|
350
|
+
workerTxPool.setLogger(workerLogger);
|
|
222
351
|
const telemetry = getTelemetryClient();
|
|
223
352
|
|
|
224
353
|
const deps = {
|
|
225
|
-
txPool,
|
|
226
|
-
attestationPool,
|
|
354
|
+
txPool: workerTxPool,
|
|
355
|
+
attestationPool: workerAttestationPool,
|
|
227
356
|
store: kvStore,
|
|
228
|
-
logger,
|
|
357
|
+
logger: workerLogger,
|
|
229
358
|
};
|
|
230
359
|
|
|
231
360
|
const client = await createP2PClient(
|
|
232
361
|
P2PClientType.Full,
|
|
233
362
|
config as P2PConfig & DataStoreConfig,
|
|
234
363
|
l2BlockSource,
|
|
235
|
-
proofVerifier,
|
|
364
|
+
proofVerifier as ClientProtocolCircuitVerifier,
|
|
236
365
|
worldState,
|
|
237
366
|
epochCache,
|
|
238
367
|
'test-p2p-bench-worker',
|
|
239
368
|
undefined,
|
|
240
|
-
telemetry,
|
|
369
|
+
telemetry as TelemetryClient,
|
|
241
370
|
deps,
|
|
242
371
|
);
|
|
243
372
|
|
|
244
|
-
// Create test service with validation disabled
|
|
245
|
-
// Note: Parameter order must match LibP2PService constructor
|
|
246
373
|
const testService = new TestLibP2PService(
|
|
247
374
|
P2PClientType.Full,
|
|
248
375
|
config,
|
|
@@ -255,41 +382,113 @@ process.on('message', async msg => {
|
|
|
255
382
|
epochCache,
|
|
256
383
|
proofVerifier,
|
|
257
384
|
worldState,
|
|
258
|
-
telemetry,
|
|
259
|
-
|
|
260
|
-
true,
|
|
385
|
+
telemetry as TelemetryClient,
|
|
386
|
+
workerLogger,
|
|
387
|
+
true,
|
|
261
388
|
);
|
|
262
389
|
|
|
263
|
-
// Replace the existing p2pService with our test version
|
|
264
390
|
(client as any).p2pService = testService;
|
|
265
391
|
|
|
266
392
|
await client.start();
|
|
267
|
-
// Wait until the client is ready
|
|
268
393
|
for (let i = 0; i < 100; i++) {
|
|
269
394
|
const isReady = client.isReady();
|
|
270
|
-
|
|
395
|
+
workerLogger.debug(`Client ${clientIndex} isReady: ${isReady}`);
|
|
271
396
|
if (isReady) {
|
|
272
397
|
break;
|
|
273
398
|
}
|
|
274
399
|
await sleep(1000);
|
|
275
400
|
}
|
|
276
401
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
process.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
402
|
+
workerClient = client;
|
|
403
|
+
const peerId = (client as any).p2pService.node.peerId.toString();
|
|
404
|
+
process.send!({ type: 'READY', peerId });
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const cmd = msg as any;
|
|
409
|
+
switch (cmd.type) {
|
|
410
|
+
case 'STOP':
|
|
411
|
+
if (workerClient) {
|
|
412
|
+
await workerClient.stop();
|
|
413
|
+
}
|
|
414
|
+
if (kvStore?.close) {
|
|
415
|
+
await kvStore.close();
|
|
416
|
+
}
|
|
417
|
+
process.exit(0);
|
|
418
|
+
break;
|
|
419
|
+
|
|
420
|
+
case 'SEND_TX':
|
|
421
|
+
if (workerClient) {
|
|
422
|
+
await workerClient.sendTx(Tx.fromBuffer(Buffer.from(cmd.tx)));
|
|
423
|
+
process.send!({ type: 'TX_SENT' });
|
|
424
|
+
}
|
|
425
|
+
break;
|
|
426
|
+
|
|
427
|
+
case 'BENCH_REQRESP': {
|
|
428
|
+
const benchCmd = cmd as BenchReqRespCommand;
|
|
429
|
+
if (!workerClient || !workerTxPool || !workerAttestationPool || !workerConfig || !workerLogger) {
|
|
430
|
+
process.send!({
|
|
431
|
+
type: 'BENCH_RESULT',
|
|
432
|
+
durationMs: 0,
|
|
433
|
+
fetchedCount: 0,
|
|
434
|
+
success: false,
|
|
435
|
+
error: 'Worker not initialized',
|
|
436
|
+
} as BenchResultMessage);
|
|
437
|
+
break;
|
|
289
438
|
}
|
|
290
|
-
});
|
|
291
439
|
|
|
292
|
-
|
|
440
|
+
// Reset state before each benchmark run to avoid cross-run contamination
|
|
441
|
+
workerTxPool.resetState();
|
|
442
|
+
workerAttestationPool.resetState();
|
|
443
|
+
|
|
444
|
+
installUnlimitedRateLimits(workerClient);
|
|
445
|
+
|
|
446
|
+
const allTxs = await generateDeterministicTxs(benchCmd.txCount, benchCmd.seed, workerConfig);
|
|
447
|
+
const txHashes = allTxs.map(tx => tx.getTxHash());
|
|
448
|
+
const blockProposal = await createBlockProposal(benchCmd.blockNumber, txHashes, benchCmd.seed);
|
|
449
|
+
|
|
450
|
+
await workerAttestationPool.addBlockProposal(blockProposal);
|
|
451
|
+
workerLogger.debug(
|
|
452
|
+
`[BENCH] Added block proposal with archive ${blockProposal.archive.toString().slice(0, 10)}...`,
|
|
453
|
+
);
|
|
454
|
+
|
|
455
|
+
if (benchCmd.isAggregator) {
|
|
456
|
+
workerTxPool.clearTxs();
|
|
457
|
+
|
|
458
|
+
workerLogger.info(
|
|
459
|
+
`[BENCH] Aggregator starting benchmark: txCount=${benchCmd.txCount}, collector=${benchCmd.collectorType}, distribution=${benchCmd.distribution}`,
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
const result = await runAggregatorBenchmark(
|
|
463
|
+
workerClient,
|
|
464
|
+
blockProposal,
|
|
465
|
+
benchCmd.collectorType,
|
|
466
|
+
benchCmd.timeoutMs,
|
|
467
|
+
benchCmd.pinnedPeerId,
|
|
468
|
+
benchCmd.pinnedPeerIndex,
|
|
469
|
+
workerLogger,
|
|
470
|
+
benchCmd.peerCount,
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
process.send!(result);
|
|
474
|
+
} else {
|
|
475
|
+
const myTxs = filterTxsByDistribution(
|
|
476
|
+
allTxs,
|
|
477
|
+
benchCmd.peerIndex,
|
|
478
|
+
benchCmd.peerCount,
|
|
479
|
+
benchCmd.distribution,
|
|
480
|
+
benchCmd.pinnedPeerIndex,
|
|
481
|
+
);
|
|
482
|
+
workerTxPool.setTxs(myTxs);
|
|
483
|
+
|
|
484
|
+
workerLogger.info(
|
|
485
|
+
`[BENCH] Peer ${benchCmd.peerIndex} populated tx pool with ${myTxs.length}/${benchCmd.txCount} txs (${benchCmd.distribution})`,
|
|
486
|
+
);
|
|
487
|
+
|
|
488
|
+
process.send!({ type: 'BENCH_READY' } as BenchReadyMessage);
|
|
489
|
+
}
|
|
490
|
+
break;
|
|
491
|
+
}
|
|
293
492
|
}
|
|
294
493
|
} catch (err: any) {
|
|
295
494
|
process.send!({ type: 'ERROR', error: err.message });
|