@aztec/p2p 0.0.1-commit.3e3d0c9cd → 0.0.1-commit.3f5453c7b
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 +21 -6
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
- package/dest/config.d.ts +10 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +15 -0
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -5
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +11 -8
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +4 -4
- 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 +5 -1
- 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 +20 -11
- 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 +54 -3
- 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 +19 -11
- 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/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -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 -25
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +121 -112
- 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 +37 -10
- 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 +4 -7
- 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 +43 -56
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +1 -2
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +4 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +7 -7
- 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 +27 -10
- package/dest/services/service.d.ts +5 -2
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +57 -73
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +6 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/slow_tx_collection.js +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +3 -6
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/test-helpers/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 +21 -2
- package/dest/testbench/p2p_client_testbench_worker.js +66 -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 +23 -6
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +18 -8
- package/src/config.ts +30 -1
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +12 -8
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/interfaces.ts +4 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +7 -1
- package/src/msg_validators/attestation_validator/README.md +1 -1
- package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
- package/src/msg_validators/clock_tolerance.ts +72 -3
- package/src/msg_validators/proposal_validator/README.md +4 -4
- 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 +17 -10
- 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/encoding.ts +9 -1
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/libp2p_service.ts +122 -128
- package/src/services/peer-manager/peer_manager.ts +43 -10
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +35 -60
- package/src/services/reqresp/batch-tx-requester/interface.ts +0 -1
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +6 -6
- 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 +36 -11
- package/src/services/service.ts +6 -1
- package/src/services/tx_collection/fast_tx_collection.ts +57 -83
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +1 -1
- package/src/services/tx_collection/tx_collection.ts +3 -5
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/mock-pubsub.ts +31 -5
- package/src/test-helpers/reqresp-nodes.ts +2 -2
- package/src/test-helpers/testbench-utils.ts +29 -3
- package/src/testbench/p2p_client_testbench_worker.ts +70 -14
- 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/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -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
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
|
@@ -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,12 +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
|
-
})), _dec8 = trackSpan('Libp2pService.validateCheckpointAttestation', async (_, attestation)=>({
|
|
436
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
437
|
-
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
438
|
-
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
439
434
|
}));
|
|
440
435
|
/**
|
|
441
436
|
* Lib P2P implementation of the P2PService interface.
|
|
@@ -486,16 +481,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
486
481
|
_dec6,
|
|
487
482
|
2,
|
|
488
483
|
"validateRequestedTxs"
|
|
489
|
-
],
|
|
490
|
-
[
|
|
491
|
-
_dec7,
|
|
492
|
-
2,
|
|
493
|
-
"validateRequestedBlock"
|
|
494
|
-
],
|
|
495
|
-
[
|
|
496
|
-
_dec8,
|
|
497
|
-
2,
|
|
498
|
-
"validateCheckpointAttestation"
|
|
499
484
|
]
|
|
500
485
|
], []));
|
|
501
486
|
}
|
|
@@ -519,7 +504,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
519
504
|
* Callback for when a checkpoint proposal is received from a peer.
|
|
520
505
|
* @param checkpoint - The checkpoint proposal received from the peer.
|
|
521
506
|
* @returns The attestations for the checkpoint, if any.
|
|
522
|
-
*/
|
|
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;
|
|
523
513
|
gossipSubEventHandler;
|
|
524
514
|
instrumentation;
|
|
525
515
|
telemetry;
|
|
@@ -541,13 +531,19 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
541
531
|
this.topicStrings[TopicType.block_proposal] = createTopicString(TopicType.block_proposal, this.protocolVersion);
|
|
542
532
|
this.topicStrings[TopicType.checkpoint_proposal] = createTopicString(TopicType.checkpoint_proposal, this.protocolVersion);
|
|
543
533
|
this.topicStrings[TopicType.checkpoint_attestation] = createTopicString(TopicType.checkpoint_attestation, this.protocolVersion);
|
|
534
|
+
const p2pPropagationTime = config.attestationPropagationTime;
|
|
544
535
|
const proposalValidatorOpts = {
|
|
545
536
|
txsPermitted: !config.disableTransactions,
|
|
546
|
-
maxTxsPerBlock: config.validateMaxTxsPerBlock
|
|
537
|
+
maxTxsPerBlock: config.validateMaxTxsPerBlock ?? config.validateMaxTxsPerCheckpoint,
|
|
538
|
+
p2pPropagationTime
|
|
547
539
|
};
|
|
548
540
|
this.blockProposalValidator = new BlockProposalValidator(epochCache, proposalValidatorOpts);
|
|
549
541
|
this.checkpointProposalValidator = new CheckpointProposalValidator(epochCache, proposalValidatorOpts);
|
|
550
|
-
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
|
+
});
|
|
551
547
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
552
548
|
this.blockReceivedCallback = async (block)=>{
|
|
553
549
|
this.logger.warn(`Handler for block received not yet registered on P2P service. Received block ${block.blockNumber} for slot ${block.slotNumber} from peer.`, {
|
|
@@ -555,8 +551,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
555
551
|
});
|
|
556
552
|
return true;
|
|
557
553
|
};
|
|
558
|
-
this.
|
|
559
|
-
|
|
554
|
+
this.allNodesCheckpointReceivedCallback = (_checkpoint)=>{
|
|
555
|
+
throw new CheckpointProposalReceivedCallbackNotRegisteredError();
|
|
556
|
+
};
|
|
557
|
+
this.validatorCheckpointReceivedCallback = (_checkpoint)=>{
|
|
560
558
|
return Promise.resolve(undefined);
|
|
561
559
|
};
|
|
562
560
|
}
|
|
@@ -609,9 +607,12 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
609
607
|
const l1Constants = epochCache.getL1Constants();
|
|
610
608
|
const topicScoreParams = createAllTopicScoreParams(protocolVersion, {
|
|
611
609
|
slotDurationMs: l1Constants.slotDuration * 1000,
|
|
610
|
+
ethereumSlotDuration: l1Constants.ethereumSlotDuration,
|
|
612
611
|
heartbeatIntervalMs: config.gossipsubInterval,
|
|
613
612
|
targetCommitteeSize: l1Constants.targetCommitteeSize,
|
|
614
613
|
blockDurationMs: config.blockDurationMs,
|
|
614
|
+
l1PublishingTime: config.l1PublishingTime,
|
|
615
|
+
p2pPropagationTime: config.attestationPropagationTime,
|
|
615
616
|
expectedBlockProposalsPerSlot: config.expectedBlockProposalsPerSlot
|
|
616
617
|
});
|
|
617
618
|
const node = await createLibp2p({
|
|
@@ -726,6 +727,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
726
727
|
const peerScoring = new PeerScoring(config, telemetry);
|
|
727
728
|
const reqresp = new ReqResp(config, node, peerScoring, createLogger(`${logger.module}:reqresp`));
|
|
728
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));
|
|
729
732
|
// Configure application-specific scoring for gossipsub.
|
|
730
733
|
// The weight scales app score to align with gossipsub thresholds:
|
|
731
734
|
// - Disconnect (-50) × 10 = -500 = gossipThreshold (stops receiving gossip)
|
|
@@ -752,13 +755,11 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
752
755
|
// Create request response protocol handlers
|
|
753
756
|
const txHandler = reqRespTxHandler(this.mempools);
|
|
754
757
|
const goodbyeHandler = reqGoodbyeHandler(this.peerManager);
|
|
755
|
-
const blockHandler = reqRespBlockHandler(this.archiver);
|
|
756
758
|
const statusHandler = reqRespStatusHandler(this.protocolVersion, this.worldStateSynchronizer, this.logger);
|
|
757
759
|
const requestResponseHandlers = {
|
|
758
760
|
[ReqRespSubProtocol.PING]: pingHandler,
|
|
759
761
|
[ReqRespSubProtocol.STATUS]: statusHandler.bind(this),
|
|
760
|
-
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
|
|
761
|
-
[ReqRespSubProtocol.BLOCK]: blockHandler.bind(this)
|
|
762
|
+
[ReqRespSubProtocol.GOODBYE]: goodbyeHandler.bind(this)
|
|
762
763
|
};
|
|
763
764
|
if (!this.config.disableTransactions) {
|
|
764
765
|
const blockTxsHandler = reqRespBlockTxsHandler(this.mempools.attestationPool, this.archiver, this.mempools.txPool);
|
|
@@ -771,8 +772,7 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
771
772
|
const reqrespSubProtocolValidators = {
|
|
772
773
|
...DEFAULT_SUB_PROTOCOL_VALIDATORS,
|
|
773
774
|
[ReqRespSubProtocol.TX]: this.validateRequestedTxs.bind(this),
|
|
774
|
-
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
|
|
775
|
-
[ReqRespSubProtocol.BLOCK]: this.validateRequestedBlock.bind(this)
|
|
775
|
+
[ReqRespSubProtocol.BLOCK_TXS]: this.validateRequestedBlockTxs.bind(this)
|
|
776
776
|
};
|
|
777
777
|
await this.peerManager.initializePeers();
|
|
778
778
|
await this.reqresp.start(requestResponseHandlers, reqrespSubProtocolValidators);
|
|
@@ -860,8 +860,14 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
860
860
|
registerBlockReceivedCallback(callback) {
|
|
861
861
|
this.blockReceivedCallback = callback;
|
|
862
862
|
}
|
|
863
|
-
|
|
864
|
-
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);
|
|
865
871
|
}
|
|
866
872
|
/**
|
|
867
873
|
* Registers a callback to be invoked when a duplicate proposal is detected.
|
|
@@ -1038,29 +1044,67 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1038
1044
|
return;
|
|
1039
1045
|
}
|
|
1040
1046
|
async validateReceivedMessage(validationFunc, msgId, source, topicType) {
|
|
1047
|
+
// Default to reject result with a penalty if validation function throws an error
|
|
1041
1048
|
let resultAndObj = {
|
|
1042
|
-
result: TopicValidatorResult.Reject
|
|
1049
|
+
result: TopicValidatorResult.Reject,
|
|
1050
|
+
severity: PeerErrorSeverity.MidToleranceError
|
|
1043
1051
|
};
|
|
1044
1052
|
const timer = new Timer();
|
|
1045
1053
|
try {
|
|
1046
1054
|
resultAndObj = await validationFunc();
|
|
1047
1055
|
} catch (err) {
|
|
1048
|
-
this.
|
|
1049
|
-
this.logger.error(`Error deserializing and validating gossipsub message`, err, {
|
|
1056
|
+
this.logger.error(`Error validating gossipsub message`, err, {
|
|
1050
1057
|
msgId,
|
|
1051
1058
|
source: source.toString(),
|
|
1052
1059
|
topicType
|
|
1053
1060
|
});
|
|
1054
1061
|
}
|
|
1055
1062
|
if (resultAndObj.result === TopicValidatorResult.Accept) {
|
|
1063
|
+
this.logger.debug(`Message ${topicType} accepted by validator`, {
|
|
1064
|
+
msgId,
|
|
1065
|
+
source: source.toString(),
|
|
1066
|
+
topicType
|
|
1067
|
+
});
|
|
1056
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
|
+
});
|
|
1057
1083
|
}
|
|
1058
1084
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), resultAndObj.result);
|
|
1059
1085
|
return resultAndObj;
|
|
1060
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
|
+
}
|
|
1061
1099
|
async handleGossipedTx(payloadData, msgId, source) {
|
|
1062
1100
|
const validationFunc = async ()=>{
|
|
1063
|
-
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
|
+
}
|
|
1064
1108
|
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
1065
1109
|
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
1066
1110
|
// Stage 1: fast validators (metadata, data, timestamps, double-spend, gas, phases, block header)
|
|
@@ -1081,9 +1125,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1081
1125
|
severity,
|
|
1082
1126
|
source: source.toString()
|
|
1083
1127
|
});
|
|
1084
|
-
this.peerManager.penalizePeer(source, severity);
|
|
1085
1128
|
return {
|
|
1086
|
-
result: TopicValidatorResult.Reject
|
|
1129
|
+
result: TopicValidatorResult.Reject,
|
|
1130
|
+
severity
|
|
1087
1131
|
};
|
|
1088
1132
|
}
|
|
1089
1133
|
// Pool pre-check: see if the pool would accept this tx before doing expensive proof verification
|
|
@@ -1107,9 +1151,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1107
1151
|
severity,
|
|
1108
1152
|
source: source.toString()
|
|
1109
1153
|
});
|
|
1110
|
-
this.peerManager.penalizePeer(source, severity);
|
|
1111
1154
|
return {
|
|
1112
|
-
result: TopicValidatorResult.Reject
|
|
1155
|
+
result: TopicValidatorResult.Reject,
|
|
1156
|
+
severity
|
|
1113
1157
|
};
|
|
1114
1158
|
}
|
|
1115
1159
|
// Pool add: persist the tx
|
|
@@ -1137,8 +1181,13 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1137
1181
|
obj: tx
|
|
1138
1182
|
};
|
|
1139
1183
|
} else {
|
|
1184
|
+
this.logger.warn(`Gossiped tx ${txHash.toString()} unexpectedly rejected by pool`, {
|
|
1185
|
+
source: source.toString(),
|
|
1186
|
+
txHash: txHash.toString()
|
|
1187
|
+
});
|
|
1140
1188
|
return {
|
|
1141
|
-
result: TopicValidatorResult.Reject
|
|
1189
|
+
result: TopicValidatorResult.Reject,
|
|
1190
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1142
1191
|
};
|
|
1143
1192
|
}
|
|
1144
1193
|
};
|
|
@@ -1159,7 +1208,16 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1159
1208
|
* Process a checkpoint attestation from a peer.
|
|
1160
1209
|
* Validates the attestation and adds it to the pool.
|
|
1161
1210
|
*/ async processCheckpointAttestationFromPeer(payloadData, msgId, source) {
|
|
1162
|
-
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);
|
|
1163
1221
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
1164
1222
|
return;
|
|
1165
1223
|
}
|
|
@@ -1174,9 +1232,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1174
1232
|
const validationResult = await this.checkpointAttestationValidator.validate(attestation);
|
|
1175
1233
|
if (validationResult.result === 'reject') {
|
|
1176
1234
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1177
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1178
1235
|
return {
|
|
1179
|
-
result: TopicValidatorResult.Reject
|
|
1236
|
+
result: TopicValidatorResult.Reject,
|
|
1237
|
+
severity: validationResult.severity
|
|
1180
1238
|
};
|
|
1181
1239
|
}
|
|
1182
1240
|
if (validationResult.result === 'ignore') {
|
|
@@ -1203,9 +1261,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1203
1261
|
obj: attestation
|
|
1204
1262
|
};
|
|
1205
1263
|
}
|
|
1206
|
-
// Could not add (cap reached for signer),
|
|
1264
|
+
// Could not add (cap reached for signer), penalize and do not re-broadcast
|
|
1207
1265
|
if (!added) {
|
|
1208
|
-
this.logger.warn(`
|
|
1266
|
+
this.logger.warn(`Rejecting checkpoint attestation due to cap`, {
|
|
1209
1267
|
slot: slot.toString(),
|
|
1210
1268
|
archive: attestation.archive.toString(),
|
|
1211
1269
|
source: peerId.toString(),
|
|
@@ -1213,8 +1271,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1213
1271
|
count
|
|
1214
1272
|
});
|
|
1215
1273
|
return {
|
|
1216
|
-
result: TopicValidatorResult.
|
|
1217
|
-
|
|
1274
|
+
result: TopicValidatorResult.Reject,
|
|
1275
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1218
1276
|
};
|
|
1219
1277
|
}
|
|
1220
1278
|
// Check if this is a duplicate attestation (signer attested to a different proposal at the same slot)
|
|
@@ -1252,9 +1310,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1252
1310
|
const validationResult = await this.blockProposalValidator.validate(block);
|
|
1253
1311
|
if (validationResult.result === 'reject') {
|
|
1254
1312
|
this.logger.warn(`Penalizing peer ${peerId} for block proposal validation failure`);
|
|
1255
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1256
1313
|
return {
|
|
1257
|
-
result: TopicValidatorResult.Reject
|
|
1314
|
+
result: TopicValidatorResult.Reject,
|
|
1315
|
+
severity: validationResult.severity
|
|
1258
1316
|
};
|
|
1259
1317
|
}
|
|
1260
1318
|
if (validationResult.result === 'ignore') {
|
|
@@ -1284,7 +1342,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1284
1342
|
}
|
|
1285
1343
|
// Too many blocks received for this slot and index, penalize peer and do not re-broadcast
|
|
1286
1344
|
if (!added) {
|
|
1287
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1288
1345
|
this.logger.warn(`Penalizing peer for block proposal exceeding per-position cap`, {
|
|
1289
1346
|
...block.toBlockInfo(),
|
|
1290
1347
|
indexWithinCheckpoint: block.indexWithinCheckpoint,
|
|
@@ -1296,7 +1353,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1296
1353
|
result: TopicValidatorResult.Reject,
|
|
1297
1354
|
metadata: {
|
|
1298
1355
|
isEquivocated
|
|
1299
|
-
}
|
|
1356
|
+
},
|
|
1357
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1300
1358
|
};
|
|
1301
1359
|
}
|
|
1302
1360
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1370,9 +1428,9 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1370
1428
|
const validationResult = await this.checkpointProposalValidator.validate(checkpoint);
|
|
1371
1429
|
if (validationResult.result === 'reject') {
|
|
1372
1430
|
this.logger.warn(`Penalizing peer ${peerId} for checkpoint proposal validation failure`);
|
|
1373
|
-
this.peerManager.penalizePeer(peerId, validationResult.severity);
|
|
1374
1431
|
return {
|
|
1375
|
-
result: TopicValidatorResult.Reject
|
|
1432
|
+
result: TopicValidatorResult.Reject,
|
|
1433
|
+
severity: validationResult.severity
|
|
1376
1434
|
};
|
|
1377
1435
|
}
|
|
1378
1436
|
if (validationResult.result === 'ignore') {
|
|
@@ -1389,18 +1447,20 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1389
1447
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1390
1448
|
[Attributes.P2P_ID]: peerId.toString()
|
|
1391
1449
|
});
|
|
1392
|
-
const
|
|
1393
|
-
|
|
1450
|
+
const blockProposalResult = await this.validateAndStoreBlockProposal(peerId, blockProposal);
|
|
1451
|
+
const { obj, metadata: { isEquivocated } = {} } = blockProposalResult;
|
|
1452
|
+
if (blockProposalResult.result === TopicValidatorResult.Reject || !obj || isEquivocated) {
|
|
1394
1453
|
this.logger.debug(`Rejecting checkpoint due to invalid last block proposal`, {
|
|
1395
1454
|
[Attributes.SLOT_NUMBER]: checkpoint.slotNumber.toString(),
|
|
1396
1455
|
[Attributes.P2P_ID]: peerId.toString(),
|
|
1397
1456
|
isEquivocated,
|
|
1398
|
-
result
|
|
1457
|
+
result: blockProposalResult.result
|
|
1399
1458
|
});
|
|
1400
1459
|
return {
|
|
1401
|
-
result: TopicValidatorResult.Reject
|
|
1460
|
+
result: TopicValidatorResult.Reject,
|
|
1461
|
+
severity: 'severity' in blockProposalResult ? blockProposalResult.severity : PeerErrorSeverity.MidToleranceError
|
|
1402
1462
|
};
|
|
1403
|
-
} else if (result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1463
|
+
} else if (blockProposalResult.result === TopicValidatorResult.Accept && obj && !isEquivocated) {
|
|
1404
1464
|
processBlock = true;
|
|
1405
1465
|
}
|
|
1406
1466
|
}
|
|
@@ -1427,7 +1487,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1427
1487
|
// Too many checkpoint proposals received for this slot, penalize peer and do not re-broadcast
|
|
1428
1488
|
// Note: We still return the checkpoint obj so the lastBlock can be processed if valid
|
|
1429
1489
|
if (!added) {
|
|
1430
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.HighToleranceError);
|
|
1431
1490
|
this.logger.warn(`Penalizing peer for checkpoint proposal exceeding per-slot cap`, {
|
|
1432
1491
|
...checkpoint.toCheckpointInfo(),
|
|
1433
1492
|
count,
|
|
@@ -1439,7 +1498,8 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1439
1498
|
metadata: {
|
|
1440
1499
|
isEquivocated,
|
|
1441
1500
|
processBlock
|
|
1442
|
-
}
|
|
1501
|
+
},
|
|
1502
|
+
severity: PeerErrorSeverity.HighToleranceError
|
|
1443
1503
|
};
|
|
1444
1504
|
}
|
|
1445
1505
|
// If this was a duplicate proposal, do not process it, but do invoke the duplicate callback,
|
|
@@ -1489,9 +1549,10 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1489
1549
|
archive: checkpoint.archive.toString(),
|
|
1490
1550
|
source: sender.toString()
|
|
1491
1551
|
});
|
|
1552
|
+
await this.allNodesCheckpointReceivedCallback(checkpoint, sender);
|
|
1492
1553
|
// Call the checkpoint received callback with the core version (without lastBlock)
|
|
1493
1554
|
// to validate and potentially generate attestations
|
|
1494
|
-
const attestations = await this.
|
|
1555
|
+
const attestations = await this.validatorCheckpointReceivedCallback(checkpoint, sender);
|
|
1495
1556
|
if (attestations && attestations.length > 0) {
|
|
1496
1557
|
// If the callback returned attestations, add them to the pool and propagate them
|
|
1497
1558
|
await this.mempools.attestationPool.addOwnCheckpointAttestations(attestations);
|
|
@@ -1611,45 +1672,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1611
1672
|
return false;
|
|
1612
1673
|
}
|
|
1613
1674
|
}
|
|
1614
|
-
/**
|
|
1615
|
-
* Validates a BLOCK response.
|
|
1616
|
-
*
|
|
1617
|
-
* If a local copy exists, enforces hash equality. If missing, rejects (no penalty) since the hash cannot be verified.
|
|
1618
|
-
* Penalizes on block number mismatch or hash mismatch.
|
|
1619
|
-
*
|
|
1620
|
-
* @param requestedBlockNumber - The requested block number.
|
|
1621
|
-
* @param responseBlock - The block returned by the peer.
|
|
1622
|
-
* @param peerId - The peer that returned the block.
|
|
1623
|
-
* @returns True if the response is valid, false otherwise.
|
|
1624
|
-
*/ async validateRequestedBlock(requestedBlockNumber, responseBlock, peerId) {
|
|
1625
|
-
try {
|
|
1626
|
-
const reqNum = Number(requestedBlockNumber.toString());
|
|
1627
|
-
if (responseBlock.number !== reqNum) {
|
|
1628
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.LowToleranceError);
|
|
1629
|
-
return false;
|
|
1630
|
-
}
|
|
1631
|
-
const local = await this.archiver.getBlock(BlockNumber(reqNum));
|
|
1632
|
-
if (!local) {
|
|
1633
|
-
// We are missing the local block; we cannot verify the hash yet. Reject without penalizing.
|
|
1634
|
-
// TODO: Consider extending this validator to accept an expected hash or
|
|
1635
|
-
// performing quorum-based checks when using P2P syncing prior to L1 sync.
|
|
1636
|
-
this.logger.warn(`Local block ${reqNum} not found; rejecting BLOCK response without hash verification`);
|
|
1637
|
-
return false;
|
|
1638
|
-
}
|
|
1639
|
-
const [localHash, respHash] = await Promise.all([
|
|
1640
|
-
local.hash(),
|
|
1641
|
-
responseBlock.hash()
|
|
1642
|
-
]);
|
|
1643
|
-
if (!localHash.equals(respHash)) {
|
|
1644
|
-
this.peerManager.penalizePeer(peerId, PeerErrorSeverity.MidToleranceError);
|
|
1645
|
-
return false;
|
|
1646
|
-
}
|
|
1647
|
-
return true;
|
|
1648
|
-
} catch (e) {
|
|
1649
|
-
this.logger.warn(`Error validating requested block`, e);
|
|
1650
|
-
return false;
|
|
1651
|
-
}
|
|
1652
|
-
}
|
|
1653
1675
|
async validateRequestedTx(tx, peerId, txValidator, requested) {
|
|
1654
1676
|
const penalize = (severity)=>this.peerManager.penalizePeer(peerId, severity);
|
|
1655
1677
|
if (requested && !requested.has(tx.getTxHash().toString())) {
|
|
@@ -1790,19 +1812,6 @@ _dec = trackSpan('Libp2pService.validateAndStoreCheckpointAttestation', (_peerId
|
|
|
1790
1812
|
}
|
|
1791
1813
|
return PeerErrorSeverity.HighToleranceError;
|
|
1792
1814
|
}
|
|
1793
|
-
/**
|
|
1794
|
-
* Validate a checkpoint attestation.
|
|
1795
|
-
*
|
|
1796
|
-
* @param attestation - The checkpoint attestation to validate.
|
|
1797
|
-
* @returns True if the checkpoint attestation is valid, false otherwise.
|
|
1798
|
-
*/ async validateCheckpointAttestation(peerId, attestation) {
|
|
1799
|
-
const result = await this.checkpointAttestationValidator.validate(attestation);
|
|
1800
|
-
if (result.result === 'reject') {
|
|
1801
|
-
this.logger.warn(`Penalizing peer ${peerId} for checkpoint attestation validation failure`);
|
|
1802
|
-
this.peerManager.penalizePeer(peerId, result.severity);
|
|
1803
|
-
}
|
|
1804
|
-
return result;
|
|
1805
|
-
}
|
|
1806
1815
|
getPeerScore(peerId) {
|
|
1807
1816
|
return this.node.services.pubsub.score.score(peerId.toString());
|
|
1808
1817
|
}
|
|
@@ -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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"}
|