@aztec/p2p 0.0.1-commit.ef17749e1 → 0.0.1-commit.f1b29a41e
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/README.md +129 -3
- package/dest/client/factory.d.ts +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +23 -10
- package/dest/client/interface.d.ts +9 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +3 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +37 -12
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
- package/dest/config.d.ts +13 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +20 -0
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -4
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -5
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +2 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +7 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +9 -2
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +12 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +4 -2
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +3 -0
- 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 +19 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +5 -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 +4 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +5 -5
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +23 -4
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +36 -10
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +13 -4
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +39 -9
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +21 -1
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +28 -1
- package/dest/services/dummy_service.d.ts +5 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +5 -1
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/libp2p/libp2p_service.d.ts +14 -11
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +136 -65
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +22 -8
- package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +28 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +11 -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 +69 -65
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +3 -2
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +5 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +13 -7
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +3 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/reqresp.d.ts +1 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +17 -9
- package/dest/services/service.d.ts +5 -2
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +57 -73
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/slow_tx_collection.js +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +3 -6
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/test-helpers/testbench-utils.d.ts +1 -1
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +22 -3
- package/dest/testbench/p2p_client_testbench_worker.js +44 -15
- package/dest/testbench/worker_client_manager.d.ts +1 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +0 -1
- package/package.json +14 -14
- package/src/client/factory.ts +41 -13
- package/src/client/interface.ts +9 -1
- package/src/client/p2p_client.ts +39 -14
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +18 -8
- package/src/config.ts +33 -0
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -5
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -1
- package/src/mem_pools/tx_pool_v2/interfaces.ts +6 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +18 -2
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +13 -1
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +20 -5
- package/src/msg_validators/attestation_validator/README.md +49 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +5 -4
- package/src/msg_validators/clock_tolerance.ts +4 -3
- package/src/msg_validators/proposal_validator/README.md +123 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +6 -5
- package/src/msg_validators/tx_validator/README.md +5 -1
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +43 -3
- package/src/msg_validators/tx_validator/gas_validator.ts +41 -8
- package/src/msg_validators/tx_validator/phases_validator.ts +31 -1
- package/src/services/dummy_service.ts +7 -2
- package/src/services/encoding.ts +9 -1
- package/src/services/libp2p/libp2p_service.ts +137 -79
- package/src/services/peer-manager/peer_manager.ts +26 -8
- package/src/services/peer-manager/peer_scoring.ts +21 -5
- package/src/services/reqresp/README.md +229 -0
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +64 -69
- package/src/services/reqresp/batch-tx-requester/interface.ts +2 -1
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +13 -6
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +5 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/reqresp.ts +19 -11
- package/src/services/service.ts +6 -1
- package/src/services/tx_collection/fast_tx_collection.ts +57 -83
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +1 -1
- package/src/services/tx_collection/tx_collection.ts +3 -5
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/testbench-utils.ts +29 -3
- package/src/testbench/p2p_client_testbench_worker.ts +43 -14
- package/src/testbench/worker_client_manager.ts +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -122
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -400
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -162
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -319
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
|
@@ -230,7 +230,7 @@ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.j
|
|
|
230
230
|
/**
|
|
231
231
|
* Creates a mock EpochCache for testing.
|
|
232
232
|
*/ export function createMockEpochCache() {
|
|
233
|
-
|
|
233
|
+
const cache = {
|
|
234
234
|
getCommittee: ()=>Promise.resolve({
|
|
235
235
|
committee: [],
|
|
236
236
|
seed: 1n,
|
|
@@ -238,27 +238,44 @@ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.j
|
|
|
238
238
|
isEscapeHatchOpen: false
|
|
239
239
|
}),
|
|
240
240
|
getProposerIndexEncoding: ()=>'0x',
|
|
241
|
+
getSlotNow: ()=>SlotNumber.ZERO,
|
|
242
|
+
getTargetSlot: ()=>SlotNumber.ZERO,
|
|
243
|
+
getEpochNow: ()=>EpochNumber.ZERO,
|
|
244
|
+
getTargetEpoch: ()=>EpochNumber.ZERO,
|
|
241
245
|
getEpochAndSlotNow: ()=>({
|
|
242
246
|
epoch: EpochNumber.ZERO,
|
|
243
247
|
slot: SlotNumber.ZERO,
|
|
244
248
|
ts: 0n,
|
|
245
249
|
nowMs: 0n
|
|
246
250
|
}),
|
|
251
|
+
isProposerPipeliningEnabled: ()=>false,
|
|
247
252
|
computeProposerIndex: ()=>0n,
|
|
248
253
|
getCurrentAndNextSlot: ()=>({
|
|
249
254
|
currentSlot: SlotNumber.ZERO,
|
|
250
255
|
nextSlot: SlotNumber.ZERO
|
|
251
256
|
}),
|
|
257
|
+
getTargetAndNextSlot: ()=>({
|
|
258
|
+
targetSlot: SlotNumber.ZERO,
|
|
259
|
+
nextSlot: SlotNumber.ZERO
|
|
260
|
+
}),
|
|
252
261
|
getProposerAttesterAddressInSlot: ()=>Promise.resolve(undefined),
|
|
253
262
|
getEpochAndSlotInNextL1Slot: ()=>({
|
|
254
263
|
epoch: EpochNumber.ZERO,
|
|
255
264
|
slot: SlotNumber.ZERO,
|
|
256
265
|
ts: 0n,
|
|
257
|
-
|
|
266
|
+
nowSeconds: 0n
|
|
267
|
+
}),
|
|
268
|
+
getTargetEpochAndSlotInNextL1Slot: ()=>({
|
|
269
|
+
epoch: EpochNumber.ZERO,
|
|
270
|
+
slot: SlotNumber.ZERO,
|
|
271
|
+
ts: 0n,
|
|
272
|
+
nowSeconds: 0n
|
|
258
273
|
}),
|
|
259
274
|
isInCommittee: ()=>Promise.resolve(false),
|
|
260
275
|
getRegisteredValidators: ()=>Promise.resolve([]),
|
|
261
276
|
filterInCommittee: ()=>Promise.resolve([]),
|
|
277
|
+
isEscapeHatchOpen: ()=>Promise.resolve(false),
|
|
278
|
+
isEscapeHatchOpenAtSlot: ()=>Promise.resolve(false),
|
|
262
279
|
getL1Constants: ()=>({
|
|
263
280
|
l1StartBlock: 0n,
|
|
264
281
|
l1GenesisTime: 0n,
|
|
@@ -266,9 +283,11 @@ import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.j
|
|
|
266
283
|
slotDuration: 1,
|
|
267
284
|
ethereumSlotDuration: 1,
|
|
268
285
|
proofSubmissionEpochs: 1,
|
|
269
|
-
targetCommitteeSize: 48
|
|
286
|
+
targetCommitteeSize: 48,
|
|
287
|
+
rollupManaLimit: Number.MAX_SAFE_INTEGER
|
|
270
288
|
})
|
|
271
289
|
};
|
|
290
|
+
return cache;
|
|
272
291
|
}
|
|
273
292
|
/**
|
|
274
293
|
* Creates a mock WorldStateSynchronizer for testing.
|
|
@@ -23,7 +23,7 @@ import { peerIdFromString } from '@libp2p/peer-id';
|
|
|
23
23
|
import { createP2PClient } from '../index.js';
|
|
24
24
|
import { BatchTxRequesterCollector, LibP2PService, SendBatchRequestCollector } from '../services/index.js';
|
|
25
25
|
import { RateLimitStatus } from '../services/reqresp/rate-limiter/rate_limiter.js';
|
|
26
|
-
import {
|
|
26
|
+
import { RequestTracker } from '../services/tx_collection/request_tracker.js';
|
|
27
27
|
import { AlwaysTrueCircuitVerifier } from '../test-helpers/index.js';
|
|
28
28
|
import { BENCHMARK_CONSTANTS, InMemoryAttestationPool, InMemoryTxPool, UNLIMITED_RATE_LIMIT_QUOTA, createMockEpochCache, createMockWorldStateSynchronizer, filterTxsByDistribution } from '../test-helpers/index.js';
|
|
29
29
|
export { COLLECTOR_DISPLAY_NAMES } from '../test-helpers/testbench-utils.js';
|
|
@@ -154,7 +154,7 @@ async function runAggregatorBenchmark(client, blockProposal, collectorType, time
|
|
|
154
154
|
timer = new Timer();
|
|
155
155
|
if (collectorType === 'batch-requester') {
|
|
156
156
|
const collector = new BatchTxRequesterCollector(batchTxRequesterService, logger, new DateProvider(), noopTxValidator);
|
|
157
|
-
const fetchedTxs = await collector.collectTxs(
|
|
157
|
+
const fetchedTxs = await collector.collectTxs(RequestTracker.create(txHashes, new Date(Date.now() + timeoutMs)), blockProposal, pinnedPeer);
|
|
158
158
|
const durationMs = timer.ms();
|
|
159
159
|
return {
|
|
160
160
|
type: 'BENCH_RESULT',
|
|
@@ -164,7 +164,7 @@ async function runAggregatorBenchmark(client, blockProposal, collectorType, time
|
|
|
164
164
|
};
|
|
165
165
|
}
|
|
166
166
|
const collector = new SendBatchRequestCollector(batchTxRequesterService, BENCHMARK_CONSTANTS.FIXED_MAX_PEERS, BENCHMARK_CONSTANTS.FIXED_MAX_RETRY_ATTEMPTS);
|
|
167
|
-
const fetchedTxs = await collector.collectTxs(
|
|
167
|
+
const fetchedTxs = await collector.collectTxs(RequestTracker.create(txHashes, new Date(Date.now() + timeoutMs)), blockProposal, pinnedPeer);
|
|
168
168
|
const durationMs = timer.ms();
|
|
169
169
|
return {
|
|
170
170
|
type: 'BENCH_RESULT',
|
|
@@ -188,6 +188,35 @@ let workerAttestationPool = null;
|
|
|
188
188
|
let workerConfig = null;
|
|
189
189
|
let workerLogger = null;
|
|
190
190
|
let kvStore = null;
|
|
191
|
+
async function stopWorker() {
|
|
192
|
+
try {
|
|
193
|
+
if (workerClient) {
|
|
194
|
+
await workerClient.stop();
|
|
195
|
+
workerClient = null;
|
|
196
|
+
}
|
|
197
|
+
} catch (e) {
|
|
198
|
+
workerLogger?.error('Error stopping worker client', e);
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
if (kvStore?.close) {
|
|
202
|
+
await kvStore.close();
|
|
203
|
+
kvStore = null;
|
|
204
|
+
}
|
|
205
|
+
} catch (e) {
|
|
206
|
+
workerLogger?.error('Error closing kv store', e);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function gracefulExit(code = 0) {
|
|
210
|
+
try {
|
|
211
|
+
if (process.connected) {
|
|
212
|
+
process.disconnect();
|
|
213
|
+
}
|
|
214
|
+
} catch {
|
|
215
|
+
// IPC channel already closed
|
|
216
|
+
}
|
|
217
|
+
// Safety fallback if lingering handles prevent the event loop from draining
|
|
218
|
+
setTimeout(()=>process.exit(code), 5000).unref();
|
|
219
|
+
}
|
|
191
220
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
192
221
|
process.on('message', async (msg)=>{
|
|
193
222
|
const { type, config: rawConfig, clientIndex } = msg;
|
|
@@ -238,13 +267,8 @@ process.on('message', async (msg)=>{
|
|
|
238
267
|
const cmd = msg;
|
|
239
268
|
switch(cmd.type){
|
|
240
269
|
case 'STOP':
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
244
|
-
if (kvStore?.close) {
|
|
245
|
-
await kvStore.close();
|
|
246
|
-
}
|
|
247
|
-
process.exit(0);
|
|
270
|
+
await stopWorker();
|
|
271
|
+
gracefulExit(0);
|
|
248
272
|
break;
|
|
249
273
|
case 'SEND_TX':
|
|
250
274
|
if (workerClient) {
|
|
@@ -293,10 +317,15 @@ process.on('message', async (msg)=>{
|
|
|
293
317
|
}
|
|
294
318
|
}
|
|
295
319
|
} catch (err) {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
320
|
+
try {
|
|
321
|
+
process.send({
|
|
322
|
+
type: 'ERROR',
|
|
323
|
+
error: err.message
|
|
324
|
+
});
|
|
325
|
+
} catch {
|
|
326
|
+
// IPC channel may be closed
|
|
327
|
+
}
|
|
328
|
+
await stopWorker();
|
|
329
|
+
gracefulExit(1);
|
|
301
330
|
}
|
|
302
331
|
});
|
|
@@ -95,4 +95,4 @@ declare class WorkerClientManager {
|
|
|
95
95
|
export { WorkerClientManager, testChainConfig };
|
|
96
96
|
export type { DistributionPattern, CollectorType } from './p2p_client_testbench_worker.js';
|
|
97
97
|
export { COLLECTOR_DISPLAY_NAMES } from './p2p_client_testbench_worker.js';
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyX2NsaWVudF9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGJlbmNoL3dvcmtlcl9jbGllbnRfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsS0FBSyxZQUFZLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFLeEQsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUtuRSxPQUFPLEtBQUssRUFHVixhQUFhLEVBQ2IsbUJBQW1CLEVBQ3BCLE1BQU0sa0NBQWtDLENBQUM7QUFRMUMsUUFBQSxNQUFNLGVBQWUsRUFBRSxXQU10QixDQUFDO0FBRUYsTUFBTSxXQUFXLHNCQUFzQjtJQUNyQyxPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFlBQVksRUFBRSxtQkFBbUIsQ0FBQztJQUNsQyxhQUFhLEVBQUUsYUFBYSxDQUFDO0lBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3pCLFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDZjtBQUVELE1BQU0sV0FBVyxzQkFBc0I7SUFDckMsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixZQUFZLEVBQUUsbUJBQW1CLENBQUM7SUFDbEMsU0FBUyxFQUFFLGFBQWEsQ0FBQztJQUN6QixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUNqQixLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7Q0FDaEI7QUFFRCxjQUFNLG1CQUFtQjtJQUNoQixTQUFTLEVBQUUsWUFBWSxFQUFFLENBQU07SUFDL0IsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDakMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFNO0lBQ3hCLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBTTtJQUNyQixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQU07SUFDOUIsT0FBTyxDQUFDLFNBQVMsQ0FBcUI7SUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBUztJQUN2QixPQUFPLENBQUMsdUJBQXVCLENBQWdCO0lBRS9DLFlBQVksTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUd4RDtJQUVELE9BQU8sU0FJTjtJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBb0IxQjs7O09BR0c7SUFDSCxPQUFPLENBQUMsa0JBQWtCO0lBa0cxQjs7Ozs7OztPQU9HO0lBQ0csaUJBQWlCLENBQ3JCLGVBQWUsRUFBRSxNQUFNLEVBQ3ZCLE9BQU8sR0FBRTtRQUNQLGFBQWEsQ0FBQyxFQUFFLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakMsYUFBYSxDQUFDLEVBQUUsTUFBTSxDQUFDO1FBQ3ZCLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUNuQixZQUFZLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDbEIscUJBK0RQO0lBRUQsNEJBQTRCLFNBRTNCO0lBRUQsa0NBQWtDLFdBRWpDO0lBRUQ7Ozs7O09BS0c7SUFDRyxVQUFVLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkE4Q3BEO0lBRUQ7O09BRUc7SUFDSCxPQUFPLENBQUMsZ0JBQWdCO0lBcUN4Qjs7T0FFRztJQUNHLE9BQU8sa0JBZ0NaO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0csbUJBQW1CLENBQUMsTUFBTSxFQUFFLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQXVFekY7SUFFRCxPQUFPLENBQUMsaUJBQWlCO0lBa0N6QixPQUFPLENBQUMsa0JBQWtCO0NBaUMzQjtBQUVELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztBQUNoRCxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAKxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAKnE,OAAO,KAAK,EAGV,aAAa,EACb,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAQ1C,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,
|
|
1
|
+
{"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAKxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAKnE,OAAO,KAAK,EAGV,aAAa,EACb,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAQ1C,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,OAAO,EAAE,MAAM,EAAE,CAAM;IAC9B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;IAE/C,YAAY,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,EAGxD;IAED,OAAO,SAIN;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;;;;;;OAOG;IACG,iBAAiB,CACrB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;KAClB,qBA+DP;IAED,4BAA4B,SAE3B;IAED,kCAAkC,WAEjC;IAED;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBA8CpD;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAqCxB;;OAEG;IACG,OAAO,kBAgCZ;IAED;;;;;;;;;OASG;IACG,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAuEzF;IAED,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,kBAAkB;CAiC3B;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.f1b29a41e",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -67,17 +67,17 @@
|
|
|
67
67
|
]
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@aztec/constants": "0.0.1-commit.
|
|
71
|
-
"@aztec/epoch-cache": "0.0.1-commit.
|
|
72
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
73
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
74
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
75
|
-
"@aztec/noir-contracts.js": "0.0.1-commit.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
77
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
78
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
79
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
80
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
70
|
+
"@aztec/constants": "0.0.1-commit.f1b29a41e",
|
|
71
|
+
"@aztec/epoch-cache": "0.0.1-commit.f1b29a41e",
|
|
72
|
+
"@aztec/ethereum": "0.0.1-commit.f1b29a41e",
|
|
73
|
+
"@aztec/foundation": "0.0.1-commit.f1b29a41e",
|
|
74
|
+
"@aztec/kv-store": "0.0.1-commit.f1b29a41e",
|
|
75
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.f1b29a41e",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.f1b29a41e",
|
|
77
|
+
"@aztec/protocol-contracts": "0.0.1-commit.f1b29a41e",
|
|
78
|
+
"@aztec/simulator": "0.0.1-commit.f1b29a41e",
|
|
79
|
+
"@aztec/stdlib": "0.0.1-commit.f1b29a41e",
|
|
80
|
+
"@aztec/telemetry-client": "0.0.1-commit.f1b29a41e",
|
|
81
81
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
82
82
|
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
83
83
|
"@chainsafe/libp2p-yamux": "^6.0.2",
|
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
"xxhash-wasm": "^1.1.0"
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
|
-
"@aztec/archiver": "0.0.1-commit.
|
|
108
|
-
"@aztec/world-state": "0.0.1-commit.
|
|
107
|
+
"@aztec/archiver": "0.0.1-commit.f1b29a41e",
|
|
108
|
+
"@aztec/world-state": "0.0.1-commit.f1b29a41e",
|
|
109
109
|
"@jest/globals": "^30.0.0",
|
|
110
110
|
"@types/jest": "^30.0.0",
|
|
111
111
|
"@types/node": "^22.15.17",
|
package/src/client/factory.ts
CHANGED
|
@@ -17,7 +17,12 @@ import { AttestationPool, type AttestationPoolApi } from '../mem_pools/attestati
|
|
|
17
17
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
18
18
|
import type { TxPoolV2 } from '../mem_pools/tx_pool_v2/interfaces.js';
|
|
19
19
|
import { AztecKVTxPoolV2 } from '../mem_pools/tx_pool_v2/tx_pool_v2.js';
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
createCheckAllowedSetupCalls,
|
|
22
|
+
createTxValidatorForReqResponseReceivedTxs,
|
|
23
|
+
createTxValidatorForTransactionsEnteringPendingTxPool,
|
|
24
|
+
getDefaultAllowedSetupFunctions,
|
|
25
|
+
} from '../msg_validators/index.js';
|
|
21
26
|
import { DummyP2PService } from '../services/dummy_service.js';
|
|
22
27
|
import { LibP2PService } from '../services/index.js';
|
|
23
28
|
import { createFileStoreTxSources } from '../services/tx_collection/file_store_tx_source.js';
|
|
@@ -75,6 +80,33 @@ export async function createP2PClient(
|
|
|
75
80
|
const rollupAddress = inputConfig.l1Contracts.rollupAddress.toString().toLowerCase().replace(/^0x/, '');
|
|
76
81
|
const txFileStoreBasePath = `aztec-${inputConfig.l1ChainId}-${inputConfig.rollupVersion}-0x${rollupAddress}`;
|
|
77
82
|
|
|
83
|
+
const allowedInSetup = [
|
|
84
|
+
...(await getDefaultAllowedSetupFunctions()),
|
|
85
|
+
...(inputConfig.txPublicSetupAllowListExtend ?? []),
|
|
86
|
+
];
|
|
87
|
+
const checkAllowedSetupCalls = createCheckAllowedSetupCalls(
|
|
88
|
+
archiver,
|
|
89
|
+
allowedInSetup,
|
|
90
|
+
() => epochCache.getEpochAndSlotInNextL1Slot().ts,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
const createTxValidator = async () => {
|
|
94
|
+
// We accept transactions if they are not expired by the next slot and block number (checked based on the ExpirationTimestamp field)
|
|
95
|
+
const currentBlockNumber = await archiver.getBlockNumber();
|
|
96
|
+
const { ts: nextSlotTimestamp } = epochCache.getEpochAndSlotInNextL1Slot();
|
|
97
|
+
const l1Constants = await archiver.getL1Constants();
|
|
98
|
+
return createTxValidatorForTransactionsEnteringPendingTxPool(
|
|
99
|
+
worldStateSynchronizer,
|
|
100
|
+
nextSlotTimestamp,
|
|
101
|
+
BlockNumber(currentBlockNumber + 1),
|
|
102
|
+
{
|
|
103
|
+
rollupManaLimit: l1Constants.rollupManaLimit,
|
|
104
|
+
maxBlockL2Gas: config.validateMaxL2BlockGas,
|
|
105
|
+
maxBlockDAGas: config.validateMaxDABlockGas,
|
|
106
|
+
},
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
|
|
78
110
|
const txPool =
|
|
79
111
|
deps.txPool ??
|
|
80
112
|
new AztecKVTxPoolV2(
|
|
@@ -83,16 +115,8 @@ export async function createP2PClient(
|
|
|
83
115
|
{
|
|
84
116
|
l2BlockSource: archiver,
|
|
85
117
|
worldStateSynchronizer,
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const currentBlockNumber = await archiver.getBlockNumber();
|
|
89
|
-
const { ts: nextSlotTimestamp } = epochCache.getEpochAndSlotInNextL1Slot();
|
|
90
|
-
return createTxValidatorForTransactionsEnteringPendingTxPool(
|
|
91
|
-
worldStateSynchronizer,
|
|
92
|
-
nextSlotTimestamp,
|
|
93
|
-
BlockNumber(currentBlockNumber + 1),
|
|
94
|
-
);
|
|
95
|
-
},
|
|
118
|
+
checkAllowedSetupCalls,
|
|
119
|
+
createTxValidator,
|
|
96
120
|
},
|
|
97
121
|
telemetry,
|
|
98
122
|
{
|
|
@@ -125,9 +149,12 @@ export async function createP2PClient(
|
|
|
125
149
|
telemetry,
|
|
126
150
|
);
|
|
127
151
|
|
|
152
|
+
const txValidatorForTxCollection = createTxValidatorForReqResponseReceivedTxs(proofVerifier, config);
|
|
128
153
|
const nodeSources = [
|
|
129
|
-
...createNodeRpcTxSources(config.txCollectionNodeRpcUrls, config),
|
|
130
|
-
...(deps.rpcTxProviders ?? []).map(
|
|
154
|
+
...createNodeRpcTxSources(config.txCollectionNodeRpcUrls, txValidatorForTxCollection, config),
|
|
155
|
+
...(deps.rpcTxProviders ?? []).map(
|
|
156
|
+
(node, i) => new NodeRpcTxSource(node, txValidatorForTxCollection, `node-rpc-provider-${i}`),
|
|
157
|
+
),
|
|
131
158
|
...(deps.txCollectionNodeSources ?? []),
|
|
132
159
|
];
|
|
133
160
|
if (nodeSources.length > 0) {
|
|
@@ -139,6 +166,7 @@ export async function createP2PClient(
|
|
|
139
166
|
const fileStoreSources = await createFileStoreTxSources(
|
|
140
167
|
config.txCollectionFileStoreUrls,
|
|
141
168
|
txFileStoreBasePath,
|
|
169
|
+
txValidatorForTxCollection,
|
|
142
170
|
logger.createChild('file-store-tx-source'),
|
|
143
171
|
telemetry,
|
|
144
172
|
);
|
package/src/client/interface.ts
CHANGED
|
@@ -82,7 +82,15 @@ export type P2P = P2PClient & {
|
|
|
82
82
|
*
|
|
83
83
|
* @param handler - A function taking a received checkpoint proposal and producing attestations
|
|
84
84
|
*/
|
|
85
|
-
|
|
85
|
+
registerValidatorCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Registers a callback that runs for ALL nodes (not just validators) when a checkpoint proposal is received.
|
|
89
|
+
* Used to set the proposed checkpoint number on the archiver so the sequencer can build on top of it.
|
|
90
|
+
*
|
|
91
|
+
* @param handler - A function taking a received checkpoint proposal
|
|
92
|
+
*/
|
|
93
|
+
registerAllNodesCheckpointProposalHandler(callback: P2PCheckpointReceivedCallback): void;
|
|
86
94
|
|
|
87
95
|
/**
|
|
88
96
|
* Registers a callback invoked when a duplicate proposal is detected (equivocation).
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -357,6 +357,8 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
357
357
|
// Store our own last-block proposal so we can respond to req/resp requests for it.
|
|
358
358
|
await this.attestationPool.tryAddBlockProposal(blockProposal);
|
|
359
359
|
}
|
|
360
|
+
// Gossipsub doesn't deliver own messages, so fire the all-nodes handler locally
|
|
361
|
+
await this.p2pService.notifyOwnCheckpointProposal(proposal.toCore());
|
|
360
362
|
return this.p2pService.propagate(proposal);
|
|
361
363
|
}
|
|
362
364
|
|
|
@@ -388,8 +390,12 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
388
390
|
this.p2pService.registerBlockReceivedCallback(handler);
|
|
389
391
|
}
|
|
390
392
|
|
|
391
|
-
public
|
|
392
|
-
this.p2pService.
|
|
393
|
+
public registerValidatorCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
394
|
+
this.p2pService.registerValidatorCheckpointReceivedCallback(handler);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
public registerAllNodesCheckpointProposalHandler(handler: P2PCheckpointReceivedCallback): void {
|
|
398
|
+
this.p2pService.registerAllNodesCheckpointReceivedCallback(handler);
|
|
393
399
|
}
|
|
394
400
|
|
|
395
401
|
public registerDuplicateProposalCallback(callback: (info: DuplicateProposalInfo) => void): void {
|
|
@@ -669,31 +675,50 @@ export class P2PClient extends WithTracer implements P2P {
|
|
|
669
675
|
}
|
|
670
676
|
|
|
671
677
|
/**
|
|
672
|
-
* Returns true if the prune
|
|
673
|
-
* If the
|
|
674
|
-
* If they differ, the prune spans across checkpoints (epoch prune).
|
|
678
|
+
* Returns true if the prune is an epoch prune (new checkpoint number is less than old).
|
|
679
|
+
* If the checkpoint number stays the same or increases, the prune is within a checkpoint.
|
|
675
680
|
*/
|
|
676
681
|
private async isEpochPrune(newCheckpoint: CheckpointId): Promise<boolean> {
|
|
677
682
|
const tips = await this.l2Tips.getL2Tips();
|
|
678
683
|
const oldCheckpointNumber = tips.checkpointed.checkpoint.number;
|
|
679
|
-
if (oldCheckpointNumber <= CheckpointNumber.
|
|
684
|
+
if (oldCheckpointNumber <= CheckpointNumber.INITIAL) {
|
|
680
685
|
return false;
|
|
681
686
|
}
|
|
682
|
-
const
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
687
|
+
const newCheckpointNumber = newCheckpoint.number;
|
|
688
|
+
// We check that the new checkpoint number is less than the old checkpoint number in order to consider it an epoch prune.
|
|
689
|
+
// To be more certain that it is an epoch prune, we will check that at least 2 checkpoints were removed.
|
|
690
|
+
// This means we should avoid thinking checkpoints removed by L1 re-orgs are epoch prunes
|
|
691
|
+
const thresholdForEpochPrune = CheckpointNumber(oldCheckpointNumber - 2);
|
|
692
|
+
const isEpochPrune = newCheckpointNumber <= thresholdForEpochPrune;
|
|
693
|
+
if (isEpochPrune) {
|
|
694
|
+
this.log.info(`Detected epoch prune to ${newCheckpointNumber}`, {
|
|
695
|
+
oldCheckpointNumber,
|
|
696
|
+
newCheckpointNumber,
|
|
697
|
+
thresholdForEpochPrune,
|
|
698
|
+
});
|
|
699
|
+
}
|
|
686
700
|
return isEpochPrune;
|
|
687
701
|
}
|
|
688
702
|
|
|
689
703
|
/** Checks if the slot has changed and calls prepareForSlot if so. */
|
|
690
704
|
private async maybeCallPrepareForSlot(): Promise<void> {
|
|
691
|
-
|
|
692
|
-
|
|
705
|
+
// If we have a proposed checkpoint available, we want to prepare the target slot - otherwise we prepare the current slot
|
|
706
|
+
const l2Tips = await this.l2Tips.getL2Tips();
|
|
707
|
+
const hasProposedCheckpoint = l2Tips.proposedCheckpoint.checkpoint.number > l2Tips.checkpointed.checkpoint.number;
|
|
708
|
+
|
|
709
|
+
let slot;
|
|
710
|
+
if (this.epochCache.isProposerPipeliningEnabled() && hasProposedCheckpoint) {
|
|
711
|
+
const { targetSlot } = this.epochCache.getTargetAndNextSlot();
|
|
712
|
+
slot = targetSlot;
|
|
713
|
+
} else {
|
|
714
|
+
const { currentSlot } = this.epochCache.getCurrentAndNextSlot();
|
|
715
|
+
slot = currentSlot;
|
|
716
|
+
}
|
|
717
|
+
if (slot <= this.lastSlotProcessed) {
|
|
693
718
|
return;
|
|
694
719
|
}
|
|
695
|
-
this.lastSlotProcessed =
|
|
696
|
-
await this.txPool.prepareForSlot(
|
|
720
|
+
this.lastSlotProcessed = slot;
|
|
721
|
+
await this.txPool.prepareForSlot(slot);
|
|
697
722
|
}
|
|
698
723
|
|
|
699
724
|
private async startServiceIfSynched() {
|
|
@@ -19,7 +19,7 @@ import type { P2PConfig } from '../../../config.js';
|
|
|
19
19
|
import { BatchTxRequesterCollector, SendBatchRequestCollector } from '../../../services/index.js';
|
|
20
20
|
import type { IBatchRequestTxValidator } from '../../../services/reqresp/batch-tx-requester/tx_validator.js';
|
|
21
21
|
import { RateLimitStatus } from '../../../services/reqresp/rate-limiter/rate_limiter.js';
|
|
22
|
-
import {
|
|
22
|
+
import { RequestTracker } from '../../../services/tx_collection/request_tracker.js';
|
|
23
23
|
import {
|
|
24
24
|
AlwaysTrueCircuitVerifier,
|
|
25
25
|
BENCHMARK_CONSTANTS,
|
|
@@ -213,10 +213,9 @@ async function runCollector(cmd: Extract<WorkerCommand, { type: 'RUN_COLLECTOR'
|
|
|
213
213
|
const fetched = await executeTimeout(
|
|
214
214
|
(_signal: AbortSignal) =>
|
|
215
215
|
collector.collectTxs(
|
|
216
|
-
|
|
216
|
+
RequestTracker.create(parsedTxHashes, new Date(Date.now() + internalTimeoutMs)),
|
|
217
217
|
parsedProposal,
|
|
218
218
|
pinnedPeer,
|
|
219
|
-
internalTimeoutMs,
|
|
220
219
|
),
|
|
221
220
|
timeoutMs,
|
|
222
221
|
() => new Error(`Collector timed out after ${timeoutMs}ms`),
|
|
@@ -231,10 +230,9 @@ async function runCollector(cmd: Extract<WorkerCommand, { type: 'RUN_COLLECTOR'
|
|
|
231
230
|
const fetched = await executeTimeout(
|
|
232
231
|
(_signal: AbortSignal) =>
|
|
233
232
|
collector.collectTxs(
|
|
234
|
-
|
|
233
|
+
RequestTracker.create(parsedTxHashes, new Date(Date.now() + internalTimeoutMs)),
|
|
235
234
|
parsedProposal,
|
|
236
235
|
pinnedPeer,
|
|
237
|
-
internalTimeoutMs,
|
|
238
236
|
),
|
|
239
237
|
timeoutMs,
|
|
240
238
|
() => new Error(`Collector timed out after ${timeoutMs}ms`),
|
|
@@ -261,9 +259,20 @@ async function stopClient() {
|
|
|
261
259
|
attestationPool = undefined;
|
|
262
260
|
}
|
|
263
261
|
|
|
262
|
+
function gracefulExit(code: number = 0) {
|
|
263
|
+
try {
|
|
264
|
+
if (process.connected) {
|
|
265
|
+
process.disconnect();
|
|
266
|
+
}
|
|
267
|
+
} catch {
|
|
268
|
+
// IPC channel already closed
|
|
269
|
+
}
|
|
270
|
+
setTimeout(() => process.exit(code), 5000).unref();
|
|
271
|
+
}
|
|
272
|
+
|
|
264
273
|
process.on('disconnect', () => {
|
|
265
274
|
ipcDisconnected = true;
|
|
266
|
-
void stopClient()
|
|
275
|
+
void stopClient();
|
|
267
276
|
});
|
|
268
277
|
|
|
269
278
|
process.on('error', err => {
|
|
@@ -327,7 +336,7 @@ process.on('message', (msg: WorkerCommand) => {
|
|
|
327
336
|
case 'STOP': {
|
|
328
337
|
await stopClient();
|
|
329
338
|
await sendMessage({ type: 'STOPPED', requestId });
|
|
330
|
-
|
|
339
|
+
gracefulExit(0);
|
|
331
340
|
break;
|
|
332
341
|
}
|
|
333
342
|
default: {
|
|
@@ -338,7 +347,8 @@ process.on('message', (msg: WorkerCommand) => {
|
|
|
338
347
|
} catch (err: any) {
|
|
339
348
|
await sendMessage({ type: 'ERROR', requestId, error: err?.message ?? String(err) });
|
|
340
349
|
if (msg.type === 'START') {
|
|
341
|
-
|
|
350
|
+
await stopClient();
|
|
351
|
+
gracefulExit(1);
|
|
342
352
|
}
|
|
343
353
|
}
|
|
344
354
|
})();
|
package/src/config.ts
CHANGED
|
@@ -43,6 +43,15 @@ export interface P2PConfig
|
|
|
43
43
|
/** Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set. */
|
|
44
44
|
validateMaxTxsPerBlock?: number;
|
|
45
45
|
|
|
46
|
+
/** Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set. */
|
|
47
|
+
validateMaxTxsPerCheckpoint?: number;
|
|
48
|
+
|
|
49
|
+
/** Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected. */
|
|
50
|
+
validateMaxL2BlockGas?: number;
|
|
51
|
+
|
|
52
|
+
/** Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected. */
|
|
53
|
+
validateMaxDABlockGas?: number;
|
|
54
|
+
|
|
46
55
|
/** A flag dictating whether the P2P subsystem should be enabled. */
|
|
47
56
|
p2pEnabled: boolean;
|
|
48
57
|
|
|
@@ -61,6 +70,9 @@ export interface P2PConfig
|
|
|
61
70
|
/** The frequency in which to check for new peers. */
|
|
62
71
|
peerCheckIntervalMS: number;
|
|
63
72
|
|
|
73
|
+
/** How long to ban a peer after it fails MAX_DIAL_ATTEMPTS dials. */
|
|
74
|
+
peerFailedBanTimeMs: number;
|
|
75
|
+
|
|
64
76
|
/** Size of queue of L2 blocks to store. */
|
|
65
77
|
l2QueueSize: number;
|
|
66
78
|
|
|
@@ -208,6 +220,22 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
208
220
|
'Maximum transactions per block for validation. Overrides maxTxsPerBlock for gossip validation when set.',
|
|
209
221
|
parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
|
|
210
222
|
},
|
|
223
|
+
validateMaxTxsPerCheckpoint: {
|
|
224
|
+
env: 'VALIDATOR_MAX_TX_PER_CHECKPOINT',
|
|
225
|
+
description:
|
|
226
|
+
'Maximum transactions per checkpoint for validation. Used as fallback for maxTxsPerBlock when that is not set.',
|
|
227
|
+
parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
|
|
228
|
+
},
|
|
229
|
+
validateMaxL2BlockGas: {
|
|
230
|
+
env: 'VALIDATOR_MAX_L2_BLOCK_GAS',
|
|
231
|
+
description: 'Maximum L2 gas per block for validation. When set, txs exceeding this limit are rejected.',
|
|
232
|
+
parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
|
|
233
|
+
},
|
|
234
|
+
validateMaxDABlockGas: {
|
|
235
|
+
env: 'VALIDATOR_MAX_DA_BLOCK_GAS',
|
|
236
|
+
description: 'Maximum DA gas per block for validation. When set, txs exceeding this limit are rejected.',
|
|
237
|
+
parseEnv: (val: string) => (val ? parseInt(val, 10) : undefined),
|
|
238
|
+
},
|
|
211
239
|
p2pEnabled: {
|
|
212
240
|
env: 'P2P_ENABLED',
|
|
213
241
|
description: 'A flag dictating whether the P2P subsystem should be enabled.',
|
|
@@ -238,6 +266,11 @@ export const p2pConfigMappings: ConfigMappingsType<P2PConfig> = {
|
|
|
238
266
|
description: 'The frequency in which to check for new peers.',
|
|
239
267
|
...numberConfigHelper(30_000),
|
|
240
268
|
},
|
|
269
|
+
peerFailedBanTimeMs: {
|
|
270
|
+
env: 'P2P_PEER_FAILED_BAN_TIME_MS',
|
|
271
|
+
description: 'How long to ban a peer after it fails maximum dial attempts.',
|
|
272
|
+
...numberConfigHelper(5 * 60 * 1000),
|
|
273
|
+
},
|
|
241
274
|
l2QueueSize: {
|
|
242
275
|
env: 'P2P_L2_QUEUE_SIZE',
|
|
243
276
|
description: 'Size of queue of L2 blocks to store.',
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Checkpoint Proposal Received Callback Not Registered Error
|
|
2
|
+
*
|
|
3
|
+
* Error triggered if the allNodesCheckpointReceivedCallback is not registered
|
|
4
|
+
* @category Errors
|
|
5
|
+
*/
|
|
6
|
+
export class CheckpointProposalReceivedCallbackNotRegisteredError extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super('FATAL (allNodesCheckpointReceivedCallback): All nodes should register a checkpoint proposal handler');
|
|
9
|
+
this.name = 'CheckpointProposalReceivedCallbackNotRegisteredError';
|
|
10
|
+
}
|
|
11
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -6,7 +6,6 @@ export * from './client/index.js';
|
|
|
6
6
|
export * from './enr/index.js';
|
|
7
7
|
export * from './config.js';
|
|
8
8
|
export * from './mem_pools/attestation_pool/index.js';
|
|
9
|
-
export * from './mem_pools/tx_pool/index.js';
|
|
10
9
|
export * from './mem_pools/tx_pool_v2/index.js';
|
|
11
10
|
export * from './msg_validators/index.js';
|
|
12
11
|
export * from './services/index.js';
|
|
@@ -26,10 +26,10 @@ export type TryAddResult = {
|
|
|
26
26
|
count: number;
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT =
|
|
30
|
-
export const MAX_BLOCK_PROPOSALS_PER_POSITION =
|
|
29
|
+
export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
|
|
30
|
+
export const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
|
|
31
31
|
/** Maximum attestations a single signer can make per slot before being rejected. */
|
|
32
|
-
export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER =
|
|
32
|
+
export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
|
|
33
33
|
|
|
34
34
|
/** Public API interface for attestation pools. Used for typing mocks and test implementations. */
|
|
35
35
|
export type AttestationPoolApi = Pick<
|
|
@@ -278,7 +278,7 @@ export class AttestationPool {
|
|
|
278
278
|
* @returns Result indicating whether the proposal was added and duplicate detection info
|
|
279
279
|
*/
|
|
280
280
|
public async tryAddCheckpointProposal(proposal: CheckpointProposalCore): Promise<TryAddResult> {
|
|
281
|
-
|
|
281
|
+
const result = await this.store.transactionAsync(async () => {
|
|
282
282
|
const proposalId = proposal.archive.toString();
|
|
283
283
|
|
|
284
284
|
// Check if already exists
|
|
@@ -304,6 +304,8 @@ export class AttestationPool {
|
|
|
304
304
|
|
|
305
305
|
return { added: true, alreadyExists: false, count: count + 1 };
|
|
306
306
|
});
|
|
307
|
+
|
|
308
|
+
return result;
|
|
307
309
|
}
|
|
308
310
|
|
|
309
311
|
/** Internal method - must be called within a transaction. */
|
|
@@ -345,7 +347,7 @@ export class AttestationPool {
|
|
|
345
347
|
await this.store.transactionAsync(async () => {
|
|
346
348
|
for (const attestation of attestations) {
|
|
347
349
|
const slotNumber = attestation.payload.header.slotNumber;
|
|
348
|
-
const proposalId = attestation.archive;
|
|
350
|
+
const proposalId = attestation.archive.toString();
|
|
349
351
|
const sender = attestation.getSender();
|
|
350
352
|
|
|
351
353
|
// Skip attestations with invalid signatures
|