@aztec/p2p 0.0.1-commit.f295ac2 → 0.0.1-commit.fc805bf
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/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +6 -5
- package/dest/client/p2p_client.d.ts +1 -1
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +9 -2
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts +2 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +305 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts +73 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.d.ts.map +1 -0
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.js +8 -0
- package/dest/config.d.ts +8 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +2 -0
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +2 -2
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +3 -3
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +3 -2
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +8 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +3 -3
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +2 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +41 -10
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +3 -3
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +18 -6
- package/dest/msg_validators/clock_tolerance.d.ts +21 -0
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -0
- package/dest/msg_validators/clock_tolerance.js +37 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +55 -31
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +3 -3
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +93 -64
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +3 -2
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +8 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +21 -11
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
- package/dest/msg_validators/tx_validator/index.d.ts +2 -1
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/index.js +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +8 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +23 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
- 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 +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/dummy_service.d.ts +13 -1
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +39 -0
- package/dest/services/encoding.d.ts +1 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +2 -3
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -3
- package/dest/services/libp2p/libp2p_service.d.ts +13 -7
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +60 -51
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +20 -5
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +8 -2
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +47 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +566 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts +17 -0
- package/dest/services/reqresp/batch-tx-requester/config.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/config.js +27 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +50 -0
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/interface.js +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +37 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +151 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts +54 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/peer_collection.js +139 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts +20 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.d.ts.map +1 -0
- package/dest/services/reqresp/batch-tx-requester/tx_validator.js +21 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +22 -3
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +63 -4
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +2 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +12 -0
- package/dest/services/reqresp/interface.d.ts +5 -3
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +2 -2
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -5
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +5 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +5 -0
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +16 -3
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +18 -6
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +43 -13
- package/dest/services/reqresp/reqresp.d.ts +6 -1
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +58 -22
- package/dest/services/service.d.ts +4 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/config.d.ts +4 -1
- package/dest/services/tx_collection/config.d.ts.map +1 -1
- package/dest/services/tx_collection/config.js +9 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +6 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +16 -5
- package/dest/services/tx_collection/index.d.ts +2 -1
- package/dest/services/tx_collection/index.d.ts.map +1 -1
- package/dest/services/tx_collection/index.js +1 -0
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +9 -2
- package/dest/services/tx_collection/proposal_tx_collector.d.ts +48 -0
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -0
- package/dest/services/tx_collection/proposal_tx_collector.js +50 -0
- package/dest/services/tx_collection/slow_tx_collection.d.ts +3 -3
- package/dest/services/tx_collection/slow_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +8 -8
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_collection.js +5 -5
- package/dest/services/tx_provider.d.ts +3 -3
- package/dest/services/tx_provider.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- package/dest/test-helpers/index.d.ts +3 -1
- package/dest/test-helpers/index.d.ts.map +1 -1
- package/dest/test-helpers/index.js +2 -0
- package/dest/test-helpers/test_tx_provider.d.ts +40 -0
- package/dest/test-helpers/test_tx_provider.d.ts.map +1 -0
- package/dest/test-helpers/test_tx_provider.js +41 -0
- package/dest/test-helpers/testbench-utils.d.ts +158 -0
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -0
- package/dest/test-helpers/testbench-utils.js +297 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +28 -2
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +212 -133
- package/dest/testbench/worker_client_manager.d.ts +51 -6
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +226 -44
- package/package.json +14 -14
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +6 -10
- package/src/client/p2p_client.ts +14 -7
- package/src/client/test/tx_proposal_collector/README.md +227 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +336 -0
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker_protocol.ts +43 -0
- package/src/config.ts +6 -1
- package/src/mem_pools/instrumentation.ts +2 -1
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +2 -2
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +2 -1
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +10 -7
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
- package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -14
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +14 -8
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +31 -31
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +91 -67
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +6 -5
- package/src/msg_validators/tx_validator/data_validator.ts +6 -2
- package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
- package/src/msg_validators/tx_validator/factory.ts +64 -23
- package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +22 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +6 -3
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/dummy_service.ts +45 -0
- package/src/services/encoding.ts +2 -3
- package/src/services/libp2p/instrumentation.ts +15 -2
- package/src/services/libp2p/libp2p_service.ts +99 -73
- package/src/services/peer-manager/metrics.ts +21 -4
- package/src/services/peer-manager/peer_scoring.ts +4 -1
- package/src/services/reqresp/batch-tx-requester/README.md +305 -0
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +706 -0
- package/src/services/reqresp/batch-tx-requester/config.ts +40 -0
- package/src/services/reqresp/batch-tx-requester/interface.ts +57 -0
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +209 -0
- package/src/services/reqresp/batch-tx-requester/peer_collection.ts +205 -0
- package/src/services/reqresp/batch-tx-requester/tx_validator.ts +37 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +65 -4
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +16 -0
- package/src/services/reqresp/interface.ts +5 -2
- package/src/services/reqresp/metrics.ts +34 -9
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +7 -0
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +18 -4
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +51 -9
- package/src/services/reqresp/reqresp.ts +66 -19
- package/src/services/service.ts +4 -0
- package/src/services/tx_collection/config.ts +15 -1
- package/src/services/tx_collection/fast_tx_collection.ts +36 -13
- package/src/services/tx_collection/index.ts +5 -0
- package/src/services/tx_collection/instrumentation.ts +11 -2
- package/src/services/tx_collection/proposal_tx_collector.ts +114 -0
- package/src/services/tx_collection/slow_tx_collection.ts +2 -2
- package/src/services/tx_collection/tx_collection.ts +8 -8
- package/src/services/tx_provider.ts +2 -2
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/index.ts +2 -0
- package/src/test-helpers/test_tx_provider.ts +64 -0
- package/src/test-helpers/testbench-utils.ts +374 -0
- package/src/testbench/p2p_client_testbench_worker.ts +321 -126
- package/src/testbench/worker_client_manager.ts +304 -47
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# BatchTxRequester
|
|
2
|
+
|
|
3
|
+
The `BatchTxRequester` is a specialized P2P service that aggressively fetches missing transactions from peers when a node receives a block proposal but lacks some of the referenced transactions. This is critical for validators who need all transactions to attest to a proposal.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
When a validator receives a block proposal, they must verify all transactions in the block. If some transactions are missing from the local mempool (e.g., due to gossip delays), the `BatchTxRequester` kicks in to fetch them via direct peer-to-peer requests before the attestation deadline.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
11
|
+
│ Block Proposal Received │
|
|
12
|
+
│ (contains hashes of N transactions) │
|
|
13
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
14
|
+
│
|
|
15
|
+
▼
|
|
16
|
+
┌─────────────────────────────────┐
|
|
17
|
+
│ Check local mempool for txs │
|
|
18
|
+
└─────────────────────────────────┘
|
|
19
|
+
│
|
|
20
|
+
┌─────────────────┴─────────────────┐
|
|
21
|
+
│ │
|
|
22
|
+
▼ ▼
|
|
23
|
+
┌─────────────────┐ ┌─────────────────┐
|
|
24
|
+
│ All txs found │ │ Missing M txs │
|
|
25
|
+
│ → Attest now │ │ │
|
|
26
|
+
└─────────────────┘ └─────────────────┘
|
|
27
|
+
│
|
|
28
|
+
▼
|
|
29
|
+
┌───────────────────────────────┐
|
|
30
|
+
│ BatchTxRequester.run() │
|
|
31
|
+
│ Fetch missing txs until │
|
|
32
|
+
│ deadline or all collected │
|
|
33
|
+
└───────────────────────────────┘
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Architecture
|
|
37
|
+
|
|
38
|
+
### Peer Classification
|
|
39
|
+
|
|
40
|
+
The requester classifies peers into three categories to optimize fetching:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
┌─────────────────────────────┐
|
|
44
|
+
│ All Known Peers │
|
|
45
|
+
└─────────────────────────────┘
|
|
46
|
+
│
|
|
47
|
+
┌────────────────────────────┼────────────────────────────┐
|
|
48
|
+
│ │ │
|
|
49
|
+
▼ ▼ ▼
|
|
50
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
51
|
+
│ Pinned Peer │ │ Dumb Peers │ │ Smart Peers │
|
|
52
|
+
│ │ │ │ │ │
|
|
53
|
+
│ The peer who │ │ Peers we query │ │ Peers that have │
|
|
54
|
+
│ sent us the │ │ blindly - we │ │ told us which │
|
|
55
|
+
│ block proposal. │ │ don't know what │ │ txs they have │
|
|
56
|
+
│ Should have ALL │ │ txs they have. │ │ via BitVector │
|
|
57
|
+
│ transactions. │ │ │ │ responses. │
|
|
58
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
59
|
+
│ │ │
|
|
60
|
+
│ │ │
|
|
61
|
+
▼ ▼ ▼
|
|
62
|
+
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
63
|
+
│ Queried in │ │ Queried with │ │ Queried with │
|
|
64
|
+
│ dedicated loop, │ │ full tx hashes │ │ BitVector only │
|
|
65
|
+
│ prioritizes │ │ (peer may not │ │ (peer has the │
|
|
66
|
+
│ least-requested │ │ have proposal) │ │ block proposal) │
|
|
67
|
+
│ transactions │ │ │ │ │
|
|
68
|
+
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Blind Phase → Smart Phase Transition
|
|
72
|
+
|
|
73
|
+
Peers transition from "dumb" to "smart" when they respond with a valid `BlockTxsResponse` containing:
|
|
74
|
+
1. A matching `archiveRoot`
|
|
75
|
+
2. A non-empty `txIndices` BitVector indicating which transactions they have
|
|
76
|
+
3. At least one transaction we're still missing
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
80
|
+
│ BLIND PHASE │
|
|
81
|
+
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
82
|
+
│ │ Initial State: All peers are "dumb" (except pinned peer) │ │
|
|
83
|
+
│ │ │ │
|
|
84
|
+
│ │ Request: [archiveRoot, txHashes (full list), txIndices (BitVector)] │ │
|
|
85
|
+
│ │ └─ Include full hashes because peer may not have proposal │ │
|
|
86
|
+
│ │ │ │
|
|
87
|
+
│ │ Response: [archiveRoot, txs[], txIndices (what peer has)] │ │
|
|
88
|
+
│ │ └─ Tells us exactly which txs this peer can provide │ │
|
|
89
|
+
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
90
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
91
|
+
│
|
|
92
|
+
│ Peer responds with valid txIndices
|
|
93
|
+
│ AND has txs we're missing
|
|
94
|
+
▼
|
|
95
|
+
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
96
|
+
│ SMART PHASE │
|
|
97
|
+
│ ┌────────────────────────────────────────────────────────────────────────┐ │
|
|
98
|
+
│ │ Peer promoted to "smart" - we know exactly what they have │ │
|
|
99
|
+
│ │ │ │
|
|
100
|
+
│ │ Request: [archiveRoot, txIndices (BitVector only)] │ │
|
|
101
|
+
│ │ └─ No need for full hashes, peer has the proposal │ │
|
|
102
|
+
│ │ │ │
|
|
103
|
+
│ │ Response: [archiveRoot, txs[], txIndices (updated availability)] │ │
|
|
104
|
+
│ │ └─ May have received more txs since last response │ │
|
|
105
|
+
│ └────────────────────────────────────────────────────────────────────────┘ │
|
|
106
|
+
└──────────────────────────────────────────────────────────────────────────────┘
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Concurrent Worker Architecture
|
|
110
|
+
|
|
111
|
+
The `BatchTxRequester` runs three types of workers concurrently:
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
┌─────────────────────────────────────┐
|
|
115
|
+
│ BatchTxRequester.run() │
|
|
116
|
+
│ │
|
|
117
|
+
│ ┌─────────────────────────────┐ │
|
|
118
|
+
│ │ txQueue (FifoMemoryQueue)│◄───┼──── Yields Tx objects
|
|
119
|
+
│ └─────────────────────────────┘ │ to caller
|
|
120
|
+
└─────────────────────────────────────┘
|
|
121
|
+
▲
|
|
122
|
+
│ put(tx)
|
|
123
|
+
┌──────────────────────────────┼────────────────────────────┐
|
|
124
|
+
│ │ │
|
|
125
|
+
│ │ │
|
|
126
|
+
┌──────────┴──────────┐ ┌───────────┴─────────┐ ┌──────────┴──────────┐
|
|
127
|
+
│ pinnedPeerRequester │ │ dumbRequester │ │ smartRequester │
|
|
128
|
+
│ │ │ │ │ │
|
|
129
|
+
│ Single dedicated │ │ N parallel workers │ │ M parallel workers │
|
|
130
|
+
│ loop for pinned │ │ (default: 10) │ │ (default: 10) │
|
|
131
|
+
│ peer │ │ │ │ │
|
|
132
|
+
│ │ │ Round-robin through │ │ Wait on semaphore │
|
|
133
|
+
│ Prioritizes txs │ │ available dumb │ │ until peers become │
|
|
134
|
+
│ that have been │ │ peers │ │ smart │
|
|
135
|
+
│ requested least │ │ │ │ │
|
|
136
|
+
└─────────────────────┘ └─────────────────────┘ └─────────────────────┘
|
|
137
|
+
│ │ │
|
|
138
|
+
└──────────────────────────────┼──────────────────────────────┘
|
|
139
|
+
│
|
|
140
|
+
▼
|
|
141
|
+
┌───────────────────────┐
|
|
142
|
+
│ requestTxBatch() │
|
|
143
|
+
│ │
|
|
144
|
+
│ sendRequestToPeer() │
|
|
145
|
+
│ via libp2p ReqResp │
|
|
146
|
+
└───────────────────────┘
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Wire Protocol
|
|
150
|
+
|
|
151
|
+
### BlockTxsRequest
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
class BlockTxsRequest {
|
|
155
|
+
archiveRoot: Fr; // Archive root after the proposed block is applied
|
|
156
|
+
txHashes: TxHashArray; // Full tx hashes (for dumb peers without proposal)
|
|
157
|
+
txIndices: BitVector; // Which txs from proposal we're requesting (1 = want)
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### BlockTxsResponse
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
class BlockTxsResponse {
|
|
165
|
+
archiveRoot: Fr; // Echo back the proposal archive root
|
|
166
|
+
txs: TxArray; // Actual transaction data
|
|
167
|
+
txIndices: BitVector; // Which txs the peer has available (1 = have)
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
The `BitVector` is a compact representation where each bit corresponds to a transaction index in the block proposal. This allows efficient capability advertisement without repeating full hashes.
|
|
172
|
+
|
|
173
|
+
## Key Files
|
|
174
|
+
|
|
175
|
+
| File | Description |
|
|
176
|
+
|------|-------------|
|
|
177
|
+
| `batch_tx_requester.ts` | Main orchestrator with worker loops |
|
|
178
|
+
| `missing_txs.ts` | Tracks metadata for each missing tx (request count, in-flight status, which peers have it) |
|
|
179
|
+
| `peer_collection.ts` | Manages peer classification (dumb/smart/bad) and rate limiting |
|
|
180
|
+
| `interface.ts` | Type definitions for dependencies |
|
|
181
|
+
| `../protocols/block_txs/` | Wire protocol definitions (`BlockTxsRequest`, `BlockTxsResponse`, `BitVector`) |
|
|
182
|
+
|
|
183
|
+
## Stopping Conditions
|
|
184
|
+
|
|
185
|
+
The `BatchTxRequester` stops when any of these conditions are met:
|
|
186
|
+
|
|
187
|
+
1. **All transactions fetched** - Success!
|
|
188
|
+
2. **Deadline exceeded** - Timeout configured by caller
|
|
189
|
+
3. **Abort signal** - External cancellation
|
|
190
|
+
4. **No transactions to fetch** - Nothing was missing
|
|
191
|
+
|
|
192
|
+
## Configuration
|
|
193
|
+
|
|
194
|
+
| Parameter | Default | Description |
|
|
195
|
+
|-----------|---------|-------------|
|
|
196
|
+
| `batchTxRequesterSmartParallelWorkerCount` | 10 | Max concurrent requests to smart peers |
|
|
197
|
+
| `batchTxRequesterDumbParallelWorkerCount` | 10 | Max concurrent requests to dumb peers |
|
|
198
|
+
| `batchTxRequesterTxBatchSize` | 8 | Max transactions per request |
|
|
199
|
+
| `batchTxRequesterBadPeerThreshold` | 2 | Penalties before marking peer as bad (see > threshold logic) |
|
|
200
|
+
| `RATE_LIMIT_EXCEEDED_PEER_CACHE_TTL` | 1000ms | Cooldown after rate limit hit |
|
|
201
|
+
|
|
202
|
+
## Error Handling
|
|
203
|
+
|
|
204
|
+
### Peer States
|
|
205
|
+
|
|
206
|
+
- **Bad Peer**: After `batchTxRequesterBadPeerThreshold` penalties, peer is excluded from queries
|
|
207
|
+
- **Bad Peer Penalties**: A penalty is applied on `FAILURE`/`UNKNOWN` responses or when transaction validation fails
|
|
208
|
+
- **Rate Limited**: On `RATE_LIMIT_EXCEEDED` response, peer is temporarily excluded
|
|
209
|
+
- **Redemption**: A peer is removed from the bad set only after a successful response with all transactions valid (this clears the penalty counter)
|
|
210
|
+
- **Peer Scoring**: Each penalty is forwarded to the injected `peerScoring` service with a severity
|
|
211
|
+
|
|
212
|
+
### Failure Recovery
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
Request to peer fails
|
|
216
|
+
│
|
|
217
|
+
├── RATE_LIMIT_EXCEEDED → Mark peer rate-limited, sleep, retry later
|
|
218
|
+
│
|
|
219
|
+
├── FAILURE/UNKNOWN → Penalise peer (severity), increment penalty counter
|
|
220
|
+
│ │
|
|
221
|
+
│ ├── Counter < threshold → Continue querying
|
|
222
|
+
│ │
|
|
223
|
+
│ └── Counter ≥ threshold → Exclude peer
|
|
224
|
+
│
|
|
225
|
+
└── SUCCESS → Process response, if all transactions are valid clear penalties
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Usage Example
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
const requester = new BatchTxRequester(
|
|
232
|
+
missingTxHashes, // TxHash[] - what we need
|
|
233
|
+
blockProposal, // BlockProposal - the proposal we're attesting to
|
|
234
|
+
pinnedPeer, // PeerId | undefined - who sent us the proposal
|
|
235
|
+
timeoutMs, // number - how long to try
|
|
236
|
+
p2pService, // BatchTxRequesterLibP2PService
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
// Async generator yields transactions as they arrive
|
|
240
|
+
for await (const tx of requester.run()) {
|
|
241
|
+
// Process each transaction as it's fetched and validated
|
|
242
|
+
mempool.addTx(tx);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Or collect all at once
|
|
246
|
+
const txs = await BatchTxRequester.collectAllTxs(requester.run());
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Integration with Broader Codebase
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
253
|
+
│ P2PClient │
|
|
254
|
+
│ │
|
|
255
|
+
│ Receives block proposals via gossipsub │
|
|
256
|
+
│ Triggers transaction collection when needed │
|
|
257
|
+
└───────────────────────────────────┬─────────────────────────────────────────┘
|
|
258
|
+
│
|
|
259
|
+
▼
|
|
260
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
261
|
+
│ TxCollection │
|
|
262
|
+
│ │
|
|
263
|
+
│ Coordinates Fast and Slow collection strategies │
|
|
264
|
+
│ Manages lifecycle of collection requests │
|
|
265
|
+
└───────────────────┬─────────────────────────────────┬───────────────────────┘
|
|
266
|
+
│ │
|
|
267
|
+
▼ ▼
|
|
268
|
+
┌───────────────────────────────────┐ ┌─────────────────────────────────────┐
|
|
269
|
+
│ FastTxCollection │ │ SlowTxCollection │
|
|
270
|
+
│ │ │ │
|
|
271
|
+
│ Time-critical: attestations │ │ Background: unproven blocks │
|
|
272
|
+
│ │ │ │
|
|
273
|
+
│ 1. Try RPC nodes first (fast) │ │ Periodic polling of RPC nodes │
|
|
274
|
+
│ 2. Fall back to BatchTxRequester │ │ and peers for missing txs │
|
|
275
|
+
│ │ │ │
|
|
276
|
+
└───────────────────┬───────────────┘ └─────────────────────────────────────┘
|
|
277
|
+
│
|
|
278
|
+
│ For 'proposal' requests
|
|
279
|
+
▼
|
|
280
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
281
|
+
│ BatchTxRequester │
|
|
282
|
+
│ │
|
|
283
|
+
│ Aggressive parallel fetching from multiple peers │
|
|
284
|
+
│ Uses BLOCK_TXS sub-protocol for efficient batching │
|
|
285
|
+
└───────────────────┬─────────────────────────────────────────────────────────┘
|
|
286
|
+
│
|
|
287
|
+
▼
|
|
288
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
289
|
+
│ ReqResp (libp2p) │
|
|
290
|
+
│ │
|
|
291
|
+
│ Low-level stream management │
|
|
292
|
+
│ sendRequestToPeer() → opens stream → sends request → awaits response │
|
|
293
|
+
└───────────────────┬─────────────────────────────────────────────────────────┘
|
|
294
|
+
│
|
|
295
|
+
▼
|
|
296
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
297
|
+
│ reqRespBlockTxsHandler (on peer) │
|
|
298
|
+
│ │
|
|
299
|
+
│ 1. Parse BlockTxsRequest │
|
|
300
|
+
│ 2. Look up block proposal in AttestationPool │
|
|
301
|
+
│ 3. Check TxPool for available transactions │
|
|
302
|
+
│ 4. Build BitVector of available tx indices │
|
|
303
|
+
│ 5. Return BlockTxsResponse with txs + availability info │
|
|
304
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
305
|
+
```
|