@aztec/p2p 0.0.1-commit.9ef841308 → 0.0.1-commit.a89ec08
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/client/factory.d.ts +2 -2
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +1 -2
- package/dest/client/p2p_client.d.ts +1 -1
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +4 -6
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +6 -17
- package/dest/config.d.ts +6 -6
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +6 -6
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- 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 +4 -8
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/index.d.ts +2 -1
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.d.ts +2 -4
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +14 -16
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +125 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +596 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +32 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +112 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +157 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +52 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +123 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +78 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +26 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +84 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/mem_pools/tx_pool/index.d.ts +3 -0
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/index.js +2 -0
- package/dest/mem_pools/tx_pool/priority.d.ts +12 -0
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/priority.js +15 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +127 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool.js +3 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +402 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +5 -7
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +0 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +6 -5
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +1 -5
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.js +43 -26
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +1 -1
- 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 +0 -3
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +1 -2
- 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 +1 -18
- 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 +4 -5
- 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 +3 -4
- 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/metadata_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +4 -4
- package/dest/services/discv5/discV5_service.d.ts +1 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +2 -4
- package/dest/services/libp2p/libp2p_service.d.ts +9 -7
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +59 -137
- package/dest/services/peer-manager/metrics.d.ts +1 -3
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +0 -6
- package/dest/services/peer-manager/peer_manager.d.ts +2 -6
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +9 -24
- package/dest/services/peer-manager/peer_scoring.d.ts +2 -5
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +10 -28
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +8 -11
- 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 +101 -82
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +2 -3
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +4 -5
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +7 -13
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +11 -19
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +15 -52
- 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 +3 -4
- package/dest/services/service.d.ts +1 -7
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +4 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +73 -57
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +32 -0
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/missing_txs_tracker.js +27 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +7 -6
- 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/slow_tx_collection.js +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +6 -3
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- 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/mock-pubsub.d.ts +1 -6
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +1 -9
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- 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 +2 -20
- package/dest/testbench/p2p_client_testbench_worker.js +15 -44
- 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 +2 -2
- package/dest/util.d.ts +4 -9
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +9 -2
- package/package.json +14 -14
- package/src/client/factory.ts +2 -3
- package/src/client/p2p_client.ts +4 -6
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +9 -19
- package/src/config.ts +10 -10
- package/src/index.ts +1 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +7 -8
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +13 -17
- package/src/mem_pools/tx_pool/README.md +270 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +746 -0
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +132 -0
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +208 -0
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +163 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +104 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +93 -0
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +106 -0
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/mem_pools/tx_pool/index.ts +2 -0
- package/src/mem_pools/tx_pool/priority.ts +20 -0
- package/src/mem_pools/tx_pool/tx_pool.ts +141 -0
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +321 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +4 -7
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +5 -11
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +43 -29
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +0 -3
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1 -19
- package/src/msg_validators/attestation_validator/README.md +1 -1
- package/src/msg_validators/attestation_validator/attestation_validator.ts +4 -5
- package/src/msg_validators/clock_tolerance.ts +3 -4
- package/src/msg_validators/proposal_validator/README.md +4 -4
- package/src/msg_validators/proposal_validator/proposal_validator.ts +5 -6
- package/src/msg_validators/tx_validator/metadata_validator.ts +4 -12
- package/src/services/discv5/discV5_service.ts +2 -4
- package/src/services/libp2p/libp2p_service.ts +71 -135
- package/src/services/peer-manager/metrics.ts +0 -7
- package/src/services/peer-manager/peer_manager.ts +9 -28
- package/src/services/peer-manager/peer_scoring.ts +5 -21
- package/src/services/reqresp/batch-tx-requester/README.md +7 -46
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +111 -78
- package/src/services/reqresp/batch-tx-requester/interface.ts +1 -2
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +6 -13
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +24 -68
- package/src/services/reqresp/reqresp.ts +3 -5
- package/src/services/service.ts +0 -7
- package/src/services/tx_collection/fast_tx_collection.ts +83 -57
- package/src/services/tx_collection/missing_txs_tracker.ts +52 -0
- package/src/services/tx_collection/proposal_tx_collector.ts +13 -8
- package/src/services/tx_collection/slow_tx_collection.ts +1 -1
- package/src/services/tx_collection/tx_collection.ts +5 -3
- package/src/test-helpers/make-test-p2p-clients.ts +1 -1
- package/src/test-helpers/mock-pubsub.ts +0 -9
- package/src/test-helpers/reqresp-nodes.ts +1 -1
- package/src/test-helpers/testbench-utils.ts +3 -28
- package/src/testbench/p2p_client_testbench_worker.ts +15 -44
- package/src/testbench/worker_client_manager.ts +2 -2
- package/src/util.ts +13 -9
- package/dest/services/tx_collection/request_tracker.d.ts +0 -53
- package/dest/services/tx_collection/request_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/request_tracker.js +0 -84
- package/src/services/tx_collection/request_tracker.ts +0 -127
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { times } from '@aztec/foundation/collection';
|
|
2
|
+
import { AbortError, TimeoutError } from '@aztec/foundation/error';
|
|
2
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { promiseWithResolvers } from '@aztec/foundation/promise';
|
|
3
5
|
import { sleep } from '@aztec/foundation/sleep';
|
|
4
6
|
import { DateProvider, elapsed } from '@aztec/foundation/timer';
|
|
5
7
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
8
|
+
import { MissingTxsTracker } from './missing_txs_tracker.js';
|
|
6
9
|
import { BatchTxRequesterCollector, SendBatchRequestCollector } from './proposal_tx_collector.js';
|
|
7
|
-
import { RequestTracker } from './request_tracker.js';
|
|
8
10
|
export class FastTxCollection {
|
|
9
11
|
nodes;
|
|
10
12
|
txCollectionSink;
|
|
@@ -26,9 +28,7 @@ export class FastTxCollection {
|
|
|
26
28
|
this.missingTxsCollector = missingTxsCollector ?? (missingTxsCollectorType === 'old' ? new SendBatchRequestCollector(p2pService) : new BatchTxRequesterCollector(p2pService, log, dateProvider, undefined, batchTxRequesterConfig));
|
|
27
29
|
}
|
|
28
30
|
async stop() {
|
|
29
|
-
this.requests.forEach((request)=>
|
|
30
|
-
request.requestTracker.cancel();
|
|
31
|
-
});
|
|
31
|
+
this.requests.forEach((request)=>request.promise.reject(new AbortError(`Stopped collection service`)));
|
|
32
32
|
await Promise.resolve();
|
|
33
33
|
}
|
|
34
34
|
getFastCollectionRequests() {
|
|
@@ -49,66 +49,81 @@ export class FastTxCollection {
|
|
|
49
49
|
} : {
|
|
50
50
|
...input.block.toBlockInfo()
|
|
51
51
|
};
|
|
52
|
+
// This promise is used to await for the collection to finish during the main collectFast method.
|
|
53
|
+
// It gets resolved in `foundTxs` when all txs have been collected, or rejected if the request is aborted or hits the deadline.
|
|
54
|
+
const promise = promiseWithResolvers();
|
|
55
|
+
const timeoutTimer = setTimeout(()=>promise.reject(new TimeoutError(`Timed out while collecting txs`)), timeout);
|
|
52
56
|
const request = {
|
|
53
57
|
...input,
|
|
54
58
|
blockInfo,
|
|
55
|
-
|
|
59
|
+
promise,
|
|
60
|
+
missingTxTracker: MissingTxsTracker.fromArray(txHashes),
|
|
61
|
+
deadline: opts.deadline
|
|
56
62
|
};
|
|
57
63
|
const [duration] = await elapsed(()=>this.collectFast(request, {
|
|
58
64
|
...opts
|
|
59
65
|
}));
|
|
60
|
-
|
|
66
|
+
clearTimeout(timeoutTimer);
|
|
67
|
+
this.log.verbose(`Collected ${request.missingTxTracker.collectedTxs.length} txs out of ${txHashes.length} for ${input.type} at slot ${blockInfo.slotNumber}`, {
|
|
61
68
|
...blockInfo,
|
|
62
69
|
duration,
|
|
63
70
|
requestType: input.type,
|
|
64
71
|
missingTxs: [
|
|
65
|
-
...request.
|
|
72
|
+
...request.missingTxTracker.missingTxHashes
|
|
66
73
|
]
|
|
67
74
|
});
|
|
68
|
-
return request.
|
|
75
|
+
return request.missingTxTracker.collectedTxs;
|
|
69
76
|
}
|
|
70
77
|
async collectFast(request, opts) {
|
|
71
78
|
this.requests.add(request);
|
|
72
79
|
const { blockInfo } = request;
|
|
73
|
-
this.log.debug(`Starting fast collection of ${request.
|
|
80
|
+
this.log.debug(`Starting fast collection of ${request.missingTxTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
|
|
74
81
|
...blockInfo,
|
|
75
82
|
requestType: request.type,
|
|
76
|
-
deadline:
|
|
83
|
+
deadline: opts.deadline
|
|
77
84
|
});
|
|
78
85
|
try {
|
|
79
86
|
// Start blasting all nodes for the txs. We give them a little time to respond before we start reqresp.
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
const nodeCollectionPromise = this.collectFastFromNodes(request);
|
|
87
|
+
// And keep an eye on the request promise to ensure we don't wait longer than the deadline or return as soon
|
|
88
|
+
// as we have collected all txs, whatever the source.
|
|
89
|
+
const nodeCollectionPromise = this.collectFastFromNodes(request, opts);
|
|
83
90
|
const waitBeforeReqResp = sleep(this.config.txCollectionFastNodesTimeoutBeforeReqRespMs);
|
|
84
91
|
await Promise.race([
|
|
85
|
-
request.
|
|
92
|
+
request.promise.promise,
|
|
86
93
|
waitBeforeReqResp
|
|
87
94
|
]);
|
|
88
|
-
// If we have collected all txs
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (request.requestTracker.allFetched()) {
|
|
92
|
-
this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
|
|
93
|
-
}
|
|
94
|
-
await nodeCollectionPromise;
|
|
95
|
+
// If we have collected all txs, we can stop here
|
|
96
|
+
if (request.missingTxTracker.allFetched()) {
|
|
97
|
+
this.log.debug(`All txs collected for slot ${blockInfo.slotNumber} without reqresp`, blockInfo);
|
|
95
98
|
return;
|
|
96
99
|
}
|
|
97
100
|
// Start blasting reqresp for the remaining txs. Note that node collection keeps running in parallel.
|
|
98
101
|
// We stop when we have collected all txs, timed out, or both node collection and reqresp have given up.
|
|
99
|
-
|
|
100
|
-
await Promise.allSettled([
|
|
102
|
+
const collectionPromise = Promise.allSettled([
|
|
101
103
|
this.collectFastViaReqResp(request, opts),
|
|
102
104
|
nodeCollectionPromise
|
|
103
105
|
]);
|
|
106
|
+
await Promise.race([
|
|
107
|
+
collectionPromise,
|
|
108
|
+
request.promise.promise
|
|
109
|
+
]);
|
|
104
110
|
} catch (err) {
|
|
105
|
-
|
|
111
|
+
// Log and swallow all errors
|
|
112
|
+
const logCtx = {
|
|
106
113
|
...blockInfo,
|
|
107
|
-
|
|
108
|
-
|
|
114
|
+
errorMessage: err instanceof Error ? err.message : undefined,
|
|
115
|
+
missingTxs: request.missingTxTracker.missingTxHashes.values().map((txHash)=>txHash.toString())
|
|
116
|
+
};
|
|
117
|
+
if (err instanceof Error && err.name === 'TimeoutError') {
|
|
118
|
+
this.log.warn(`Timed out collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
|
|
119
|
+
} else if (err instanceof Error && err.name === 'AbortError') {
|
|
120
|
+
this.log.warn(`Aborted collecting txs for ${request.type} at slot ${blockInfo.slotNumber}`, logCtx);
|
|
121
|
+
} else {
|
|
122
|
+
this.log.error(`Error collecting txs for ${request.type} for slot ${blockInfo.slotNumber}`, err, logCtx);
|
|
123
|
+
}
|
|
109
124
|
} finally{
|
|
110
125
|
// Ensure no unresolved promises and remove the request from the set
|
|
111
|
-
request.
|
|
126
|
+
request.promise.resolve();
|
|
112
127
|
this.requests.delete(request);
|
|
113
128
|
}
|
|
114
129
|
}
|
|
@@ -117,23 +132,23 @@ export class FastTxCollection {
|
|
|
117
132
|
* in parallel to each node. We keep track of the number of attempts made to collect each tx, so we can prioritize
|
|
118
133
|
* the txs that have been requested less often whenever we need to send a new batch of requests. We ensure that no
|
|
119
134
|
* tx is requested more than once at the same time to the same node.
|
|
120
|
-
*/ async collectFastFromNodes(request) {
|
|
135
|
+
*/ async collectFastFromNodes(request, opts) {
|
|
121
136
|
if (this.nodes.length === 0) {
|
|
122
137
|
return;
|
|
123
138
|
}
|
|
124
139
|
// Keep a shared priority queue of all txs pending to be requested, sorted by the number of attempts made to collect them.
|
|
125
140
|
const attemptsPerTx = [
|
|
126
|
-
...request.
|
|
141
|
+
...request.missingTxTracker.missingTxHashes
|
|
127
142
|
].map((txHash)=>({
|
|
128
143
|
txHash,
|
|
129
144
|
attempts: 0,
|
|
130
145
|
found: false
|
|
131
146
|
}));
|
|
132
147
|
// Returns once we have finished all node loops. Each loop finishes when the deadline is hit, or all txs have been collected.
|
|
133
|
-
await Promise.allSettled(this.nodes.map((node)=>this.collectFastFromNode(request, node, attemptsPerTx)));
|
|
148
|
+
await Promise.allSettled(this.nodes.map((node)=>this.collectFastFromNode(request, node, attemptsPerTx, opts)));
|
|
134
149
|
}
|
|
135
|
-
async collectFastFromNode(request, node, attemptsPerTx) {
|
|
136
|
-
const notFinished = ()
|
|
150
|
+
async collectFastFromNode(request, node, attemptsPerTx, opts) {
|
|
151
|
+
const notFinished = ()=>this.dateProvider.now() <= +opts.deadline && !request.missingTxTracker.allFetched() && this.requests.has(request);
|
|
137
152
|
const maxParallelRequests = this.config.txCollectionFastMaxParallelRequestsPerNode;
|
|
138
153
|
const maxBatchSize = this.config.txCollectionNodeRpcMaxBatchSize;
|
|
139
154
|
const activeRequestsToThisNode = new Set(); // Track the txs being actively requested to this node
|
|
@@ -147,7 +162,7 @@ export class FastTxCollection {
|
|
|
147
162
|
const txToRequest = attemptsPerTx[index++];
|
|
148
163
|
if (!txToRequest) {
|
|
149
164
|
break;
|
|
150
|
-
} else if (!request.
|
|
165
|
+
} else if (!request.missingTxTracker.isMissing(txToRequest.txHash)) {
|
|
151
166
|
// Mark as found if it was found somewhere else, we'll then remove it from the array.
|
|
152
167
|
// We don't delete it now since 'array.splice' is pretty expensive, so we do it after sorting.
|
|
153
168
|
txToRequest.found = true;
|
|
@@ -176,7 +191,7 @@ export class FastTxCollection {
|
|
|
176
191
|
await this.txCollectionSink.collect(async ()=>{
|
|
177
192
|
const result = await node.getTxsByHash(txHashes.map(TxHash.fromString));
|
|
178
193
|
for (const tx of result.validTxs){
|
|
179
|
-
request.
|
|
194
|
+
request.missingTxTracker.markFetched(tx);
|
|
180
195
|
}
|
|
181
196
|
return result;
|
|
182
197
|
}, txHashes, {
|
|
@@ -189,12 +204,9 @@ export class FastTxCollection {
|
|
|
189
204
|
for (const requestedTx of batch){
|
|
190
205
|
activeRequestsToThisNode.delete(requestedTx.txHash);
|
|
191
206
|
}
|
|
192
|
-
// Sleep a bit until hitting the node again
|
|
207
|
+
// Sleep a bit until hitting the node again (or not, depending on config)
|
|
193
208
|
if (notFinished()) {
|
|
194
|
-
await
|
|
195
|
-
sleep(this.config.txCollectionFastNodeIntervalMs),
|
|
196
|
-
request.requestTracker.cancellationToken
|
|
197
|
-
]);
|
|
209
|
+
await sleep(this.config.txCollectionFastNodeIntervalMs);
|
|
198
210
|
}
|
|
199
211
|
}
|
|
200
212
|
};
|
|
@@ -202,32 +214,33 @@ export class FastTxCollection {
|
|
|
202
214
|
await Promise.all(times(maxParallelRequests, processBatch));
|
|
203
215
|
}
|
|
204
216
|
async collectFastViaReqResp(request, opts) {
|
|
217
|
+
const timeoutMs = +request.deadline - this.dateProvider.now();
|
|
205
218
|
const pinnedPeer = opts.pinnedPeer;
|
|
206
219
|
const blockInfo = request.blockInfo;
|
|
207
220
|
const slotNumber = blockInfo.slotNumber;
|
|
208
|
-
if (
|
|
221
|
+
if (timeoutMs < 100) {
|
|
209
222
|
this.log.warn(`Not initiating fast reqresp for txs for ${request.type} at slot ${blockInfo.slotNumber} due to timeout`, {
|
|
210
|
-
timeoutMs
|
|
223
|
+
timeoutMs,
|
|
211
224
|
...blockInfo
|
|
212
225
|
});
|
|
213
226
|
return;
|
|
214
227
|
}
|
|
215
|
-
this.log.debug(`Starting fast reqresp for ${request.
|
|
228
|
+
this.log.debug(`Starting fast reqresp for ${request.missingTxTracker.numberOfMissingTxs} txs for ${request.type} at slot ${blockInfo.slotNumber}`, {
|
|
216
229
|
...blockInfo,
|
|
217
|
-
timeoutMs
|
|
230
|
+
timeoutMs,
|
|
218
231
|
pinnedPeer
|
|
219
232
|
});
|
|
220
233
|
try {
|
|
221
234
|
await this.txCollectionSink.collect(async ()=>{
|
|
222
235
|
let result;
|
|
223
236
|
if (request.type === 'proposal') {
|
|
224
|
-
result = await this.missingTxsCollector.collectTxs(request.
|
|
237
|
+
result = await this.missingTxsCollector.collectTxs(request.missingTxTracker, request.blockProposal, pinnedPeer, timeoutMs);
|
|
225
238
|
} else if (request.type === 'block') {
|
|
226
239
|
const blockTxsSource = {
|
|
227
240
|
txHashes: request.block.body.txEffects.map((e)=>e.txHash),
|
|
228
241
|
archive: request.block.archive.root
|
|
229
242
|
};
|
|
230
|
-
result = await this.missingTxsCollector.collectTxs(request.
|
|
243
|
+
result = await this.missingTxsCollector.collectTxs(request.missingTxTracker, blockTxsSource, pinnedPeer, timeoutMs);
|
|
231
244
|
} else {
|
|
232
245
|
throw new Error(`Unknown request type: ${request.type}`);
|
|
233
246
|
}
|
|
@@ -235,7 +248,7 @@ export class FastTxCollection {
|
|
|
235
248
|
validTxs: result,
|
|
236
249
|
invalidTxHashes: []
|
|
237
250
|
};
|
|
238
|
-
}, Array.from(request.
|
|
251
|
+
}, Array.from(request.missingTxTracker.missingTxHashes), {
|
|
239
252
|
description: `reqresp for slot ${slotNumber}`,
|
|
240
253
|
method: 'fast-req-resp',
|
|
241
254
|
...opts,
|
|
@@ -244,7 +257,7 @@ export class FastTxCollection {
|
|
|
244
257
|
} catch (err) {
|
|
245
258
|
this.log.error(`Error sending fast reqresp request for txs`, err, {
|
|
246
259
|
txs: [
|
|
247
|
-
...request.
|
|
260
|
+
...request.missingTxTracker.missingTxHashes
|
|
248
261
|
],
|
|
249
262
|
...blockInfo
|
|
250
263
|
});
|
|
@@ -271,19 +284,20 @@ export class FastTxCollection {
|
|
|
271
284
|
for (const tx of txs){
|
|
272
285
|
const txHash = tx.txHash.toString();
|
|
273
286
|
// Remove the tx hash from the missing set, and add it to the found set.
|
|
274
|
-
if (request.
|
|
287
|
+
if (request.missingTxTracker.markFetched(tx)) {
|
|
275
288
|
this.log.trace(`Found tx ${txHash} for fast collection request`, {
|
|
276
289
|
...request.blockInfo,
|
|
277
290
|
txHash: tx.txHash.toString(),
|
|
278
291
|
type: request.type
|
|
279
292
|
});
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
}
|
|
293
|
+
}
|
|
294
|
+
// If we found all txs for this request, we resolve the promise
|
|
295
|
+
if (request.missingTxTracker.allFetched()) {
|
|
296
|
+
this.log.trace(`All txs found for fast collection request`, {
|
|
297
|
+
...request.blockInfo,
|
|
298
|
+
type: request.type
|
|
299
|
+
});
|
|
300
|
+
request.promise.resolve();
|
|
287
301
|
}
|
|
288
302
|
}
|
|
289
303
|
}
|
|
@@ -294,7 +308,8 @@ export class FastTxCollection {
|
|
|
294
308
|
*/ stopCollectingForBlocksUpTo(blockNumber) {
|
|
295
309
|
for (const request of this.requests){
|
|
296
310
|
if (request.blockInfo.blockNumber <= blockNumber) {
|
|
297
|
-
request.
|
|
311
|
+
request.promise.reject(new AbortError(`Stopped collecting txs up to block ${blockNumber}`));
|
|
312
|
+
this.requests.delete(request);
|
|
298
313
|
}
|
|
299
314
|
}
|
|
300
315
|
}
|
|
@@ -304,7 +319,8 @@ export class FastTxCollection {
|
|
|
304
319
|
*/ stopCollectingForBlocksAfter(blockNumber) {
|
|
305
320
|
for (const request of this.requests){
|
|
306
321
|
if (request.blockInfo.blockNumber > blockNumber) {
|
|
307
|
-
request.
|
|
322
|
+
request.promise.reject(new AbortError(`Stopped collecting txs after block ${blockNumber}`));
|
|
323
|
+
this.requests.delete(request);
|
|
308
324
|
}
|
|
309
325
|
}
|
|
310
326
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TxHash } from '@aztec/stdlib/tx';
|
|
2
|
+
import type { Tx } from '@aztec/stdlib/tx';
|
|
3
|
+
/**
|
|
4
|
+
* Tracks which transactions are still missing and need to be fetched.
|
|
5
|
+
* Allows external code to mark transactions as fetched, enabling coordination
|
|
6
|
+
* between multiple fetching mechanisms (e.g., BatchTxRequester and Rpc Node requests).
|
|
7
|
+
*/
|
|
8
|
+
export interface IMissingTxsTracker {
|
|
9
|
+
/** Returns the set of transaction hashes that are still missing. */
|
|
10
|
+
get missingTxHashes(): Set<string>;
|
|
11
|
+
/** Size of this.missingTxHashes */
|
|
12
|
+
get numberOfMissingTxs(): number;
|
|
13
|
+
/** Are all requested txs are fetched */
|
|
14
|
+
allFetched(): boolean;
|
|
15
|
+
/** Checks that transaction is still missing */
|
|
16
|
+
isMissing(txHash: string): boolean;
|
|
17
|
+
/** Marks a transaction as fetched. Returns true if it was previously missing. */
|
|
18
|
+
markFetched(tx: Tx): boolean;
|
|
19
|
+
/** Get list of collected txs */
|
|
20
|
+
get collectedTxs(): Tx[];
|
|
21
|
+
}
|
|
22
|
+
export declare class MissingTxsTracker implements IMissingTxsTracker {
|
|
23
|
+
readonly missingTxHashes: Set<string>;
|
|
24
|
+
readonly collectedTxs: Tx[];
|
|
25
|
+
private constructor();
|
|
26
|
+
static fromArray(hashes: TxHash[] | string[]): MissingTxsTracker;
|
|
27
|
+
markFetched(tx: Tx): boolean;
|
|
28
|
+
get numberOfMissingTxs(): number;
|
|
29
|
+
allFetched(): boolean;
|
|
30
|
+
isMissing(txHash: string): boolean;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2luZ190eHNfdHJhY2tlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3R4X2NvbGxlY3Rpb24vbWlzc2luZ190eHNfdHJhY2tlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxrQkFBa0I7SUFDakMsb0VBQW9FO0lBQ3BFLElBQUksZUFBZSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxtQ0FBbUM7SUFDbkMsSUFBSSxrQkFBa0IsSUFBSSxNQUFNLENBQUM7SUFDakMsd0NBQXdDO0lBQ3hDLFVBQVUsSUFBSSxPQUFPLENBQUM7SUFDdEIsK0NBQStDO0lBQy9DLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUNuQyxpRkFBaUY7SUFDakYsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzdCLGdDQUFnQztJQUNoQyxJQUFJLFlBQVksSUFBSSxFQUFFLEVBQUUsQ0FBQztDQUMxQjtBQUVELHFCQUFhLGlCQUFrQixZQUFXLGtCQUFrQjthQUd0QixlQUFlLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUZoRSxTQUFnQixZQUFZLEVBQUUsRUFBRSxFQUFFLENBQU07SUFFeEMsT0FBTyxlQUE2RDtJQUVwRSxPQUFjLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLHFCQUVsRDtJQUVELFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FNM0I7SUFFRCxJQUFJLGtCQUFrQixJQUFJLE1BQU0sQ0FFL0I7SUFFRCxVQUFVLElBQUksT0FBTyxDQUVwQjtJQUVELFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FFakM7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missing_txs_tracker.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/missing_txs_tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,IAAI,eAAe,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,mCAAmC;IACnC,IAAI,kBAAkB,IAAI,MAAM,CAAC;IACjC,wCAAwC;IACxC,UAAU,IAAI,OAAO,CAAC;IACtB,+CAA+C;IAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,iFAAiF;IACjF,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAC7B,gCAAgC;IAChC,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;CAC1B;AAED,qBAAa,iBAAkB,YAAW,kBAAkB;aAGtB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC;IAFhE,SAAgB,YAAY,EAAE,EAAE,EAAE,CAAM;IAExC,OAAO,eAA6D;IAEpE,OAAc,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,qBAElD;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAM3B;IAED,IAAI,kBAAkB,IAAI,MAAM,CAE/B;IAED,UAAU,IAAI,OAAO,CAEpB;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class MissingTxsTracker {
|
|
2
|
+
missingTxHashes;
|
|
3
|
+
collectedTxs;
|
|
4
|
+
constructor(missingTxHashes){
|
|
5
|
+
this.missingTxHashes = missingTxHashes;
|
|
6
|
+
this.collectedTxs = [];
|
|
7
|
+
}
|
|
8
|
+
static fromArray(hashes) {
|
|
9
|
+
return new MissingTxsTracker(new Set(hashes.map((hash)=>hash.toString())));
|
|
10
|
+
}
|
|
11
|
+
markFetched(tx) {
|
|
12
|
+
if (this.missingTxHashes.delete(tx.txHash.toString())) {
|
|
13
|
+
this.collectedTxs.push(tx);
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
get numberOfMissingTxs() {
|
|
19
|
+
return this.missingTxHashes.size;
|
|
20
|
+
}
|
|
21
|
+
allFetched() {
|
|
22
|
+
return this.numberOfMissingTxs === 0;
|
|
23
|
+
}
|
|
24
|
+
isMissing(txHash) {
|
|
25
|
+
return this.missingTxHashes.has(txHash.toString());
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -6,7 +6,7 @@ import type { BatchTxRequesterConfig } from '../reqresp/batch-tx-requester/confi
|
|
|
6
6
|
import type { BatchTxRequesterLibP2PService } from '../reqresp/batch-tx-requester/interface.js';
|
|
7
7
|
import type { IBatchRequestTxValidator } from '../reqresp/batch-tx-requester/tx_validator.js';
|
|
8
8
|
import { type BlockTxsSource } from '../reqresp/index.js';
|
|
9
|
-
import type {
|
|
9
|
+
import type { IMissingTxsTracker } from './missing_txs_tracker.js';
|
|
10
10
|
/**
|
|
11
11
|
* Strategy interface for collecting missing transactions for a block or proposal.
|
|
12
12
|
* Allows swapping between different tx collection implementations for benchmarking.
|
|
@@ -14,12 +14,13 @@ import type { IRequestTracker } from './request_tracker.js';
|
|
|
14
14
|
export interface MissingTxsCollector {
|
|
15
15
|
/**
|
|
16
16
|
* Collect missing transactions for a block or proposal.
|
|
17
|
-
* @param
|
|
17
|
+
* @param missingTxsTracker - The missing transactions tracker
|
|
18
18
|
* @param blockTxsSource - The block or proposal containing the transactions
|
|
19
19
|
* @param pinnedPeer - Optional peer expected to have the transactions
|
|
20
|
+
* @param timeoutMs - Timeout in milliseconds
|
|
20
21
|
* @returns The collected transactions
|
|
21
22
|
*/
|
|
22
|
-
collectTxs(
|
|
23
|
+
collectTxs(missingTxsTracker: IMissingTxsTracker, blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
|
|
23
24
|
}
|
|
24
25
|
/**
|
|
25
26
|
* Collects transactions using the BatchTxRequester implementation.
|
|
@@ -32,7 +33,7 @@ export declare class BatchTxRequesterCollector implements MissingTxsCollector {
|
|
|
32
33
|
private txValidator?;
|
|
33
34
|
private batchTxRequesterConfig?;
|
|
34
35
|
constructor(p2pService: BatchTxRequesterLibP2PService, log: Logger, dateProvider: DateProvider, txValidator?: IBatchRequestTxValidator | undefined, batchTxRequesterConfig?: Partial<BatchTxRequesterConfig> | undefined);
|
|
35
|
-
collectTxs(
|
|
36
|
+
collectTxs(missingTxsTracker: IMissingTxsTracker, blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
39
|
* Collects transactions using the sendBatchRequest implementation from ReqResp.
|
|
@@ -43,6 +44,6 @@ export declare class SendBatchRequestCollector implements MissingTxsCollector {
|
|
|
43
44
|
private maxPeers;
|
|
44
45
|
private maxRetryAttempts;
|
|
45
46
|
constructor(p2pService: BatchTxRequesterLibP2PService, maxPeers?: number, maxRetryAttempts?: number);
|
|
46
|
-
collectTxs(
|
|
47
|
+
collectTxs(missingTxsTracker: IMissingTxsTracker, _blockTxsSource: BlockTxsSource, pinnedPeer: PeerId | undefined, timeoutMs: number): Promise<Tx[]>;
|
|
47
48
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdHhfY29sbGVjdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdHhfY29sbGVjdGlvbi9wcm9wb3NhbF90eF9jb2xsZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN0RixPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hHLE9BQU8sS0FBSyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDOUYsT0FBTyxFQUFFLEtBQUssY0FBYyxFQUE0QyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BHLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFbkU7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLG1CQUFtQjtJQUNsQzs7Ozs7OztPQU9HO0lBQ0gsVUFBVSxDQUNSLGlCQUFpQixFQUFFLGtCQUFrQixFQUNyQyxjQUFjLEVBQUUsY0FBYyxFQUM5QixVQUFVLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDOUIsU0FBUyxFQUFFLE1BQU0sR0FDaEIsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Q0FDbEI7QUFFRDs7O0dBR0c7QUFDSCxxQkFBYSx5QkFBMEIsWUFBVyxtQkFBbUI7SUFFakUsT0FBTyxDQUFDLFVBQVU7SUFDbEIsT0FBTyxDQUFDLEdBQUc7SUFDWCxPQUFPLENBQUMsWUFBWTtJQUNwQixPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ3BCLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztJQUxqQyxZQUNVLFVBQVUsRUFBRSw2QkFBNkIsRUFDekMsR0FBRyxFQUFFLE1BQU0sRUFDWCxZQUFZLEVBQUUsWUFBWSxFQUMxQixXQUFXLENBQUMsc0NBQTBCLEVBQ3RDLHNCQUFzQixDQUFDLDZDQUFpQyxFQUM5RDtJQUVFLFVBQVUsQ0FDZCxpQkFBaUIsRUFBRSxrQkFBa0IsRUFDckMsY0FBYyxFQUFFLGNBQWMsRUFDOUIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFNBQVMsRUFBRSxNQUFNLEdBQ2hCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQTBCZjtDQUNGO0FBS0Q7OztHQUdHO0FBQ0gscUJBQWEseUJBQTBCLFlBQVcsbUJBQW1CO0lBRWpFLE9BQU8sQ0FBQyxVQUFVO0lBQ2xCLE9BQU8sQ0FBQyxRQUFRO0lBQ2hCLE9BQU8sQ0FBQyxnQkFBZ0I7SUFIMUIsWUFDVSxVQUFVLEVBQUUsNkJBQTZCLEVBQ3pDLFFBQVEsR0FBRSxNQUEwQixFQUNwQyxnQkFBZ0IsR0FBRSxNQUFtQyxFQUMzRDtJQUVFLFVBQVUsQ0FDZCxpQkFBaUIsRUFBRSxrQkFBa0IsRUFDckMsZUFBZSxFQUFFLGNBQWMsRUFDL0IsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFNBQVMsRUFBRSxNQUFNLEdBQ2hCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQVdmO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_tx_collector.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/proposal_tx_collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,EAAU,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,EAAE,KAAK,cAAc,EAA4C,MAAM,qBAAqB,CAAC;AACpG,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"proposal_tx_collector.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/proposal_tx_collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,EAAU,MAAM,kBAAkB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4CAA4C,CAAC;AAChG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,EAAE,KAAK,cAAc,EAA4C,MAAM,qBAAqB,CAAC;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;;OAOG;IACH,UAAU,CACR,iBAAiB,EAAE,kBAAkB,EACrC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IAEjE,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW,CAAC;IACpB,OAAO,CAAC,sBAAsB,CAAC;IALjC,YACU,UAAU,EAAE,6BAA6B,EACzC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,YAAY,EAC1B,WAAW,CAAC,sCAA0B,EACtC,sBAAsB,CAAC,6CAAiC,EAC9D;IAEE,UAAU,CACd,iBAAiB,EAAE,kBAAkB,EACrC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CA0Bf;CACF;AAKD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,mBAAmB;IAEjE,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IAH1B,YACU,UAAU,EAAE,6BAA6B,EACzC,QAAQ,GAAE,MAA0B,EACpC,gBAAgB,GAAE,MAAmC,EAC3D;IAEE,UAAU,CACd,iBAAiB,EAAE,kBAAkB,EACrC,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,EAAE,EAAE,CAAC,CAWf;CACF"}
|
|
@@ -17,9 +17,9 @@ import { ReqRespSubProtocol, chunkTxHashesRequest } from '../reqresp/index.js';
|
|
|
17
17
|
this.txValidator = txValidator;
|
|
18
18
|
this.batchTxRequesterConfig = batchTxRequesterConfig;
|
|
19
19
|
}
|
|
20
|
-
async collectTxs(
|
|
20
|
+
async collectTxs(missingTxsTracker, blockTxsSource, pinnedPeer, timeoutMs) {
|
|
21
21
|
const { batchTxRequesterSmartParallelWorkerCount: smartParallelWorkerCount, batchTxRequesterDumbParallelWorkerCount: dumbParallelWorkerCount, batchTxRequesterTxBatchSize: txBatchSize, batchTxRequesterBadPeerThreshold: badPeerThreshold } = this.batchTxRequesterConfig ?? {};
|
|
22
|
-
const batchRequester = new BatchTxRequester(
|
|
22
|
+
const batchRequester = new BatchTxRequester(missingTxsTracker, blockTxsSource, pinnedPeer, timeoutMs, this.p2pService, this.log, this.dateProvider, {
|
|
23
23
|
smartParallelWorkerCount,
|
|
24
24
|
dumbParallelWorkerCount,
|
|
25
25
|
txBatchSize,
|
|
@@ -43,8 +43,8 @@ const DEFAULT_MAX_RETRY_ATTEMPTS = 3;
|
|
|
43
43
|
this.maxPeers = maxPeers;
|
|
44
44
|
this.maxRetryAttempts = maxRetryAttempts;
|
|
45
45
|
}
|
|
46
|
-
async collectTxs(
|
|
47
|
-
const txs = await this.p2pService.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(Array.from(
|
|
46
|
+
async collectTxs(missingTxsTracker, _blockTxsSource, pinnedPeer, timeoutMs) {
|
|
47
|
+
const txs = await this.p2pService.reqResp.sendBatchRequest(ReqRespSubProtocol.TX, chunkTxHashesRequest(Array.from(missingTxsTracker.missingTxHashes).map(TxHash.fromString)), pinnedPeer, timeoutMs, this.maxPeers, this.maxRetryAttempts);
|
|
48
48
|
return txs.flat();
|
|
49
49
|
}
|
|
50
50
|
}
|
|
@@ -155,7 +155,7 @@ export class SlowTxCollection {
|
|
|
155
155
|
// is fast-collecting missing txs for proving an epoch, and still has the tx in the slow collection loops
|
|
156
156
|
// from mined unproven blocks it has seen in the past.
|
|
157
157
|
const fastRequests = this.fastCollection.getFastCollectionRequests();
|
|
158
|
-
const fastCollectionTxs = new Set(fastRequests.values().flatMap((r)=>Array.from(r.
|
|
158
|
+
const fastCollectionTxs = new Set(fastRequests.values().flatMap((r)=>Array.from(r.missingTxTracker.missingTxHashes)));
|
|
159
159
|
// Return all missing txs that are not in fastCollectionTxs and are ready for reqresp if requested
|
|
160
160
|
return Array.from(this.missingTxs.entries()).filter(([txHash, _])=>!fastCollectionTxs.has(txHash)).filter(([_, value])=>!opts.onlyReqRespReady || value.readyForReqResp);
|
|
161
161
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { type Logger } from '@aztec/foundation/log';
|
|
3
|
+
import { type PromiseWithResolvers } from '@aztec/foundation/promise';
|
|
3
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
5
|
import type { L2Block, L2BlockInfo } from '@aztec/stdlib/block';
|
|
5
6
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
@@ -14,7 +15,7 @@ import type { TxCollectionConfig } from './config.js';
|
|
|
14
15
|
import { FastTxCollection } from './fast_tx_collection.js';
|
|
15
16
|
import { FileStoreTxCollection } from './file_store_tx_collection.js';
|
|
16
17
|
import type { FileStoreTxSource } from './file_store_tx_source.js';
|
|
17
|
-
import type {
|
|
18
|
+
import type { IMissingTxsTracker } from './missing_txs_tracker.js';
|
|
18
19
|
import { SlowTxCollection } from './slow_tx_collection.js';
|
|
19
20
|
import type { TxSource } from './tx_source.js';
|
|
20
21
|
export type CollectionMethod = 'fast-req-resp' | 'fast-node-rpc' | 'slow-req-resp' | 'slow-node-rpc' | 'file-store';
|
|
@@ -33,8 +34,10 @@ export type FastCollectionRequestInput = {
|
|
|
33
34
|
blockNumber: BlockNumber;
|
|
34
35
|
};
|
|
35
36
|
export type FastCollectionRequest = FastCollectionRequestInput & {
|
|
36
|
-
|
|
37
|
+
missingTxTracker: IMissingTxsTracker;
|
|
38
|
+
deadline: Date;
|
|
37
39
|
blockInfo: L2BlockInfo;
|
|
40
|
+
promise: PromiseWithResolvers<void>;
|
|
38
41
|
};
|
|
39
42
|
/**
|
|
40
43
|
* Coordinates tx collection from remote RPC nodes and reqresp.
|
|
@@ -117,4 +120,4 @@ export declare class TxCollection {
|
|
|
117
120
|
stopCollectingForBlocksAfter(blockNumber: BlockNumber): void;
|
|
118
121
|
private reconcileFoundTxsWithPool;
|
|
119
122
|
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfY29sbGVjdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3R4X2NvbGxlY3Rpb24vdHhfY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxLQUFLLG9CQUFvQixFQUFrQixNQUFNLDJCQUEyQixDQUFDO0FBRXRGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssZUFBZSxFQUFzQixNQUFNLHlCQUF5QixDQUFDO0FBRW5GLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN6RixPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2hHLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzNELE9BQU8sRUFBRSxxQkFBcUIs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"tx_collection.d.ts","sourceRoot":"","sources":["../../../src/services/tx_collection/tx_collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,4 +60,4 @@ export declare function makeTestP2PClients(numberOfPeers: number, testConfig: Ma
|
|
|
60
60
|
enr: string;
|
|
61
61
|
}[]>;
|
|
62
62
|
export declare function startTestP2PClients(clients: P2PClient[]): Promise<void>;
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZS10ZXN0LXAycC1jbGllbnRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1oZWxwZXJzL21ha2UtdGVzdC1wMnAtY2xpZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFLbEUsT0FBTyxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUc5RSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDekYsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFJdEUsT0FBTyxFQUFFLEtBQUssb0JBQW9CLEVBQWtDLE1BQU0sa0JBQWtCLENBQUM7QUFHN0YsTUFBTSxXQUFXLHdCQUF3QjtJQUN2QyxtQkFBbUIsRUFBRSxlQUFlLENBQUM7SUFDckMsVUFBVSxFQUFFLFFBQVEsQ0FBQztJQUNyQixjQUFjLEVBQUUsVUFBVSxDQUFDO0lBQzNCLGNBQWMsRUFBRSxzQkFBc0IsQ0FBQztJQUN2QyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQztJQUM3QixhQUFhLEVBQUUsU0FBUyxDQUFDO0lBQ3pCLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNoQixvQkFBb0IsQ0FBQyxFQUFFLG9CQUFvQixDQUFDO0NBQzdDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILHdCQUFzQix5QkFBeUIsQ0FDN0MsZ0JBQWdCLEVBQUUsTUFBTSxFQUN4QixJQUFJLEVBQUUsTUFBTSxFQUNaLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFDZixPQUFPLEVBQUUsd0JBQXdCLHNCQU1sQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCx3QkFBc0IsaUJBQWlCLENBQ3JDLGdCQUFnQixFQUFFLE1BQU0sRUFDeEIsSUFBSSxFQUFFLE1BQU0sRUFDWixLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQ2YsRUFDRSxrQkFBeUIsRUFDekIsYUFBYSxFQUNiLGtCQUF1QixFQUN2QixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLE1BQXdDLEVBQ3pDLEVBQUUsd0JBQXdCLHNCQTBDNUI7QUFFRDs7Ozs7R0FLRztBQUNILHdCQUFzQiwwQkFBMEIsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSx3QkFBd0I7Ozs7O0tBdUMzRztBQUVEOzs7OztHQUtHO0FBQ0gsd0JBQXNCLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLHdCQUF3Qjs7Ozs7S0FnQ25HO0FBRUQsd0JBQXNCLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBRzdEIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-test-p2p-clients.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-test-p2p-clients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"make-test-p2p-clients.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-test-p2p-clients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAKlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAG9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAItE,OAAO,EAAE,KAAK,oBAAoB,EAAkC,MAAM,kBAAkB,CAAC;AAG7F,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,eAAe,CAAC;IACrC,UAAU,EAAE,QAAQ,CAAC;IACrB,cAAc,EAAE,UAAU,CAAC;IAC3B,cAAc,EAAE,sBAAsB,CAAC;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,SAAS,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,wBAAwB,sBAMlC;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,EACE,kBAAyB,EACzB,aAAa,EACb,kBAAuB,EACvB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,MAAwC,EACzC,EAAE,wBAAwB,sBA0C5B;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB;;;;;KAuC3G;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB;;;;;KAgCnG;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,iBAG7D"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { GossipsubEvents, GossipsubMessage } from '@chainsafe/libp2p-gossipsub';
|
|
2
2
|
import type { MsgIdStr, PeerIdStr, PublishOpts, TopicStr } from '@chainsafe/libp2p-gossipsub/types';
|
|
3
3
|
import { type Libp2pStatus, type PeerId, type PublishResult, type TopicValidatorResult, TypedEventEmitter } from '@libp2p/interface';
|
|
4
|
-
import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
|
|
5
4
|
import { LibP2PService } from '../services/index.js';
|
|
6
5
|
import type { P2PReqRespConfig } from '../services/reqresp/config.js';
|
|
7
6
|
import type { ConnectionSampler } from '../services/reqresp/connection-sampler/connection_sampler.js';
|
|
@@ -47,10 +46,6 @@ export declare class MockPubSub implements PubSubLibp2p {
|
|
|
47
46
|
pubsub: Pick<import("@chainsafe/libp2p-gossipsub").GossipSub, "addEventListener" | "direct" | "getMeshPeers" | "publish" | "removeEventListener" | "reportMessageValidationResult" | "subscribe"> & {
|
|
48
47
|
score: Pick<import("@chainsafe/libp2p-gossipsub/score").PeerScore, "score">;
|
|
49
48
|
};
|
|
50
|
-
components: {
|
|
51
|
-
addressManager: AddressManager;
|
|
52
|
-
connectionManager: ConnectionManager;
|
|
53
|
-
};
|
|
54
49
|
};
|
|
55
50
|
start(): void | Promise<void>;
|
|
56
51
|
stop(): void | Promise<void>;
|
|
@@ -87,4 +82,4 @@ export declare class MockGossipSubNetwork {
|
|
|
87
82
|
publishToPeers(topic: TopicStr, data: Uint8Array, sender: PeerId): void;
|
|
88
83
|
}
|
|
89
84
|
export {};
|
|
90
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9jay1wdWJzdWIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0LWhlbHBlcnMvbW9jay1wdWJzdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckYsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEcsT0FBTyxFQUNMLEtBQUssWUFBWSxFQUNqQixLQUFLLE1BQU0sRUFDWCxLQUFLLGFBQWEsRUFDbEIsS0FBSyxvQkFBb0IsRUFDekIsaUJBQWlCLEVBQ2xCLE1BQU0sbUJBQW1CLENBQUM7QUFJM0IsT0FBTyxFQUErQyxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRyxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdEcsT0FBTyxFQUNMLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUssZUFBZSxFQUNwQixLQUFLLGtCQUFrQixFQUN2QixLQUFLLHlCQUF5QixFQUM5QixLQUFLLDBCQUEwQixFQUMvQixLQUFLLDRCQUE0QixFQUNqQyxLQUFLLGNBQWMsRUFFcEIsTUFBTSxrQ0FBa0MsQ0FBQztBQUcxQyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFL0MsS0FBSyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFM0Q7OztHQUdHO0FBQ0gsd0JBQWdCLDhCQUE4QixDQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEdBQzVCLENBQUMsR0FBRyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxhQUFhLENBQUMsQ0FB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
|