@aztec/p2p 0.0.1-commit.7035c9bd6 → 0.0.1-commit.71324e566
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 +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +5 -4
- package/dest/client/interface.d.ts +9 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +3 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +30 -10
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +16 -6
- package/dest/config.d.ts +103 -99
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +10 -5
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +4 -2
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +8 -5
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +2 -2
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +6 -2
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +5 -2
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +17 -9
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
- 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/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +50 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +2 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +2 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +16 -8
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +1 -1
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +8 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +11 -9
- package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +5 -5
- package/dest/services/dummy_service.d.ts +6 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +6 -1
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/libp2p_service.d.ts +15 -18
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +117 -91
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +35 -8
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -1
- 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 +3 -0
- package/dest/services/reqresp/config.d.ts +3 -3
- package/dest/services/reqresp/config.d.ts.map +1 -1
- package/dest/services/reqresp/interface.d.ts +14 -9
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -11
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +4 -2
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +11 -2
- package/dest/services/service.d.ts +5 -2
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/test-helpers/mock-pubsub.d.ts +11 -3
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +35 -10
- 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/reqresp-nodes.js +1 -2
- 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 +1 -0
- 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 +65 -15
- package/dest/testbench/worker_client_manager.d.ts +8 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +49 -1
- package/package.json +14 -14
- package/src/client/factory.ts +7 -2
- package/src/client/interface.ts +9 -1
- package/src/client/p2p_client.ts +34 -11
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +17 -6
- package/src/config.ts +18 -6
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +9 -5
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +3 -3
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +8 -2
- package/src/msg_validators/attestation_validator/attestation_validator.ts +18 -7
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
- package/src/msg_validators/clock_tolerance.ts +68 -0
- package/src/msg_validators/proposal_validator/README.md +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +4 -1
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +4 -1
- package/src/msg_validators/proposal_validator/proposal_validator.ts +13 -7
- package/src/msg_validators/tx_validator/archive_cache.ts +1 -1
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +7 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +25 -9
- package/src/msg_validators/tx_validator/phases_validator.ts +1 -1
- package/src/services/data_store.ts +5 -13
- package/src/services/dummy_service.ts +8 -2
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/libp2p_service.ts +117 -102
- package/src/services/peer-manager/peer_manager.ts +40 -8
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +3 -0
- package/src/services/reqresp/config.ts +2 -2
- package/src/services/reqresp/interface.ts +21 -11
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +18 -1
- package/src/services/service.ts +6 -1
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/mock-pubsub.ts +31 -5
- package/src/test-helpers/reqresp-nodes.ts +2 -2
- package/src/test-helpers/testbench-utils.ts +1 -0
- package/src/testbench/p2p_client_testbench_worker.ts +70 -12
- package/src/testbench/worker_client_manager.ts +55 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
- package/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
- package/src/services/reqresp/protocols/block.ts +0 -37
|
@@ -370,7 +370,7 @@ function applyDecs2203RFactory() {
|
|
|
370
370
|
function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
|
|
371
371
|
return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
|
|
372
372
|
}
|
|
373
|
-
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6,
|
|
373
|
+
var _dec, _dec1, _dec2, _dec3, _dec4, _dec5, _dec6, _initProto;
|
|
374
374
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
375
375
|
import { maxBy } from '@aztec/foundation/collection';
|
|
376
376
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
@@ -395,6 +395,7 @@ import { mplex } from '@libp2p/mplex';
|
|
|
395
395
|
import { tcp } from '@libp2p/tcp';
|
|
396
396
|
import { ENR } from '@nethermindeth/enr';
|
|
397
397
|
import { createLibp2p } from 'libp2p';
|
|
398
|
+
import { CheckpointProposalReceivedCallbackNotRegisteredError } from '../../errors/p2p-service.error.js';
|
|
398
399
|
import { BlockProposalValidator, CheckpointAttestationValidator, CheckpointProposalValidator, DoubleSpendTxValidator, FishermanAttestationValidator, getDefaultAllowedSetupFunctions } from '../../msg_validators/index.js';
|
|
399
400
|
import { MessageSeenValidator } from '../../msg_validators/msg_seen_validator/msg_seen_validator.js';
|
|
400
401
|
import { createFirstStageTxValidationsForGossipedTransactions, createSecondStageTxValidationsForGossipedTransactions, createTxValidatorForBlockProposalReceivedTxs, createTxValidatorForReqResponseReceivedTxs } from '../../msg_validators/tx_validator/factory.js';
|
|
@@ -408,7 +409,7 @@ import { APP_SPECIFIC_WEIGHT, gossipScoreThresholds } from '../gossipsub/scoring
|
|
|
408
409
|
import { createAllTopicScoreParams } from '../gossipsub/topic_score_params.js';
|
|
409
410
|
import { PeerManager } from '../peer-manager/peer_manager.js';
|
|
410
411
|
import { PeerScoring } from '../peer-manager/peer_scoring.js';
|
|
411
|
-
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler,
|
|
412
|
+
import { DEFAULT_SUB_PROTOCOL_VALIDATORS, ReqRespSubProtocol, ValidationError, pingHandler, reqGoodbyeHandler, reqRespBlockTxsHandler, reqRespStatusHandler, reqRespTxHandler } from '../reqresp/index.js';
|
|
412
413
|
import { ReqResp } from '../reqresp/reqresp.js';
|
|
413
414
|
import { P2PInstrumentation } from './instrumentation.js';
|
|
414
415
|
_dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId, attestation)=>({
|
|
@@ -430,8 +431,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
430
431
|
[Attributes.BLOCK_ARCHIVE]: request.archiveRoot.toString()
|
|
431
432
|
})), _dec6 = trackSpan('Libp2pService.validateRequestedTx', (requestedTxHash, _responseTx)=>({
|
|
432
433
|
[Attributes.TX_HASH]: requestedTxHash.toString()
|
|
433
|
-
})), _dec7 = trackSpan('Libp2pService.validateRequestedBlock', (requestedBlockNumber, _responseBlock)=>({
|
|
434
|
-
[Attributes.BLOCK_NUMBER]: requestedBlockNumber.toString()
|
|
435
434
|
}));
|
|
436
435
|
/**
|
|
437
436
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -482,11 +481,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
482
481
|
_dec6,
|
|
483
482
|
2,
|
|
484
483
|
"validateRequestedTxs"
|
|
485
|
-
],
|
|
486
|
-
[
|
|
487
|
-
_dec7,
|
|
488
|
-
2,
|
|
489
|
-
"validateRequestedBlock"
|
|
490
484
|
]
|
|
491
485
|
], []));
|
|
492
486
|
}
|
|
@@ -510,7 +504,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
510
504
|
* Callback for when a checkpoint proposal is received from a peer.
|
|
511
505
|
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
512
506
|
* @returns The attestations for the checkpoint, if any.
|
|
513
|
-
*/
|
|
507
|
+
*/ allNodesCheckpointReceivedCallback;
|
|
508
|
+
/**
|
|
509
|
+
* Callback for when a checkpoint proposal is received - specifically for validators - from a peer.
|
|
510
|
+
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
511
|
+
* @returns The attestations for the checkpoint, if any.
|
|
512
|
+
*/ validatorCheckpointReceivedCallback;
|
|
514
513
|
gossipSubEventHandler;
|
|
515
514
|
instrumentation;
|
|
516
515
|
telemetry;
|
|
@@ -532,13 +531,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
532
531
|
this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
|
|
533
532
|
this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
|
|
534
533
|
this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
|
|
534
|
+
const p2pPropagationTime = config.attestationPropagationTime;
|
|
535
535
|
const proposalValidatorOpts = {
|
|
536
536
|
txsPermitted: !config.disableTransactions,
|
|
537
|
-
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint
|
|
537
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
|
|
538
|
+
p2pPropagationTime
|
|
538
539
|
};
|
|
539
540
|
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
540
541
|
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
541
|
-
this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry
|
|
542
|
+
this.checkpointAttestationValidator = config.fishermanMode ? new FishermanAttestationValidator(epochCache, mempools.attestationPool, telemetry, {
|
|
543
|
+
l1PublishingTime: config.l1PublishingTime
|
|
544
|
+
}) : new CheckpointAttestationValidator(epochCache, {
|
|
545
|
+
l1PublishingTime: config.l1PublishingTime
|
|
546
|
+
});
|
|
542
547
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
543
548
|
this.blockReceivedCallback = async (block)=>{
|
|
544
549
|
this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
|
|
@@ -546,8 +551,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
546
551
|
});
|
|
547
552
|
return true;
|
|
548
553
|
};
|
|
549
|
-
this.
|
|
550
|
-
|
|
554
|
+
this.allNodesCheckpointReceivedCallback = (_checkpoint)=>{
|
|
555
|
+
throw new CheckpointProposalReceivedCallbackNotRegisteredError();
|
|
556
|
+
};
|
|
557
|
+
this.validatorCheckpointReceivedCallback = (_checkpoint)=>{
|
|
551
558
|
return Promise.resolve(undefined);
|
|
552
559
|
};
|
|
553
560
|
}
|
|
@@ -600,9 +607,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
600
607
|
const l1Constants = epochCache.getL1Constants();
|
|
601
608
|
const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
|
|
602
609
|
slotDurationMs: l1Constants.slotDuration * 1000,
|
|
610
|
+
ethereumSlotDuration: l1Constants.ethereumSlotDuration,
|
|
603
611
|
heartbeatIntervalMs: config.gossipsubInterval,
|
|
604
612
|
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
605
613
|
blockDurationMs: config.blockDurationMs,
|
|
614
|
+
l1PublishingTime: config.l1PublishingTime,
|
|
615
|
+
p2pPropagationTime: config.attestationPropagationTime,
|
|
606
616
|
expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
|
|
607
617
|
});
|
|
608
618
|
const node = await createLibp2p({
|
|
@@ -717,6 +727,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
717
727
|
const peerScoring = new PeerScoring(config, telemetry);
|
|
718
728
|
const reqresp = new ReqResp(config, node, peerScoring, createLogger(`${logger.module}:reqresp`));
|
|
719
729
|
const peerManager = new PeerManager(node, peerDiscoveryService, config, telemetry, createLogger(`${logger.module}:peer_manager`), peerScoring, reqresp, worldStateSynchronizer, protocolVersion, epochCache);
|
|
730
|
+
// Gate req/resp data protocols for unauthenticated peers when p2pAllowOnlyValidators is enabled
|
|
731
|
+
reqresp.setShouldRejectPeer((peerId)=>peerManager.shouldDisableP2PGossip(peerId));
|
|
720
732
|
// Configure application-specific scoring for gossipsub.
|
|
721
733
|
// The weight scales app score to align with gossipsub thresholds:
|
|
722
734
|
// - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
|
|
@@ -743,13 +755,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
743
755
|
// Create request response protocol handlers
|
|
744
756
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
745
757
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
746
|
-
const blockHandler = reqRespBlockHandler(this.archiver);
|
|
747
758
|
const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
|
|
748
759
|
const requestResponseHandlers = {
|
|
749
760
|
[ReqRespSubProtocol.PING]: pingHandler,
|
|
750
761
|
[ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
|
|
751
|
-
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
|
|
752
|
-
[ReqRespSubProtocol.BLOCK]: blockHandler.bind(this)
|
|
762
|
+
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
|
|
753
763
|
};
|
|
754
764
|
if (!this.config.disableTransactions) {
|
|
755
765
|
const blockTxsHandler = reqRespBlockTxsHandler(this.mempools.attestationPool, this.archiver, this.mempools.txPool);
|
|
@@ -762,8 +772,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
762
772
|
const reqrespSubProtocolValidators = {
|
|
763
773
|
...DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
764
774
|
[ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
|
|
765
|
-
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
|
|
766
|
-
[ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this)
|
|
775
|
+
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
|
|
767
776
|
};
|
|
768
777
|
await this.peerManager.initializePeers();
|
|
769
778
|
await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
|
|
@@ -851,8 +860,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
851
860
|
registerBlockReceivedCallback(callback) {
|
|
852
861
|
this.blockReceivedCallback = callback;
|
|
853
862
|
}
|
|
854
|
-
|
|
855
|
-
this.
|
|
863
|
+
registerValidatorCheckpointReceivedCallback(callback) {
|
|
864
|
+
this.validatorCheckpointReceivedCallback = callback;
|
|
865
|
+
}
|
|
866
|
+
registerAllNodesCheckpointReceivedCallback(callback) {
|
|
867
|
+
this.allNodesCheckpointReceivedCallback = callback;
|
|
868
|
+
}
|
|
869
|
+
async notifyOwnCheckpointProposal(checkpoint) {
|
|
870
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, this.node.peerId);
|
|
856
871
|
}
|
|
857
872
|
/**
|
|
858
873
|
* Registers a callback to be invoked when a duplicate proposal is detected.
|
|
@@ -1029,29 +1044,67 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1029
1044
|
return;
|
|
1030
1045
|
}
|
|
1031
1046
|
async validateReceivedMessage(validationFunc, msgId, source, topicType) {
|
|
1047
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
1032
1048
|
let resultAndObj = {
|
|
1033
|
-
result: TopicValidatorResult.Reject
|
|
1049
|
+
result: TopicValidatorResult.Reject,
|
|
1050
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
1034
1051
|
};
|
|
1035
1052
|
const timer = new Timer();
|
|
1036
1053
|
try {
|
|
1037
1054
|
resultAndObj = await validationFunc();
|
|
1038
1055
|
} catch (err) {
|
|
1039
|
-
this.
|
|
1040
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
1056
|
+
this.logger.error(`Error validating gossipsub message`, err, {
|
|
1041
1057
|
msgId,
|
|
1042
1058
|
source: source.toString(),
|
|
1043
1059
|
topicType
|
|
1044
1060
|
});
|
|
1045
1061
|
}
|
|
1046
1062
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
1063
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, {
|
|
1064
|
+
msgId,
|
|
1065
|
+
source: source.toString(),
|
|
1066
|
+
topicType
|
|
1067
|
+
});
|
|
1047
1068
|
this.instrumentation.recordMessageValidation(topicType, timer);
|
|
1069
|
+
} else if (resultAndObj.result === TopicValidatorResult.Reject) {
|
|
1070
|
+
this.logger.warn(`Message ${topicType} rejected by validator with severity ${resultAndObj.severity}`, {
|
|
1071
|
+
msgId,
|
|
1072
|
+
source: source.toString(),
|
|
1073
|
+
topicType,
|
|
1074
|
+
severity: resultAndObj.severity
|
|
1075
|
+
});
|
|
1076
|
+
this.peerManager.penalizePeer(source, resultAndObj.severity);
|
|
1077
|
+
} else {
|
|
1078
|
+
this.logger.trace(`Message ${topicType} ignored by validator`, {
|
|
1079
|
+
msgId,
|
|
1080
|
+
source: source.toString(),
|
|
1081
|
+
topicType
|
|
1082
|
+
});
|
|
1048
1083
|
}
|
|
1049
1084
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
1050
1085
|
return resultAndObj;
|
|
1051
1086
|
}
|
|
1087
|
+
tryDeserialize(deserializeFunc, msgId, source) {
|
|
1088
|
+
try {
|
|
1089
|
+
return deserializeFunc();
|
|
1090
|
+
} catch (err) {
|
|
1091
|
+
this.logger.warn(`Failed to deserialize gossipsub message from buffer`, {
|
|
1092
|
+
err,
|
|
1093
|
+
msgId,
|
|
1094
|
+
source: source.toString()
|
|
1095
|
+
});
|
|
1096
|
+
return undefined;
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1052
1099
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1053
1100
|
const validationFunc = async ()=>{
|
|
1054
|
-
const tx = Tx.fromBuffer(payloadData);
|
|
1101
|
+
const tx = this.tryDeserialize(()=>Tx.fromBuffer(payloadData), msgId, source);
|
|
1102
|
+
if (!tx) {
|
|
1103
|
+
return {
|
|
1104
|
+
result: TopicValidatorResult.Reject,
|
|
1105
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
1106
|
+
};
|
|
1107
|
+
}
|
|
1055
1108
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1056
1109
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1057
1110
|
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
@@ -1072,9 +1125,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1072
1125
|
severity,
|
|
1073
1126
|
source: source.toString()
|
|
1074
1127
|
});
|
|
1075
|
-
this.peerManager.penalizePeer(source, severity);
|
|
1076
1128
|
return {
|
|
1077
|
-
result: TopicValidatorResult.Reject
|
|
1129
|
+
result: TopicValidatorResult.Reject,
|
|
1130
|
+
severity
|
|
1078
1131
|
};
|
|
1079
1132
|
}
|
|
1080
1133
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
@@ -1098,9 +1151,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1098
1151
|
severity,
|
|
1099
1152
|
source: source.toString()
|
|
1100
1153
|
});
|
|
1101
|
-
this.peerManager.penalizePeer(source, severity);
|
|
1102
1154
|
return {
|
|
1103
|
-
result: TopicValidatorResult.Reject
|
|
1155
|
+
result: TopicValidatorResult.Reject,
|
|
1156
|
+
severity
|
|
1104
1157
|
};
|
|
1105
1158
|
}
|
|
1106
1159
|
// Pool add: persist the tx
|
|
@@ -1132,9 +1185,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1132
1185
|
source: source.toString(),
|
|
1133
1186
|
txHash: txHash.toString()
|
|
1134
1187
|
});
|
|
1135
|
-
this.peerManager.penalizePeer(source, PeerErrorSeverity.HighToleranceError);
|
|
1136
1188
|
return {
|
|
1137
|
-
result: TopicValidatorResult.Reject
|
|
1189
|
+
result: TopicValidatorResult.Reject,
|
|
1190
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1138
1191
|
};
|
|
1139
1192
|
}
|
|
1140
1193
|
};
|
|
@@ -1155,7 +1208,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1155
1208
|
* Process a checkpoint attestation from a peer.
|
|
1156
1209
|
* Validates the attestation and adds it to the pool.
|
|
1157
1210
|
*/ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
|
|
1158
|
-
const { result, obj: attestation } = await this.validateReceivedMessage(()=>
|
|
1211
|
+
const { result, obj: attestation } = await this.validateReceivedMessage(()=>{
|
|
1212
|
+
const attestation = this.tryDeserialize(()=>CheckpointAttestation.fromBuffer(payloadData), msgId, source);
|
|
1213
|
+
if (!attestation) {
|
|
1214
|
+
return Promise.resolve({
|
|
1215
|
+
result: TopicValidatorResult.Reject,
|
|
1216
|
+
severity: PeerErrorSeverity.LowToleranceError
|
|
1217
|
+
});
|
|
1218
|
+
}
|
|
1219
|
+
return this.validateAndStoreCheckpointAttestation(source, attestation);
|
|
1220
|
+
}, msgId, source, TopicType.checkpoint_attestation);
|
|
1159
1221
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
1160
1222
|
return;
|
|
1161
1223
|
}
|
|
@@ -1170,9 +1232,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1170
1232
|
const validationResult = await this.checkpointAttestationValidator.validate(attestation);
|
|
1171
1233
|
if (validationResult.result === 'reject') {
|
|
1172
1234
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1173
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1174
1235
|
return {
|
|
1175
|
-
result: TopicValidatorResult.Reject
|
|
1236
|
+
result: TopicValidatorResult.Reject,
|
|
1237
|
+
severity: validationResult.severity
|
|
1176
1238
|
};
|
|
1177
1239
|
}
|
|
1178
1240
|
if (validationResult.result === 'ignore') {
|
|
@@ -1199,9 +1261,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1199
1261
|
obj: attestation
|
|
1200
1262
|
};
|
|
1201
1263
|
}
|
|
1202
|
-
// Could not add (cap reached for signer),
|
|
1264
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1203
1265
|
if (!added) {
|
|
1204
|
-
this.logger.warn(`
|
|
1266
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1205
1267
|
slot: slot.toString(),
|
|
1206
1268
|
archive: attestation.archive.toString(),
|
|
1207
1269
|
source: peerId.toString(),
|
|
@@ -1209,8 +1271,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1209
1271
|
count
|
|
1210
1272
|
});
|
|
1211
1273
|
return {
|
|
1212
|
-
result: TopicValidatorResult.
|
|
1213
|
-
|
|
1274
|
+
result: TopicValidatorResult.Reject,
|
|
1275
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1214
1276
|
};
|
|
1215
1277
|
}
|
|
1216
1278
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1248,9 +1310,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1248
1310
|
const validationResult = await this.blockProposalValidator.validate(block);
|
|
1249
1311
|
if (validationResult.result === 'reject') {
|
|
1250
1312
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1251
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1252
1313
|
return {
|
|
1253
|
-
result: TopicValidatorResult.Reject
|
|
1314
|
+
result: TopicValidatorResult.Reject,
|
|
1315
|
+
severity: validationResult.severity
|
|
1254
1316
|
};
|
|
1255
1317
|
}
|
|
1256
1318
|
if (validationResult.result === 'ignore') {
|
|
@@ -1280,7 +1342,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1280
1342
|
}
|
|
1281
1343
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1282
1344
|
if (!added) {
|
|
1283
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1284
1345
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1285
1346
|
...block.toBlockInfo(),
|
|
1286
1347
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1292,7 +1353,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1292
1353
|
result: TopicValidatorResult.Reject,
|
|
1293
1354
|
metadata: {
|
|
1294
1355
|
isEquivocated
|
|
1295
|
-
}
|
|
1356
|
+
},
|
|
1357
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1296
1358
|
};
|
|
1297
1359
|
}
|
|
1298
1360
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1366,9 +1428,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1366
1428
|
const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1367
1429
|
if (validationResult.result === 'reject') {
|
|
1368
1430
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1369
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1370
1431
|
return {
|
|
1371
|
-
result: TopicValidatorResult.Reject
|
|
1432
|
+
result: TopicValidatorResult.Reject,
|
|
1433
|
+
severity: validationResult.severity
|
|
1372
1434
|
};
|
|
1373
1435
|
}
|
|
1374
1436
|
if (validationResult.result === 'ignore') {
|
|
@@ -1385,18 +1447,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1385
1447
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1386
1448
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1387
1449
|
});
|
|
1388
|
-
const
|
|
1389
|
-
|
|
1450
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1451
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1452
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1390
1453
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1391
1454
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1392
1455
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1393
1456
|
isEquivocated,
|
|
1394
|
-
result
|
|
1457
|
+
result: blockProposalResult.result
|
|
1395
1458
|
});
|
|
1396
1459
|
return {
|
|
1397
|
-
result: TopicValidatorResult.Reject
|
|
1460
|
+
result: TopicValidatorResult.Reject,
|
|
1461
|
+
severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
|
|
1398
1462
|
};
|
|
1399
|
-
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1463
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1400
1464
|
processBlock = true;
|
|
1401
1465
|
}
|
|
1402
1466
|
}
|
|
@@ -1423,7 +1487,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1423
1487
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1424
1488
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1425
1489
|
if (!added) {
|
|
1426
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1427
1490
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1428
1491
|
...checkpoint.toCheckpointInfo(),
|
|
1429
1492
|
count,
|
|
@@ -1435,7 +1498,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1435
1498
|
metadata: {
|
|
1436
1499
|
isEquivocated,
|
|
1437
1500
|
processBlock
|
|
1438
|
-
}
|
|
1501
|
+
},
|
|
1502
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1439
1503
|
};
|
|
1440
1504
|
}
|
|
1441
1505
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1485,9 +1549,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1485
1549
|
archive: checkpoint.archive.toString(),
|
|
1486
1550
|
source: sender.toString()
|
|
1487
1551
|
});
|
|
1552
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
|
|
1488
1553
|
// Call the checkpoint received callback with the core version (without lastBlock)
|
|
1489
1554
|
// to validate and potentially generate attestations
|
|
1490
|
-
const attestations = await this.
|
|
1555
|
+
const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
|
|
1491
1556
|
if (attestations && attestations.length > 0) {
|
|
1492
1557
|
// If the callback returned attestations, add them to the pool and propagate them
|
|
1493
1558
|
await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
@@ -1607,45 +1672,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1607
1672
|
return false;
|
|
1608
1673
|
}
|
|
1609
1674
|
}
|
|
1610
|
-
/**
|
|
1611
|
-
* Validates a BLOCK response.
|
|
1612
|
-
*
|
|
1613
|
-
* If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
|
|
1614
|
-
* Penalizes on block number mismatch or hash mismatch.
|
|
1615
|
-
*
|
|
1616
|
-
* @param requestedBlockNumber - The requested block number.
|
|
1617
|
-
* @param responseBlock - The block returned by the peer.
|
|
1618
|
-
* @param peerId - The peer that returned the block.
|
|
1619
|
-
* @returns True if the response is valid, false otherwise.
|
|
1620
|
-
*/ async validateRequestedBlock(requestedBlockNumber, responseBlock, peerId) {
|
|
1621
|
-
try {
|
|
1622
|
-
const reqNum = Number(requestedBlockNumber.toString());
|
|
1623
|
-
if (responseBlock.number !== reqNum) {
|
|
1624
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
1625
|
-
return false;
|
|
1626
|
-
}
|
|
1627
|
-
const local = await this.archiver.getBlock(BlockNumber(reqNum));
|
|
1628
|
-
if (!local) {
|
|
1629
|
-
// We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
|
|
1630
|
-
// TODO: Consider extending this validator to accept an expected hash or
|
|
1631
|
-
// performing quorum-based checks when using P2P syncing prior to L1 sync.
|
|
1632
|
-
this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
|
|
1633
|
-
return false;
|
|
1634
|
-
}
|
|
1635
|
-
const [localHash, respHash] = await Promise.all([
|
|
1636
|
-
local.hash(),
|
|
1637
|
-
responseBlock.hash()
|
|
1638
|
-
]);
|
|
1639
|
-
if (!localHash.equals(respHash)) {
|
|
1640
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
1641
|
-
return false;
|
|
1642
|
-
}
|
|
1643
|
-
return true;
|
|
1644
|
-
} catch (e) {
|
|
1645
|
-
this.logger.warn(`Error validating requested block`, e);
|
|
1646
|
-
return false;
|
|
1647
|
-
}
|
|
1648
|
-
}
|
|
1649
1675
|
async validateRequestedTx(tx, peerId, txValidator, requested) {
|
|
1650
1676
|
const penalize = (severity)=>this.peerManager.penalizePeer(peerId, severity);
|
|
1651
1677
|
if (requested && !requested.has(tx.getTxHash().toString())) {
|
|
@@ -53,11 +53,15 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
53
53
|
heartbeat(): Promise<void>;
|
|
54
54
|
setupDirectPeersIfValidator(): Promise<void>;
|
|
55
55
|
/**
|
|
56
|
-
* Cleans up expired timeouts.
|
|
56
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
57
57
|
*
|
|
58
58
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
59
59
|
* This function removes any peers that have been in the timed out state for too long.
|
|
60
60
|
* To give them a chance to reconnect.
|
|
61
|
+
*
|
|
62
|
+
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
63
|
+
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
64
|
+
* map forever, causing an unbounded memory leak.
|
|
61
65
|
*/
|
|
62
66
|
private cleanupExpiredTimeouts;
|
|
63
67
|
private processScheduledDisconnects;
|
|
@@ -171,4 +175,4 @@ export declare class PeerManager implements PeerManagerInterface {
|
|
|
171
175
|
handleAuthRequestFromPeer(_authRequest: AuthRequest, peerId: PeerId): Promise<StatusMessage>;
|
|
172
176
|
private updateAuthenticatedPeers;
|
|
173
177
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVlcl9tYW5hZ2VyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvcGVlci1tYW5hZ2VyL3BlZXJfbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEtBQUssRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RixPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE9BQU8sS0FBSyxFQUFjLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTTVELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVoRCxPQUFPLEVBQUUsV0FBVyxFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUNBQWlDLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUFrQixLQUFLLFdBQVcsRUFBRSxNQUFNLG1C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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;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,KAAK,EAAc,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAM5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAgB,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAuB,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA2BrE,qBAAa,WAAY,YAAW,oBAAoB;IAyBpD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,MAAM;IAEd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAlC/B,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,8BAA8B,CAAa;IACnD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,uBAAuB,CAAkB;IACjD,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,uBAAuB,CAAkB;IACjD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,qCAAqC,CAAsC;IACnF,OAAO,CAAC,qCAAqC,CAAkC;IAC/E,OAAO,CAAC,qBAAqB,CAA0B;IACvD,OAAO,CAAC,oBAAoB,CAAoD;IAChF,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,yBAAyB,CAAkB;IAEnD,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,QAAQ,CAId;IAEF,YACU,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,oBAAoB,EAC1C,MAAM,EAAE,SAAS,EACzB,eAAe,EAAE,eAAe,EACxB,MAAM,oDAAmC,EACzC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EACP,sBAAsB,EAAE,sBAAsB,EAC9C,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,mBAAmB,EAC/B,YAAY,GAAE,YAAiC,EAyBjE;IACD;;;;OAIG;IACG,eAAe,kBAmCpB;IAED,IAAI,MAAM,6CAET;IAEY,SAAS,kBAUrB;IAIK,2BAA2B,kBAgDhC;IAED
|
|
1
|
+
{"version":3,"file":"peer_manager.d.ts","sourceRoot":"","sources":["../../../src/services/peer-manager/peer_manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -172,19 +172,27 @@ export class PeerManager {
|
|
|
172
172
|
this.initializedPreferredPeers = true;
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
|
-
* Cleans up expired timeouts.
|
|
175
|
+
* Cleans up expired timeouts and stale failed-auth-handshake entries.
|
|
176
176
|
*
|
|
177
177
|
* When peers fail to dial after a number of retries, they are temporarily timed out.
|
|
178
178
|
* This function removes any peers that have been in the timed out state for too long.
|
|
179
179
|
* To give them a chance to reconnect.
|
|
180
|
+
*
|
|
181
|
+
* Also evicts entries from the failed-auth-handshake map whose expiry window has passed.
|
|
182
|
+
* Without this, peers that probe once and never reconnect would leave their entries in the
|
|
183
|
+
* map forever, causing an unbounded memory leak.
|
|
180
184
|
*/ cleanupExpiredTimeouts() {
|
|
181
|
-
// Clean up expired timeouts
|
|
182
185
|
const now = this.dateProvider.now();
|
|
183
186
|
for (const [peerId, timedOutPeer] of this.timedOutPeers.entries()){
|
|
184
187
|
if (now >= timedOutPeer.timeoutUntilMs) {
|
|
185
188
|
this.timedOutPeers.delete(peerId);
|
|
186
189
|
}
|
|
187
190
|
}
|
|
191
|
+
for (const [id, entry] of this.failedAuthHandshakes.entries()){
|
|
192
|
+
if (now - entry.lastFailureTimestamp > FAILED_AUTH_HANDSHAKE_EXPIRY_MS) {
|
|
193
|
+
this.failedAuthHandshakes.delete(id);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
188
196
|
}
|
|
189
197
|
/**
|
|
190
198
|
* Processes scheduled disconnects during heartbeat.
|
|
@@ -238,13 +246,17 @@ export class PeerManager {
|
|
|
238
246
|
* @param e - The disconnected peer event.
|
|
239
247
|
*/ handleDisconnectedPeerEvent(e) {
|
|
240
248
|
const peerId = e.detail;
|
|
249
|
+
const peerIdStr = peerId.toString();
|
|
241
250
|
this.metrics.peerDisconnected(peerId);
|
|
242
|
-
this.logger.verbose(`Disconnected from peer ${
|
|
243
|
-
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(
|
|
251
|
+
this.logger.verbose(`Disconnected from peer ${peerIdStr}`);
|
|
252
|
+
const validatorAddress = this.authenticatedPeerIdToValidatorAddress.get(peerIdStr);
|
|
244
253
|
if (validatorAddress !== undefined) {
|
|
245
|
-
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${
|
|
254
|
+
this.logger.info(`Removing authentication for validator ${validatorAddress} at peer id ${peerIdStr} due to disconnection`);
|
|
246
255
|
this.authenticatedValidatorAddressToPeerId.delete(validatorAddress.toString());
|
|
247
|
-
this.authenticatedPeerIdToValidatorAddress.delete(
|
|
256
|
+
this.authenticatedPeerIdToValidatorAddress.delete(peerIdStr);
|
|
257
|
+
}
|
|
258
|
+
if (this.peerScoring.getScoreState(peerIdStr) === PeerScoreState.Healthy) {
|
|
259
|
+
this.peerScoring.removePeer(peerIdStr);
|
|
248
260
|
}
|
|
249
261
|
}
|
|
250
262
|
registerThisValidatorAddresses(address) {
|
|
@@ -559,6 +571,11 @@ export class PeerManager {
|
|
|
559
571
|
if (this.peerScoring.getScoreState(peerIdString) != PeerScoreState.Healthy) {
|
|
560
572
|
return;
|
|
561
573
|
}
|
|
574
|
+
// Don't dial peers that have exceeded the auth failure threshold
|
|
575
|
+
if (!this.isNodeAllowedToConnect(peerId)) {
|
|
576
|
+
this.logger.trace(`Skipping peer ${peerId} due to failed auth handshake attempts`);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
562
579
|
const [multiaddrTcp] = await Promise.all([
|
|
563
580
|
enr.getFullMultiaddr('tcp')
|
|
564
581
|
]);
|
|
@@ -774,6 +791,8 @@ export class PeerManager {
|
|
|
774
791
|
...logData,
|
|
775
792
|
address: sender.toString()
|
|
776
793
|
});
|
|
794
|
+
this.markAuthHandshakeFailed(peerId);
|
|
795
|
+
this.markPeerForDisconnect(peerId);
|
|
777
796
|
return;
|
|
778
797
|
}
|
|
779
798
|
this.markAuthHandshakeSuccess(peerId);
|
|
@@ -799,13 +818,13 @@ export class PeerManager {
|
|
|
799
818
|
const now = this.dateProvider.now();
|
|
800
819
|
const peerIdStr = peerId.toString();
|
|
801
820
|
const existingEntry = this.failedAuthHandshakes.get(peerIdStr);
|
|
821
|
+
const failureCount = (existingEntry?.count || 0) + 1;
|
|
802
822
|
this.failedAuthHandshakes.set(peerIdStr, {
|
|
803
|
-
count:
|
|
823
|
+
count: failureCount,
|
|
804
824
|
lastFailureTimestamp: now
|
|
805
825
|
});
|
|
806
826
|
const connections = this.libP2PNode.getConnections(peerId);
|
|
807
827
|
connections.forEach((conn)=>{
|
|
808
|
-
// We mark the IP address
|
|
809
828
|
const address = conn.remoteAddr.nodeAddress().address;
|
|
810
829
|
const existingAddressEntry = this.failedAuthHandshakes.get(address);
|
|
811
830
|
this.failedAuthHandshakes.set(address, {
|
|
@@ -813,6 +832,14 @@ export class PeerManager {
|
|
|
813
832
|
lastFailureTimestamp: now
|
|
814
833
|
});
|
|
815
834
|
});
|
|
835
|
+
// Ban the peer from being re-dialed for a cooldown period (exponential backoff)
|
|
836
|
+
const banTimeMs = this.config.peerFailedBanTimeMs ?? DEFAULT_FAILED_PEER_BAN_TIME_MS;
|
|
837
|
+
const backoffMs = banTimeMs * Math.pow(2, Math.min(failureCount - 1, 5));
|
|
838
|
+
this.timedOutPeers.set(peerIdStr, {
|
|
839
|
+
peerId: peerIdStr,
|
|
840
|
+
timeoutUntilMs: now + backoffMs
|
|
841
|
+
});
|
|
842
|
+
this.cachedPeers.delete(peerIdStr);
|
|
816
843
|
}
|
|
817
844
|
/*
|
|
818
845
|
* Marks when peer exchanges auth handshake
|