@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
|
@@ -2,6 +2,7 @@ import { insertIntoSortedArray } from '@aztec/foundation/array';
|
|
|
2
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
3
|
import { toArray } from '@aztec/foundation/iterable';
|
|
4
4
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
6
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
6
7
|
import { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
7
8
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
@@ -10,10 +11,12 @@ import EventEmitter from 'node:events';
|
|
|
10
11
|
import { ArchiveCache } from '../../msg_validators/tx_validator/archive_cache.js';
|
|
11
12
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
12
13
|
import { EvictionManager } from './eviction/eviction_manager.js';
|
|
13
|
-
import {
|
|
14
|
+
import { FeePayerTxInfo } from './eviction/eviction_strategy.js';
|
|
15
|
+
import { FeePayerBalanceEvictionRule } from './eviction/fee_payer_balance_eviction_rule.js';
|
|
14
16
|
import { InvalidTxsAfterMiningRule } from './eviction/invalid_txs_after_mining_rule.js';
|
|
15
17
|
import { InvalidTxsAfterReorgRule } from './eviction/invalid_txs_after_reorg_rule.js';
|
|
16
18
|
import { LowPriorityEvictionRule } from './eviction/low_priority_eviction_rule.js';
|
|
19
|
+
import { NullifierConflictPreAddRule } from './eviction/nullifier_conflict_pre_add_rule.js';
|
|
17
20
|
import { getPendingTxPriority } from './priority.js';
|
|
18
21
|
/**
|
|
19
22
|
* KV implementation of the Transaction Pool.
|
|
@@ -26,7 +29,8 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
26
29
|
/** Map from tx hash to the block number it was originally mined in (for soft-deleted txs). */ #deletedMinedTxHashes;
|
|
27
30
|
/** MultiMap from block number to deleted mined tx hashes for efficient cleanup. */ #blockToDeletedMinedTxHash;
|
|
28
31
|
#historicalHeaderToTxHash;
|
|
29
|
-
#
|
|
32
|
+
#feePayerToBalanceEntry;
|
|
33
|
+
/** Index from nullifier to pending tx hash */ #pendingNullifierToTxHash;
|
|
30
34
|
/** In-memory set of txs that should not be evicted from the pool. */ #nonEvictableTxs;
|
|
31
35
|
/** KV store for archived txs. */ #archive;
|
|
32
36
|
/** Archived txs map for future lookup. */ #archivedTxs;
|
|
@@ -48,11 +52,12 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
48
52
|
this.#evictionManager = new EvictionManager(this);
|
|
49
53
|
this.#evictionManager.registerRule(new InvalidTxsAfterMiningRule());
|
|
50
54
|
this.#evictionManager.registerRule(new InvalidTxsAfterReorgRule(worldState));
|
|
51
|
-
this.#evictionManager.registerRule(new
|
|
55
|
+
this.#evictionManager.registerRule(new FeePayerBalanceEvictionRule(worldState));
|
|
52
56
|
this.#evictionManager.registerRule(new LowPriorityEvictionRule({
|
|
53
57
|
//NOTE: 0 effectively disables low priority eviction
|
|
54
58
|
maxPoolSize: config.maxPendingTxCount ?? 0
|
|
55
59
|
}));
|
|
60
|
+
this.#evictionManager.registerPreAddRule(new NullifierConflictPreAddRule());
|
|
56
61
|
this.updateConfig(config);
|
|
57
62
|
this.#txs = store.openMap('txs');
|
|
58
63
|
this.#minedTxHashToBlock = store.openMap('txHashToBlockMined');
|
|
@@ -61,7 +66,8 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
61
66
|
this.#blockToDeletedMinedTxHash = store.openMultiMap('blockToDeletedMinedTxHash');
|
|
62
67
|
this.#pendingTxHashToHistoricalBlockHeaderHash = store.openMap('txHistoricalBlock');
|
|
63
68
|
this.#historicalHeaderToTxHash = store.openMultiMap('historicalHeaderToPendingTxHash');
|
|
64
|
-
this.#
|
|
69
|
+
this.#feePayerToBalanceEntry = store.openMultiMap('feePayerToBalanceEntry');
|
|
70
|
+
this.#pendingNullifierToTxHash = store.openMap('pendingNullifierToTxHash');
|
|
65
71
|
this.#nonEvictableTxs = new Set();
|
|
66
72
|
this.#archivedTxs = archive.openMap('archivedTxs');
|
|
67
73
|
this.#archivedTxIndices = archive.openMap('archivedTxIndices');
|
|
@@ -104,7 +110,7 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
104
110
|
for (const hash of txHashes){
|
|
105
111
|
const key = hash.toString();
|
|
106
112
|
await this.#minedTxHashToBlock.set(key, blockHeader.globalVariables.blockNumber);
|
|
107
|
-
const tx = await this.
|
|
113
|
+
const tx = await this.getTxByHash(hash);
|
|
108
114
|
if (tx) {
|
|
109
115
|
const nullifiers = tx.data.getNonEmptyNullifiers();
|
|
110
116
|
nullifiers.forEach((nullifier)=>insertIntoSortedArray(uniqueMinedNullifiers, nullifier, Fr.cmp, false));
|
|
@@ -139,8 +145,15 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
139
145
|
for (const hash of txHashes){
|
|
140
146
|
const key = hash.toString();
|
|
141
147
|
await this.#minedTxHashToBlock.delete(key);
|
|
148
|
+
// Clear soft-delete metadata if this tx was previously soft-deleted,
|
|
149
|
+
// so cleanupDeletedMinedTxs won't later hard-delete it while it's pending
|
|
150
|
+
const deletedBlock = await this.#deletedMinedTxHashes.getAsync(key);
|
|
151
|
+
if (deletedBlock !== undefined) {
|
|
152
|
+
await this.#deletedMinedTxHashes.delete(key);
|
|
153
|
+
await this.#blockToDeletedMinedTxHash.deleteValue(deletedBlock, key);
|
|
154
|
+
}
|
|
142
155
|
// Rehydrate the tx in the in-memory pending txs mapping
|
|
143
|
-
const tx = await this.
|
|
156
|
+
const tx = await this.getTxByHash(hash);
|
|
144
157
|
if (tx) {
|
|
145
158
|
await this.addPendingTxIndicesInDbTx(tx, key);
|
|
146
159
|
}
|
|
@@ -190,6 +203,8 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
190
203
|
}
|
|
191
204
|
/**
|
|
192
205
|
* Adds a list of transactions to the pool. Duplicates are ignored.
|
|
206
|
+
* Handles nullifier deduplication: if an incoming tx has a nullifier conflict with
|
|
207
|
+
* existing pending txs, it will either replace them (if higher fee) or be rejected.
|
|
193
208
|
* @param txs - An array of txs to be added to the pool.
|
|
194
209
|
* @returns count of added transactions
|
|
195
210
|
*/ async addTxs(txs, opts = {}) {
|
|
@@ -197,38 +212,59 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
197
212
|
return Promise.resolve(0);
|
|
198
213
|
}
|
|
199
214
|
const addedTxs = [];
|
|
215
|
+
const uniqueFeePayers = [];
|
|
216
|
+
const replacedTxHashes = [];
|
|
200
217
|
const hashesAndStats = txs.map((tx)=>({
|
|
201
218
|
txHash: tx.getTxHash(),
|
|
202
219
|
txStats: tx.getStats()
|
|
203
220
|
}));
|
|
204
221
|
try {
|
|
205
222
|
await this.#store.transactionAsync(async ()=>{
|
|
206
|
-
|
|
223
|
+
for(let i = 0; i < txs.length; i++){
|
|
224
|
+
const tx = txs[i];
|
|
207
225
|
const { txHash, txStats } = hashesAndStats[i];
|
|
208
226
|
const key = txHash.toString();
|
|
209
227
|
if (await this.#txs.hasAsync(key)) {
|
|
210
|
-
this.#log.debug(`Tx ${
|
|
211
|
-
|
|
228
|
+
this.#log.debug(`Tx ${key} already exists in the pool`);
|
|
229
|
+
continue;
|
|
212
230
|
}
|
|
213
|
-
|
|
231
|
+
const poolAccess = this.getPreAddPoolAccess();
|
|
232
|
+
const { shouldReject, txHashesToEvict } = await this.#evictionManager.runPreAddRules(tx, poolAccess);
|
|
233
|
+
if (shouldReject) {
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
for (const txHashToEvict of txHashesToEvict){
|
|
237
|
+
const txToDelete = await this.getTxByHash(txHashToEvict);
|
|
238
|
+
if (txToDelete) {
|
|
239
|
+
const evictedKey = txHashToEvict.toString();
|
|
240
|
+
await this.deletePendingTxInDbTx(txToDelete, evictedKey);
|
|
241
|
+
replacedTxHashes.push(txHashToEvict);
|
|
242
|
+
this.#log.verbose(`Evicted tx ${evictedKey} due to higher-fee tx ${key}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
this.#log.verbose(`Adding tx ${key} to pool`, {
|
|
214
246
|
eventName: 'tx-added-to-pool',
|
|
215
247
|
...txStats
|
|
216
248
|
});
|
|
217
249
|
await this.#txs.set(key, tx.toBuffer());
|
|
218
250
|
addedTxs.push(tx);
|
|
251
|
+
insertIntoSortedArray(uniqueFeePayers, tx.data.feePayer, (a, b)=>a.toField().cmp(b.toField()), false);
|
|
219
252
|
await this.#pendingTxHashToHistoricalBlockHeaderHash.set(key, (await tx.data.constants.anchorBlockHeader.hash()).toString());
|
|
220
253
|
if (!await this.#minedTxHashToBlock.hasAsync(key)) {
|
|
221
254
|
await this.addPendingTxIndicesInDbTx(tx, key);
|
|
222
255
|
this.#metrics.recordSize(tx);
|
|
223
256
|
}
|
|
224
|
-
}
|
|
257
|
+
}
|
|
225
258
|
});
|
|
226
|
-
await this.#evictionManager.evictAfterNewTxs(addedTxs.map(({ txHash })=>txHash));
|
|
259
|
+
await this.#evictionManager.evictAfterNewTxs(addedTxs.map(({ txHash })=>txHash), uniqueFeePayers);
|
|
227
260
|
} catch (err) {
|
|
228
261
|
this.#log.warn('Unexpected error when adding txs', {
|
|
229
262
|
err
|
|
230
263
|
});
|
|
231
264
|
}
|
|
265
|
+
if (replacedTxHashes.length > 0) {
|
|
266
|
+
this.#metrics.transactionsRemoved(replacedTxHashes.map((hash)=>hash.toBigInt()));
|
|
267
|
+
}
|
|
232
268
|
if (addedTxs.length > 0) {
|
|
233
269
|
this.#metrics.transactionsAdded(addedTxs);
|
|
234
270
|
this.emit('txs-added', {
|
|
@@ -259,7 +295,7 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
259
295
|
const minedBlockNumber = await this.#minedTxHashToBlock.getAsync(key);
|
|
260
296
|
const txIsPending = minedBlockNumber === undefined;
|
|
261
297
|
if (txIsPending) {
|
|
262
|
-
await this.
|
|
298
|
+
await this.deletePendingTxInDbTx(tx, key);
|
|
263
299
|
} else {
|
|
264
300
|
await this.deleteMinedTx(key, minedBlockNumber, opts?.permanently ?? false);
|
|
265
301
|
const shouldArchiveTx = this.#archivedTxLimit && !opts?.permanently;
|
|
@@ -287,10 +323,11 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
287
323
|
await this.#deletedMinedTxHashes.set(txHash, minedBlockNumber);
|
|
288
324
|
await this.#blockToDeletedMinedTxHash.set(minedBlockNumber, txHash);
|
|
289
325
|
}
|
|
290
|
-
|
|
326
|
+
// Assumes being called within a DB transaction
|
|
327
|
+
async deletePendingTxInDbTx(tx, txHash) {
|
|
291
328
|
// We always permanently delete pending transactions
|
|
292
329
|
this.#log.trace(`Deleting pending tx ${txHash} from pool`);
|
|
293
|
-
await this.
|
|
330
|
+
await this.removePendingTxIndicesInDbTx(tx, txHash);
|
|
294
331
|
await this.#txs.delete(txHash);
|
|
295
332
|
await this.#pendingTxHashToHistoricalBlockHeaderHash.delete(txHash);
|
|
296
333
|
}
|
|
@@ -317,7 +354,7 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
317
354
|
let historicalBlockHash = await this.#pendingTxHashToHistoricalBlockHeaderHash.getAsync(txHash.toString());
|
|
318
355
|
// Not all tx might have this index created.
|
|
319
356
|
if (!historicalBlockHash) {
|
|
320
|
-
const tx = await this.
|
|
357
|
+
const tx = await this.getTxByHash(txHash);
|
|
321
358
|
if (!tx) {
|
|
322
359
|
this.#log.warn(`PendingTxInfo:tx ${txHash} not found`);
|
|
323
360
|
return undefined;
|
|
@@ -343,14 +380,20 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
343
380
|
}
|
|
344
381
|
return result;
|
|
345
382
|
}
|
|
346
|
-
async
|
|
347
|
-
const
|
|
348
|
-
for (const feePayer of
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
|
|
383
|
+
async getPendingFeePayers() {
|
|
384
|
+
const feePayers = [];
|
|
385
|
+
for await (const feePayer of this.#feePayerToBalanceEntry.keysAsync()){
|
|
386
|
+
const address = AztecAddress.fromString(feePayer);
|
|
387
|
+
insertIntoSortedArray(feePayers, address, (a, b)=>a.toField().cmp(b.toField()), false);
|
|
388
|
+
}
|
|
389
|
+
return feePayers;
|
|
390
|
+
}
|
|
391
|
+
async *getFeePayerTxInfos(feePayer) {
|
|
392
|
+
for await (const value of this.#feePayerToBalanceEntry.getValuesAsync(feePayer.toString())){
|
|
393
|
+
const info = FeePayerTxInfo.decode(value);
|
|
394
|
+
info.isEvictable = !this.#nonEvictableTxs.has(info.txHash.toString());
|
|
395
|
+
yield info;
|
|
352
396
|
}
|
|
353
|
-
return result;
|
|
354
397
|
}
|
|
355
398
|
async getMinedTxHashes() {
|
|
356
399
|
const vals = await toArray(this.#minedTxHashToBlock.entriesAsync());
|
|
@@ -447,21 +490,6 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
447
490
|
return new ArchiveCache(db);
|
|
448
491
|
}
|
|
449
492
|
/**
|
|
450
|
-
* Checks if a cached transaction exists in the in-memory pending tx pool and returns it.
|
|
451
|
-
* Otherwise, it checks the tx pool, updates the pending tx pool, and returns the tx.
|
|
452
|
-
* @param txHash - The generated tx hash.
|
|
453
|
-
* @returns The transaction, if found, 'undefined' otherwise.
|
|
454
|
-
*/ async getPendingTxByHash(txHash) {
|
|
455
|
-
if (typeof txHash === 'string') {
|
|
456
|
-
txHash = TxHash.fromString(txHash);
|
|
457
|
-
}
|
|
458
|
-
const tx = await this.getTxByHash(txHash);
|
|
459
|
-
if (tx) {
|
|
460
|
-
return tx;
|
|
461
|
-
}
|
|
462
|
-
return undefined;
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
493
|
* Archives a list of txs for future reference. The number of archived txs is limited by the specified archivedTxLimit.
|
|
466
494
|
* Note: Pending txs should not be archived, only finalized txs
|
|
467
495
|
* @param txs - The list of transactions to archive.
|
|
@@ -515,23 +543,23 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
515
543
|
async addPendingTxIndicesInDbTx(tx, txHash) {
|
|
516
544
|
await this.#pendingTxPriorityToHash.set(getPendingTxPriority(tx), txHash);
|
|
517
545
|
await this.#historicalHeaderToTxHash.set((await tx.data.constants.anchorBlockHeader.hash()).toString(), txHash);
|
|
518
|
-
await this.#
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
await this.
|
|
523
|
-
}
|
|
546
|
+
await this.#feePayerToBalanceEntry.set(tx.data.feePayer.toString(), await FeePayerTxInfo.encode(tx, txHash));
|
|
547
|
+
// Add nullifier entries for conflict detection
|
|
548
|
+
const nullifiers = tx.data.getNonEmptyNullifiers();
|
|
549
|
+
for (const nullifier of nullifiers){
|
|
550
|
+
await this.#pendingNullifierToTxHash.set(nullifier.toString(), txHash);
|
|
551
|
+
}
|
|
524
552
|
}
|
|
525
553
|
// Assumes being called within a DB transaction
|
|
526
554
|
async removePendingTxIndicesInDbTx(tx, txHash) {
|
|
527
555
|
await this.#pendingTxPriorityToHash.deleteValue(getPendingTxPriority(tx), txHash);
|
|
528
556
|
await this.#historicalHeaderToTxHash.deleteValue((await tx.data.constants.anchorBlockHeader.hash()).toString(), txHash);
|
|
529
|
-
await this.#
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
await this.
|
|
534
|
-
}
|
|
557
|
+
await this.#feePayerToBalanceEntry.deleteValue(tx.data.feePayer.toString(), await FeePayerTxInfo.encode(tx, txHash));
|
|
558
|
+
// Remove nullifier entries
|
|
559
|
+
const nullifiers = tx.data.getNonEmptyNullifiers();
|
|
560
|
+
for (const nullifier of nullifiers){
|
|
561
|
+
await this.#pendingNullifierToTxHash.delete(nullifier.toString());
|
|
562
|
+
}
|
|
535
563
|
}
|
|
536
564
|
/**
|
|
537
565
|
* Returns up to `limit` lowest-priority evictable pending tx hashes without hydrating transactions.
|
|
@@ -552,4 +580,17 @@ import { getPendingTxPriority } from './priority.js';
|
|
|
552
580
|
}
|
|
553
581
|
return txsToEvict;
|
|
554
582
|
}
|
|
583
|
+
/**
|
|
584
|
+
* Creates a PreAddPoolAccess object for use by pre-add eviction rules.
|
|
585
|
+
* Provides read-only access to pool state during addTxs transaction.
|
|
586
|
+
*/ getPreAddPoolAccess() {
|
|
587
|
+
return {
|
|
588
|
+
getTxHashByNullifier: async (nullifier)=>{
|
|
589
|
+
const hashStr = await this.#pendingNullifierToTxHash.getAsync(nullifier.toString());
|
|
590
|
+
return hashStr ? TxHash.fromString(hashStr) : undefined;
|
|
591
|
+
},
|
|
592
|
+
getPendingTxByHash: this.getTxByHash.bind(this),
|
|
593
|
+
getTxPriority: getPendingTxPriority
|
|
594
|
+
};
|
|
595
|
+
}
|
|
555
596
|
}
|
|
@@ -1,18 +1,32 @@
|
|
|
1
|
+
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
|
-
import { BlockHeader, TxHash } from '@aztec/stdlib/tx';
|
|
4
|
+
import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
4
5
|
import type { TxPoolOptions } from '../tx_pool.js';
|
|
5
|
-
import { type EvictionRule, type TxPoolOperations } from './eviction_strategy.js';
|
|
6
|
+
import { type EvictionRule, type PreAddEvictionResult, type PreAddEvictionRule, type PreAddPoolAccess, type TxPoolOperations } from './eviction_strategy.js';
|
|
6
7
|
export declare class EvictionManager {
|
|
7
8
|
private txPool;
|
|
8
9
|
private log;
|
|
9
10
|
private rules;
|
|
11
|
+
/** Pre-add eviction rules (run inside addTxs transaction) */
|
|
12
|
+
private preAddRules;
|
|
10
13
|
constructor(txPool: TxPoolOperations, log?: import("@aztec/foundation/log").Logger);
|
|
11
|
-
evictAfterNewTxs(newTxs: TxHash[]): Promise<void>;
|
|
14
|
+
evictAfterNewTxs(newTxs: TxHash[], feePayers: AztecAddress[]): Promise<void>;
|
|
12
15
|
evictAfterNewBlock(block: BlockHeader, newNullifiers: Fr[], minedFeePayers: AztecAddress[]): Promise<void>;
|
|
13
|
-
evictAfterChainPrune(blockNumber:
|
|
16
|
+
evictAfterChainPrune(blockNumber: BlockNumber): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Runs pre-add eviction rules to determine if an incoming tx should be added
|
|
19
|
+
* and which existing txs should be evicted.
|
|
20
|
+
* Called from inside the addTxs database transaction for atomicity.
|
|
21
|
+
*
|
|
22
|
+
* @param tx - The incoming transaction
|
|
23
|
+
* @param poolAccess - Read-only access to pool state
|
|
24
|
+
* @returns Combined result from all pre-add rules
|
|
25
|
+
*/
|
|
26
|
+
runPreAddRules(tx: Tx, poolAccess: PreAddPoolAccess): Promise<PreAddEvictionResult>;
|
|
14
27
|
registerRule(rule: EvictionRule): void;
|
|
28
|
+
registerPreAddRule(rule: PreAddEvictionRule): void;
|
|
15
29
|
updateConfig(config: TxPoolOptions): void;
|
|
16
30
|
private runEvictionRules;
|
|
17
31
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpY3Rpb25fbWFuYWdlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sL2V2aWN0aW9uL2V2aWN0aW9uX21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBR0wsS0FBSyxZQUFZLEVBQ2pCLEtBQUssb0JBQW9CLEVBQ3pCLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMscUJBQWEsZUFBZTtJQU94QixPQUFPLENBQUMsTUFBTTtJQUNkLE9BQU8sQ0FBQyxHQUFHO0lBUGIsT0FBTyxDQUFDLEtBQUssQ0FBc0I7SUFFbkMsNkRBQTZEO0lBQzdELE9BQU8sQ0FBQyxXQUFXLENBQTRCO0lBRS9DLFlBQ1UsTUFBTSxFQUFFLGdCQUFnQixFQUN4QixHQUFHLHlDQUF1RCxFQUNoRTtJQUVTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQU94RjtJQUVZLGtCQUFrQixDQUM3QixLQUFLLEVBQUUsV0FBVyxFQUNsQixhQUFhLEVBQUUsRUFBRSxFQUFFLEVBQ25CLGNBQWMsRUFBRSxZQUFZLEVBQUUsR0FDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQVNmO0lBRVksb0JBQW9CLENBQUMsV0FBVyxFQUFFLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBTXpFO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDVSxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBNkIvRjtJQUVNLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxRQUVyQztJQUVNLGtCQUFrQixDQUFDLElBQUksRUFBRSxrQkFBa0IsUUFFakQ7SUFFTSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsR0FBRyxJQUFJLENBTy9DO1lBRWEsZ0JBQWdCO0NBYS9CIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eviction_manager.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eviction_manager.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,eAAe;IAOxB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,GAAG;IAPb,OAAO,CAAC,KAAK,CAAsB;IAEnC,6DAA6D;IAC7D,OAAO,CAAC,WAAW,CAA4B;IAE/C,YACU,MAAM,EAAE,gBAAgB,EACxB,GAAG,yCAAuD,EAChE;IAES,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxF;IAEY,kBAAkB,CAC7B,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,EAAE,EAAE,EACnB,cAAc,EAAE,YAAY,EAAE,GAC7B,OAAO,CAAC,IAAI,CAAC,CASf;IAEY,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzE;IAED;;;;;;;;OAQG;IACU,cAAc,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA6B/F;IAEM,YAAY,CAAC,IAAI,EAAE,YAAY,QAErC;IAEM,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,QAEjD;IAEM,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAO/C;YAEa,gBAAgB;CAa/B"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
|
+
import { findIndexInSortedArray, insertIntoSortedArray } from '@aztec/foundation/array';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
1
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
4
|
import { EvictionEvent } from './eviction_strategy.js';
|
|
3
5
|
export class EvictionManager {
|
|
4
6
|
txPool;
|
|
5
7
|
log;
|
|
6
8
|
rules;
|
|
9
|
+
/** Pre-add eviction rules (run inside addTxs transaction) */ preAddRules;
|
|
7
10
|
constructor(txPool, log = createLogger('p2p:mempool:tx_pool:eviction_manager')){
|
|
8
11
|
this.txPool = txPool;
|
|
9
12
|
this.log = log;
|
|
10
13
|
this.rules = [];
|
|
14
|
+
this.preAddRules = [];
|
|
11
15
|
}
|
|
12
|
-
async evictAfterNewTxs(newTxs) {
|
|
16
|
+
async evictAfterNewTxs(newTxs, feePayers) {
|
|
13
17
|
const ctx = {
|
|
14
18
|
event: EvictionEvent.TXS_ADDED,
|
|
15
|
-
newTxs
|
|
19
|
+
newTxs,
|
|
20
|
+
feePayers
|
|
16
21
|
};
|
|
17
22
|
await this.runEvictionRules(ctx);
|
|
18
23
|
}
|
|
@@ -21,7 +26,7 @@ export class EvictionManager {
|
|
|
21
26
|
event: EvictionEvent.BLOCK_MINED,
|
|
22
27
|
block,
|
|
23
28
|
newNullifiers,
|
|
24
|
-
minedFeePayers
|
|
29
|
+
feePayers: minedFeePayers
|
|
25
30
|
};
|
|
26
31
|
await this.runEvictionRules(ctx);
|
|
27
32
|
}
|
|
@@ -32,13 +37,64 @@ export class EvictionManager {
|
|
|
32
37
|
};
|
|
33
38
|
await this.runEvictionRules(ctx);
|
|
34
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Runs pre-add eviction rules to determine if an incoming tx should be added
|
|
42
|
+
* and which existing txs should be evicted.
|
|
43
|
+
* Called from inside the addTxs database transaction for atomicity.
|
|
44
|
+
*
|
|
45
|
+
* @param tx - The incoming transaction
|
|
46
|
+
* @param poolAccess - Read-only access to pool state
|
|
47
|
+
* @returns Combined result from all pre-add rules
|
|
48
|
+
*/ async runPreAddRules(tx, poolAccess) {
|
|
49
|
+
const allTxHashesToEvict = [];
|
|
50
|
+
const cmpTxHash = (a, b)=>Fr.cmp(a.hash, b.hash);
|
|
51
|
+
for (const rule of this.preAddRules){
|
|
52
|
+
try {
|
|
53
|
+
const result = await rule.check(tx, poolAccess);
|
|
54
|
+
if (result.shouldReject) {
|
|
55
|
+
return {
|
|
56
|
+
shouldReject: true,
|
|
57
|
+
txHashesToEvict: [],
|
|
58
|
+
reason: result.reason
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
for (const txHashToEvict of result.txHashesToEvict){
|
|
62
|
+
// Only add if not already present (dedup)
|
|
63
|
+
if (findIndexInSortedArray(allTxHashesToEvict, txHashToEvict, cmpTxHash) === -1) {
|
|
64
|
+
insertIntoSortedArray(allTxHashesToEvict, txHashToEvict, cmpTxHash);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
} catch (err) {
|
|
68
|
+
this.log.warn(`Pre-add eviction rule ${rule.name} unexpected error: ${String(err)}`, {
|
|
69
|
+
err,
|
|
70
|
+
preAddRule: rule.name
|
|
71
|
+
});
|
|
72
|
+
// On error, reject the tx to be safe
|
|
73
|
+
return {
|
|
74
|
+
shouldReject: true,
|
|
75
|
+
txHashesToEvict: [],
|
|
76
|
+
reason: `rule error: ${String(err)}`
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
shouldReject: false,
|
|
82
|
+
txHashesToEvict: allTxHashesToEvict
|
|
83
|
+
};
|
|
84
|
+
}
|
|
35
85
|
registerRule(rule) {
|
|
36
86
|
this.rules.push(rule);
|
|
37
87
|
}
|
|
88
|
+
registerPreAddRule(rule) {
|
|
89
|
+
this.preAddRules.push(rule);
|
|
90
|
+
}
|
|
38
91
|
updateConfig(config) {
|
|
39
92
|
for (const rule of this.rules){
|
|
40
93
|
rule.updateConfig(config);
|
|
41
94
|
}
|
|
95
|
+
for (const rule of this.preAddRules){
|
|
96
|
+
rule.updateConfig?.(config);
|
|
97
|
+
}
|
|
42
98
|
}
|
|
43
99
|
async runEvictionRules(ctx) {
|
|
44
100
|
for (const rule of this.rules){
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
|
-
import type
|
|
4
|
+
import { type BlockHeader, type Tx, TxHash } from '@aztec/stdlib/tx';
|
|
4
5
|
import type { TxPoolOptions } from '../tx_pool.js';
|
|
5
6
|
export declare const EvictionEvent: {
|
|
6
7
|
readonly TXS_ADDED: "txs_added";
|
|
@@ -11,14 +12,15 @@ type EvictionEvent = (typeof EvictionEvent)[keyof typeof EvictionEvent];
|
|
|
11
12
|
export type EvictionContext = {
|
|
12
13
|
event: typeof EvictionEvent.TXS_ADDED;
|
|
13
14
|
newTxs: TxHash[];
|
|
15
|
+
feePayers: AztecAddress[];
|
|
14
16
|
} | {
|
|
15
17
|
event: typeof EvictionEvent.CHAIN_PRUNED;
|
|
16
|
-
blockNumber:
|
|
18
|
+
blockNumber: BlockNumber;
|
|
17
19
|
} | {
|
|
18
20
|
event: typeof EvictionEvent.BLOCK_MINED;
|
|
19
21
|
block: BlockHeader;
|
|
20
22
|
newNullifiers: Fr[];
|
|
21
|
-
|
|
23
|
+
feePayers: AztecAddress[];
|
|
22
24
|
};
|
|
23
25
|
/**
|
|
24
26
|
* Result of an eviction operation
|
|
@@ -52,7 +54,8 @@ export interface TxPoolOperations {
|
|
|
52
54
|
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
53
55
|
getPendingTxInfos(): Promise<PendingTxInfo[]>;
|
|
54
56
|
getPendingTxsReferencingBlocks(blockHashes: Fr[]): Promise<TxBlockReference[]>;
|
|
55
|
-
|
|
57
|
+
getPendingFeePayers(): Promise<AztecAddress[]>;
|
|
58
|
+
getFeePayerTxInfos(feePayer: AztecAddress): AsyncIterable<FeePayerTxInfo>;
|
|
56
59
|
/** Cheap count of current pending transactions. */
|
|
57
60
|
getPendingTxCount(): Promise<number>;
|
|
58
61
|
/**
|
|
@@ -79,5 +82,76 @@ export interface EvictionRule {
|
|
|
79
82
|
*/
|
|
80
83
|
updateConfig(config: TxPoolOptions): void;
|
|
81
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Balance-related information about a transaction for a fee payer.
|
|
87
|
+
*/
|
|
88
|
+
export declare class FeePayerTxInfo {
|
|
89
|
+
txHash: TxHash;
|
|
90
|
+
priority: bigint;
|
|
91
|
+
feeLimit: bigint;
|
|
92
|
+
claimAmount: bigint;
|
|
93
|
+
isEvictable: boolean;
|
|
94
|
+
constructor(fields: {
|
|
95
|
+
txHash: TxHash;
|
|
96
|
+
priority: bigint;
|
|
97
|
+
feeLimit: bigint;
|
|
98
|
+
claimAmount: bigint;
|
|
99
|
+
isEvictable: boolean;
|
|
100
|
+
});
|
|
101
|
+
static encode(tx: Tx, txHash: string | TxHash): Promise<Buffer>;
|
|
102
|
+
static decode(value: Buffer, isEvictable?: boolean): FeePayerTxInfo;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Read-only access to pool state for pre-add eviction checks.
|
|
106
|
+
* Passed to pre-add rules during the addTxs transaction.
|
|
107
|
+
*/
|
|
108
|
+
export interface PreAddPoolAccess {
|
|
109
|
+
/**
|
|
110
|
+
* Get the pending tx hash that uses a specific nullifier, if any.
|
|
111
|
+
* Returns undefined if no pending tx uses this nullifier.
|
|
112
|
+
*/
|
|
113
|
+
getTxHashByNullifier(nullifier: Fr): Promise<TxHash | undefined>;
|
|
114
|
+
/**
|
|
115
|
+
* Get a pending transaction by its hash.
|
|
116
|
+
*/
|
|
117
|
+
getPendingTxByHash(hash: TxHash): Promise<Tx | undefined>;
|
|
118
|
+
/**
|
|
119
|
+
* Get the priority string for a transaction (for fee comparison).
|
|
120
|
+
*/
|
|
121
|
+
getTxPriority(tx: Tx): string;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Result of a pre-add eviction check for a single transaction.
|
|
125
|
+
*/
|
|
126
|
+
export interface PreAddEvictionResult {
|
|
127
|
+
/** Whether the incoming tx should be rejected */
|
|
128
|
+
readonly shouldReject: boolean;
|
|
129
|
+
/** Sorted array of existing tx hashes that should be evicted if this tx is added */
|
|
130
|
+
readonly txHashesToEvict: TxHash[];
|
|
131
|
+
/** Optional reason for rejection */
|
|
132
|
+
readonly reason?: string;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Strategy interface for pre-add eviction rules.
|
|
136
|
+
* These run inside the addTxs transaction before a tx is added,
|
|
137
|
+
* deciding whether to evict existing txs or reject the incoming tx.
|
|
138
|
+
*/
|
|
139
|
+
export interface PreAddEvictionRule {
|
|
140
|
+
readonly name: string;
|
|
141
|
+
/**
|
|
142
|
+
* Check if incoming tx should be added and which existing txs to evict.
|
|
143
|
+
* Called inside the addTxs database transaction for atomicity.
|
|
144
|
+
*
|
|
145
|
+
* @param tx - The incoming transaction to check
|
|
146
|
+
* @param poolAccess - Read-only access to current pool state
|
|
147
|
+
* @returns Result indicating whether to reject and what to evict
|
|
148
|
+
*/
|
|
149
|
+
check(tx: Tx, poolAccess: PreAddPoolAccess): Promise<PreAddEvictionResult>;
|
|
150
|
+
/**
|
|
151
|
+
* Updates the configuration for this rule.
|
|
152
|
+
* Rules should ignore config options that don't apply to them.
|
|
153
|
+
*/
|
|
154
|
+
updateConfig?(config: TxPoolOptions): void;
|
|
155
|
+
}
|
|
82
156
|
export {};
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpY3Rpb25fc3RyYXRlZ3kuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvdHhfcG9vbC9ldmljdGlvbi9ldmljdGlvbl9zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFcEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSXJFLE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxlQUFPLE1BQU0sYUFBYTs7OztDQUloQixDQUFDO0FBRVgsS0FBSyxhQUFhLEdBQUcsQ0FBQyxPQUFPLGFBQWEsQ0FBQyxDQUFDLE1BQU0sT0FBTyxhQUFhLENBQUMsQ0FBQztBQUV4RSxNQUFNLE1BQU0sZUFBZSxHQUN2QjtJQUNFLEtBQUssRUFBRSxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUM7SUFDdEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ2pCLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUMzQixHQUNEO0lBQ0UsS0FBSyxFQUFFLE9BQU8sYUFBYSxDQUFDLFlBQVksQ0FBQztJQUN6QyxXQUFXLEVBQUUsV0FBVyxDQUFDO0NBQzFCLEdBQ0Q7SUFDRSxLQUFLLEVBQUUsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3hDLEtBQUssRUFBRSxXQUFXLENBQUM7SUFDbkIsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3BCLFNBQVMsRUFBRSxZQUFZLEVBQUUsQ0FBQztDQUMzQixDQUFDO0FBRU47O0dBRUc7QUFDSCxNQUFN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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eviction_strategy.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"eviction_strategy.d.ts","sourceRoot":"","sources":["../../../../src/mem_pools/tx_pool/eviction/eviction_strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,52 @@
|
|
|
1
|
+
import { Buffer32 } from '@aztec/foundation/buffer';
|
|
2
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
3
|
+
import { TxHash } from '@aztec/stdlib/tx';
|
|
4
|
+
import { getFeePayerBalanceDelta } from '../../../msg_validators/tx_validator/fee_payer_balance.js';
|
|
5
|
+
import { getTxPriorityFee } from '../priority.js';
|
|
1
6
|
export const EvictionEvent = {
|
|
2
7
|
TXS_ADDED: 'txs_added',
|
|
3
8
|
BLOCK_MINED: 'block_mined',
|
|
4
9
|
CHAIN_PRUNED: 'chain_pruned'
|
|
5
10
|
};
|
|
11
|
+
/**
|
|
12
|
+
* Balance-related information about a transaction for a fee payer.
|
|
13
|
+
*/ export class FeePayerTxInfo {
|
|
14
|
+
txHash;
|
|
15
|
+
priority;
|
|
16
|
+
feeLimit;
|
|
17
|
+
claimAmount;
|
|
18
|
+
isEvictable;
|
|
19
|
+
constructor(fields){
|
|
20
|
+
this.txHash = fields.txHash;
|
|
21
|
+
this.priority = fields.priority;
|
|
22
|
+
this.feeLimit = fields.feeLimit;
|
|
23
|
+
this.claimAmount = fields.claimAmount;
|
|
24
|
+
this.isEvictable = fields.isEvictable;
|
|
25
|
+
}
|
|
26
|
+
static async encode(tx, txHash) {
|
|
27
|
+
const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
|
|
28
|
+
const priority = Buffer32.fromBigInt(getTxPriorityFee(tx)).toBuffer();
|
|
29
|
+
const hashBuffer = (typeof txHash === 'string' ? TxHash.fromString(txHash) : txHash).toBuffer();
|
|
30
|
+
const feeLimitBuffer = Buffer32.fromBigInt(feeLimit).toBuffer();
|
|
31
|
+
const claimAmountBuffer = Buffer32.fromBigInt(claimAmount).toBuffer();
|
|
32
|
+
return Buffer.concat([
|
|
33
|
+
priority,
|
|
34
|
+
hashBuffer,
|
|
35
|
+
feeLimitBuffer,
|
|
36
|
+
claimAmountBuffer
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
static decode(value, isEvictable = true) {
|
|
40
|
+
const priority = Buffer32.fromBuffer(value.subarray(0, Buffer32.SIZE)).toBigInt();
|
|
41
|
+
const hashOffset = Buffer32.SIZE;
|
|
42
|
+
const feeLimitOffset = hashOffset + TxHash.SIZE;
|
|
43
|
+
const claimOffset = feeLimitOffset + Buffer32.SIZE;
|
|
44
|
+
return new FeePayerTxInfo({
|
|
45
|
+
txHash: TxHash.fromBuffer(value.subarray(hashOffset, feeLimitOffset)),
|
|
46
|
+
priority,
|
|
47
|
+
feeLimit: Buffer32.fromBuffer(value.subarray(feeLimitOffset, claimOffset)).toBigInt(),
|
|
48
|
+
claimAmount: Buffer32.fromBuffer(value.subarray(claimOffset, claimOffset + Buffer32.SIZE)).toBigInt(),
|
|
49
|
+
isEvictable
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|