@aztec/p2p 0.0.1-commit.993d240 → 0.0.1-commit.9a89641
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 +7 -6
- package/dest/bootstrap/bootstrap.d.ts +1 -1
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +20 -12
- package/dest/client/factory.d.ts +2 -2
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +10 -5
- package/dest/client/interface.d.ts +40 -9
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +23 -12
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +38 -35
- package/dest/config.d.ts +19 -13
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +27 -26
- package/dest/errors/reqresp.error.d.ts +13 -1
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +14 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -2
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +9 -2
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +43 -0
- package/dest/mem_pools/instrumentation.d.ts +9 -4
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +11 -8
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +1 -5
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +1 -7
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool_v2/deleted_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/deleted_pool.js +6 -6
- 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 +3 -3
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.js +3 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +3 -4
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +4 -5
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +6 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +30 -5
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.js +2 -1
- package/dest/mem_pools/tx_pool_v2/tx_pool_indices.d.ts +15 -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 +31 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +9 -3
- 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 +19 -8
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +17 -4
- 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 +133 -34
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +6 -5
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +24 -26
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -4
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +4 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +2 -2
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +4 -3
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +8 -2
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +19 -5
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +66 -30
- package/dest/msg_validators/tx_validator/factory.d.ts +9 -11
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +15 -6
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +12 -7
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +15 -15
- package/dest/msg_validators/tx_validator/phases_validator.js +2 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.js +1 -1
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts +2 -2
- package/dest/msg_validators/tx_validator/tx_validation_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_validation_cache.js +6 -7
- package/dest/services/discv5/discV5_service.d.ts +12 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +84 -15
- package/dest/services/discv5/persisted_enr_store.d.ts +38 -0
- package/dest/services/discv5/persisted_enr_store.d.ts.map +1 -0
- package/dest/services/discv5/persisted_enr_store.js +145 -0
- package/dest/services/dummy_service.d.ts +6 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +3 -0
- package/dest/services/encoding.d.ts +19 -6
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +25 -15
- package/dest/services/gossipsub/topic_score_params.d.ts +6 -23
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +4 -31
- package/dest/services/libp2p/libp2p_service.d.ts +12 -3
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +204 -114
- package/dest/services/peer-manager/peer_manager.d.ts +15 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +46 -18
- package/dest/services/peer-manager/peer_scoring.d.ts +28 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +70 -3
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -8
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +21 -39
- package/dest/services/reqresp/config.d.ts +13 -1
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/config.js +11 -0
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +4 -3
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +3 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +29 -28
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +12 -7
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +42 -24
- package/dest/services/reqresp/rate-limiter/rate_limits.js +3 -3
- 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 +34 -3
- package/dest/services/service.d.ts +21 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.d.ts +1 -1
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +4 -1
- package/dest/test-helpers/testbench-utils.d.ts +4 -1
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +11 -3
- package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +19 -2
- package/package.json +15 -17
- package/src/bootstrap/bootstrap.ts +15 -9
- package/src/client/factory.ts +9 -5
- package/src/client/interface.ts +33 -7
- package/src/client/p2p_client.ts +46 -48
- package/src/config.ts +50 -38
- package/src/errors/reqresp.error.ts +19 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +12 -2
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +40 -1
- package/src/mem_pools/instrumentation.ts +13 -11
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +1 -9
- package/src/mem_pools/tx_pool_v2/deleted_pool.ts +7 -7
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +2 -4
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +3 -2
- package/src/mem_pools/tx_pool_v2/eviction/insufficient_fee_per_gas_eviction_rule.ts +3 -1
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +1 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +2 -4
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +5 -6
- package/src/mem_pools/tx_pool_v2/interfaces.ts +28 -4
- package/src/mem_pools/tx_pool_v2/tx_pool_indices.ts +35 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +22 -8
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +158 -33
- package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -26
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -3
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +4 -2
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +10 -2
- package/src/msg_validators/proposal_validator/proposal_validator.ts +69 -30
- package/src/msg_validators/tx_validator/README.md +2 -0
- package/src/msg_validators/tx_validator/factory.ts +19 -13
- package/src/msg_validators/tx_validator/gas_validator.ts +16 -20
- package/src/msg_validators/tx_validator/phases_validator.ts +2 -2
- package/src/msg_validators/tx_validator/timestamp_validator.ts +1 -1
- package/src/msg_validators/tx_validator/tx_validation_cache.ts +6 -7
- package/src/services/discv5/discV5_service.ts +88 -9
- package/src/services/discv5/persisted_enr_store.ts +158 -0
- package/src/services/dummy_service.ts +6 -0
- package/src/services/encoding.ts +28 -20
- package/src/services/gossipsub/README.md +33 -11
- package/src/services/gossipsub/topic_score_params.ts +9 -50
- package/src/services/libp2p/libp2p_service.ts +234 -125
- package/src/services/peer-manager/peer_manager.ts +48 -17
- package/src/services/peer-manager/peer_scoring.ts +75 -3
- package/src/services/reqresp/README.md +2 -23
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +21 -45
- package/src/services/reqresp/config.ts +17 -0
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +3 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +33 -31
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +47 -20
- package/src/services/reqresp/rate-limiter/rate_limits.ts +3 -3
- package/src/services/reqresp/reqresp.ts +42 -2
- package/src/services/service.ts +23 -0
- package/src/services/tx_collection/tx_source.ts +2 -1
- package/src/test-helpers/testbench-utils.ts +13 -2
- package/src/testbench/p2p_client_testbench_worker.ts +22 -2
- package/dest/msg_validators/clock_tolerance.d.ts +0 -32
- package/dest/msg_validators/clock_tolerance.d.ts.map +0 -1
- package/dest/msg_validators/clock_tolerance.js +0 -95
- package/src/msg_validators/clock_tolerance.ts +0 -127
|
@@ -129,7 +129,20 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
129
129
|
shouldDisableP2PGossip(peerId: string): boolean;
|
|
130
130
|
getPeers(includePending?: boolean): PeerInfo[];
|
|
131
131
|
isAuthenticatedPeer(peerId: PeerId): boolean;
|
|
132
|
-
|
|
132
|
+
/**
|
|
133
|
+
* Whether a peer is allowed to connect, given its peer id. Rejects peers serving an active ban and
|
|
134
|
+
* peers that have exceeded the failed auth-handshake limit. Use this once the peer id is known —
|
|
135
|
+
* i.e. for the encrypted-inbound gater and when dialing.
|
|
136
|
+
*/
|
|
137
|
+
isPeerAllowedToConnect(peerId: string | PeerId): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Whether a connection from an address is allowed. Bans are keyed by peer id, which isn't known at
|
|
140
|
+
* the raw-inbound layer, so only the failed auth-handshake limit (also tracked per address) is
|
|
141
|
+
* enforced here; the ban is applied once the peer id is known via {@link isPeerAllowedToConnect}.
|
|
142
|
+
*/
|
|
143
|
+
isAddressAllowedToConnect(address: string): boolean;
|
|
144
|
+
/** Whether the failed auth-handshake count for a peer id or address is below the configured limit. */
|
|
145
|
+
private isWithinFailedAuthLimit;
|
|
133
146
|
/**
|
|
134
147
|
* Discovers peers.
|
|
135
148
|
*/
|
|
@@ -175,4 +188,4 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
175
188
|
handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
176
189
|
private updateAuthenticatedPeers;
|
|
177
190
|
}
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
191
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { compactArray } from '@aztec/foundation/collection';
|
|
1
2
|
import { makeEthSignDigest, tryRecoverAddress } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
@@ -127,6 +128,7 @@ export class PeerManager {
|
|
|
127
128
|
async heartbeat() {
|
|
128
129
|
this.heartbeatCounter++;
|
|
129
130
|
this.peerScoring.decayAllScores();
|
|
131
|
+
this.peerScoring.pruneExpiredBans();
|
|
130
132
|
this.cleanupExpiredTimeouts();
|
|
131
133
|
await this.setupDirectPeersIfValidator();
|
|
132
134
|
await this.updateAuthenticatedPeers();
|
|
@@ -150,19 +152,27 @@ export class PeerManager {
|
|
|
150
152
|
}
|
|
151
153
|
const preferredPeersEnrs = this.config.preferredPeers.map((enr)=>ENR.decodeTxt(enr));
|
|
152
154
|
await Promise.all(preferredPeersEnrs.map((enr)=>enr.peerId())).then((peerIds)=>peerIds.forEach((peerId)=>this.preferredPeers.add(peerId.toString()))).catch((e)=>this.logger.error('Error initializing preferred peers', e));
|
|
153
|
-
const directPeers = (await Promise.all(preferredPeersEnrs.map(async (enr)=>{
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
155
|
+
const directPeers = compactArray(await Promise.all(preferredPeersEnrs.map(async (enr)=>{
|
|
156
|
+
try {
|
|
157
|
+
const peerId = await enr.peerId();
|
|
158
|
+
const address = enr.getLocationMultiaddr('tcp');
|
|
159
|
+
if (address === undefined) {
|
|
160
|
+
throw new Error(`Direct peer ${peerId.toString()} has no TCP address, ENR: ${enr.encodeTxt()}`);
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
id: peerId,
|
|
164
|
+
addrs: [
|
|
165
|
+
address
|
|
166
|
+
]
|
|
167
|
+
};
|
|
168
|
+
} catch (err) {
|
|
169
|
+
// A malformed configured ENR shouldn't abort preferred-peer setup — skip it and log.
|
|
170
|
+
this.logger.warn(`Skipping preferred peer with invalid ENR`, {
|
|
171
|
+
err
|
|
172
|
+
});
|
|
173
|
+
return undefined;
|
|
158
174
|
}
|
|
159
|
-
|
|
160
|
-
id: peerId,
|
|
161
|
-
addrs: [
|
|
162
|
-
address
|
|
163
|
-
]
|
|
164
|
-
};
|
|
165
|
-
}))).filter((peer)=>peer !== undefined);
|
|
175
|
+
})));
|
|
166
176
|
await Promise.all(directPeers.map((peer)=>{
|
|
167
177
|
this.libP2PNode.services.pubsub.direct.add(peer.id.toString());
|
|
168
178
|
return this.libP2PNode.peerStore.merge(peer.id, {
|
|
@@ -390,14 +400,32 @@ export class PeerManager {
|
|
|
390
400
|
* @param id: Address of the node or it's peerId
|
|
391
401
|
*
|
|
392
402
|
* @returns: True if node is allowed to connect, otherwise false
|
|
393
|
-
* */
|
|
394
|
-
|
|
403
|
+
* */ /**
|
|
404
|
+
* Whether a peer is allowed to connect, given its peer id. Rejects peers serving an active ban and
|
|
405
|
+
* peers that have exceeded the failed auth-handshake limit. Use this once the peer id is known —
|
|
406
|
+
* i.e. for the encrypted-inbound gater and when dialing.
|
|
407
|
+
*/ isPeerAllowedToConnect(peerId) {
|
|
408
|
+
const id = peerId.toString();
|
|
409
|
+
if (this.peerScoring.getScoreState(id) === PeerScoreState.Banned) {
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
return this.isWithinFailedAuthLimit(id);
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Whether a connection from an address is allowed. Bans are keyed by peer id, which isn't known at
|
|
416
|
+
* the raw-inbound layer, so only the failed auth-handshake limit (also tracked per address) is
|
|
417
|
+
* enforced here; the ban is applied once the peer id is known via {@link isPeerAllowedToConnect}.
|
|
418
|
+
*/ isAddressAllowedToConnect(address) {
|
|
419
|
+
return this.isWithinFailedAuthLimit(address);
|
|
420
|
+
}
|
|
421
|
+
/** Whether the failed auth-handshake count for a peer id or address is below the configured limit. */ isWithinFailedAuthLimit(key) {
|
|
422
|
+
const entry = this.failedAuthHandshakes.get(key);
|
|
395
423
|
if (!entry) {
|
|
396
424
|
return true;
|
|
397
425
|
}
|
|
398
426
|
// In case entry is too old, remove it and allow connection
|
|
399
427
|
if (this.dateProvider.now() - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
400
|
-
this.failedAuthHandshakes.delete(
|
|
428
|
+
this.failedAuthHandshakes.delete(key);
|
|
401
429
|
return true;
|
|
402
430
|
}
|
|
403
431
|
return entry.count <= this.config.p2pMaxFailedAuthAttemptsAllowed;
|
|
@@ -572,9 +600,9 @@ export class PeerManager {
|
|
|
572
600
|
if (this.peerScoring.getScoreState(peerIdString) != PeerScoreState.Healthy) {
|
|
573
601
|
return;
|
|
574
602
|
}
|
|
575
|
-
// Don't dial peers that have exceeded the auth failure threshold
|
|
576
|
-
if (!this.
|
|
577
|
-
this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
|
|
603
|
+
// Don't dial banned peers or those that have exceeded the auth failure threshold
|
|
604
|
+
if (!this.isPeerAllowedToConnect(peerId)) {
|
|
605
|
+
this.logger.trace(`Skipping peer ${peerId} due to ban or failed auth handshake attempts`);
|
|
578
606
|
return;
|
|
579
607
|
}
|
|
580
608
|
const [multiaddrTcp] = await Promise.all([
|
|
@@ -19,13 +19,40 @@ export declare class PeerScoring {
|
|
|
19
19
|
[key in PeerErrorSeverity]: number;
|
|
20
20
|
};
|
|
21
21
|
private peerStateCounter;
|
|
22
|
+
/** Active bans, keyed by peer id. Held in memory only, so they are cleared on restart. */
|
|
23
|
+
private bannedPeers;
|
|
24
|
+
/**
|
|
25
|
+
* How long a peer remains banned once its score crosses MIN_SCORE_BEFORE_BAN. While banned, the
|
|
26
|
+
* peer's ban score is returned by getScore regardless of decay, so it cannot recover its way out
|
|
27
|
+
* of the ban early. After the ban expires the live (decayed) score takes over again.
|
|
28
|
+
*/
|
|
29
|
+
private readonly banDurationMs;
|
|
22
30
|
constructor(config: P2PConfig, telemetry?: TelemetryClient, dateProvider?: DateProvider);
|
|
23
31
|
penalizePeer(peerId: PeerId, penalty: PeerErrorSeverity): number;
|
|
24
32
|
updateScore(peerId: string, scoreDelta: number): number;
|
|
33
|
+
/**
|
|
34
|
+
* Records a ban for a peer whose score has crossed the ban threshold, with an expiry banDurationMs
|
|
35
|
+
* in the future. No-op if the score is above the threshold or the peer is already serving an active
|
|
36
|
+
* ban (an existing ban is not extended; the original window stands). A previously expired ban does
|
|
37
|
+
* not block a fresh one — getActiveBanScore prunes it first.
|
|
38
|
+
*/
|
|
39
|
+
private maybeBanPeer;
|
|
25
40
|
decayAllScores(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Removes bans whose window has elapsed. Expired bans are otherwise only pruned lazily when their
|
|
43
|
+
* peer's score is next queried, so a banned peer that disconnects and is never queried again would
|
|
44
|
+
* linger in the map. Called periodically (per heartbeat) to bound the ban map's size.
|
|
45
|
+
*/
|
|
46
|
+
pruneExpiredBans(): void;
|
|
26
47
|
/** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */
|
|
27
48
|
resetAllScores(): void;
|
|
28
49
|
removePeer(peerId: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* The single source of truth for whether a peer is banned. Returns the ban score while the ban is
|
|
52
|
+
* active, or undefined if the peer is not banned. A ban that has expired is lazily lifted before
|
|
53
|
+
* returning undefined, so callers never see a stale ban.
|
|
54
|
+
*/
|
|
55
|
+
private getActiveBanScore;
|
|
29
56
|
getScore(peerId: string): number;
|
|
30
57
|
getScoreState(peerId: string): PeerScoreState;
|
|
31
58
|
getStats(): {
|
|
@@ -35,4 +62,4 @@ export declare class PeerScoring {
|
|
|
35
62
|
bannedCount: number;
|
|
36
63
|
};
|
|
37
64
|
}
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9zY29yaW5nLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfc2NvcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUdMLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBdUJqRCxvQkFBWSxjQUFjO0lBQ3hCLE1BQU0sSUFBQTtJQUNOLFVBQVUsSUFBQTtJQUNWLE9BQU8sSUFBQTtDQUNSO0FBb0JELHFCQUFhLFdBQVc7SUFzQnBCLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWTtJQXJCL0IsT0FBTyxDQUFDLE1BQU0sQ0FBb0M7SUFDbEQsT0FBTyxDQUFDLE1BQU0sQ0FBa0M7SUFDaEQsT0FBTyxDQUFDLGNBQWMsQ0FBa0M7SUFDeEQsT0FBTyxDQUFDLGFBQWEsQ0FBYTtJQUNsQyxPQUFPLENBQUMsV0FBVyxDQUFPO0lBQzFCLGFBQWEsRUFBRTtTQUFHLEdBQUcsSUFBSSxpQkFBaUIsR0FBRyxNQUFNO0tBQUUsQ0FBQztJQUV0RCxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBRXhDLDBGQUEwRjtJQUMxRixPQUFPLENBQUMsV0FBVyxDQUFxQztJQUN4RDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQVM7SUFFdkMsWUFDRSxNQUFNLEVBQUUsU0FBUyxFQUNqQixTQUFTLEdBQUUsZUFBc0MsRUFDaEMsWUFBWSxHQUFFLFlBQWlDLEVBa0JqRTtJQUVNLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsVUFNN0Q7SUFFRCxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FvQnREO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPLENBQUMsWUFBWTtJQWFwQixjQUFjLElBQUksSUFBSSxDQWlCckI7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLElBQUksSUFBSSxDQU12QjtJQUVELHlGQUF5RjtJQUN6RixjQUFjLElBQUksSUFBSSxDQUlyQjtJQUVELFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLElBQUksQ0FHL0I7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLGlCQUFpQjtJQWF6QixRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLENBSS9CO0lBRU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsY0FBYyxDQVduRDtJQUVELFFBQVEsSUFBSTtRQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFBQyxZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQztRQUFDLFdBQVcsRUFBRSxNQUFNLENBQUE7S0FBRSxDQThCdEc7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer_scoring.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_scoring.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuBjD,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,UAAU,IAAA;IACV,OAAO,IAAA;CACR;
|
|
1
|
+
{"version":3,"file":"peer_scoring.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_scoring.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAuBjD,oBAAY,cAAc;IACxB,MAAM,IAAA;IACN,UAAU,IAAA;IACV,OAAO,IAAA;CACR;AAoBD,qBAAa,WAAW;IAsBpB,OAAO,CAAC,QAAQ,CAAC,YAAY;IArB/B,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,WAAW,CAAO;IAC1B,aAAa,EAAE;SAAG,GAAG,IAAI,iBAAiB,GAAG,MAAM;KAAE,CAAC;IAEtD,OAAO,CAAC,gBAAgB,CAAgB;IAExC,0FAA0F;IAC1F,OAAO,CAAC,WAAW,CAAqC;IACxD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,YACE,MAAM,EAAE,SAAS,EACjB,SAAS,GAAE,eAAsC,EAChC,YAAY,GAAE,YAAiC,EAkBjE;IAEM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,UAM7D;IAED,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoBtD;IAED;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB,cAAc,IAAI,IAAI,CAiBrB;IAED;;;;OAIG;IACH,gBAAgB,IAAI,IAAI,CAMvB;IAED,yFAAyF;IACzF,cAAc,IAAI,IAAI,CAIrB;IAED,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/B;IAED;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAazB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAI/B;IAEM,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAWnD;IAED,QAAQ,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CA8BtG;CACF"}
|
|
@@ -50,6 +50,12 @@ export class PeerScoring {
|
|
|
50
50
|
decayFactor;
|
|
51
51
|
peerPenalties;
|
|
52
52
|
peerStateCounter;
|
|
53
|
+
/** Active bans, keyed by peer id. Held in memory only, so they are cleared on restart. */ bannedPeers;
|
|
54
|
+
/**
|
|
55
|
+
* How long a peer remains banned once its score crosses MIN_SCORE_BEFORE_BAN. While banned, the
|
|
56
|
+
* peer's ban score is returned by getScore regardless of decay, so it cannot recover its way out
|
|
57
|
+
* of the ban early. After the ban expires the live (decayed) score takes over again.
|
|
58
|
+
*/ banDurationMs;
|
|
53
59
|
constructor(config, telemetry = getTelemetryClient(), dateProvider = new DateProvider()){
|
|
54
60
|
this.dateProvider = dateProvider;
|
|
55
61
|
this.logger = createLogger('p2p:peer-scoring');
|
|
@@ -57,6 +63,8 @@ export class PeerScoring {
|
|
|
57
63
|
this.lastUpdateTime = new Map();
|
|
58
64
|
this.decayInterval = 1000 * 60;
|
|
59
65
|
this.decayFactor = 0.9;
|
|
66
|
+
this.bannedPeers = new Map();
|
|
67
|
+
this.banDurationMs = config.peerBanDurationSeconds * 1000;
|
|
60
68
|
const orderedValues = config.peerPenaltyValues?.sort((a, b)=>a - b);
|
|
61
69
|
this.peerPenalties = {
|
|
62
70
|
[PeerErrorSeverity.HighToleranceError]: orderedValues?.[0] ?? DefaultPeerPenalties[PeerErrorSeverity.HighToleranceError],
|
|
@@ -91,8 +99,29 @@ export class PeerScoring {
|
|
|
91
99
|
currentScore += scoreDelta;
|
|
92
100
|
this.scores.set(peerId, currentScore);
|
|
93
101
|
this.lastUpdateTime.set(peerId, currentTime);
|
|
102
|
+
this.maybeBanPeer(peerId, currentScore);
|
|
94
103
|
return currentScore;
|
|
95
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Records a ban for a peer whose score has crossed the ban threshold, with an expiry banDurationMs
|
|
107
|
+
* in the future. No-op if the score is above the threshold or the peer is already serving an active
|
|
108
|
+
* ban (an existing ban is not extended; the original window stands). A previously expired ban does
|
|
109
|
+
* not block a fresh one — getActiveBanScore prunes it first.
|
|
110
|
+
*/ maybeBanPeer(peerId, score) {
|
|
111
|
+
if (score >= MIN_SCORE_BEFORE_BAN || this.getActiveBanScore(peerId) !== undefined) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const record = {
|
|
115
|
+
score,
|
|
116
|
+
expiry: this.dateProvider.now() + this.banDurationMs
|
|
117
|
+
};
|
|
118
|
+
this.bannedPeers.set(peerId, record);
|
|
119
|
+
this.logger.verbose(`Banning peer ${peerId} until ${new Date(record.expiry).toISOString()}`, {
|
|
120
|
+
peerId,
|
|
121
|
+
score,
|
|
122
|
+
expiry: record.expiry
|
|
123
|
+
});
|
|
124
|
+
}
|
|
96
125
|
decayAllScores() {
|
|
97
126
|
const currentTime = this.dateProvider.now();
|
|
98
127
|
for (const [peerId, lastUpdate] of this.lastUpdateTime.entries()){
|
|
@@ -111,19 +140,52 @@ export class PeerScoring {
|
|
|
111
140
|
}
|
|
112
141
|
}
|
|
113
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Removes bans whose window has elapsed. Expired bans are otherwise only pruned lazily when their
|
|
145
|
+
* peer's score is next queried, so a banned peer that disconnects and is never queried again would
|
|
146
|
+
* linger in the map. Called periodically (per heartbeat) to bound the ban map's size.
|
|
147
|
+
*/ pruneExpiredBans() {
|
|
148
|
+
const now = this.dateProvider.now();
|
|
149
|
+
const expired = [
|
|
150
|
+
...this.bannedPeers.entries()
|
|
151
|
+
].filter(([, ban])=>ban.expiry <= now).map(([peerId])=>peerId);
|
|
152
|
+
for (const peerId of expired){
|
|
153
|
+
this.bannedPeers.delete(peerId);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
114
156
|
/** Resets all peer scores. Useful for benchmarks to prevent cross-case contamination. */ resetAllScores() {
|
|
115
157
|
this.scores.clear();
|
|
116
158
|
this.lastUpdateTime.clear();
|
|
159
|
+
this.bannedPeers.clear();
|
|
117
160
|
}
|
|
118
161
|
removePeer(peerId) {
|
|
119
162
|
this.scores.delete(peerId);
|
|
120
163
|
this.lastUpdateTime.delete(peerId);
|
|
121
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* The single source of truth for whether a peer is banned. Returns the ban score while the ban is
|
|
167
|
+
* active, or undefined if the peer is not banned. A ban that has expired is lazily lifted before
|
|
168
|
+
* returning undefined, so callers never see a stale ban.
|
|
169
|
+
*/ getActiveBanScore(peerId) {
|
|
170
|
+
const ban = this.bannedPeers.get(peerId);
|
|
171
|
+
if (ban === undefined) {
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
if (ban.expiry > this.dateProvider.now()) {
|
|
175
|
+
return ban.score;
|
|
176
|
+
}
|
|
177
|
+
// Ban expired: lift it so the peer can recover.
|
|
178
|
+
this.bannedPeers.delete(peerId);
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
122
181
|
getScore(peerId) {
|
|
123
|
-
|
|
182
|
+
// While a ban is active its ban score is returned regardless of how the live score has decayed,
|
|
183
|
+
// so the peer stays banned for the full duration.
|
|
184
|
+
return this.getActiveBanScore(peerId) ?? this.scores.get(peerId) ?? 0;
|
|
124
185
|
}
|
|
125
186
|
getScoreState(peerId) {
|
|
126
|
-
//
|
|
187
|
+
// A banned peer stays banned for the full ban duration regardless of score decay (see getScore /
|
|
188
|
+
// maybeBanPeer), rather than silently recovering once its decayed score is cleaned up.
|
|
127
189
|
const score = this.getScore(peerId);
|
|
128
190
|
if (score < MIN_SCORE_BEFORE_BAN) {
|
|
129
191
|
return 0;
|
|
@@ -139,7 +201,12 @@ export class PeerScoring {
|
|
|
139
201
|
disconnect: 0,
|
|
140
202
|
banned: 0
|
|
141
203
|
};
|
|
142
|
-
|
|
204
|
+
// Include banned peers whose live score may have been decayed away but whose ban is still active.
|
|
205
|
+
const peerIds = new Set([
|
|
206
|
+
...this.scores.keys(),
|
|
207
|
+
...this.bannedPeers.keys()
|
|
208
|
+
]);
|
|
209
|
+
for (const peerId of peerIds){
|
|
143
210
|
const state = this.getScoreState(peerId);
|
|
144
211
|
switch(state){
|
|
145
212
|
case 2:
|
|
@@ -33,13 +33,6 @@ export declare class BatchTxRequester {
|
|
|
33
33
|
private handleSuccessResponseFromPeer;
|
|
34
34
|
private handleReceivedTxs;
|
|
35
35
|
private decideIfPeerIsSmart;
|
|
36
|
-
/**
|
|
37
|
-
* Handles an archive root mismatch between local state and peer response.
|
|
38
|
-
*
|
|
39
|
-
* - Response archive is Fr.ZERO (peer pruned proposal, legitimate): marks peer dumb.
|
|
40
|
-
* - Non-zero archive mismatch (malicious response): penalises + marks dumb.
|
|
41
|
-
*/
|
|
42
|
-
private handleArchiveRootMismatch;
|
|
43
36
|
private peerHasSomeTxsWeAreMissing;
|
|
44
37
|
private markTxsPeerHas;
|
|
45
38
|
private extractHashesPeerHasFromResponse;
|
|
@@ -48,4 +41,4 @@ export declare class BatchTxRequester {
|
|
|
48
41
|
private unlockSmartRequesterSemaphores;
|
|
49
42
|
private sleepClampedToDeadline;
|
|
50
43
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdHhfcmVxdWVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9iYXRjaC10eC1yZXF1ZXN0ZXIvYmF0Y2hfdHhfcmVxdWVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUdsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLEVBQUUsRUFBcUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdoRCxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUU5RSxPQUFPLEVBQXFDLEtBQUssY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFRakcsT0FBTyxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsdUJBQXVCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7QUFzQnBILHFCQUFhLGdCQUFnQjtJQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBa0I7SUFDakQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQWlCO0lBQ2hELE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFxQjtJQUNoRCxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBZ0M7SUFDM0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQVM7SUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQTBCO0lBQy9DLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFrQjtJQUN4QyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBd0I7SUFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBYTtJQUNyRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBc0I7SUFDOUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQWM7SUFDMUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBUztJQUNsRCxPQUFPLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFTO0lBQ2pELE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFTO0lBRXJDLFlBQ0UsY0FBYyxFQUFFLGVBQWUsRUFDL0IsY0FBYyxFQUFFLGNBQWMsRUFDOUIsVUFBVSxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzlCLFVBQVUsRUFBRSw2QkFBNkIsRUFDekMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNmLFlBQVksQ0FBQyxFQUFFLFlBQVksRUFDM0IsSUFBSSxDQUFDLEVBQUUsdUJBQXVCLEVBK0IvQjtJQUthLEdBQUcsSUFBSSxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBbUMvRDtJQUtELE9BQW9CLGFBQWEsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQVN2RztZQVVhLG1CQUFtQjtZQWtEbkIsYUFBYTtZQWtEYixjQUFjO1lBZ0RkLGNBQWM7WUErQmQsZUFBZTtZQTRFZixjQUFjO0lBNkM1QixPQUFPLENBQUMsMEJBQTBCO1lBc0JwQiw2QkFBNkI7WUFZN0IsaUJBQWlCO0lBd0QvQixPQUFPLENBQUMsbUJBQW1CO0lBZ0MzQixPQUFPLENBQUMsMEJBQTBCO0lBUWxDLE9BQU8sQ0FBQyxjQUFjO0lBTXRCLE9BQU8sQ0FBQyxnQ0FBZ0M7SUFVeEMsT0FBTyxDQUFDLHFCQUFxQjtJQXdCN0IsT0FBTyxDQUFDLFVBQVU7SUFZbEIsT0FBTyxDQUFDLDhCQUE4QjtZQVV4QixzQkFBc0I7Q0FNckMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAqC,MAAM,kBAAkB,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"batch_tx_requester.d.ts","sourceRoot":"","sources":["../../../../src/services/reqresp/batch-tx-requester/batch_tx_requester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,EAAE,EAAqC,MAAM,kBAAkB,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAqC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,uBAAuB,EAAyB,MAAM,gBAAgB,CAAC;AAsBpH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IACpD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAa;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAClD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,YACE,cAAc,EAAE,eAAe,EAC/B,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,6BAA6B,EACzC,MAAM,CAAC,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,YAAY,EAC3B,IAAI,CAAC,EAAE,uBAAuB,EA+B/B;IAKa,GAAG,IAAI,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,CAmC/D;IAKD,OAAoB,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CASvG;YAUa,mBAAmB;YAkDnB,aAAa;YAkDb,cAAc;YAgDd,cAAc;YA+Bd,eAAe;YA4Ef,cAAc;IA6C5B,OAAO,CAAC,0BAA0B;YAsBpB,6BAA6B;YAY7B,iBAAiB;IAwD/B,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gCAAgC;IAUxC,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,8BAA8B;YAUxB,sBAAsB;CAMrC"}
|
|
@@ -5,6 +5,7 @@ import { sleep } from '@aztec/foundation/sleep';
|
|
|
5
5
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
6
6
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
7
7
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
8
|
+
import { strict as assert } from 'assert';
|
|
8
9
|
import { ReqRespSubProtocol } from '.././interface.js';
|
|
9
10
|
import { BlockTxsRequest, BlockTxsResponse } from '.././protocols/index.js';
|
|
10
11
|
import { ReqRespStatus } from '.././status.js';
|
|
@@ -367,22 +368,19 @@ import { createBatchRequestTxValidator } from './tx_validator.js';
|
|
|
367
368
|
* - FAILURE and UNKNOWN: We penalise this, if peer has been penalised this way N times they are not queried again
|
|
368
369
|
* this implies we will query these peers couple of more times and give them a chance to "redeem" themselves before completely ignoring them
|
|
369
370
|
*/ handleFailResponseFromPeer(peerId, responseStatus) {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
}
|
|
384
|
-
if (responseStatus === ReqRespStatus.RATE_LIMIT_EXCEEDED) {
|
|
385
|
-
this.peers.markPeerRateLimitExceeded(peerId);
|
|
371
|
+
switch(responseStatus){
|
|
372
|
+
case ReqRespStatus.RATE_LIMIT_EXCEEDED:
|
|
373
|
+
this.peers.markPeerRateLimitExceeded(peerId);
|
|
374
|
+
return;
|
|
375
|
+
case ReqRespStatus.INTERNAL_ERROR:
|
|
376
|
+
this.peers.markPeerDumb(peerId);
|
|
377
|
+
this.txsMetadata.clearPeerData(peerId);
|
|
378
|
+
return;
|
|
379
|
+
default:
|
|
380
|
+
this.peers.penalisePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
381
|
+
this.peers.markPeerDumb(peerId);
|
|
382
|
+
this.txsMetadata.clearPeerData(peerId);
|
|
383
|
+
return;
|
|
386
384
|
}
|
|
387
385
|
}
|
|
388
386
|
/*
|
|
@@ -450,9 +448,10 @@ import { createBatchRequestTxValidator } from './tx_validator.js';
|
|
|
450
448
|
if (smartPeersAreDisabled) {
|
|
451
449
|
return;
|
|
452
450
|
}
|
|
453
|
-
|
|
454
|
-
if (
|
|
455
|
-
this.
|
|
451
|
+
// If the peer doesn't have the block, we mark them as dumb.
|
|
452
|
+
if (!response.peerHasBlock()) {
|
|
453
|
+
this.peers.markPeerDumb(peerId);
|
|
454
|
+
this.txsMetadata.clearPeerData(peerId);
|
|
456
455
|
return;
|
|
457
456
|
}
|
|
458
457
|
// We mark peer as "smart" only if they have some txs we are missing
|
|
@@ -466,18 +465,6 @@ import { createBatchRequestTxValidator } from './tx_validator.js';
|
|
|
466
465
|
// Unblock smart workers
|
|
467
466
|
this.smartRequesterSemaphore.release();
|
|
468
467
|
}
|
|
469
|
-
/**
|
|
470
|
-
* Handles an archive root mismatch between local state and peer response.
|
|
471
|
-
*
|
|
472
|
-
* - Response archive is Fr.ZERO (peer pruned proposal, legitimate): marks peer dumb.
|
|
473
|
-
* - Non-zero archive mismatch (malicious response): penalises + marks dumb.
|
|
474
|
-
*/ handleArchiveRootMismatch(peerId, response) {
|
|
475
|
-
if (!response.archiveRoot.isZero()) {
|
|
476
|
-
this.peers.penalisePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
477
|
-
}
|
|
478
|
-
this.peers.markPeerDumb(peerId);
|
|
479
|
-
this.txsMetadata.clearPeerData(peerId);
|
|
480
|
-
}
|
|
481
468
|
peerHasSomeTxsWeAreMissing(_peerId, response) {
|
|
482
469
|
if (response.txIndices.isEmpty()) {
|
|
483
470
|
return false;
|
|
@@ -491,14 +478,9 @@ import { createBatchRequestTxValidator } from './tx_validator.js';
|
|
|
491
478
|
this.txsMetadata.markPeerHas(peerId, txsPeerHas);
|
|
492
479
|
}
|
|
493
480
|
extractHashesPeerHasFromResponse(response) {
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
if (indicesOfHashesPeerHas.has(idx)) {
|
|
498
|
-
hashes.push(hash);
|
|
499
|
-
}
|
|
500
|
-
});
|
|
501
|
-
return hashes;
|
|
481
|
+
// Should already have been validated, but just in case.
|
|
482
|
+
assert(response.txIndices.getLength() === this.blockTxsSource.txHashes.length);
|
|
483
|
+
return response.txIndices.getTrueIndices().map((idx)=>this.blockTxsSource.txHashes[idx]);
|
|
502
484
|
}
|
|
503
485
|
/*
|
|
504
486
|
* Helper function to crate round robin indexer -
|
|
@@ -3,6 +3,18 @@ export declare const DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS = 10000;
|
|
|
3
3
|
export declare const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 10000;
|
|
4
4
|
export declare const DEFAULT_REQRESP_DIAL_TIMEOUT_MS = 5000;
|
|
5
5
|
export declare const DEFAULT_OPTIMISTIC_NEGOTIATION = false;
|
|
6
|
+
/**
|
|
7
|
+
* Max size of a yamux frame, header included. This is the library default, pinned explicitly when configuring the
|
|
8
|
+
* muxer in the libp2p service so a dependency upgrade cannot silently change it.
|
|
9
|
+
*/
|
|
10
|
+
export declare const YAMUX_MAX_MESSAGE_SIZE_BYTES: number;
|
|
11
|
+
/**
|
|
12
|
+
* Max size of a reqresp request payload. A request must fit in a single muxer frame: the responder never reassembles
|
|
13
|
+
* a request from multiple chunks (see `ReqResp.processStream`), and yamux splits writes larger than one frame into
|
|
14
|
+
* multiple frames, each of which arrives as a separate chunk. mplex only splits at 1 MiB, so yamux is the binding
|
|
15
|
+
* constraint.
|
|
16
|
+
*/
|
|
17
|
+
export declare const MAX_REQRESP_REQUEST_SIZE_BYTES: number;
|
|
6
18
|
export declare const DEFAULT_P2P_REQRESP_CONFIG: P2PReqRespConfig;
|
|
7
19
|
export interface P2PReqRespConfig {
|
|
8
20
|
/** The overall timeout for a request response operation. */
|
|
@@ -15,4 +27,4 @@ export interface P2PReqRespConfig {
|
|
|
15
27
|
dialTimeoutMs: number;
|
|
16
28
|
}
|
|
17
29
|
export declare const p2pReqRespConfigMappings: ConfigMappingsType<P2PReqRespConfig>;
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssa0JBQWtCLEVBQTJDLE1BQU0sMEJBQTBCLENBQUM7QUFFNUcsZUFBTyxNQUFNLHFDQUFxQyxRQUFTLENBQUM7QUFDNUQsZUFBTyxNQUFNLGtDQUFrQyxRQUFTLENBQUM7QUFDekQsZUFBTyxNQUFNLCtCQUErQixPQUFRLENBQUM7QUFDckQsZUFBTyxNQUFNLDhCQUE4QixRQUFRLENBQUM7QUFFcEQ7OztHQUdHO0FBQ0gsZUFBTyxNQUFNLDRCQUE0QixRQUFZLENBQUM7QUFLdEQ7Ozs7O0dBS0c7QUFDSCxlQUFPLE1BQU0sOEJBQThCLFFBQTJELENBQUM7QUFHdkcsZUFBTyxNQUFNLDBCQUEwQixFQUFFLGdCQUt4QyxDQUFDO0FBRUYsTUFBTSxXQUFXLGdCQUFnQjtJQUMvQiw0REFBNEQ7SUFDNUQsdUJBQXVCLEVBQUUsTUFBTSxDQUFDO0lBRWhDLHVFQUF1RTtJQUN2RSwwQkFBMEIsRUFBRSxNQUFNLENBQUM7SUFFbkMsa0hBQWtIO0lBQ2xILHdCQUF3QixFQUFFLE9BQU8sQ0FBQztJQUVsQyx1RUFBdUU7SUFDdkUsYUFBYSxFQUFFLE1BQU0sQ0FBQztDQUN2QjtBQUVELGVBQU8sTUFBTSx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FzQnpFLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAA2C,MAAM,0BAA0B,CAAC;AAE5G,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAC5D,eAAO,MAAM,kCAAkC,QAAS,CAAC;AACzD,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AACrD,eAAO,MAAM,8BAA8B,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/services/reqresp/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAA2C,MAAM,0BAA0B,CAAC;AAE5G,eAAO,MAAM,qCAAqC,QAAS,CAAC;AAC5D,eAAO,MAAM,kCAAkC,QAAS,CAAC;AACzD,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AACrD,eAAO,MAAM,8BAA8B,QAAQ,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAY,CAAC;AAKtD;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,QAA2D,CAAC;AAGvG,eAAO,MAAM,0BAA0B,EAAE,gBAKxC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,uBAAuB,EAAE,MAAM,CAAC;IAEhC,uEAAuE;IACvE,0BAA0B,EAAE,MAAM,CAAC;IAEnC,kHAAkH;IAClH,wBAAwB,EAAE,OAAO,CAAC;IAElC,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,wBAAwB,EAAE,kBAAkB,CAAC,gBAAgB,CAsBzE,CAAC"}
|
|
@@ -3,6 +3,17 @@ export const DEFAULT_INDIVIDUAL_REQUEST_TIMEOUT_MS = 10_000;
|
|
|
3
3
|
export const DEFAULT_OVERALL_REQUEST_TIMEOUT_MS = 10_000; // Not currently used
|
|
4
4
|
export const DEFAULT_REQRESP_DIAL_TIMEOUT_MS = 5_000;
|
|
5
5
|
export const DEFAULT_OPTIMISTIC_NEGOTIATION = false;
|
|
6
|
+
/**
|
|
7
|
+
* Max size of a yamux frame, header included. This is the library default, pinned explicitly when configuring the
|
|
8
|
+
* muxer in the libp2p service so a dependency upgrade cannot silently change it.
|
|
9
|
+
*/ export const YAMUX_MAX_MESSAGE_SIZE_BYTES = 64 * 1024;
|
|
10
|
+
/** Size of a yamux data frame header. */ const YAMUX_HEADER_LENGTH_BYTES = 12;
|
|
11
|
+
/**
|
|
12
|
+
* Max size of a reqresp request payload. A request must fit in a single muxer frame: the responder never reassembles
|
|
13
|
+
* a request from multiple chunks (see `ReqResp.processStream`), and yamux splits writes larger than one frame into
|
|
14
|
+
* multiple frames, each of which arrives as a separate chunk. mplex only splits at 1 MiB, so yamux is the binding
|
|
15
|
+
* constraint.
|
|
16
|
+
*/ export const MAX_REQRESP_REQUEST_SIZE_BYTES = YAMUX_MAX_MESSAGE_SIZE_BYTES - YAMUX_HEADER_LENGTH_BYTES;
|
|
6
17
|
// For use in tests.
|
|
7
18
|
export const DEFAULT_P2P_REQRESP_CONFIG = {
|
|
8
19
|
overallRequestTimeoutMs: DEFAULT_OVERALL_REQUEST_TIMEOUT_MS,
|
|
@@ -10,8 +10,9 @@ export declare class BitVector {
|
|
|
10
10
|
getLength(): number;
|
|
11
11
|
isSet(index: number): boolean;
|
|
12
12
|
/**
|
|
13
|
-
* Returns all indices which are set to true
|
|
14
|
-
*
|
|
13
|
+
* Returns all indices which are set to true.
|
|
14
|
+
* Ordered by index. No duplicates.
|
|
15
|
+
*/
|
|
15
16
|
getTrueIndices(): number[];
|
|
16
17
|
/**
|
|
17
18
|
* Returns true if no indices are set to true
|
|
@@ -31,4 +32,4 @@ export declare class BitVector {
|
|
|
31
32
|
static fromBuffer(buffer: Buffer | BufferReader): BitVector;
|
|
32
33
|
static byteLength(length: number): number;
|
|
33
34
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0dmVjdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvcmVxcmVzcC9wcm90b2NvbHMvYmxvY2tfdHhzL2JpdHZlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFxQixNQUFNLDZCQUE2QixDQUFDO0FBSTlFOztHQUVHO0FBQ0gscUJBQWEsU0FBUztJQUNwQixPQUFPLENBQUMsTUFBTSxDQUFTO0lBQ3ZCLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFFdkIsWUFBWSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBR3pDO0lBU0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxTQUFTLENBbUJ4RDtJQUVELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBU0QsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUU1QjtJQUVEOzs7T0FHRztJQUNILGNBQWMsSUFBSSxNQUFNLEVBQUUsQ0FFekI7SUFFRDs7U0FFSztJQUNMLE9BQU8sSUFBSSxPQUFPLENBRWpCO0lBRUQ7Ozs7U0FJSztJQUNMLFFBQVEsSUFBSSxNQUFNLENBRWpCO0lBRUQ7Ozs7U0FJSztJQUNMLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxZQUFZLEdBQUcsU0FBUyxDQWExRDtJQUVELE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sVUFFL0I7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitvector.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/bitvector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAI9E;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAGzC;IASD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAmBxD;IAED,SAAS,IAAI,MAAM,CAElB;IASD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5B;IAED
|
|
1
|
+
{"version":3,"file":"bitvector.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/bitvector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAI9E;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAGzC;IASD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,CAmBxD;IAED,SAAS,IAAI,MAAM,CAElB;IASD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5B;IAED;;;OAGG;IACH,cAAc,IAAI,MAAM,EAAE,CAEzB;IAED;;SAEK;IACL,OAAO,IAAI,OAAO,CAEjB;IAED;;;;SAIK;IACL,QAAQ,IAAI,MAAM,CAEjB;IAED;;;;SAIK;IACL,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAa1D;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,UAE/B;CACF"}
|
|
@@ -44,8 +44,9 @@ import { MAX_TXS_PER_BLOCK } from '../../constants.js';
|
|
|
44
44
|
return index >= 0 && index < this.length && !!(this.buffer[Math.floor(index / 8)] & 1 << index % 8);
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
* Returns all indices which are set to true
|
|
48
|
-
*
|
|
47
|
+
* Returns all indices which are set to true.
|
|
48
|
+
* Ordered by index. No duplicates.
|
|
49
|
+
*/ getTrueIndices() {
|
|
49
50
|
return Array.from({
|
|
50
51
|
length: this.length
|
|
51
52
|
}, (_, i)=>i).filter((i)=>this.isSet(i));
|
|
@@ -10,4 +10,4 @@ import type { ReqRespSubProtocolHandler } from '../../interface.js';
|
|
|
10
10
|
* @returns the BlockTxs request handler
|
|
11
11
|
*/
|
|
12
12
|
export declare function reqRespBlockTxsHandler(attestationPool: AttestationPoolApi, archiver: L2BlockSource, txPool: TxPoolV2): ReqRespSubProtocolHandler;
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfdHhzX2hhbmRsZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9yZXFyZXNwL3Byb3RvY29scy9ibG9ja190eHMvYmxvY2tfdHhzX2hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFLekQsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUNyRyxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUMvRSxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBS3BFOzs7Ozs7R0FNRztBQUNILHdCQUFnQixzQkFBc0IsQ0FDcEMsZUFBZSxFQUFFLGtCQUFrQixFQUNuQyxRQUFRLEVBQUUsYUFBYSxFQUN2QixNQUFNLEVBQUUsUUFBUSxHQUNmLHlCQUF5QixDQXdEM0IifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_txs_handler.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/block_txs_handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"block_txs_handler.d.ts","sourceRoot":"","sources":["../../../../../src/services/reqresp/protocols/block_txs/block_txs_handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4DAA4D,CAAC;AACrG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAKpE;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,kBAAkB,EACnC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,QAAQ,GACf,yBAAyB,CAwD3B"}
|