@aztec/p2p 0.0.1-commit.fcb71a6 → 0.0.1-commit.fffb133c
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/interface.d.ts +18 -5
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +10 -13
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +449 -118
- package/dest/config.js +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +61 -42
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +237 -263
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +21 -18
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +113 -108
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -16
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +89 -128
- package/dest/mem_pools/attestation_pool/mocks.d.ts +9 -6
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/mocks.js +16 -12
- 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 +4 -13
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +15 -10
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +91 -50
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +19 -5
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +59 -3
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +79 -5
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +47 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +122 -0
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +4 -4
- 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/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +2 -2
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +25 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +57 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +4 -4
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +51 -18
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +5 -5
- 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 -14
- 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/index.d.ts +2 -2
- package/dest/msg_validators/index.d.ts.map +1 -1
- package/dest/msg_validators/index.js +1 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/block_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +9 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.js +6 -0
- package/dest/msg_validators/proposal_validator/index.d.ts +4 -0
- package/dest/msg_validators/proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/index.js +3 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +13 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator.js +104 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts +23 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.d.ts.map +1 -0
- package/dest/msg_validators/proposal_validator/proposal_validator_test_suite.js +212 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +1 -1
- 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/fee_payer_balance.d.ts +10 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/fee_payer_balance.js +20 -0
- 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 +8 -14
- 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 +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/size_validator.d.ts +6 -0
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/size_validator.js +20 -0
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/services/dummy_service.d.ts +6 -2
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +3 -0
- package/dest/services/encoding.d.ts +1 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +6 -5
- 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 +20 -73
- package/dest/services/libp2p/libp2p_service.d.ts +28 -11
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +711 -152
- package/dest/services/peer-manager/metrics.d.ts +1 -1
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +6 -26
- package/dest/services/peer-manager/peer_manager.d.ts +2 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +0 -10
- 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 +2 -5
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +1 -1
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -1
- package/dest/services/reqresp/constants.d.ts +12 -0
- package/dest/services/reqresp/constants.d.ts.map +1 -0
- package/dest/services/reqresp/constants.js +7 -0
- 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 +5 -21
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/bitvector.js +7 -0
- package/dest/services/reqresp/protocols/status.d.ts +1 -1
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/status.js +4 -1
- package/dest/services/reqresp/reqresp.js +402 -24
- package/dest/services/service.d.ts +16 -3
- package/dest/services/service.d.ts.map +1 -1
- 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 +4 -14
- 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 +5 -5
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- 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 +6 -19
- package/dest/testbench/p2p_client_testbench_worker.js +30 -17
- package/dest/testbench/worker_client_manager.d.ts +1 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +6 -1
- package/package.json +16 -16
- package/src/client/interface.ts +19 -4
- package/src/client/p2p_client.ts +82 -132
- package/src/config.ts +2 -2
- package/src/mem_pools/attestation_pool/attestation_pool.ts +68 -41
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +239 -287
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +162 -140
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +141 -164
- package/src/mem_pools/attestation_pool/mocks.ts +19 -13
- package/src/mem_pools/instrumentation.ts +9 -18
- package/src/mem_pools/tx_pool/README.md +28 -13
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +130 -75
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +66 -5
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +119 -4
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +162 -0
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +4 -2
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +75 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +36 -21
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +13 -16
- package/src/msg_validators/clock_tolerance.ts +51 -0
- package/src/msg_validators/index.ts +1 -1
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +10 -0
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +13 -0
- package/src/msg_validators/proposal_validator/index.ts +3 -0
- package/src/msg_validators/proposal_validator/proposal_validator.ts +92 -0
- package/src/msg_validators/proposal_validator/proposal_validator_test_suite.ts +230 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +3 -1
- package/src/msg_validators/tx_validator/data_validator.ts +12 -4
- package/src/msg_validators/tx_validator/fee_payer_balance.ts +40 -0
- package/src/msg_validators/tx_validator/gas_validator.ts +8 -25
- package/src/msg_validators/tx_validator/index.ts +1 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +12 -4
- package/src/msg_validators/tx_validator/size_validator.ts +18 -0
- package/src/msg_validators/tx_validator/timestamp_validator.ts +3 -1
- package/src/services/dummy_service.ts +6 -0
- package/src/services/encoding.ts +5 -4
- package/src/services/libp2p/instrumentation.ts +19 -73
- package/src/services/libp2p/libp2p_service.ts +351 -115
- package/src/services/peer-manager/metrics.ts +5 -26
- package/src/services/peer-manager/peer_manager.ts +1 -2
- package/src/services/peer-manager/peer_scoring.ts +1 -5
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +3 -1
- package/src/services/reqresp/constants.ts +14 -0
- package/src/services/reqresp/metrics.ts +7 -23
- package/src/services/reqresp/protocols/block_txs/bitvector.ts +9 -0
- package/src/services/reqresp/protocols/status.ts +7 -4
- package/src/services/service.ts +19 -4
- package/src/services/tx_collection/instrumentation.ts +4 -21
- package/src/services/tx_collection/slow_tx_collection.ts +2 -2
- package/src/services/tx_collection/tx_collection.ts +4 -4
- package/src/services/tx_provider.ts +2 -2
- package/src/services/tx_provider_instrumentation.ts +11 -24
- package/src/testbench/p2p_client_testbench_worker.ts +40 -21
- package/src/testbench/worker_client_manager.ts +6 -1
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts +0 -15
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.js +0 -88
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +0 -12
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +0 -82
- package/dest/msg_validators/block_proposal_validator/index.d.ts +0 -2
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +0 -1
- package/dest/msg_validators/block_proposal_validator/index.js +0 -1
- package/src/mem_pools/tx_pool/eviction/insufficient_fee_payer_balance_rule.ts +0 -108
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +0 -97
- package/src/msg_validators/block_proposal_validator/index.ts +0 -1
|
@@ -1,60 +1,93 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
3
|
+
import { ProposalSlotCapExceededError } from '../../errors/attestation-pool.error.js';
|
|
3
4
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
4
5
|
import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation_pool.js';
|
|
5
6
|
export class InMemoryAttestationPool {
|
|
6
7
|
log;
|
|
7
8
|
metrics;
|
|
8
|
-
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
9
|
-
attestations;
|
|
10
9
|
proposals;
|
|
10
|
+
// Checkpoint attestations
|
|
11
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
12
|
+
checkpointAttestations;
|
|
13
|
+
checkpointProposals;
|
|
11
14
|
constructor(telemetry = getTelemetryClient(), log = createLogger('p2p:attestation_pool')){
|
|
12
15
|
this.log = log;
|
|
13
16
|
this.poolStats = ()=>{
|
|
14
17
|
return Promise.resolve({
|
|
15
|
-
itemCount: this.
|
|
18
|
+
itemCount: this.checkpointAttestations.size
|
|
16
19
|
});
|
|
17
20
|
};
|
|
18
|
-
this.attestations = new Map();
|
|
19
21
|
this.proposals = new Map();
|
|
22
|
+
this.checkpointAttestations = new Map();
|
|
23
|
+
this.checkpointProposals = new Map();
|
|
20
24
|
this.metrics = new PoolInstrumentation(telemetry, PoolName.ATTESTATION_POOL, this.poolStats);
|
|
21
25
|
}
|
|
22
26
|
poolStats;
|
|
23
27
|
isEmpty() {
|
|
24
|
-
return Promise.resolve(this.
|
|
28
|
+
return Promise.resolve(this.checkpointAttestations.size === 0 && this.proposals.size === 0);
|
|
25
29
|
}
|
|
26
|
-
|
|
27
|
-
|
|
30
|
+
addBlockProposal(blockProposal) {
|
|
31
|
+
// Strip signedTxs before storing to avoid holding full tx data in memory
|
|
32
|
+
this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
|
|
33
|
+
return Promise.resolve();
|
|
28
34
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
getBlockProposal(id) {
|
|
36
|
+
return Promise.resolve(this.proposals.get(id));
|
|
37
|
+
}
|
|
38
|
+
hasBlockProposal(idOrProposal) {
|
|
39
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
|
|
40
|
+
return Promise.resolve(this.proposals.has(id));
|
|
41
|
+
}
|
|
42
|
+
canAddProposal(_block) {
|
|
43
|
+
// TODO(palla/mbps): See when to allow
|
|
44
|
+
return Promise.resolve(true);
|
|
45
|
+
}
|
|
46
|
+
// Checkpoint attestation methods
|
|
47
|
+
async addCheckpointProposal(proposal) {
|
|
48
|
+
if (!await this.canAddCheckpointProposal(proposal)) {
|
|
49
|
+
throw new ProposalSlotCapExceededError(`Maximum checkpoint proposals per slot reached: slot=${proposal.slotNumber} cap=${MAX_PROPOSALS_PER_SLOT} proposal=${proposal.archive.toString()}`);
|
|
36
50
|
}
|
|
37
|
-
|
|
51
|
+
// Extract and validate the block proposal if present
|
|
52
|
+
const blockProposal = proposal.getBlockProposal();
|
|
53
|
+
if (blockProposal && !await this.canAddProposal(blockProposal)) {
|
|
54
|
+
throw new ProposalSlotCapExceededError(`Maximum block proposals per slot reached when extracting from checkpoint: slot=${proposal.slotNumber} proposal=${blockProposal.archive.toString()}`);
|
|
55
|
+
}
|
|
56
|
+
const slotProposalMapping = getCheckpointSlotOrDefault(this.checkpointAttestations, proposal.slotNumber);
|
|
57
|
+
slotProposalMapping.set(proposal.archive.toString(), new Map());
|
|
58
|
+
// Store the checkpoint proposal as core (without lastBlock) to avoid duplication
|
|
59
|
+
this.checkpointProposals.set(proposal.archive.toString(), proposal.toCore());
|
|
60
|
+
// Store the extracted block proposal separately
|
|
61
|
+
if (blockProposal) {
|
|
62
|
+
this.proposals.set(blockProposal.archive.toString(), blockProposal.withoutSignedTxs());
|
|
63
|
+
}
|
|
64
|
+
return Promise.resolve();
|
|
65
|
+
}
|
|
66
|
+
getCheckpointProposal(id) {
|
|
67
|
+
return Promise.resolve(this.checkpointProposals.get(id));
|
|
38
68
|
}
|
|
39
|
-
|
|
69
|
+
hasCheckpointProposal(idOrProposal) {
|
|
70
|
+
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.archive.toString();
|
|
71
|
+
return Promise.resolve(this.checkpointProposals.has(id));
|
|
72
|
+
}
|
|
73
|
+
addCheckpointAttestations(attestations) {
|
|
40
74
|
for (const attestation of attestations){
|
|
41
|
-
// Perf: order and group by slot before insertion
|
|
42
75
|
const slotNumber = attestation.payload.header.slotNumber;
|
|
43
76
|
const proposalId = attestation.archive.toString();
|
|
44
77
|
const sender = attestation.getSender();
|
|
45
78
|
// Skip attestations with invalid signatures
|
|
46
79
|
if (!sender) {
|
|
47
|
-
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
|
|
80
|
+
this.log.warn(`Skipping checkpoint attestation with invalid signature for slot ${slotNumber}`, {
|
|
48
81
|
signature: attestation.signature.toString(),
|
|
49
82
|
slotNumber,
|
|
50
83
|
proposalId
|
|
51
84
|
});
|
|
52
85
|
continue;
|
|
53
86
|
}
|
|
54
|
-
const slotAttestationMap =
|
|
55
|
-
const proposalAttestationMap =
|
|
87
|
+
const slotAttestationMap = getCheckpointSlotOrDefault(this.checkpointAttestations, slotNumber);
|
|
88
|
+
const proposalAttestationMap = getCheckpointProposalOrDefault(slotAttestationMap, proposalId);
|
|
56
89
|
proposalAttestationMap.set(sender.toString(), attestation);
|
|
57
|
-
this.log.verbose(`Added attestation for slot ${slotNumber} from ${sender}`, {
|
|
90
|
+
this.log.verbose(`Added checkpoint attestation for slot ${slotNumber} from ${sender}`, {
|
|
58
91
|
signature: attestation.signature.toString(),
|
|
59
92
|
slotNumber,
|
|
60
93
|
address: sender,
|
|
@@ -63,22 +96,22 @@ export class InMemoryAttestationPool {
|
|
|
63
96
|
}
|
|
64
97
|
return Promise.resolve();
|
|
65
98
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
99
|
+
getCheckpointAttestationsForSlot(slot) {
|
|
100
|
+
return Promise.resolve(Array.from(this.checkpointAttestations.get(slot)?.values() ?? []).flatMap((proposalAttestationMap)=>Array.from(proposalAttestationMap.values())));
|
|
101
|
+
}
|
|
102
|
+
getCheckpointAttestationsForSlotAndProposal(slot, proposalId) {
|
|
103
|
+
const slotAttestationMap = this.checkpointAttestations.get(slot);
|
|
69
104
|
if (slotAttestationMap) {
|
|
70
|
-
|
|
71
|
-
|
|
105
|
+
const proposalAttestationMap = slotAttestationMap.get(proposalId);
|
|
106
|
+
if (proposalAttestationMap) {
|
|
107
|
+
return Promise.resolve(Array.from(proposalAttestationMap.values()));
|
|
72
108
|
}
|
|
73
109
|
}
|
|
74
|
-
return
|
|
110
|
+
return Promise.resolve([]);
|
|
75
111
|
}
|
|
76
|
-
|
|
112
|
+
deleteCheckpointAttestationsOlderThan(oldestSlot) {
|
|
77
113
|
const olderThan = [];
|
|
78
|
-
|
|
79
|
-
// Note: this will only prune correctly if attestations are added in order of rising slot, it is important that we do not allow
|
|
80
|
-
// insertion of attestations that are old. #(https://github.com/AztecProtocol/aztec-packages/issues/10322)
|
|
81
|
-
const slots = this.attestations.keys();
|
|
114
|
+
const slots = this.checkpointAttestations.keys();
|
|
82
115
|
for (const slot of slots){
|
|
83
116
|
if (slot < oldestSlot) {
|
|
84
117
|
olderThan.push(slot);
|
|
@@ -87,57 +120,32 @@ export class InMemoryAttestationPool {
|
|
|
87
120
|
}
|
|
88
121
|
}
|
|
89
122
|
for (const oldSlot of olderThan){
|
|
90
|
-
|
|
123
|
+
const proposalIds = this.checkpointAttestations.get(oldSlot)?.keys();
|
|
124
|
+
proposalIds?.forEach((proposalId)=>this.checkpointProposals.delete(proposalId));
|
|
125
|
+
this.checkpointAttestations.delete(oldSlot);
|
|
91
126
|
}
|
|
92
127
|
return Promise.resolve();
|
|
93
128
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
let proposalIdsToDeleteCount = 0;
|
|
99
|
-
proposalIdsToDelete?.forEach((proposalId)=>{
|
|
100
|
-
this.proposals.delete(proposalId);
|
|
101
|
-
proposalIdsToDeleteCount++;
|
|
102
|
-
});
|
|
103
|
-
this.attestations.delete(slot);
|
|
104
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations and ${proposalIdsToDeleteCount} proposals for slot ${slot}`);
|
|
105
|
-
return Promise.resolve();
|
|
129
|
+
hasReachedCheckpointProposalCap(slot) {
|
|
130
|
+
const slotAttestationMap = this.checkpointAttestations.get(slot);
|
|
131
|
+
const proposalCount = slotAttestationMap?.size ?? 0;
|
|
132
|
+
return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
|
|
106
133
|
}
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const numberOfAttestations = slotAttestationMap.get(proposalId)?.size ?? 0;
|
|
112
|
-
slotAttestationMap.delete(proposalId);
|
|
113
|
-
this.log.verbose(`Removed ${numberOfAttestations} attestations for slot ${slot} and proposal ${proposalId}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
this.proposals.delete(proposalId);
|
|
117
|
-
return Promise.resolve();
|
|
134
|
+
hasReachedCheckpointAttestationCap(slot, proposalId, committeeSize) {
|
|
135
|
+
const limit = committeeSize + ATTESTATION_CAP_BUFFER;
|
|
136
|
+
const count = this.checkpointAttestations.get(slot)?.get(proposalId)?.size ?? 0;
|
|
137
|
+
return Promise.resolve(limit <= 0 || count >= limit);
|
|
118
138
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const slotNumber = attestation.payload.header.slotNumber;
|
|
122
|
-
const slotAttestationMap = this.attestations.get(slotNumber);
|
|
123
|
-
if (slotAttestationMap) {
|
|
124
|
-
const proposalId = attestation.archive.toString();
|
|
125
|
-
const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
|
|
126
|
-
if (proposalAttestationMap) {
|
|
127
|
-
const sender = attestation.getSender();
|
|
128
|
-
// Skip attestations with invalid signatures
|
|
129
|
-
if (!sender) {
|
|
130
|
-
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
proposalAttestationMap.delete(sender.toString());
|
|
134
|
-
this.log.debug(`Deleted attestation for slot ${slotNumber} from ${sender}`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return Promise.resolve();
|
|
139
|
+
async canAddCheckpointProposal(proposal) {
|
|
140
|
+
return this.checkpointProposals.has(proposal.archive.toString()) || !await this.hasReachedCheckpointProposalCap(proposal.slotNumber);
|
|
139
141
|
}
|
|
140
|
-
|
|
142
|
+
async canAddCheckpointAttestation(attestation, committeeSize) {
|
|
143
|
+
const sender = attestation.getSender();
|
|
144
|
+
const slot = attestation.payload.header.slotNumber;
|
|
145
|
+
const pid = attestation.archive.toString();
|
|
146
|
+
return !!sender && ((this.checkpointAttestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedCheckpointAttestationCap(slot, pid, committeeSize));
|
|
147
|
+
}
|
|
148
|
+
hasCheckpointAttestation(attestation) {
|
|
141
149
|
const slotNumber = attestation.payload.header.slotNumber;
|
|
142
150
|
const proposalId = attestation.archive.toString();
|
|
143
151
|
const sender = attestation.getSender();
|
|
@@ -145,7 +153,7 @@ export class InMemoryAttestationPool {
|
|
|
145
153
|
if (!sender) {
|
|
146
154
|
return Promise.resolve(false);
|
|
147
155
|
}
|
|
148
|
-
const slotAttestationMap = this.
|
|
156
|
+
const slotAttestationMap = this.checkpointAttestations.get(slotNumber);
|
|
149
157
|
if (!slotAttestationMap) {
|
|
150
158
|
return Promise.resolve(false);
|
|
151
159
|
}
|
|
@@ -155,63 +163,16 @@ export class InMemoryAttestationPool {
|
|
|
155
163
|
}
|
|
156
164
|
return Promise.resolve(proposalAttestationMap.has(sender.toString()));
|
|
157
165
|
}
|
|
158
|
-
addBlockProposal(blockProposal) {
|
|
159
|
-
// We initialize slot-proposal mapping if it does not exist
|
|
160
|
-
// This is important to ensure we can delete this proposal if there were not attestations for it
|
|
161
|
-
const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber);
|
|
162
|
-
slotProposalMapping.set(blockProposal.payload.archive.toString(), new Map());
|
|
163
|
-
this.proposals.set(blockProposal.payload.archive.toString(), blockProposal);
|
|
164
|
-
return Promise.resolve();
|
|
165
|
-
}
|
|
166
|
-
getBlockProposal(id) {
|
|
167
|
-
return Promise.resolve(this.proposals.get(id));
|
|
168
|
-
}
|
|
169
|
-
hasBlockProposal(idOrProposal) {
|
|
170
|
-
const id = typeof idOrProposal === 'string' ? idOrProposal : idOrProposal.payload.archive.toString();
|
|
171
|
-
return Promise.resolve(this.proposals.has(id));
|
|
172
|
-
}
|
|
173
|
-
hasReachedProposalCap(slot) {
|
|
174
|
-
const slotAttestationMap = this.attestations.get(slot);
|
|
175
|
-
const proposalCount = slotAttestationMap?.size ?? 0;
|
|
176
|
-
return Promise.resolve(proposalCount >= MAX_PROPOSALS_PER_SLOT);
|
|
177
|
-
}
|
|
178
|
-
hasReachedAttestationCap(slot, proposalId, committeeSize) {
|
|
179
|
-
const limit = committeeSize + ATTESTATION_CAP_BUFFER;
|
|
180
|
-
const count = this.attestations.get(slot)?.get(proposalId)?.size ?? 0;
|
|
181
|
-
return Promise.resolve(limit <= 0 || count >= limit);
|
|
182
|
-
}
|
|
183
|
-
async canAddProposal(block) {
|
|
184
|
-
return this.proposals.has(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber);
|
|
185
|
-
}
|
|
186
|
-
async canAddAttestation(attestation, committeeSize) {
|
|
187
|
-
const sender = attestation.getSender();
|
|
188
|
-
const slot = attestation.payload.header.slotNumber;
|
|
189
|
-
const pid = attestation.archive.toString();
|
|
190
|
-
return !!sender && ((this.attestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedAttestationCap(slot, pid, committeeSize));
|
|
191
|
-
}
|
|
192
166
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
*
|
|
196
|
-
* Fetch the slot mapping, if it does not exist, then create a mapping and return it
|
|
197
|
-
* @param map - The map to fetch from
|
|
198
|
-
* @param slot - The slot to fetch
|
|
199
|
-
* @returns The slot mapping
|
|
200
|
-
*/ function getSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
167
|
+
// Checkpoint attestation helper functions
|
|
168
|
+
function getCheckpointSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
201
169
|
map, slot) {
|
|
202
170
|
if (!map.has(slot)) {
|
|
203
171
|
map.set(slot, new Map());
|
|
204
172
|
}
|
|
205
173
|
return map.get(slot);
|
|
206
174
|
}
|
|
207
|
-
|
|
208
|
-
* Get Proposal or Default
|
|
209
|
-
*
|
|
210
|
-
* Fetch the proposal mapping, if it does not exist, then create a mapping and return it
|
|
211
|
-
* @param map - The map to fetch from
|
|
212
|
-
* @param proposalId - The proposal id to fetch
|
|
213
|
-
* @returns The proposal mapping
|
|
214
|
-
*/ function getProposalOrDefault(map, proposalId) {
|
|
175
|
+
function getCheckpointProposalOrDefault(map, proposalId) {
|
|
215
176
|
if (!map.has(proposalId)) {
|
|
216
177
|
map.set(proposalId, new Map());
|
|
217
178
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import {
|
|
3
|
+
import { CheckpointAttestation } from '@aztec/stdlib/p2p';
|
|
4
|
+
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
4
5
|
/** Generate Account
|
|
5
6
|
*
|
|
6
7
|
* Create a random signer
|
|
@@ -229,11 +230,13 @@ export declare const generateAccount: () => {
|
|
|
229
230
|
source: string;
|
|
230
231
|
type: "local";
|
|
231
232
|
};
|
|
232
|
-
/** Mock Attestation
|
|
233
|
+
/** Mock Checkpoint Attestation
|
|
233
234
|
*
|
|
234
|
-
* @param signer A
|
|
235
|
+
* @param signer A Secp256k1Signer to create a signature
|
|
235
236
|
* @param slot The slot number the attestation is for
|
|
236
|
-
* @
|
|
237
|
+
* @param archive The archive root (defaults to random)
|
|
238
|
+
* @param header The checkpoint header (defaults to random with given slot)
|
|
239
|
+
* @returns A Checkpoint Attestation
|
|
237
240
|
*/
|
|
238
|
-
export declare const
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
241
|
+
export declare const mockCheckpointAttestation: (signer: Secp256k1Signer, slot?: number, archive?: Fr, header?: CheckpointHeader | undefined) => CheckpointAttestation;
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDcEQsT0FBTyxFQUNMLHFCQUFxQixFQUl0QixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBSXhEOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sZUFBZTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBRzNCLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsZUFBTyxNQUFNLHlCQUF5Qix3SEFtQnJDLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mocks.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/mocks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EACL,qBAAqB,EAItB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIxD;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG3B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,wHAmBrC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
3
|
+
import { CheckpointAttestation, ConsensusPayload, SignatureDomainSeparator, getHashedSignaturePayloadEthSignedMessage } from '@aztec/stdlib/p2p';
|
|
4
|
+
import { CheckpointHeader } from '@aztec/stdlib/rollup';
|
|
4
5
|
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
5
6
|
/** Generate Account
|
|
6
7
|
*
|
|
@@ -10,18 +11,21 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
|
10
11
|
const privateKey = generatePrivateKey();
|
|
11
12
|
return privateKeyToAccount(privateKey);
|
|
12
13
|
};
|
|
13
|
-
/** Mock Attestation
|
|
14
|
+
/** Mock Checkpoint Attestation
|
|
14
15
|
*
|
|
15
|
-
* @param signer A
|
|
16
|
+
* @param signer A Secp256k1Signer to create a signature
|
|
16
17
|
* @param slot The slot number the attestation is for
|
|
17
|
-
* @
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
* @param archive The archive root (defaults to random)
|
|
19
|
+
* @param header The checkpoint header (defaults to random with given slot)
|
|
20
|
+
* @returns A Checkpoint Attestation
|
|
21
|
+
*/ export const mockCheckpointAttestation = (signer, slot = 0, archive = Fr.random(), header)=>{
|
|
22
|
+
header = header ?? CheckpointHeader.random({
|
|
23
|
+
slotNumber: SlotNumber(slot)
|
|
24
|
+
});
|
|
25
|
+
const payload = new ConsensusPayload(header, archive);
|
|
26
|
+
const attestationHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.checkpointAttestation);
|
|
23
27
|
const attestationSignature = signer.sign(attestationHash);
|
|
24
|
-
const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.
|
|
28
|
+
const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.checkpointProposal);
|
|
25
29
|
const proposerSignature = signer.sign(proposalHash);
|
|
26
|
-
return new
|
|
30
|
+
return new CheckpointAttestation(payload, attestationSignature, proposerSignature);
|
|
27
31
|
};
|
|
@@ -31,4 +31,4 @@ export declare class PoolInstrumentation<PoolObject extends Gossipable> {
|
|
|
31
31
|
transactionsRemoved(hashes: Iterable<bigint> | Iterable<string>): void;
|
|
32
32
|
private observeStats;
|
|
33
33
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWVtX3Bvb2xzL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzQyxPQUFPLEVBS0wsS0FBSyxpQkFBaUIsRUFLdEIsS0FBSyxlQUFlLEVBRXJCLE1BQU0seUJBQXlCLENBQUM7QUFFakMsb0JBQVksUUFBUTtJQUNsQixPQUFPLFdBQVc7SUFDbEIsZ0JBQWdCLG9CQUFvQjtDQUNyQztBQWtDRCxNQUFNLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxPQUFPLENBQUM7SUFDNUMsU0FBUyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQzVDLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0gscUJBQWEsbUJBQW1CLENBQUMsVUFBVSxTQUFTLFVBQVU7SUFtQjFELE9BQU8sQ0FBQyxTQUFTO0lBbEJuQix1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLGdCQUFnQixDQUFrQjtJQUMxQyxPQUFPLENBQUMsZ0JBQWdCLENBQWdCO0lBQ3hDLHFCQUFxQjtJQUNyQixPQUFPLENBQUMsVUFBVSxDQUFZO0lBQzlCLHdEQUF3RDtJQUN4RCxPQUFPLENBQUMsVUFBVSxDQUFZO0lBRTlCLE9BQU8sQ0FBQyxTQUFTLENBQWM7SUFFL0IsT0FBTyxDQUFDLGlCQUFpQixDQUFDO0lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQVE7SUFFckIsT0FBTyxDQUFDLGdCQUFnQixDQUFrRDtJQUUxRSxZQUNFLFNBQVMsRUFBRSxlQUFlLEVBQzFCLElBQUksRUFBRSxRQUFRLEVBQ04sU0FBUyxFQUFFLGlCQUFpQixFQUNwQyxPQUFPLENBQUMsRUFBRSxpQkFBaUIsRUF3QjVCO0lBRU0sVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLFFBRXZDO0lBRU0scUJBQXFCLENBQUMsS0FBSyxFQUFFLE1BQU0sUUFFekM7SUFFTSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLFFBSzFDO0lBRU0sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBWXJFO0lBRUQsT0FBTyxDQUFDLFlBQVksQ0FZbEI7Q0FDSCJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAKL,KAAK,iBAAiB,EAKtB,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,oBAAY,QAAQ;IAClB,OAAO,WAAW;IAClB,gBAAgB,oBAAoB;CACrC;AAkCD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAmB,CAAC,UAAU,SAAS,UAAU;IAmB1D,OAAO,CAAC,SAAS;IAlBnB,uCAAuC;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,gBAAgB,CAAkD;IAE1E,YACE,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,QAAQ,EACN,SAAS,EAAE,iBAAiB,EACpC,OAAO,CAAC,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/mem_pools/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAKL,KAAK,iBAAiB,EAKtB,KAAK,eAAe,EAErB,MAAM,yBAAyB,CAAC;AAEjC,oBAAY,QAAQ;IAClB,OAAO,WAAW;IAClB,gBAAgB,oBAAoB;CACrC;AAkCD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC;IAC5C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C,CAAC,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAmB,CAAC,UAAU,SAAS,UAAU;IAmB1D,OAAO,CAAC,SAAS;IAlBnB,uCAAuC;IACvC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,gBAAgB,CAAgB;IACxC,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAY;IAC9B,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAY;IAE9B,OAAO,CAAC,SAAS,CAAc;IAE/B,OAAO,CAAC,iBAAiB,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAQ;IAErB,OAAO,CAAC,gBAAgB,CAAkD;IAE1E,YACE,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,QAAQ,EACN,SAAS,EAAE,iBAAiB,EACpC,OAAO,CAAC,EAAE,iBAAiB,EAwB5B;IAEM,UAAU,CAAC,UAAU,EAAE,UAAU,QAEvC;IAEM,qBAAqB,CAAC,KAAK,EAAE,MAAM,QAEzC;IAEM,iBAAiB,CAAC,YAAY,EAAE,EAAE,EAAE,QAK1C;IAEM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,QAYrE;IAED,OAAO,CAAC,YAAY,CAYlB;CACH"}
|
|
@@ -59,22 +59,13 @@ export var PoolName = /*#__PURE__*/ function(PoolName) {
|
|
|
59
59
|
[Attributes.POOL_NAME]: name
|
|
60
60
|
};
|
|
61
61
|
const metricsLabels = getMetricsLabels(name);
|
|
62
|
-
this.objectsInMempool = this.meter.createObservableGauge(metricsLabels.objectInMempool
|
|
63
|
-
|
|
64
|
-
});
|
|
65
|
-
this.objectSize = this.meter.createHistogram(metricsLabels.objectSize, {
|
|
66
|
-
unit: 'By',
|
|
67
|
-
description: 'The size of transactions in the mempool'
|
|
68
|
-
});
|
|
62
|
+
this.objectsInMempool = this.meter.createObservableGauge(metricsLabels.objectInMempool);
|
|
63
|
+
this.objectSize = this.meter.createHistogram(metricsLabels.objectSize);
|
|
69
64
|
this.dbMetrics = new LmdbMetrics(this.meter, {
|
|
70
65
|
[Attributes.DB_DATA_TYPE]: 'tx-pool'
|
|
71
66
|
}, dbStats);
|
|
72
|
-
this.addObjectCounter = this.meter.createUpDownCounter(metricsLabels.itemsAdded
|
|
73
|
-
|
|
74
|
-
});
|
|
75
|
-
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay, {
|
|
76
|
-
description: 'Delay between transaction added and evicted from the mempool'
|
|
77
|
-
});
|
|
67
|
+
this.addObjectCounter = this.meter.createUpDownCounter(metricsLabels.itemsAdded);
|
|
68
|
+
this.minedDelay = this.meter.createHistogram(metricsLabels.itemMinedDelay);
|
|
78
69
|
this.meter.addBatchObservableCallback(this.observeStats, [
|
|
79
70
|
this.objectsInMempool
|
|
80
71
|
]);
|
|
@@ -3,12 +3,12 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
3
3
|
import { type Logger } from '@aztec/foundation/log';
|
|
4
4
|
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
5
5
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
6
|
-
import
|
|
7
|
-
import type { MerkleTreeReadOperations,
|
|
6
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
|
+
import type { MerkleTreeReadOperations, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
8
8
|
import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
9
9
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
10
10
|
import { ArchiveCache } from '../../msg_validators/tx_validator/archive_cache.js';
|
|
11
|
-
import type
|
|
11
|
+
import { FeePayerTxInfo, type PendingTxInfo, type TxBlockReference, type TxPoolOperations } from './eviction/eviction_strategy.js';
|
|
12
12
|
import type { TxPool, TxPoolEvents, TxPoolOptions } from './tx_pool.js';
|
|
13
13
|
declare const AztecKVTxPool_base: new () => TypedEventEmitter<TxPoolEvents>;
|
|
14
14
|
/**
|
|
@@ -24,7 +24,7 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool,
|
|
|
24
24
|
* @param archivedTxLimit - The number of txs to archive.
|
|
25
25
|
* @param log - A logger.
|
|
26
26
|
*/
|
|
27
|
-
constructor(store: AztecAsyncKVStore, archive: AztecAsyncKVStore, worldState:
|
|
27
|
+
constructor(store: AztecAsyncKVStore, archive: AztecAsyncKVStore, worldState: WorldStateSynchronizer, telemetry?: TelemetryClient, config?: TxPoolOptions, log?: Logger);
|
|
28
28
|
private countTxs;
|
|
29
29
|
isEmpty(): Promise<boolean>;
|
|
30
30
|
/**
|
|
@@ -54,6 +54,8 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool,
|
|
|
54
54
|
getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
55
55
|
/**
|
|
56
56
|
* Adds a list of transactions to the pool. Duplicates are ignored.
|
|
57
|
+
* Handles nullifier deduplication: if an incoming tx has a nullifier conflict with
|
|
58
|
+
* existing pending txs, it will either replace them (if higher fee) or be rejected.
|
|
57
59
|
* @param txs - An array of txs to be added to the pool.
|
|
58
60
|
* @returns count of added transactions
|
|
59
61
|
*/
|
|
@@ -70,7 +72,7 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool,
|
|
|
70
72
|
permanently?: boolean;
|
|
71
73
|
}): Promise<void>;
|
|
72
74
|
private deleteMinedTx;
|
|
73
|
-
private
|
|
75
|
+
private deletePendingTxInDbTx;
|
|
74
76
|
/**
|
|
75
77
|
* Gets all the transactions stored in the pool.
|
|
76
78
|
* @returns Array of tx objects in the order they were added to the pool.
|
|
@@ -84,7 +86,8 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool,
|
|
|
84
86
|
getPendingTxInfos(): Promise<PendingTxInfo[]>;
|
|
85
87
|
private getPendingTxInfo;
|
|
86
88
|
getPendingTxsReferencingBlocks(blockHashes: Fr[]): Promise<TxBlockReference[]>;
|
|
87
|
-
|
|
89
|
+
getPendingFeePayers(): Promise<AztecAddress[]>;
|
|
90
|
+
getFeePayerTxInfos(feePayer: AztecAddress): AsyncIterable<FeePayerTxInfo>;
|
|
88
91
|
getMinedTxHashes(): Promise<[TxHash, BlockNumber][]>;
|
|
89
92
|
getPendingTxCount(): Promise<number>;
|
|
90
93
|
getMinedTxCount(): Promise<number>;
|
|
@@ -104,17 +107,19 @@ export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool,
|
|
|
104
107
|
* @returns An ArchiveCache instance
|
|
105
108
|
*/
|
|
106
109
|
protected createArchiveCache(db: MerkleTreeReadOperations): ArchiveCache;
|
|
107
|
-
private getPendingTxByHash;
|
|
108
110
|
private archiveTxs;
|
|
109
111
|
private addPendingTxIndicesInDbTx;
|
|
110
|
-
private addPendingTxIndices;
|
|
111
112
|
private removePendingTxIndicesInDbTx;
|
|
112
|
-
private removePendingTxIndices;
|
|
113
113
|
/**
|
|
114
114
|
* Returns up to `limit` lowest-priority evictable pending tx hashes without hydrating transactions.
|
|
115
115
|
* Iterates the priority index in ascending order and skips non-evictable txs.
|
|
116
116
|
*/
|
|
117
117
|
getLowestPriorityEvictable(limit: number): Promise<TxHash[]>;
|
|
118
|
+
/**
|
|
119
|
+
* Creates a PreAddPoolAccess object for use by pre-add eviction rules.
|
|
120
|
+
* Provides read-only access to pool state during addTxs transaction.
|
|
121
|
+
*/
|
|
122
|
+
private getPreAddPoolAccess;
|
|
118
123
|
}
|
|
119
124
|
export {};
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWNfa3ZfdHhfcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sL2F6dGVjX2t2X3R4X3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUd4RyxPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFLbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBR2xGLE9BQU8sRUFDTCxjQUFjLEVBQ2QsS0FBSyxhQUFhLEVBRWxCLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0saUNBQWlDLENBQUM7QUFPekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRXhFOztHQUVHO0FBQ0gscUJBQWEsYUFDWCxTQUFRLGtCQUNSLFlBQVcsTUFBTSxFQUFFLGdCQUFnQjs7SUFrRG5DOzs7Ozs7O09BT0c7SUFDSCxZQUNFLEtBQUss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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aztec_kv_tx_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool/aztec_kv_tx_pool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,
|
|
1
|
+
{"version":3,"file":"aztec_kv_tx_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool/aztec_kv_tx_pool.ts"],"names":[],"mappings":"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"}
|