@aztec/p2p 0.0.1-commit.b2a5d0dd1 → 0.0.1-commit.b3d3157a
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 +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +9 -1
- package/dest/client/factory.d.ts +3 -3
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +12 -9
- package/dest/client/interface.d.ts +6 -4
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +11 -8
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +53 -17
- package/dest/config.d.ts +43 -17
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +48 -8
- package/dest/errors/reqresp.error.d.ts +1 -20
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +0 -21
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +93 -55
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +258 -195
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +175 -59
- package/dest/mem_pools/attestation_pool/mocks.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +6 -4
- 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 +17 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +73 -83
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +18 -2
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +3 -4
- package/dest/msg_validators/clock_tolerance.d.ts +1 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +13 -11
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +5 -2
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +5 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +8 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +28 -2
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +8 -15
- package/dest/msg_validators/tx_validator/allowed_public_setup.js +3 -3
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts +15 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/cached_tx_validator.js +19 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +2 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +1 -0
- package/dest/msg_validators/tx_validator/factory.d.ts +5 -4
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +11 -7
- package/dest/msg_validators/tx_validator/index.d.ts +3 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +2 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +2 -1
- 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 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +48 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +68 -0
- package/dest/services/discv5/discV5_service.d.ts +2 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +35 -8
- package/dest/services/dummy_service.d.ts +10 -17
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +9 -18
- package/dest/services/libp2p/libp2p_service.d.ts +19 -21
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +147 -148
- package/dest/services/peer-manager/peer_manager.d.ts +1 -1
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +35 -44
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +8 -5
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +5 -14
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +6 -20
- package/dest/services/reqresp/interface.d.ts +3 -10
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +0 -9
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- 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 +31 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- 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 +42 -24
- package/dest/services/reqresp/reqresp.d.ts +5 -29
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +16 -206
- package/dest/services/service.d.ts +7 -13
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +2 -23
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +2 -55
- package/dest/services/tx_collection/file_store_tx_collection.d.ts +12 -28
- package/dest/services/tx_collection/file_store_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_collection.js +43 -83
- package/dest/services/tx_collection/index.d.ts +2 -3
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +0 -1
- 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 +0 -2
- package/dest/services/tx_collection/tx_collection.d.ts +35 -51
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +275 -119
- package/dest/services/tx_collection/tx_collection_sink.d.ts +1 -1
- package/dest/services/tx_collection/tx_collection_sink.js +2 -2
- package/dest/services/tx_file_store/tx_file_store.d.ts +1 -3
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -1
- package/dest/services/tx_file_store/tx_file_store.js +4 -14
- package/dest/services/tx_provider.d.ts +3 -1
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider.js +3 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +1 -1
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +1 -1
- package/dest/test-helpers/mock-pubsub.d.ts +13 -7
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +12 -37
- package/dest/test-helpers/reqresp-nodes.d.ts +4 -5
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +11 -15
- package/dest/test-helpers/test_tx_provider.d.ts +3 -1
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -1
- package/dest/test-helpers/test_tx_provider.js +3 -0
- package/dest/test-helpers/testbench-utils.d.ts +12 -14
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +19 -14
- package/dest/testbench/p2p_client_testbench_worker.d.ts +3 -5
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +13 -24
- package/dest/testbench/worker_client_manager.d.ts +3 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +2 -8
- package/dest/util.d.ts +11 -6
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +35 -14
- package/dest/versioning.d.ts +3 -6
- package/dest/versioning.d.ts.map +1 -1
- package/dest/versioning.js +3 -24
- package/package.json +15 -14
- package/src/bootstrap/bootstrap.ts +9 -1
- package/src/client/factory.ts +20 -5
- package/src/client/interface.ts +6 -10
- package/src/client/p2p_client.ts +61 -36
- package/src/client/test/{tx_proposal_collector/README.md → p2p_client.batch_tx_requester.bench.README.md} +23 -53
- package/src/config.ts +94 -6
- package/src/errors/reqresp.error.ts +0 -25
- package/src/mem_pools/attestation_pool/attestation_pool.ts +309 -238
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +198 -62
- package/src/mem_pools/attestation_pool/mocks.ts +13 -8
- package/src/mem_pools/instrumentation.ts +5 -1
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +73 -90
- package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -1
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +11 -7
- package/src/msg_validators/clock_tolerance.ts +13 -12
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +9 -2
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +14 -2
- package/src/msg_validators/proposal_validator/proposal_validator.ts +39 -2
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +3 -12
- package/src/msg_validators/tx_validator/allowed_public_setup.ts +3 -3
- package/src/msg_validators/tx_validator/cached_tx_validator.ts +31 -0
- package/src/msg_validators/tx_validator/data_validator.ts +2 -0
- package/src/msg_validators/tx_validator/factory.ts +15 -6
- package/src/msg_validators/tx_validator/index.ts +2 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +2 -0
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +101 -0
- package/src/services/discv5/discV5_service.ts +38 -5
- package/src/services/dummy_service.ts +12 -43
- package/src/services/libp2p/libp2p_service.ts +169 -167
- package/src/services/peer-manager/peer_manager.ts +1 -0
- package/src/services/reqresp/README.md +0 -14
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +39 -52
- package/src/services/reqresp/batch-tx-requester/interface.ts +11 -4
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +12 -25
- package/src/services/reqresp/interface.ts +2 -38
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +34 -30
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- package/src/services/reqresp/reqresp.ts +11 -251
- package/src/services/service.ts +9 -30
- package/src/services/tx_collection/config.ts +3 -80
- package/src/services/tx_collection/file_store_tx_collection.ts +54 -103
- package/src/services/tx_collection/index.ts +1 -6
- package/src/services/tx_collection/instrumentation.ts +1 -7
- package/src/services/tx_collection/tx_collection.ts +330 -173
- package/src/services/tx_collection/tx_collection_sink.ts +2 -2
- package/src/services/tx_file_store/tx_file_store.ts +5 -17
- package/src/services/tx_provider.ts +5 -0
- package/src/test-helpers/make-test-p2p-clients.ts +1 -0
- package/src/test-helpers/mock-pubsub.ts +17 -60
- package/src/test-helpers/reqresp-nodes.ts +8 -20
- package/src/test-helpers/test_tx_provider.ts +5 -0
- package/src/test-helpers/testbench-utils.ts +23 -27
- package/src/testbench/p2p_client_testbench_worker.ts +16 -42
- package/src/testbench/worker_client_manager.ts +4 -19
- package/src/util.ts +32 -17
- package/src/versioning.ts +3 -33
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +0 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +0 -318
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +0 -73
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +0 -1
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +0 -8
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +0 -64
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +0 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +0 -151
- package/dest/services/tx_collection/fast_tx_collection.d.ts +0 -51
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/fast_tx_collection.js +0 -311
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +0 -48
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +0 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +0 -50
- package/dest/services/tx_collection/slow_tx_collection.d.ts +0 -57
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +0 -1
- package/dest/services/tx_collection/slow_tx_collection.js +0 -211
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +0 -357
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +0 -43
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +0 -161
- package/src/services/tx_collection/fast_tx_collection.ts +0 -361
- package/src/services/tx_collection/proposal_tx_collector.ts +0 -108
- package/src/services/tx_collection/slow_tx_collection.ts +0 -266
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
BlockNumber,
|
|
4
|
+
CheckpointNumber,
|
|
5
|
+
type CheckpointProposalHash,
|
|
6
|
+
SlotNumber,
|
|
7
|
+
} from '@aztec/foundation/branded-types';
|
|
3
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
9
|
import { RunningPromise } from '@aztec/foundation/promise';
|
|
5
10
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
6
11
|
import type { AztecAsyncKVStore, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
7
12
|
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
8
13
|
import {
|
|
14
|
+
type BlockData,
|
|
15
|
+
type BlockHash,
|
|
9
16
|
type CheckpointId,
|
|
10
17
|
type EthAddress,
|
|
11
|
-
GENESIS_BLOCK_HEADER_HASH,
|
|
12
18
|
type L2Block,
|
|
13
19
|
type L2BlockId,
|
|
14
20
|
type L2BlockSource,
|
|
@@ -18,6 +24,7 @@ import {
|
|
|
18
24
|
type L2TipsStore,
|
|
19
25
|
} from '@aztec/stdlib/block';
|
|
20
26
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
27
|
+
import { getTimestampForSlot } from '@aztec/stdlib/epoch-helpers';
|
|
21
28
|
import { type PeerInfo, tryStop } from '@aztec/stdlib/interfaces/server';
|
|
22
29
|
import { type BlockProposal, CheckpointAttestation, type CheckpointProposal, type TopicType } from '@aztec/stdlib/p2p';
|
|
23
30
|
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
@@ -28,15 +35,11 @@ import type { ENR } from '@nethermindeth/enr';
|
|
|
28
35
|
|
|
29
36
|
import { type P2PConfig, getP2PDefaultConfig } from '../config.js';
|
|
30
37
|
import { TxPoolError } from '../errors/tx-pool.error.js';
|
|
31
|
-
import type { AttestationPoolApi } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
38
|
+
import type { AttestationPoolApi, ProposalsForSlot } from '../mem_pools/attestation_pool/attestation_pool.js';
|
|
32
39
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
33
40
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
34
41
|
import type { AuthRequest, StatusMessage } from '../services/index.js';
|
|
35
|
-
import {
|
|
36
|
-
ReqRespSubProtocol,
|
|
37
|
-
type ReqRespSubProtocolHandler,
|
|
38
|
-
type ReqRespSubProtocolValidators,
|
|
39
|
-
} from '../services/reqresp/interface.js';
|
|
42
|
+
import { ReqRespSubProtocol, type ReqRespSubProtocolHandler } from '../services/reqresp/interface.js';
|
|
40
43
|
import type {
|
|
41
44
|
DuplicateAttestationInfo,
|
|
42
45
|
DuplicateProposalInfo,
|
|
@@ -95,6 +98,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
95
98
|
private _dateProvider: DateProvider = new DateProvider(),
|
|
96
99
|
private telemetry: TelemetryClient = getTelemetryClient(),
|
|
97
100
|
private log = createLogger('p2p'),
|
|
101
|
+
initialBlockHash: BlockHash,
|
|
98
102
|
) {
|
|
99
103
|
super(telemetry, 'P2PClient');
|
|
100
104
|
|
|
@@ -110,7 +114,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
110
114
|
this.telemetry,
|
|
111
115
|
);
|
|
112
116
|
|
|
113
|
-
this.l2Tips = new L2TipsKVStore(store, 'p2p_client');
|
|
117
|
+
this.l2Tips = new L2TipsKVStore(store, 'p2p_client', initialBlockHash);
|
|
114
118
|
this.synchedLatestSlot = store.openSingleton('p2p_pool_last_l2_slot');
|
|
115
119
|
}
|
|
116
120
|
|
|
@@ -164,7 +168,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
164
168
|
const from = BlockNumber(oldFinalizedBlockNum + 1);
|
|
165
169
|
const limit = event.block.number - from + 1;
|
|
166
170
|
if (limit > 0) {
|
|
167
|
-
const oldBlocks = await this.l2BlockSource.
|
|
171
|
+
const oldBlocks = await this.l2BlockSource.getBlocksData({ from, limit });
|
|
168
172
|
await this.handleFinalizedL2Blocks(oldBlocks);
|
|
169
173
|
}
|
|
170
174
|
break;
|
|
@@ -262,7 +266,6 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
262
266
|
throw new Error('Block stream not initialized');
|
|
263
267
|
}
|
|
264
268
|
this.blockStream.start();
|
|
265
|
-
await this.txCollection.start();
|
|
266
269
|
this.txFileStore?.start();
|
|
267
270
|
|
|
268
271
|
// Start slot monitor to call prepareForSlot when the slot changes
|
|
@@ -276,12 +279,8 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
276
279
|
return this.syncPromise;
|
|
277
280
|
}
|
|
278
281
|
|
|
279
|
-
addReqRespSubProtocol(
|
|
280
|
-
subProtocol
|
|
281
|
-
handler: ReqRespSubProtocolHandler,
|
|
282
|
-
validator: ReqRespSubProtocolValidators[ReqRespSubProtocol],
|
|
283
|
-
): Promise<void> {
|
|
284
|
-
return this.p2pService.addReqRespSubProtocol(subProtocol, handler, validator);
|
|
282
|
+
addReqRespSubProtocol(subProtocol: ReqRespSubProtocol, handler: ReqRespSubProtocolHandler): Promise<void> {
|
|
283
|
+
return this.p2pService.addReqRespSubProtocol(subProtocol, handler);
|
|
285
284
|
}
|
|
286
285
|
|
|
287
286
|
private initBlockStream(startingBlock?: BlockNumber) {
|
|
@@ -365,8 +364,19 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
365
364
|
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
366
365
|
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
367
366
|
}
|
|
368
|
-
|
|
369
|
-
await this.
|
|
367
|
+
const checkpointCore = proposal.toCore();
|
|
368
|
+
const { count } = await this.attestationPool.tryAddCheckpointProposal(checkpointCore);
|
|
369
|
+
if (count > 1) {
|
|
370
|
+
if (this.config.broadcastEquivocatedProposals) {
|
|
371
|
+
this.log.warn(`Broadcasting equivocated checkpoint proposal for slot ${proposal.slotNumber}`, {
|
|
372
|
+
slot: proposal.slotNumber,
|
|
373
|
+
archive: proposal.archive.toString(),
|
|
374
|
+
count,
|
|
375
|
+
});
|
|
376
|
+
} else {
|
|
377
|
+
throw new Error(`Attempted to broadcast a duplicate checkpoint proposal for slot ${proposal.slotNumber}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
370
380
|
return this.p2pService.propagate(proposal);
|
|
371
381
|
}
|
|
372
382
|
|
|
@@ -377,10 +387,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
377
387
|
|
|
378
388
|
public async getCheckpointAttestationsForSlot(
|
|
379
389
|
slot: SlotNumber,
|
|
380
|
-
|
|
390
|
+
proposalPayloadHash?: CheckpointProposalHash,
|
|
381
391
|
): Promise<CheckpointAttestation[]> {
|
|
382
|
-
return await (
|
|
383
|
-
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot,
|
|
392
|
+
return await (proposalPayloadHash
|
|
393
|
+
? this.attestationPool.getCheckpointAttestationsForSlotAndProposal(slot, proposalPayloadHash)
|
|
384
394
|
: this.attestationPool.getCheckpointAttestationsForSlot(slot));
|
|
385
395
|
}
|
|
386
396
|
|
|
@@ -388,6 +398,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
388
398
|
return this.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
389
399
|
}
|
|
390
400
|
|
|
401
|
+
public getProposalsForSlot(slot: SlotNumber): Promise<ProposalsForSlot> {
|
|
402
|
+
return this.attestationPool.getProposalsForSlot(slot);
|
|
403
|
+
}
|
|
404
|
+
|
|
391
405
|
public hasBlockProposalsForSlot(slot: SlotNumber): Promise<boolean> {
|
|
392
406
|
return this.attestationPool.hasBlockProposalsForSlot(slot);
|
|
393
407
|
}
|
|
@@ -414,6 +428,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
414
428
|
this.p2pService.registerDuplicateAttestationCallback(callback);
|
|
415
429
|
}
|
|
416
430
|
|
|
431
|
+
public registerCheckpointAttestationCallback(callback: (attestation: CheckpointAttestation) => void): void {
|
|
432
|
+
this.p2pService.registerCheckpointAttestationCallback(callback);
|
|
433
|
+
}
|
|
434
|
+
|
|
417
435
|
public async getPendingTxs(limit?: number, after?: TxHash): Promise<Tx[]> {
|
|
418
436
|
if (limit !== undefined && limit <= 0) {
|
|
419
437
|
throw new TypeError('limit must be greater than 0');
|
|
@@ -584,13 +602,10 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
584
602
|
*/
|
|
585
603
|
public async getStatus(): Promise<P2PSyncState> {
|
|
586
604
|
const blockNumber = await this.getSyncedLatestBlockNum();
|
|
587
|
-
const blockHash =
|
|
588
|
-
blockNumber
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
.getBlockHeader(blockNumber)
|
|
592
|
-
.then(header => header?.hash())
|
|
593
|
-
.then(hash => hash?.toString());
|
|
605
|
+
const blockHash = await this.l2BlockSource
|
|
606
|
+
.getBlockData({ number: blockNumber })
|
|
607
|
+
.then(data => data?.header.hash())
|
|
608
|
+
.then(hash => hash?.toString());
|
|
594
609
|
|
|
595
610
|
return {
|
|
596
611
|
state: this.currentState,
|
|
@@ -621,13 +636,13 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
621
636
|
|
|
622
637
|
await this.handleMinedBlocks(blocks);
|
|
623
638
|
await this.maybeCallPrepareForSlot();
|
|
624
|
-
await this.
|
|
639
|
+
await this.collectingMissingTxs(blocks);
|
|
625
640
|
const lastBlock = blocks.at(-1)!;
|
|
626
641
|
await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
|
|
627
642
|
}
|
|
628
643
|
|
|
629
|
-
/** Request txs for unproven blocks so the prover node
|
|
630
|
-
private async
|
|
644
|
+
/** Request txs for unproven blocks so the prover node can prove. */
|
|
645
|
+
private async collectingMissingTxs(blocks: L2Block[]): Promise<void> {
|
|
631
646
|
try {
|
|
632
647
|
// TODO(#15435): If the archiver has lagged behind L1, the reported proven block number may
|
|
633
648
|
// be much lower than the actual one, and it does not update until the pending chain is
|
|
@@ -635,7 +650,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
635
650
|
// are already proven, but the archiver has not yet updated its state. Until this is properly
|
|
636
651
|
// fixed, it is mitigated by the expiration date of collection requests, which depends on
|
|
637
652
|
// the slot number of the block.
|
|
638
|
-
const provenBlockNumber = await this.l2BlockSource.
|
|
653
|
+
const provenBlockNumber = (await this.l2BlockSource.getBlockNumber({ tag: 'proven' })) ?? BlockNumber.ZERO;
|
|
639
654
|
const unprovenBlocks = blocks.filter(block => block.number > provenBlockNumber);
|
|
640
655
|
for (const block of unprovenBlocks) {
|
|
641
656
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
@@ -647,7 +662,17 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
647
662
|
`Starting collection of ${missingTxHashes.length} missing txs for unproven mined block ${block.number}`,
|
|
648
663
|
{ missingTxHashes, blockNumber: block.number, blockHash: await block.hash().then(h => h.toString()) },
|
|
649
664
|
);
|
|
650
|
-
|
|
665
|
+
// Both `slashDataWithholdingToleranceSlots` and `p2pMissingTxCollectionDeadlineSlots`
|
|
666
|
+
// count *full slots after the block slot* — value N means collection runs until
|
|
667
|
+
// `slotStart(block.slot + N + 1)`. Take the larger of the two so collection never
|
|
668
|
+
// gives up before the data-withholding slash verdict is rendered.
|
|
669
|
+
const blockSlot = block.header.getSlot();
|
|
670
|
+
const toleranceSlots = this.config.slashDataWithholdingToleranceSlots;
|
|
671
|
+
const configuredSlots = this.config.p2pMissingTxCollectionDeadlineSlots ?? 0;
|
|
672
|
+
const deadlineSlot = SlotNumber(blockSlot + Math.max(toleranceSlots, configuredSlots) + 1);
|
|
673
|
+
const deadlineSeconds = getTimestampForSlot(deadlineSlot, this.epochCache.getL1Constants());
|
|
674
|
+
const deadline = new Date(Number(deadlineSeconds) * 1000);
|
|
675
|
+
await this.txCollection.collectFastForBlock(block, missingTxHashes, { deadline });
|
|
651
676
|
}
|
|
652
677
|
}
|
|
653
678
|
} catch (err) {
|
|
@@ -660,7 +685,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
660
685
|
* @param blocks - A list of finalized L2 blocks.
|
|
661
686
|
* @returns Empty promise.
|
|
662
687
|
*/
|
|
663
|
-
private async handleFinalizedL2Blocks(blocks:
|
|
688
|
+
private async handleFinalizedL2Blocks(blocks: BlockData[]): Promise<void> {
|
|
664
689
|
if (!blocks.length) {
|
|
665
690
|
return;
|
|
666
691
|
}
|
|
@@ -715,7 +740,7 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
715
740
|
const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
|
|
716
741
|
|
|
717
742
|
let slot;
|
|
718
|
-
if (
|
|
743
|
+
if (hasProposedCheckpoint) {
|
|
719
744
|
const { targetSlot } = this.epochCache.getTargetAndNextSlot();
|
|
720
745
|
slot = targetSlot;
|
|
721
746
|
} else {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# BatchTxRequester Benchmarks
|
|
2
2
|
|
|
3
|
-
This benchmark suite measures **how quickly a proposer node can fetch missing transactions from P2P peers** when building a block proposal
|
|
3
|
+
This benchmark suite measures **how quickly a proposer node can fetch missing transactions from P2P peers** when building a block proposal under several controlled "who-has-which-txs" distributions.
|
|
4
4
|
|
|
5
5
|
## Purpose
|
|
6
6
|
|
|
@@ -10,12 +10,6 @@ This benchmark answers:
|
|
|
10
10
|
|
|
11
11
|
- How long does it take to fetch **N missing txs** (N ∈ **{10, 50, 100, 500}**)?
|
|
12
12
|
- How do different **peer availability patterns** affect performance?
|
|
13
|
-
- Which collector strategy performs better under each pattern?
|
|
14
|
-
|
|
15
|
-
The suite compares two collectors:
|
|
16
|
-
|
|
17
|
-
- **`BatchTxRequesterCollector`** (collector type: `batch-requester`)
|
|
18
|
-
- **`SendBatchRequestCollector`** (collector type: `send-batch-request`)
|
|
19
13
|
|
|
20
14
|
## Architecture
|
|
21
15
|
|
|
@@ -24,7 +18,7 @@ The benchmark runs a small simulated network on localhost:
|
|
|
24
18
|
```
|
|
25
19
|
┌─────────────────────────────────────────────────────────────────────┐
|
|
26
20
|
│ Test Process (Driver) │
|
|
27
|
-
│ p2p_client.
|
|
21
|
+
│ p2p_client.batch_tx_requester.bench.test.ts │
|
|
28
22
|
│ ┌─────────────────────────────────────────────────────────────┐ │
|
|
29
23
|
│ │ WorkerClientManager │ │
|
|
30
24
|
│ │ (src/testbench/worker_client_manager.ts) │ │
|
|
@@ -34,7 +28,7 @@ The benchmark runs a small simulated network on localhost:
|
|
|
34
28
|
│ ▼ ▼ ▼ │
|
|
35
29
|
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
|
|
36
30
|
│ │ Worker 0 │◄──────►│ Worker 1 │◄──────►│ Worker N-1│ │
|
|
37
|
-
│ │
|
|
31
|
+
│ │(Aggregator│ P2P │(Responder)│ P2P │(Responder)│ │
|
|
38
32
|
│ │ Node) │ │ │ │ │ │
|
|
39
33
|
│ │ TxPool:[] │ │ TxPool: │ │ TxPool: │ │
|
|
40
34
|
│ │ │ │ [txs...] │ │ [txs...] │ │
|
|
@@ -54,12 +48,12 @@ Using separate OS processes makes the setup closer to real networking behavior (
|
|
|
54
48
|
|
|
55
49
|
The network is intentionally asymmetric:
|
|
56
50
|
|
|
57
|
-
- **Worker 0 is the
|
|
51
|
+
- **Worker 0 is the aggregator/proposer node**
|
|
58
52
|
- Starts with an **empty tx pool** (`[]`)
|
|
59
|
-
- Is the only worker instructed to run
|
|
53
|
+
- Is the only worker instructed to run `BatchTxRequester` for each `BENCH_REQRESP` command
|
|
60
54
|
- **Workers 1..N-1 are responder peers**
|
|
61
55
|
- Locally generate and filter txs according to the distribution pattern
|
|
62
|
-
- Respond to req/resp queries made by Worker 0's
|
|
56
|
+
- Respond to req/resp queries made by Worker 0's `BatchTxRequester`
|
|
63
57
|
|
|
64
58
|
This models a proposer that has only `txHashes` in a proposal and must fetch the full tx bodies from the network.
|
|
65
59
|
|
|
@@ -72,7 +66,7 @@ Each benchmark case generates `missingTxCount` mock txs and assigns them to peer
|
|
|
72
66
|
**Every responder peer has every transaction.**
|
|
73
67
|
|
|
74
68
|
- Simulates the best-case: high replication / high gossip success
|
|
75
|
-
- Expectation:
|
|
69
|
+
- Expectation: the requester should quickly succeed; differences mostly reflect requester overhead and batching strategy
|
|
76
70
|
|
|
77
71
|
### `sparse`
|
|
78
72
|
|
|
@@ -81,7 +75,7 @@ Each benchmark case generates `missingTxCount` mock txs and assigns them to peer
|
|
|
81
75
|
Each responder is bucketed and holds txs whose index falls into its bucket or the "next" bucket (striped by tx index).
|
|
82
76
|
|
|
83
77
|
- Simulates partial propagation, churn, or uneven mempool convergence
|
|
84
|
-
- Expectation:
|
|
78
|
+
- Expectation: the requester must query multiple peers and cope with "misses"
|
|
85
79
|
|
|
86
80
|
### `pinned-only`
|
|
87
81
|
|
|
@@ -92,33 +86,13 @@ Each responder is bucketed and holds txs whose index falls into its bucket or th
|
|
|
92
86
|
|
|
93
87
|
> **Guardrail:** the pinned peer index must be within `(0, numberOfPeers)` (Worker 0 cannot be pinned).
|
|
94
88
|
|
|
95
|
-
## Collectors Under Test
|
|
96
|
-
|
|
97
|
-
### `BatchTxRequesterCollector` (`batch-requester`)
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
new BatchTxRequesterCollector(p2pService, logger, new DateProvider())
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Uses the P2P service plus internal logic to fetch missing txs, coordinating requests in a batched or staged way.
|
|
104
|
-
|
|
105
|
-
### `SendBatchRequestCollector` (`send-batch-request`)
|
|
106
|
-
|
|
107
|
-
```typescript
|
|
108
|
-
const maxPeers = 10;
|
|
109
|
-
const maxRetryAttempts = Math.max(peerIds.length, 3);
|
|
110
|
-
new SendBatchRequestCollector(p2pService, maxPeers, maxRetryAttempts)
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Explicitly caps the number of peers it will involve (`maxPeers`) and uses a retry budget derived from peer count.
|
|
114
|
-
|
|
115
89
|
## Test Parameters
|
|
116
90
|
|
|
117
91
|
| Parameter | Value | Description |
|
|
118
92
|
|-----------|-------|-------------|
|
|
119
93
|
| `PEERS_PER_RUN` | 30 | Number of worker processes spawned |
|
|
120
94
|
| `MISSING_TX_COUNTS` | 10, 50, 100, 500 | Number of missing transactions to fetch |
|
|
121
|
-
| `TIMEOUT_MS` | 30,000 ms |
|
|
95
|
+
| `TIMEOUT_MS` | 30,000 ms | Per-case timeout for the requester |
|
|
122
96
|
| `TEST_TIMEOUT_MS` | 600,000 ms | Overall Jest timeout (10 minutes) |
|
|
123
97
|
|
|
124
98
|
## Running
|
|
@@ -127,13 +101,13 @@ From the p2p package:
|
|
|
127
101
|
|
|
128
102
|
```bash
|
|
129
103
|
cd yarn-project/p2p
|
|
130
|
-
yarn test src/client/test/
|
|
104
|
+
yarn test src/client/test/p2p_client.batch_tx_requester.bench.test.ts
|
|
131
105
|
```
|
|
132
106
|
|
|
133
107
|
Or from repo root:
|
|
134
108
|
|
|
135
109
|
```bash
|
|
136
|
-
yarn test p2p_client.
|
|
110
|
+
yarn test p2p_client.batch_tx_requester.bench.test.ts
|
|
137
111
|
```
|
|
138
112
|
|
|
139
113
|
The benchmark is intentionally long due to spawning many processes and running multiple cases.
|
|
@@ -145,14 +119,12 @@ The benchmark is intentionally long due to spawning many processes and running m
|
|
|
145
119
|
If no env vars are set, the suite prints a table:
|
|
146
120
|
|
|
147
121
|
```
|
|
148
|
-
|
|
|
149
|
-
|
|
150
|
-
|
|
|
151
|
-
|
|
|
122
|
+
| Distribution | Missing | Duration (ms) | Fetched | Success |
|
|
123
|
+
|--------------|---------|---------------|---------|---------|
|
|
124
|
+
| pinned-only | 10 | 123 | 10 | Yes |
|
|
125
|
+
| pinned-only | 50 | 145 | 50 | Yes |
|
|
152
126
|
```
|
|
153
127
|
|
|
154
|
-
Plus a comparison summary stating which collector was faster per `(distribution, missing)` pair.
|
|
155
|
-
|
|
156
128
|
### JSON metrics (for CI/dashboards)
|
|
157
129
|
|
|
158
130
|
```bash
|
|
@@ -160,8 +132,8 @@ BENCH_OUTPUT=/path/results.json yarn test ...
|
|
|
160
132
|
```
|
|
161
133
|
|
|
162
134
|
Writes JSON metrics like:
|
|
163
|
-
- `
|
|
164
|
-
- `
|
|
135
|
+
- `BatchTxRequester/<distribution>/missing_<N>/duration` (ms)
|
|
136
|
+
- `BatchTxRequester/<distribution>/missing_<N>/fetched` (txs)
|
|
165
137
|
|
|
166
138
|
### Markdown file output
|
|
167
139
|
|
|
@@ -175,14 +147,14 @@ Writes the pretty table + summary to disk.
|
|
|
175
147
|
|
|
176
148
|
For each case the benchmark records:
|
|
177
149
|
|
|
178
|
-
- `durationMs`: wall-clock time spent inside the
|
|
179
|
-
- `fetchedCount`: how many txs were returned by the
|
|
150
|
+
- `durationMs`: wall-clock time spent inside the requester call
|
|
151
|
+
- `fetchedCount`: how many txs were returned by the requester
|
|
180
152
|
- `success`: `fetchedCount === missingTxCount`
|
|
181
153
|
|
|
182
154
|
**Guidelines:**
|
|
183
155
|
|
|
184
156
|
- **Always check `Success` first.** A faster run that fetched fewer txs is not a win.
|
|
185
|
-
- Compare
|
|
157
|
+
- Compare runs **within the same distribution + missing count** only.
|
|
186
158
|
- Expect `pinned-only` to highlight pinned-peer behavior (fast if pinned peer is used effectively; slow if the algorithm wastes time sampling other peers).
|
|
187
159
|
- Expect `sparse` to be the most "network-like" stress case, since many peers won't have each requested tx.
|
|
188
160
|
|
|
@@ -193,7 +165,7 @@ Inside each worker, the benchmark intentionally reduces variability:
|
|
|
193
165
|
- **Unlimited rate limits** are installed so the req/resp rate limiter doesn't dominate results
|
|
194
166
|
- **Deterministic tx generation** ensures all workers see the same tx set without large IPC payloads
|
|
195
167
|
|
|
196
|
-
This makes the benchmark better for
|
|
168
|
+
This makes the benchmark better for tracking regressions, but it is **not** a perfect model of production networking conditions.
|
|
197
169
|
|
|
198
170
|
## Limitations
|
|
199
171
|
|
|
@@ -207,9 +179,7 @@ This benchmark does **not** measure:
|
|
|
207
179
|
|
|
208
180
|
| File | Purpose |
|
|
209
181
|
|------|---------|
|
|
210
|
-
| `p2p_client.
|
|
211
|
-
| `proposal_tx_collector_worker.ts` | Collector-specific worker implementation |
|
|
212
|
-
| `proposal_tx_collector_worker_protocol.ts` | IPC message types and serialization |
|
|
182
|
+
| `p2p_client.batch_tx_requester.bench.test.ts` | Test suite (cases, distributions, output formatting) |
|
|
213
183
|
| `src/testbench/worker_client_manager.ts` | Worker process manager (forking, IPC, orchestration) |
|
|
214
184
|
| `src/testbench/p2p_client_testbench_worker.ts` | General testbench worker implementation |
|
|
215
185
|
| `src/test-helpers/testbench-utils.ts` | Shared mocks and utilities (InMemoryTxPool, InMemoryAttestationPool, etc.) |
|
package/src/config.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
getConfigFromMappings,
|
|
7
7
|
getDefaultConfig,
|
|
8
8
|
numberConfigHelper,
|
|
9
|
+
optionalNumberConfigHelper,
|
|
9
10
|
percentageConfigHelper,
|
|
10
11
|
pickConfigMappings,
|
|
11
12
|
secretStringConfigHelper,
|
|
@@ -46,6 +47,7 @@ export interface P2PConfig
|
|
|
46
47
|
| 'l1PublishingTime'
|
|
47
48
|
| 'maxTxsPerBlock'
|
|
48
49
|
| 'attestationPropagationTime'
|
|
50
|
+
| 'maxBlocksPerCheckpoint'
|
|
49
51
|
> {
|
|
50
52
|
/** Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set. */
|
|
51
53
|
validateMaxTxsPerBlock?: number;
|
|
@@ -116,6 +118,11 @@ export interface P2PConfig
|
|
|
116
118
|
/** If announceUdpAddress or announceTcpAddress are not provided, query for the IP address of the machine. Default is false. */
|
|
117
119
|
queryForIp: boolean;
|
|
118
120
|
|
|
121
|
+
/**
|
|
122
|
+
* HTTPS URLs that return plain-text public IPv4, tried in order when resolving the announce IP (e.g. when `queryForIp` is true and `p2pIp` is unset).
|
|
123
|
+
*/
|
|
124
|
+
publicIpServices: string[];
|
|
125
|
+
|
|
119
126
|
/** The interval of the gossipsub heartbeat to perform maintenance tasks. */
|
|
120
127
|
gossipsubInterval: number;
|
|
121
128
|
|
|
@@ -182,6 +189,9 @@ export interface P2PConfig
|
|
|
182
189
|
/** The node's seen message ID cache size */
|
|
183
190
|
seenMessageCacheSize: number;
|
|
184
191
|
|
|
192
|
+
/** Maximum number of (validator, tx) pairs to keep in the tx validation LRU cache. */
|
|
193
|
+
txValidationCacheSize: number;
|
|
194
|
+
|
|
185
195
|
/** True to disable the status handshake on peer connected. */
|
|
186
196
|
p2pDisableStatusHandshake?: boolean;
|
|
187
197
|
|
|
@@ -214,34 +224,69 @@ export interface P2PConfig
|
|
|
214
224
|
/** Minimum age (ms) a transaction must have been in the pool before it's eligible for block building. */
|
|
215
225
|
minTxPoolAgeMs: number;
|
|
216
226
|
|
|
227
|
+
/**
|
|
228
|
+
* Number of full L2 slots to wait after a checkpoint's slot before declaring its txs missing
|
|
229
|
+
* for data-withholding slashing.
|
|
230
|
+
*/
|
|
231
|
+
slashDataWithholdingToleranceSlots: number;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Number of L2 slots after a mined block's slot to keep collecting its missing txs. Clamped
|
|
235
|
+
* up so that collection always runs at least until the data-withholding slash verdict is
|
|
236
|
+
* rendered (`block.slot + slashDataWithholdingToleranceSlots + 1`). Defaults to undefined,
|
|
237
|
+
* in which case the tolerance window is used directly.
|
|
238
|
+
*/
|
|
239
|
+
p2pMissingTxCollectionDeadlineSlots?: number;
|
|
240
|
+
|
|
217
241
|
/** Minimum percentage fee increase required to replace an existing tx via RPC (0 = no bump). */
|
|
218
242
|
priceBumpPercentage: bigint;
|
|
243
|
+
|
|
244
|
+
/** Drop incoming block and checkpoint proposals at the libp2p dispatch layer (for testing only) */
|
|
245
|
+
skipIncomingProposals?: boolean;
|
|
246
|
+
|
|
247
|
+
/** Accept proposal gossip regardless of slot timing (for testing only). */
|
|
248
|
+
skipProposalSlotValidation?: boolean;
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Whether this node skips checkpoint proposal validation and always attests. When set, the checkpoint
|
|
252
|
+
* attestation is created and broadcast before the embedded last block is processed, so it is not delayed
|
|
253
|
+
* past the slot's attestation window by that block's re-execution. Mirrors the validator config flag.
|
|
254
|
+
*/
|
|
255
|
+
skipCheckpointProposalValidation?: boolean;
|
|
219
256
|
}
|
|
220
257
|
|
|
221
258
|
export const DEFAULT_P2P_PORT = 40400;
|
|
222
259
|
|
|
260
|
+
/** Default endpoints used to discover this machine's public IPv4 when `queryForIp` is enabled. */
|
|
261
|
+
export const DEFAULT_PUBLIC_IP_SERVICES: string[] = [
|
|
262
|
+
'https://api.ipify.org/',
|
|
263
|
+
'https://checkip.amazonaws.com/',
|
|
264
|
+
'https://ifconfig.me/ip',
|
|
265
|
+
'https://icanhazip.com/',
|
|
266
|
+
];
|
|
267
|
+
|
|
223
268
|
export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
224
269
|
validateMaxTxsPerBlock: {
|
|
225
270
|
env: 'VALIDATOR_MAX_TX_PER_BLOCK',
|
|
226
271
|
description:
|
|
227
272
|
'Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set.',
|
|
228
|
-
|
|
273
|
+
...optionalNumberConfigHelper(),
|
|
229
274
|
},
|
|
230
275
|
validateMaxTxsPerCheckpoint: {
|
|
231
276
|
env: 'VALIDATOR_MAX_TX_PER_CHECKPOINT',
|
|
232
277
|
description:
|
|
233
278
|
'Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set.',
|
|
234
|
-
|
|
279
|
+
...optionalNumberConfigHelper(),
|
|
235
280
|
},
|
|
236
281
|
validateMaxL2BlockGas: {
|
|
237
282
|
env: 'VALIDATOR_MAX_L2_BLOCK_GAS',
|
|
238
283
|
description: 'Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected.',
|
|
239
|
-
|
|
284
|
+
...optionalNumberConfigHelper(),
|
|
240
285
|
},
|
|
241
286
|
validateMaxDABlockGas: {
|
|
242
287
|
env: 'VALIDATOR_MAX_DA_BLOCK_GAS',
|
|
243
288
|
description: 'Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected.',
|
|
244
|
-
|
|
289
|
+
...optionalNumberConfigHelper(),
|
|
245
290
|
},
|
|
246
291
|
p2pEnabled: {
|
|
247
292
|
env: 'P2P_ENABLED',
|
|
@@ -338,6 +383,17 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
338
383
|
'If announceUdpAddress or announceTcpAddress are not provided, query for the IP address of the machine. Default is false.',
|
|
339
384
|
...booleanConfigHelper(),
|
|
340
385
|
},
|
|
386
|
+
publicIpServices: {
|
|
387
|
+
env: 'P2P_PUBLIC_IP_SERVICES',
|
|
388
|
+
parseEnv: (val: string) =>
|
|
389
|
+
val
|
|
390
|
+
.split(',')
|
|
391
|
+
.map(s => s.trim())
|
|
392
|
+
.filter(Boolean),
|
|
393
|
+
description:
|
|
394
|
+
'Comma-separated HTTPS URLs that return plain-text public IPv4. Used when P2P_QUERY_FOR_IP is true and P2P_IP is unset. Tried in order until one succeeds.',
|
|
395
|
+
defaultValue: DEFAULT_PUBLIC_IP_SERVICES,
|
|
396
|
+
},
|
|
341
397
|
gossipsubInterval: {
|
|
342
398
|
env: 'P2P_GOSSIPSUB_INTERVAL_MS',
|
|
343
399
|
description: 'The interval of the gossipsub heartbeat to perform maintenance tasks.',
|
|
@@ -443,7 +499,7 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
443
499
|
},
|
|
444
500
|
p2pStoreMapSizeKb: {
|
|
445
501
|
env: 'P2P_STORE_MAP_SIZE_KB',
|
|
446
|
-
|
|
502
|
+
...optionalNumberConfigHelper(),
|
|
447
503
|
description: 'The maximum possible size of the P2P DB in KB. Overwrites the general dataStoreMapSizeKb.',
|
|
448
504
|
},
|
|
449
505
|
txPublicSetupAllowListExtend: {
|
|
@@ -466,6 +522,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
466
522
|
description: 'The number of messages to keep in the seen message cache',
|
|
467
523
|
...numberConfigHelper(100_000), // 100K
|
|
468
524
|
},
|
|
525
|
+
txValidationCacheSize: {
|
|
526
|
+
env: 'P2P_TX_VALIDATION_CACHE_SIZE',
|
|
527
|
+
description: 'Maximum number of items to keep in the tx validation LRU cache.',
|
|
528
|
+
...numberConfigHelper(5_000),
|
|
529
|
+
},
|
|
469
530
|
p2pDisableStatusHandshake: {
|
|
470
531
|
env: 'P2P_DISABLE_STATUS_HANDSHAKE',
|
|
471
532
|
description: 'True to disable the status handshake on peer connected.',
|
|
@@ -505,7 +566,7 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
505
566
|
l1PublishingTime: {
|
|
506
567
|
env: 'SEQ_L1_PUBLISHING_TIME_ALLOWANCE_IN_SLOT',
|
|
507
568
|
description: 'How much time (in seconds) we allow in the slot for publishing the L1 tx (defaults to 1 L1 slot).',
|
|
508
|
-
|
|
569
|
+
...optionalNumberConfigHelper(),
|
|
509
570
|
},
|
|
510
571
|
fishermanMode: {
|
|
511
572
|
env: 'FISHERMAN_MODE',
|
|
@@ -518,11 +579,36 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
518
579
|
'Broadcast block proposals even when a conflicting proposal for the same slot already exists in the pool (for testing purposes only).',
|
|
519
580
|
...booleanConfigHelper(false),
|
|
520
581
|
},
|
|
582
|
+
skipIncomingProposals: {
|
|
583
|
+
description: 'Drop incoming block and checkpoint proposals at the libp2p dispatch layer (for testing only)',
|
|
584
|
+
...booleanConfigHelper(false),
|
|
585
|
+
},
|
|
586
|
+
skipProposalSlotValidation: {
|
|
587
|
+
description: 'Accept proposal gossip regardless of slot timing (for testing only)',
|
|
588
|
+
...booleanConfigHelper(false),
|
|
589
|
+
},
|
|
590
|
+
skipCheckpointProposalValidation: {
|
|
591
|
+
description:
|
|
592
|
+
'Skip checkpoint proposal validation and always attest, broadcasting the attestation before processing the embedded last block',
|
|
593
|
+
...booleanConfigHelper(false),
|
|
594
|
+
},
|
|
521
595
|
minTxPoolAgeMs: {
|
|
522
596
|
env: 'P2P_MIN_TX_POOL_AGE_MS',
|
|
523
597
|
description: 'Minimum age (ms) a transaction must have been in the pool before it is eligible for block building.',
|
|
524
598
|
...numberConfigHelper(2_000),
|
|
525
599
|
},
|
|
600
|
+
slashDataWithholdingToleranceSlots: {
|
|
601
|
+
env: 'SLASH_DATA_WITHHOLDING_TOLERANCE_SLOTS',
|
|
602
|
+
description:
|
|
603
|
+
'L2 slots to wait after a checkpoint slot before declaring its txs missing. Drives both the data-withholding slasher check and the missing-tx collection deadline.',
|
|
604
|
+
...numberConfigHelper(3),
|
|
605
|
+
},
|
|
606
|
+
p2pMissingTxCollectionDeadlineSlots: {
|
|
607
|
+
env: 'P2P_MISSING_TX_COLLECTION_DEADLINE_SLOTS',
|
|
608
|
+
description:
|
|
609
|
+
'Optional deadline (in L2 slots after the block slot) for collecting missing txs for unproven mined blocks. Clamped up to the data-withholding tolerance window so collection never gives up before the slash verdict.',
|
|
610
|
+
...optionalNumberConfigHelper(),
|
|
611
|
+
},
|
|
526
612
|
priceBumpPercentage: {
|
|
527
613
|
env: 'P2P_RPC_PRICE_BUMP_PERCENTAGE',
|
|
528
614
|
description:
|
|
@@ -562,6 +648,7 @@ export type BootnodeConfig = Pick<
|
|
|
562
648
|
| 'bootstrapNodes'
|
|
563
649
|
| 'listenAddress'
|
|
564
650
|
| 'queryForIp'
|
|
651
|
+
| 'publicIpServices'
|
|
565
652
|
> &
|
|
566
653
|
Required<Pick<P2PConfig, 'p2pIp' | 'p2pPort'>> &
|
|
567
654
|
Pick<DataStoreConfig, 'dataDirectory' | 'dataStoreMapSizeKb'> &
|
|
@@ -579,6 +666,7 @@ const bootnodeConfigKeys: (keyof BootnodeConfig)[] = [
|
|
|
579
666
|
'bootstrapNodes',
|
|
580
667
|
'l1ChainId',
|
|
581
668
|
'queryForIp',
|
|
669
|
+
'publicIpServices',
|
|
582
670
|
];
|
|
583
671
|
|
|
584
672
|
export const bootnodeConfigMappings = pickConfigMappings(
|
|
@@ -8,28 +8,3 @@ export class IndividualReqRespTimeoutError extends Error {
|
|
|
8
8
|
super(`Request to peer timed out`);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
-
|
|
12
|
-
/** Collective request timeout error
|
|
13
|
-
*
|
|
14
|
-
* This error will be thrown when a req resp request times out regardless of the peer.
|
|
15
|
-
* @category Errors
|
|
16
|
-
*/
|
|
17
|
-
export class CollectiveReqRespTimeoutError extends Error {
|
|
18
|
-
constructor() {
|
|
19
|
-
super(`Request to all peers timed out`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** Invalid response error
|
|
24
|
-
*
|
|
25
|
-
* This error will be thrown when a response is received that is not valid.
|
|
26
|
-
*
|
|
27
|
-
* This error does not need to be punished as message validators will handle punishing invalid
|
|
28
|
-
* requests
|
|
29
|
-
* @category Errors
|
|
30
|
-
*/
|
|
31
|
-
export class InvalidResponseError extends Error {
|
|
32
|
-
constructor() {
|
|
33
|
-
super(`Invalid response received`);
|
|
34
|
-
}
|
|
35
|
-
}
|