@aztec/p2p 0.0.1-commit.29c6b1a3 → 0.0.1-commit.2e2504e2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bootstrap/bootstrap.d.ts +4 -3
- package/dest/bootstrap/bootstrap.d.ts.map +1 -1
- package/dest/bootstrap/bootstrap.js +4 -4
- package/dest/client/factory.d.ts +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +8 -5
- package/dest/client/p2p_client.d.ts +4 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +15 -4
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +1 -1
- package/dest/config.d.ts +8 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +3 -1
- package/dest/mem_pools/instrumentation.d.ts +1 -1
- package/dest/mem_pools/instrumentation.d.ts.map +1 -1
- package/dest/mem_pools/instrumentation.js +2 -2
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts +2 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/index.js +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts +43 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/archive/tx_archive.js +103 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts +47 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/eviction_manager.js +119 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.js +90 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts +19 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.js +89 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts +10 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/index.js +11 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts +131 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/interfaces.js +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.js +63 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts +17 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.js +91 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts +16 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.js +70 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts +20 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.js +63 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts +15 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.js +19 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts +5 -0
- package/dest/mem_pools/tx_pool_v2/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/index.js +4 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts +193 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/interfaces.js +6 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +71 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +94 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts +26 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_bench_metrics.js +70 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts +55 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2.js +150 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts +69 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool_v2/tx_pool_v2_impl.js +1041 -0
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +7 -2
- package/dest/msg_validators/tx_validator/archive_cache.d.ts +3 -3
- package/dest/msg_validators/tx_validator/archive_cache.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/archive_cache.js +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +5 -4
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/block_header_validator.js +4 -3
- package/dest/msg_validators/tx_validator/data_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +4 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/double_spend_validator.js +3 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +4 -3
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +12 -12
- package/dest/msg_validators/tx_validator/gas_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +2 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +3 -3
- package/dest/msg_validators/tx_validator/size_validator.d.ts +3 -1
- package/dest/msg_validators/tx_validator/size_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/size_validator.js +4 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/timestamp_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/timestamp_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_permitted_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_permitted_validator.js +2 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +2 -2
- package/dest/services/data_store.d.ts +1 -1
- package/dest/services/data_store.d.ts.map +1 -1
- package/dest/services/data_store.js +10 -6
- package/dest/services/discv5/discV5_service.js +1 -1
- package/dest/services/index.d.ts +2 -1
- package/dest/services/index.d.ts.map +1 -1
- package/dest/services/index.js +1 -0
- package/dest/services/libp2p/instrumentation.d.ts +1 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +14 -3
- package/dest/services/libp2p/libp2p_service.d.ts +1 -1
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +10 -10
- package/dest/services/peer-manager/metrics.d.ts +2 -2
- package/dest/services/peer-manager/metrics.d.ts.map +1 -1
- package/dest/services/peer-manager/metrics.js +20 -5
- package/dest/services/peer-manager/peer_scoring.d.ts +1 -1
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +8 -2
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +2 -2
- package/dest/services/reqresp/metrics.d.ts +6 -5
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +17 -5
- package/dest/services/reqresp/protocols/block_txs/block_txs_handler.js +2 -2
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts +6 -6
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/block_txs/block_txs_reqresp.js +14 -14
- package/dest/services/tx_collection/instrumentation.d.ts +1 -1
- package/dest/services/tx_collection/instrumentation.d.ts.map +1 -1
- package/dest/services/tx_collection/instrumentation.js +9 -2
- package/dest/services/tx_file_store/config.d.ts +18 -0
- package/dest/services/tx_file_store/config.d.ts.map +1 -0
- package/dest/services/tx_file_store/config.js +26 -0
- package/dest/services/tx_file_store/index.d.ts +4 -0
- package/dest/services/tx_file_store/index.d.ts.map +1 -0
- package/dest/services/tx_file_store/index.js +3 -0
- package/dest/services/tx_file_store/instrumentation.d.ts +15 -0
- package/dest/services/tx_file_store/instrumentation.d.ts.map +1 -0
- package/dest/services/tx_file_store/instrumentation.js +29 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts +47 -0
- package/dest/services/tx_file_store/tx_file_store.d.ts.map +1 -0
- package/dest/services/tx_file_store/tx_file_store.js +149 -0
- package/dest/services/tx_provider_instrumentation.d.ts +1 -1
- package/dest/services/tx_provider_instrumentation.d.ts.map +1 -1
- package/dest/services/tx_provider_instrumentation.js +5 -5
- package/dest/test-helpers/testbench-utils.d.ts +3 -1
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +2 -1
- package/dest/testbench/p2p_client_testbench_worker.js +1 -1
- package/package.json +14 -14
- package/src/bootstrap/bootstrap.ts +7 -4
- package/src/client/factory.ts +9 -9
- package/src/client/p2p_client.ts +14 -2
- package/src/client/test/tx_proposal_collector/README.md +4 -4
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +1 -1
- package/src/config.ts +8 -1
- package/src/mem_pools/instrumentation.ts +2 -1
- package/src/mem_pools/tx_pool_v2/README.md +188 -0
- package/src/mem_pools/tx_pool_v2/archive/index.ts +1 -0
- package/src/mem_pools/tx_pool_v2/archive/tx_archive.ts +120 -0
- package/src/mem_pools/tx_pool_v2/eviction/eviction_manager.ts +147 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_eviction_rule.ts +118 -0
- package/src/mem_pools/tx_pool_v2/eviction/fee_payer_balance_pre_add_rule.ts +111 -0
- package/src/mem_pools/tx_pool_v2/eviction/index.ts +23 -0
- package/src/mem_pools/tx_pool_v2/eviction/interfaces.ts +164 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_mining_rule.ts +74 -0
- package/src/mem_pools/tx_pool_v2/eviction/invalid_txs_after_reorg_rule.ts +101 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_eviction_rule.ts +86 -0
- package/src/mem_pools/tx_pool_v2/eviction/low_priority_pre_add_rule.ts +72 -0
- package/src/mem_pools/tx_pool_v2/eviction/nullifier_conflict_rule.ts +31 -0
- package/src/mem_pools/tx_pool_v2/index.ts +11 -0
- package/src/mem_pools/tx_pool_v2/interfaces.ts +225 -0
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +160 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts +77 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2.ts +209 -0
- package/src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts +1265 -0
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +8 -2
- package/src/msg_validators/tx_validator/archive_cache.ts +3 -3
- package/src/msg_validators/tx_validator/block_header_validator.ts +7 -8
- package/src/msg_validators/tx_validator/data_validator.ts +6 -2
- package/src/msg_validators/tx_validator/double_spend_validator.ts +4 -3
- package/src/msg_validators/tx_validator/factory.ts +46 -30
- package/src/msg_validators/tx_validator/gas_validator.ts +9 -3
- package/src/msg_validators/tx_validator/metadata_validator.ts +6 -3
- package/src/msg_validators/tx_validator/phases_validator.ts +5 -3
- package/src/msg_validators/tx_validator/size_validator.ts +6 -2
- package/src/msg_validators/tx_validator/timestamp_validator.ts +6 -3
- package/src/msg_validators/tx_validator/tx_permitted_validator.ts +8 -3
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +8 -3
- package/src/services/data_store.ts +10 -7
- package/src/services/discv5/discV5_service.ts +1 -1
- package/src/services/index.ts +1 -0
- package/src/services/libp2p/instrumentation.ts +15 -2
- package/src/services/libp2p/libp2p_service.ts +20 -16
- package/src/services/peer-manager/metrics.ts +21 -4
- package/src/services/peer-manager/peer_scoring.ts +4 -1
- package/src/services/reqresp/batch-tx-requester/README.md +7 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +2 -2
- package/src/services/reqresp/metrics.ts +34 -9
- package/src/services/reqresp/protocols/block_txs/block_txs_handler.ts +2 -2
- package/src/services/reqresp/protocols/block_txs/block_txs_reqresp.ts +10 -10
- package/src/services/tx_collection/instrumentation.ts +11 -2
- package/src/services/tx_file_store/config.ts +43 -0
- package/src/services/tx_file_store/index.ts +3 -0
- package/src/services/tx_file_store/instrumentation.ts +36 -0
- package/src/services/tx_file_store/tx_file_store.ts +173 -0
- package/src/services/tx_provider_instrumentation.ts +11 -5
- package/src/test-helpers/testbench-utils.ts +2 -0
- package/src/testbench/p2p_client_testbench_worker.ts +1 -1
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { L2BlockId } from '@aztec/stdlib/block';
|
|
2
|
+
import type { Tx } from '@aztec/stdlib/tx';
|
|
3
|
+
import type { PreAddResult } from './eviction/interfaces.js';
|
|
4
|
+
/**
|
|
5
|
+
* Lightweight in-memory representation of a transaction.
|
|
6
|
+
* Stored for every tx in the pool to enable efficient queries and challenges
|
|
7
|
+
* without deserializing full transaction data.
|
|
8
|
+
*
|
|
9
|
+
* Uses strings for txHash and nullifiers to enable fast Map/Set lookups
|
|
10
|
+
* without repeated .toString() conversions.
|
|
11
|
+
*/
|
|
12
|
+
export type TxMetaData = {
|
|
13
|
+
/** The transaction hash as hex string */
|
|
14
|
+
readonly txHash: string;
|
|
15
|
+
/** Block ID (number and hash) in which the transaction was mined (undefined if not mined) */
|
|
16
|
+
minedL2BlockId?: L2BlockId;
|
|
17
|
+
/** Hash of the block header the transaction uses as its anchor (hex string) */
|
|
18
|
+
readonly anchorBlockHeaderHash: string;
|
|
19
|
+
/** The total priority fee (used for ordering and challenges) */
|
|
20
|
+
readonly priorityFee: bigint;
|
|
21
|
+
/** The fee payer address as hex string */
|
|
22
|
+
readonly feePayer: string;
|
|
23
|
+
/** The claim amount for the fee payer */
|
|
24
|
+
readonly claimAmount: bigint;
|
|
25
|
+
/** The fee limit */
|
|
26
|
+
readonly feeLimit: bigint;
|
|
27
|
+
/** Non-empty nullifiers emitted by the transaction (hex strings) */
|
|
28
|
+
readonly nullifiers: readonly string[];
|
|
29
|
+
/** Timestamp by which the transaction must be included (for expiration checks) */
|
|
30
|
+
readonly includeByTimestamp: bigint;
|
|
31
|
+
};
|
|
32
|
+
/** Transaction state derived from TxMetaData fields and pool protection status */
|
|
33
|
+
export type TxState = 'pending' | 'protected' | 'mined';
|
|
34
|
+
/**
|
|
35
|
+
* Builds TxMetaData from a full Tx object.
|
|
36
|
+
* Extracts all relevant fields for efficient in-memory storage and querying.
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildTxMetaData(tx: Tx): Promise<TxMetaData>;
|
|
39
|
+
/** Minimal fields required for priority comparison. */
|
|
40
|
+
type PriorityComparable = Pick<TxMetaData, 'txHash' | 'priorityFee'>;
|
|
41
|
+
/**
|
|
42
|
+
* Compares two priority fees in ascending order.
|
|
43
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
44
|
+
*/
|
|
45
|
+
export declare function compareFee(a: bigint, b: bigint): number;
|
|
46
|
+
/**
|
|
47
|
+
* Compares two tx hashes in ascending order.
|
|
48
|
+
* Uses field element comparison for deterministic ordering.
|
|
49
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
50
|
+
*/
|
|
51
|
+
export declare function compareTxHash(a: string, b: string): number;
|
|
52
|
+
/**
|
|
53
|
+
* Compares two transactions by priority fee, with txHash as tiebreaker.
|
|
54
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
55
|
+
* Use with sort() for ascending order, or negate/reverse for descending.
|
|
56
|
+
*/
|
|
57
|
+
export declare function comparePriority(a: PriorityComparable, b: PriorityComparable): number;
|
|
58
|
+
/**
|
|
59
|
+
* Checks for nullifier conflicts between an incoming transaction and existing pool state.
|
|
60
|
+
*
|
|
61
|
+
* When the incoming tx shares nullifiers with existing pending txs:
|
|
62
|
+
* - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
|
|
63
|
+
* - If any conflicting tx has equal or higher priority, ignore the incoming tx
|
|
64
|
+
*
|
|
65
|
+
* @param incomingMeta - Metadata for the incoming transaction
|
|
66
|
+
* @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
|
|
67
|
+
* @param getMetadata - Accessor to get metadata for a tx hash
|
|
68
|
+
*/
|
|
69
|
+
export declare function checkNullifierConflict(incomingMeta: TxMetaData, getTxHashByNullifier: (nullifier: string) => string | undefined, getMetadata: (txHash: string) => TxMetaData | undefined): PreAddResult;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvdHhfcG9vbF92Mi90eF9tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUkzQyxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU3RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxNQUFNLFVBQVUsR0FBRztJQUN2Qix5Q0FBeUM7SUFDekMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFeEIsNkZBQTZGO0lBQzdGLGNBQWMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztJQUUzQiwrRUFBK0U7SUFDL0UsUUFBUSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUV2QyxnRUFBZ0U7SUFDaEUsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUM7SUFFN0IsMENBQTBDO0lBQzFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0lBRTFCLHlDQUF5QztJQUN6QyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUU3QixvQkFBb0I7SUFDcEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFFMUIsb0VBQW9FO0lBQ3BFLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxNQUFNLEVBQUUsQ0FBQztJQUV2QyxrRkFBa0Y7SUFDbEYsUUFBUSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQztDQUNyQyxDQUFDO0FBRUYsa0ZBQWtGO0FBQ2xGLE1BQU0sTUFBTSxPQUFPLEdBQUcsU0FBUyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0gsd0JBQXNCLGVBQWUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FvQmpFO0FBRUQsdURBQXVEO0FBQ3ZELEtBQUssa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUM7QUFFckU7OztHQUdHO0FBQ0gsd0JBQWdCLFVBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUV2RDtBQUVEOzs7O0dBSUc7QUFDSCx3QkFBZ0IsYUFBYSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxNQUFNLENBSTFEO0FBRUQ7Ozs7R0FJRztBQUNILHdCQUFnQixlQUFlLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsRUFBRSxrQkFBa0IsR0FBRyxNQUFNLENBTXBGO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILHdCQUFnQixzQkFBc0IsQ0FDcEMsWUFBWSxFQUFFLFVBQVUsRUFDeEIsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxLQUFLLE1BQU0sR0FBRyxTQUFTLEVBQy9ELFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEtBQUssVUFBVSxHQUFHLFNBQVMsR0FDdEQsWUFBWSxDQWtDZCJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_metadata.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAI3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,yCAAyC;IACzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,6FAA6F;IAC7F,cAAc,CAAC,EAAE,SAAS,CAAC;IAE3B,+EAA+E;IAC/E,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAEvC,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,yCAAyC;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,oBAAoB;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAEvC,kFAAkF;IAClF,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAExD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAoBjE;AAED,uDAAuD;AACvD,KAAK,kBAAkB,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,aAAa,CAAC,CAAC;AAErE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAMpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,UAAU,EACxB,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAC/D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,GACtD,YAAY,CAkCd"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
3
|
+
import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
|
|
4
|
+
import { getTxPriorityFee } from '../tx_pool/priority.js';
|
|
5
|
+
/**
|
|
6
|
+
* Builds TxMetaData from a full Tx object.
|
|
7
|
+
* Extracts all relevant fields for efficient in-memory storage and querying.
|
|
8
|
+
*/ export async function buildTxMetaData(tx) {
|
|
9
|
+
const txHash = tx.getTxHash().toString();
|
|
10
|
+
const anchorBlockHeaderHash = (await tx.data.constants.anchorBlockHeader.hash()).toString();
|
|
11
|
+
const priorityFee = getTxPriorityFee(tx);
|
|
12
|
+
const feePayer = tx.data.feePayer.toString();
|
|
13
|
+
const nullifiers = tx.data.getNonEmptyNullifiers().map((n)=>n.toString());
|
|
14
|
+
const includeByTimestamp = tx.data.includeByTimestamp;
|
|
15
|
+
const { feeLimit, claimAmount } = await getFeePayerBalanceDelta(tx, ProtocolContractAddress.FeeJuice);
|
|
16
|
+
return {
|
|
17
|
+
txHash,
|
|
18
|
+
anchorBlockHeaderHash,
|
|
19
|
+
priorityFee,
|
|
20
|
+
feePayer,
|
|
21
|
+
claimAmount,
|
|
22
|
+
feeLimit,
|
|
23
|
+
nullifiers,
|
|
24
|
+
includeByTimestamp
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Compares two priority fees in ascending order.
|
|
29
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
30
|
+
*/ export function compareFee(a, b) {
|
|
31
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Compares two tx hashes in ascending order.
|
|
35
|
+
* Uses field element comparison for deterministic ordering.
|
|
36
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
37
|
+
*/ export function compareTxHash(a, b) {
|
|
38
|
+
const fieldA = Fr.fromHexString(a);
|
|
39
|
+
const fieldB = Fr.fromHexString(b);
|
|
40
|
+
return fieldA.cmp(fieldB);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compares two transactions by priority fee, with txHash as tiebreaker.
|
|
44
|
+
* Returns negative if a < b, positive if a > b, 0 if equal.
|
|
45
|
+
* Use with sort() for ascending order, or negate/reverse for descending.
|
|
46
|
+
*/ export function comparePriority(a, b) {
|
|
47
|
+
const feeComparison = compareFee(a.priorityFee, b.priorityFee);
|
|
48
|
+
if (feeComparison !== 0) {
|
|
49
|
+
return feeComparison;
|
|
50
|
+
}
|
|
51
|
+
return compareTxHash(a.txHash, b.txHash);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Checks for nullifier conflicts between an incoming transaction and existing pool state.
|
|
55
|
+
*
|
|
56
|
+
* When the incoming tx shares nullifiers with existing pending txs:
|
|
57
|
+
* - If the incoming tx has strictly higher priority, mark conflicting txs for eviction
|
|
58
|
+
* - If any conflicting tx has equal or higher priority, ignore the incoming tx
|
|
59
|
+
*
|
|
60
|
+
* @param incomingMeta - Metadata for the incoming transaction
|
|
61
|
+
* @param getTxHashByNullifier - Accessor to find which tx uses a nullifier
|
|
62
|
+
* @param getMetadata - Accessor to get metadata for a tx hash
|
|
63
|
+
*/ export function checkNullifierConflict(incomingMeta, getTxHashByNullifier, getMetadata) {
|
|
64
|
+
const txHashesToEvict = [];
|
|
65
|
+
for (const nullifier of incomingMeta.nullifiers){
|
|
66
|
+
const conflictingHashStr = getTxHashByNullifier(nullifier);
|
|
67
|
+
if (!conflictingHashStr || conflictingHashStr === incomingMeta.txHash) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
// Skip if already marked for eviction
|
|
71
|
+
if (txHashesToEvict.includes(conflictingHashStr)) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const conflictingMeta = getMetadata(conflictingHashStr);
|
|
75
|
+
if (!conflictingMeta) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// If incoming tx has strictly higher priority, mark for eviction
|
|
79
|
+
// Otherwise, ignore incoming tx (ties go to existing tx)
|
|
80
|
+
if (incomingMeta.priorityFee > conflictingMeta.priorityFee) {
|
|
81
|
+
txHashesToEvict.push(conflictingHashStr);
|
|
82
|
+
} else {
|
|
83
|
+
return {
|
|
84
|
+
shouldIgnore: true,
|
|
85
|
+
txHashesToEvict: [],
|
|
86
|
+
reason: `nullifier conflict with ${conflictingHashStr}`
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
shouldIgnore: false,
|
|
92
|
+
txHashesToEvict
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics types for tx pool benchmarks.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum TxPoolOperation {
|
|
5
|
+
ADD_PENDING_TXS = "addPendingTxs",
|
|
6
|
+
CAN_ADD_PENDING_TX = "canAddPendingTx",
|
|
7
|
+
GET_PENDING_TX_HASHES = "getPendingTxHashes",
|
|
8
|
+
GET_TX_BY_HASH = "getTxByHash",
|
|
9
|
+
GET_TXS_BY_HASH = "getTxsByHash",
|
|
10
|
+
HAS_TXS = "hasTxs",
|
|
11
|
+
HANDLE_MINED_BLOCK = "handleMinedBlock",
|
|
12
|
+
PREPARE_FOR_SLOT = "prepareForSlot",
|
|
13
|
+
HANDLE_PRUNED_BLOCKS = "handlePrunedBlocks",
|
|
14
|
+
GET_LOWEST_PRIORITY_PENDING = "getLowestPriorityPending",
|
|
15
|
+
HYDRATE_FROM_DATABASE = "hydrateFromDatabase"
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Collects and formats tx pool benchmark metrics.
|
|
19
|
+
*/
|
|
20
|
+
export declare class TxPoolBenchMetrics {
|
|
21
|
+
private metrics;
|
|
22
|
+
addMetric(operation: TxPoolOperation, poolSize: number, batchSize: number, value: number): void;
|
|
23
|
+
toPrettyString(): string;
|
|
24
|
+
toGithubActionBenchmarkJSON(indent?: number): string;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF9iZW5jaF9tZXRyaWNzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL3R4X3Bvb2xfdjIvdHhfcG9vbF9iZW5jaF9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsb0JBQVksZUFBZTtJQUN6QixlQUFlLGtCQUFrQjtJQUNqQyxrQkFBa0Isb0JBQW9CO0lBQ3RDLHFCQUFxQix1QkFBdUI7SUFDNUMsY0FBYyxnQkFBZ0I7SUFDOUIsZUFBZSxpQkFBaUI7SUFDaEMsT0FBTyxXQUFXO0lBQ2xCLGtCQUFrQixxQkFBcUI7SUFDdkMsZ0JBQWdCLG1CQUFtQjtJQUNuQyxvQkFBb0IsdUJBQXVCO0lBQzNDLDJCQUEyQiw2QkFBNkI7SUFDeEQscUJBQXFCLHdCQUF3QjtDQUM5QztBQVNEOztHQUVHO0FBQ0gscUJBQWEsa0JBQWtCO0lBQzdCLE9BQU8sQ0FBQyxPQUFPLENBQXlCO0lBRWpDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUU5RjtJQUVNLGNBQWMsSUFBSSxNQUFNLENBd0I5QjtJQUVNLDJCQUEyQixDQUFDLE1BQU0sU0FBSSxHQUFHLE1BQU0sQ0FjckQ7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_pool_bench_metrics.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_pool_bench_metrics.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,eAAe;IACzB,eAAe,kBAAkB;IACjC,kBAAkB,oBAAoB;IACtC,qBAAqB,uBAAuB;IAC5C,cAAc,gBAAgB;IAC9B,eAAe,iBAAiB;IAChC,OAAO,WAAW;IAClB,kBAAkB,qBAAqB;IACvC,gBAAgB,mBAAmB;IACnC,oBAAoB,uBAAuB;IAC3C,2BAA2B,6BAA6B;IACxD,qBAAqB,wBAAwB;CAC9C;AASD;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAyB;IAEjC,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAE9F;IAEM,cAAc,IAAI,MAAM,CAwB9B;IAEM,2BAA2B,CAAC,MAAM,SAAI,GAAG,MAAM,CAcrD;CACF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics types for tx pool benchmarks.
|
|
3
|
+
*/ export var TxPoolOperation = /*#__PURE__*/ function(TxPoolOperation) {
|
|
4
|
+
TxPoolOperation["ADD_PENDING_TXS"] = "addPendingTxs";
|
|
5
|
+
TxPoolOperation["CAN_ADD_PENDING_TX"] = "canAddPendingTx";
|
|
6
|
+
TxPoolOperation["GET_PENDING_TX_HASHES"] = "getPendingTxHashes";
|
|
7
|
+
TxPoolOperation["GET_TX_BY_HASH"] = "getTxByHash";
|
|
8
|
+
TxPoolOperation["GET_TXS_BY_HASH"] = "getTxsByHash";
|
|
9
|
+
TxPoolOperation["HAS_TXS"] = "hasTxs";
|
|
10
|
+
TxPoolOperation["HANDLE_MINED_BLOCK"] = "handleMinedBlock";
|
|
11
|
+
TxPoolOperation["PREPARE_FOR_SLOT"] = "prepareForSlot";
|
|
12
|
+
TxPoolOperation["HANDLE_PRUNED_BLOCKS"] = "handlePrunedBlocks";
|
|
13
|
+
TxPoolOperation["GET_LOWEST_PRIORITY_PENDING"] = "getLowestPriorityPending";
|
|
14
|
+
TxPoolOperation["HYDRATE_FROM_DATABASE"] = "hydrateFromDatabase";
|
|
15
|
+
return TxPoolOperation;
|
|
16
|
+
}({});
|
|
17
|
+
/**
|
|
18
|
+
* Collects and formats tx pool benchmark metrics.
|
|
19
|
+
*/ export class TxPoolBenchMetrics {
|
|
20
|
+
metrics = [];
|
|
21
|
+
addMetric(operation, poolSize, batchSize, value) {
|
|
22
|
+
this.metrics.push({
|
|
23
|
+
operation,
|
|
24
|
+
poolSize,
|
|
25
|
+
batchSize,
|
|
26
|
+
value
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
toPrettyString() {
|
|
30
|
+
let pretty = 'TxPool Benchmark Metrics:\n';
|
|
31
|
+
pretty += '='.repeat(60) + '\n';
|
|
32
|
+
// Group by operation
|
|
33
|
+
const byOperation = new Map();
|
|
34
|
+
for (const metric of this.metrics){
|
|
35
|
+
if (!byOperation.has(metric.operation)) {
|
|
36
|
+
byOperation.set(metric.operation, []);
|
|
37
|
+
}
|
|
38
|
+
byOperation.get(metric.operation).push(metric);
|
|
39
|
+
}
|
|
40
|
+
for (const [operation, opMetrics] of byOperation){
|
|
41
|
+
pretty += `\n${operation}:\n`;
|
|
42
|
+
for (const metric of opMetrics){
|
|
43
|
+
const poolSizeStr = metric.poolSize > 0 ? `pool=${metric.poolSize}` : '';
|
|
44
|
+
const batchSizeStr = metric.batchSize > 0 ? `batch=${metric.batchSize}` : '';
|
|
45
|
+
const params = [
|
|
46
|
+
poolSizeStr,
|
|
47
|
+
batchSizeStr
|
|
48
|
+
].filter(Boolean).join(', ');
|
|
49
|
+
pretty += ` ${params ? `(${params})` : ''}: ${metric.value.toFixed(3)} ms\n`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return pretty;
|
|
53
|
+
}
|
|
54
|
+
toGithubActionBenchmarkJSON(indent = 2) {
|
|
55
|
+
const data = this.metrics.map((metric)=>{
|
|
56
|
+
const poolSizeStr = metric.poolSize > 0 ? `${metric.poolSize} txs in pool` : '';
|
|
57
|
+
const batchSizeStr = metric.batchSize > 0 ? `batch of ${metric.batchSize}` : '';
|
|
58
|
+
const params = [
|
|
59
|
+
poolSizeStr,
|
|
60
|
+
batchSizeStr
|
|
61
|
+
].filter(Boolean).join('/');
|
|
62
|
+
return {
|
|
63
|
+
name: `TxPool/${metric.operation}${params ? `/${params}` : ''}`,
|
|
64
|
+
value: metric.value,
|
|
65
|
+
unit: 'ms'
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
return JSON.stringify(data, null, indent);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { type Logger } from '@aztec/foundation/log';
|
|
3
|
+
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
4
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
5
|
+
import type { L2Block, L2BlockId } from '@aztec/stdlib/block';
|
|
6
|
+
import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
7
|
+
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
8
|
+
import type { AddTxsResult, TxPoolV2, TxPoolV2Config, TxPoolV2Dependencies, TxPoolV2Events } from './interfaces.js';
|
|
9
|
+
import type { TxState } from './tx_metadata.js';
|
|
10
|
+
declare const AztecKVTxPoolV2_base: new () => TypedEventEmitter<TxPoolV2Events>;
|
|
11
|
+
/**
|
|
12
|
+
* Implementation of TxPoolV2 with explicit state management.
|
|
13
|
+
*
|
|
14
|
+
* This class is a thin wrapper that manages the serial queue and delegates
|
|
15
|
+
* all operations to TxPoolV2Impl.
|
|
16
|
+
*/
|
|
17
|
+
export declare class AztecKVTxPoolV2 extends AztecKVTxPoolV2_base implements TxPoolV2 {
|
|
18
|
+
#private;
|
|
19
|
+
constructor(store: AztecAsyncKVStore, archiveStore: AztecAsyncKVStore, deps: TxPoolV2Dependencies, telemetry?: TelemetryClient, config?: Partial<TxPoolV2Config>, log?: Logger);
|
|
20
|
+
addPendingTxs(txs: Tx[], opts?: {
|
|
21
|
+
source?: string;
|
|
22
|
+
}): Promise<AddTxsResult>;
|
|
23
|
+
canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'>;
|
|
24
|
+
addProtectedTxs(txs: Tx[], block: BlockHeader, opts?: {
|
|
25
|
+
source?: string;
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
protectTxs(txHashes: TxHash[], block: BlockHeader): Promise<TxHash[]>;
|
|
28
|
+
addMinedTxs(txs: Tx[], block: BlockHeader, opts?: {
|
|
29
|
+
source?: string;
|
|
30
|
+
}): Promise<void>;
|
|
31
|
+
handleMinedBlock(block: L2Block): Promise<void>;
|
|
32
|
+
prepareForSlot(slotNumber: SlotNumber): Promise<void>;
|
|
33
|
+
handlePrunedBlocks(latestBlock: L2BlockId): Promise<void>;
|
|
34
|
+
handleFailedExecution(txHashes: TxHash[]): Promise<void>;
|
|
35
|
+
handleFinalizedBlock(block: BlockHeader): Promise<void>;
|
|
36
|
+
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
37
|
+
getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
38
|
+
hasTxs(txHashes: TxHash[]): Promise<boolean[]>;
|
|
39
|
+
getTxStatus(txHash: TxHash): Promise<TxState | 'deleted' | undefined>;
|
|
40
|
+
getPendingTxHashes(): Promise<TxHash[]>;
|
|
41
|
+
getPendingTxCount(): Promise<number>;
|
|
42
|
+
getMinedTxHashes(): Promise<[TxHash, L2BlockId][]>;
|
|
43
|
+
getMinedTxCount(): Promise<number>;
|
|
44
|
+
isEmpty(): Promise<boolean>;
|
|
45
|
+
getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
46
|
+
getLowestPriorityPending(limit: number): Promise<TxHash[]>;
|
|
47
|
+
updateConfig(config: Partial<TxPoolV2Config>): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Starts the pool and initializes state from persistence.
|
|
50
|
+
*/
|
|
51
|
+
start(): Promise<void>;
|
|
52
|
+
stop(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF92Mi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sX3YyL3R4X3Bvb2xfdjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLGVBQWUsRUFBc0IsTUFBTSx5QkFBeUIsQ0FBQztBQUtuRixPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwSCxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHaEQ7Ozs7O0dBS0c7QUFDSCxxQkFBYSxlQUFnQixTQUFRLG9CQUE4RCxZQUFXLFFBQVE7O0lBU3BILFlBQ0UsS0FBSyxFQUFFLGlCQUFpQixFQUN4QixZQUFZLEVBQUUsaUJBQWlCLEVBQy9CLElBQUksRUFBRSxvQkFBb0IsRUFDMUIsU0FBUyxHQUFFLGVBQXNDLEVBQ2pELE1BQU0sR0FBRSxPQUFPLENBQUMsY0FBYyxDQUFNLEVBQ3BDLEdBQUcsU0FBaUMsRUFzQnJDO0lBUUQsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUU7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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_pool_v2.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_pool_v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { SerialQueue } from '@aztec/foundation/queue';
|
|
3
|
+
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
4
|
+
import EventEmitter from 'node:events';
|
|
5
|
+
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
6
|
+
import { TxPoolV2Impl } from './tx_pool_v2_impl.js';
|
|
7
|
+
/**
|
|
8
|
+
* Implementation of TxPoolV2 with explicit state management.
|
|
9
|
+
*
|
|
10
|
+
* This class is a thin wrapper that manages the serial queue and delegates
|
|
11
|
+
* all operations to TxPoolV2Impl.
|
|
12
|
+
*/ export class AztecKVTxPoolV2 extends EventEmitter {
|
|
13
|
+
#queue;
|
|
14
|
+
#impl;
|
|
15
|
+
#metrics;
|
|
16
|
+
#store;
|
|
17
|
+
#telemetry;
|
|
18
|
+
#log;
|
|
19
|
+
#started = false;
|
|
20
|
+
constructor(store, archiveStore, deps, telemetry = getTelemetryClient(), config = {}, log = createLogger('p2p:tx_pool_v2')){
|
|
21
|
+
super();
|
|
22
|
+
this.#store = store;
|
|
23
|
+
this.#telemetry = telemetry;
|
|
24
|
+
this.#log = log;
|
|
25
|
+
this.#queue = new SerialQueue();
|
|
26
|
+
// Create callbacks that the impl uses to notify us about events and metrics
|
|
27
|
+
const callbacks = {
|
|
28
|
+
onTxsAdded: (txs, opts)=>{
|
|
29
|
+
this.#metrics?.transactionsAdded(txs);
|
|
30
|
+
this.emit('txs-added', {
|
|
31
|
+
txs,
|
|
32
|
+
...opts
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
onTxsRemoved: (txHashes)=>{
|
|
36
|
+
this.#metrics?.transactionsRemoved(txHashes);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
// Create the implementation
|
|
40
|
+
this.#impl = new TxPoolV2Impl(store, archiveStore, deps, callbacks, config, log);
|
|
41
|
+
}
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// PUBLIC API - All methods queue to the implementation
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// === Core Operations ===
|
|
46
|
+
addPendingTxs(txs, opts = {}) {
|
|
47
|
+
return this.#queue.put(()=>this.#impl.addPendingTxs(txs, opts));
|
|
48
|
+
}
|
|
49
|
+
canAddPendingTx(tx) {
|
|
50
|
+
return this.#queue.put(()=>this.#impl.canAddPendingTx(tx));
|
|
51
|
+
}
|
|
52
|
+
addProtectedTxs(txs, block, opts = {}) {
|
|
53
|
+
return this.#queue.put(()=>this.#impl.addProtectedTxs(txs, block, opts));
|
|
54
|
+
}
|
|
55
|
+
protectTxs(txHashes, block) {
|
|
56
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.protectTxs(txHashes, block)));
|
|
57
|
+
}
|
|
58
|
+
addMinedTxs(txs, block, opts = {}) {
|
|
59
|
+
return this.#queue.put(()=>this.#impl.addMinedTxs(txs, block, opts));
|
|
60
|
+
}
|
|
61
|
+
// === State Transition Handlers ===
|
|
62
|
+
handleMinedBlock(block) {
|
|
63
|
+
return this.#queue.put(()=>this.#impl.handleMinedBlock(block));
|
|
64
|
+
}
|
|
65
|
+
prepareForSlot(slotNumber) {
|
|
66
|
+
return this.#queue.put(()=>this.#impl.prepareForSlot(slotNumber));
|
|
67
|
+
}
|
|
68
|
+
handlePrunedBlocks(latestBlock) {
|
|
69
|
+
return this.#queue.put(()=>this.#impl.handlePrunedBlocks(latestBlock));
|
|
70
|
+
}
|
|
71
|
+
handleFailedExecution(txHashes) {
|
|
72
|
+
return this.#queue.put(()=>this.#impl.handleFailedExecution(txHashes));
|
|
73
|
+
}
|
|
74
|
+
handleFinalizedBlock(block) {
|
|
75
|
+
return this.#queue.put(()=>this.#impl.handleFinalizedBlock(block));
|
|
76
|
+
}
|
|
77
|
+
// === Queries ===
|
|
78
|
+
getTxByHash(txHash) {
|
|
79
|
+
return this.#queue.put(()=>this.#impl.getTxByHash(txHash));
|
|
80
|
+
}
|
|
81
|
+
getTxsByHash(txHashes) {
|
|
82
|
+
return this.#queue.put(()=>this.#impl.getTxsByHash(txHashes));
|
|
83
|
+
}
|
|
84
|
+
hasTxs(txHashes) {
|
|
85
|
+
return this.#queue.put(()=>this.#impl.hasTxs(txHashes));
|
|
86
|
+
}
|
|
87
|
+
getTxStatus(txHash) {
|
|
88
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.getTxStatus(txHash)));
|
|
89
|
+
}
|
|
90
|
+
getPendingTxHashes() {
|
|
91
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.getPendingTxHashes()));
|
|
92
|
+
}
|
|
93
|
+
getPendingTxCount() {
|
|
94
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.getPendingTxCount()));
|
|
95
|
+
}
|
|
96
|
+
getMinedTxHashes() {
|
|
97
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.getMinedTxHashes()));
|
|
98
|
+
}
|
|
99
|
+
getMinedTxCount() {
|
|
100
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.getMinedTxCount()));
|
|
101
|
+
}
|
|
102
|
+
isEmpty() {
|
|
103
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.isEmpty()));
|
|
104
|
+
}
|
|
105
|
+
getArchivedTxByHash(txHash) {
|
|
106
|
+
return this.#queue.put(()=>this.#impl.getArchivedTxByHash(txHash));
|
|
107
|
+
}
|
|
108
|
+
getLowestPriorityPending(limit) {
|
|
109
|
+
return this.#queue.put(()=>Promise.resolve(this.#impl.getLowestPriorityPending(limit)));
|
|
110
|
+
}
|
|
111
|
+
// === Configuration ===
|
|
112
|
+
updateConfig(config) {
|
|
113
|
+
return this.#queue.put(()=>{
|
|
114
|
+
this.#impl.updateConfig(config);
|
|
115
|
+
return Promise.resolve();
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// === Lifecycle ===
|
|
119
|
+
/**
|
|
120
|
+
* Starts the pool and initializes state from persistence.
|
|
121
|
+
*/ async start() {
|
|
122
|
+
if (this.#started) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.#log.info('Starting transaction pool...');
|
|
126
|
+
// Start the serial queue
|
|
127
|
+
this.#queue.start();
|
|
128
|
+
this.#started = true;
|
|
129
|
+
// Setup metrics - created after queue is started so callbacks can safely queue
|
|
130
|
+
this.#metrics = new PoolInstrumentation(this.#telemetry, PoolName.TX_POOL, ()=>this.#queue.put(()=>{
|
|
131
|
+
const counts = this.#impl.countTxs();
|
|
132
|
+
return Promise.resolve({
|
|
133
|
+
itemCount: {
|
|
134
|
+
pending: counts.pending,
|
|
135
|
+
protected: counts.protected,
|
|
136
|
+
mined: counts.mined
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}), ()=>this.#store.estimateSize());
|
|
140
|
+
// Hydrate state from persistence (runs in queue)
|
|
141
|
+
await this.#queue.put(()=>this.#impl.hydrateFromDatabase());
|
|
142
|
+
this.#log.info(`Transaction pool started with ${this.#impl.getTxCount()} transactions (${this.#impl.getPendingTxCount()} pending, ${this.#impl.getMinedTxCount()} mined)`);
|
|
143
|
+
}
|
|
144
|
+
async stop() {
|
|
145
|
+
if (this.#started) {
|
|
146
|
+
await this.#queue.end();
|
|
147
|
+
this.#started = false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import type { Logger } from '@aztec/foundation/log';
|
|
3
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
|
+
import type { L2Block, L2BlockId } from '@aztec/stdlib/block';
|
|
5
|
+
import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
6
|
+
import { type AddTxsResult, type PoolReadAccess, type TxPoolV2Config, type TxPoolV2Dependencies } from './interfaces.js';
|
|
7
|
+
import { type TxState } from './tx_metadata.js';
|
|
8
|
+
/**
|
|
9
|
+
* Callbacks for the implementation to notify the outer class about events and metrics.
|
|
10
|
+
*/
|
|
11
|
+
export interface TxPoolV2Callbacks {
|
|
12
|
+
onTxsAdded: (txs: Tx[], opts: {
|
|
13
|
+
source?: string;
|
|
14
|
+
}) => void;
|
|
15
|
+
onTxsRemoved: (txHashes: string[] | bigint[]) => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Implementation of TxPoolV2 logic.
|
|
19
|
+
*
|
|
20
|
+
* This class contains all the actual transaction pool logic.
|
|
21
|
+
*/
|
|
22
|
+
export declare class TxPoolV2Impl {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(store: AztecAsyncKVStore, archiveStore: AztecAsyncKVStore, deps: TxPoolV2Dependencies, callbacks: TxPoolV2Callbacks, config: Partial<TxPoolV2Config> | undefined, log: Logger);
|
|
25
|
+
/**
|
|
26
|
+
* Hydrates the in-memory state from the database on startup.
|
|
27
|
+
* Pipeline: Load → Check Mined Status → Partition → Validate Non-Mined → Rebuild Pending Pool → Delete Invalid
|
|
28
|
+
*
|
|
29
|
+
* Note: Protected status is lost on restart. All non-mined txs are rebuilt as pending
|
|
30
|
+
* by running pre-add rules to resolve nullifier conflicts, balance checks, and pool size limits.
|
|
31
|
+
*/
|
|
32
|
+
hydrateFromDatabase(): Promise<void>;
|
|
33
|
+
addPendingTxs(txs: Tx[], opts: {
|
|
34
|
+
source?: string;
|
|
35
|
+
}): Promise<AddTxsResult>;
|
|
36
|
+
canAddPendingTx(tx: Tx): Promise<'accepted' | 'ignored' | 'rejected'>;
|
|
37
|
+
addProtectedTxs(txs: Tx[], block: BlockHeader, opts: {
|
|
38
|
+
source?: string;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
protectTxs(txHashes: TxHash[], block: BlockHeader): TxHash[];
|
|
41
|
+
addMinedTxs(txs: Tx[], block: BlockHeader, opts: {
|
|
42
|
+
source?: string;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
handleMinedBlock(block: L2Block): Promise<void>;
|
|
45
|
+
prepareForSlot(slotNumber: SlotNumber): Promise<void>;
|
|
46
|
+
handlePrunedBlocks(latestBlock: L2BlockId): Promise<void>;
|
|
47
|
+
handleFailedExecution(txHashes: TxHash[]): Promise<void>;
|
|
48
|
+
handleFinalizedBlock(block: BlockHeader): Promise<void>;
|
|
49
|
+
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
50
|
+
getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
51
|
+
hasTxs(txHashes: TxHash[]): boolean[];
|
|
52
|
+
getTxStatus(txHash: TxHash): TxState | undefined;
|
|
53
|
+
getPendingTxHashes(): TxHash[];
|
|
54
|
+
getPendingTxCount(): number;
|
|
55
|
+
getMinedTxHashes(): [TxHash, L2BlockId][];
|
|
56
|
+
getMinedTxCount(): number;
|
|
57
|
+
isEmpty(): boolean;
|
|
58
|
+
getTxCount(): number;
|
|
59
|
+
getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
60
|
+
getLowestPriorityPending(limit: number): TxHash[];
|
|
61
|
+
updateConfig(config: Partial<TxPoolV2Config>): void;
|
|
62
|
+
getPoolReadAccess(): PoolReadAccess;
|
|
63
|
+
countTxs(): {
|
|
64
|
+
pending: number;
|
|
65
|
+
protected: number;
|
|
66
|
+
mined: number;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfcG9vbF92Ml9pbXBsLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVtX3Bvb2xzL3R4X3Bvb2xfdjIvdHhfcG9vbF92Ml9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUl4RSxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFpQixNQUFNLHFCQUFxQixDQUFDO0FBRzdFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBb0IsTUFBTSxrQkFBa0IsQ0FBQztBQWU3RSxPQUFPLEVBQ0wsS0FBSyxZQUFZLEVBRWpCLEtBQUssY0FBYyxFQUNuQixLQUFLLGNBQWMsRUFDbkIsS0FBSyxvQkFBb0IsRUFDMUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBRUwsS0FBSyxPQUFPLEVBS2IsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQjs7R0FFRztBQUNILE1BQU0sV0FBVyxpQkFBaUI7SUFDaEMsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRTtRQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEtBQUssSUFBSSxDQUFDO0lBQzNELFlBQVksRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUM7Q0FDdkQ7QUFFRDs7OztHQUlHO0FBQ0gscUJBQWEsWUFBWTs7SUFnQ3ZCLFlBQ0UsS0FBSyxFQUFFLGlCQUFpQixFQUN4QixZQUFZLEVBQUUsaUJBQWlCLEVBQy9CLElBQUksRUFBRSxvQkFBb0IsRUFDMUIsU0FBUyxFQUFFLGlC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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_pool_v2_impl.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_pool_v2_impl.ts"],"names":[],"mappings":"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"}
|