@aztec/p2p 0.0.1-commit.6b113946b → 0.0.1-commit.6bd18f1aa
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/client/factory.d.ts +1 -1
- package/dest/client/factory.d.ts.map +1 -1
- package/dest/client/factory.js +6 -5
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +16 -6
- package/dest/index.d.ts +1 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +0 -1
- package/dest/mem_pools/index.d.ts +1 -2
- package/dest/mem_pools/index.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool_v2/tx_metadata.js +5 -1
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/contract_instance_validator.js +48 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/data_validator.js +35 -2
- package/dest/msg_validators/tx_validator/factory.d.ts +1 -1
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +8 -2
- package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
- package/dest/services/discv5/discV5_service.d.ts +1 -1
- package/dest/services/discv5/discV5_service.d.ts.map +1 -1
- package/dest/services/discv5/discV5_service.js +4 -2
- package/dest/services/libp2p/libp2p_service.d.ts +7 -2
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +115 -34
- package/dest/services/peer-manager/peer_manager.d.ts +6 -2
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_manager.js +18 -6
- package/dest/services/peer-manager/peer_scoring.d.ts +5 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +28 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.js +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +5 -4
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +10 -8
- package/dest/services/service.d.ts +7 -1
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.d.ts +5 -4
- package/dest/services/tx_collection/file_store_tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/file_store_tx_source.js +39 -29
- package/dest/services/tx_collection/tx_source.d.ts +6 -5
- package/dest/services/tx_collection/tx_source.d.ts.map +1 -1
- package/dest/services/tx_collection/tx_source.js +9 -7
- package/dest/test-helpers/mock-pubsub.d.ts +6 -1
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +9 -1
- package/dest/testbench/p2p_client_testbench_worker.d.ts +1 -1
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -1
- package/dest/testbench/p2p_client_testbench_worker.js +43 -15
- 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 +0 -1
- package/dest/util.d.ts +8 -3
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +2 -9
- package/package.json +14 -14
- package/src/client/factory.ts +8 -3
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +17 -6
- package/src/index.ts +0 -1
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +7 -1
- package/src/msg_validators/proposal_validator/README.md +1 -1
- package/src/msg_validators/tx_validator/contract_instance_validator.ts +56 -0
- package/src/msg_validators/tx_validator/data_validator.ts +42 -1
- package/src/msg_validators/tx_validator/factory.ts +7 -0
- package/src/msg_validators/tx_validator/phases_validator.ts +1 -1
- package/src/services/discv5/discV5_service.ts +4 -2
- package/src/services/libp2p/libp2p_service.ts +117 -43
- package/src/services/peer-manager/peer_manager.ts +21 -6
- package/src/services/peer-manager/peer_scoring.ts +21 -5
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +3 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/service.ts +7 -0
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/mock-pubsub.ts +9 -0
- package/src/testbench/p2p_client_testbench_worker.ts +43 -12
- package/src/testbench/worker_client_manager.ts +0 -1
- package/src/util.ts +8 -12
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +0 -125
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +0 -596
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts +0 -32
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_manager.js +0 -112
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts +0 -157
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/eviction_strategy.js +0 -52
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts +0 -16
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.js +0 -123
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts +0 -17
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts +0 -19
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.js +0 -78
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts +0 -26
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/low_priority_eviction_rule.js +0 -84
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts +0 -25
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.js +0 -57
- package/dest/mem_pools/tx_pool/index.d.ts +0 -3
- package/dest/mem_pools/tx_pool/index.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/index.js +0 -2
- package/dest/mem_pools/tx_pool/priority.d.ts +0 -12
- package/dest/mem_pools/tx_pool/priority.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/priority.js +0 -15
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +0 -127
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool.js +0 -3
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +0 -7
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +0 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +0 -402
- package/src/mem_pools/tx_pool/README.md +0 -270
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +0 -746
- package/src/mem_pools/tx_pool/eviction/eviction_manager.ts +0 -132
- package/src/mem_pools/tx_pool/eviction/eviction_strategy.ts +0 -208
- package/src/mem_pools/tx_pool/eviction/fee_payer_balance_eviction_rule.ts +0 -163
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_mining_rule.ts +0 -104
- package/src/mem_pools/tx_pool/eviction/invalid_txs_after_reorg_rule.ts +0 -93
- package/src/mem_pools/tx_pool/eviction/low_priority_eviction_rule.ts +0 -106
- package/src/mem_pools/tx_pool/eviction/nullifier_conflict_pre_add_rule.ts +0 -75
- package/src/mem_pools/tx_pool/index.ts +0 -2
- package/src/mem_pools/tx_pool/priority.ts +0 -20
- package/src/mem_pools/tx_pool/tx_pool.ts +0 -141
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +0 -321
|
@@ -2,7 +2,7 @@ import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
|
|
|
2
2
|
import { protocolContractsHash } from '@aztec/protocol-contracts';
|
|
3
3
|
import type { ChainConfig } from '@aztec/stdlib/config';
|
|
4
4
|
import { type AztecNode, createAztecNodeClient } from '@aztec/stdlib/interfaces/client';
|
|
5
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
5
|
+
import type { Tx, TxHash, TxValidator } from '@aztec/stdlib/tx';
|
|
6
6
|
import { type ComponentsVersions, getComponentsVersionsFromConfig } from '@aztec/stdlib/versioning';
|
|
7
7
|
import { makeTracedFetch } from '@aztec/telemetry-client';
|
|
8
8
|
|
|
@@ -16,12 +16,13 @@ export interface TxSource {
|
|
|
16
16
|
export class NodeRpcTxSource implements TxSource {
|
|
17
17
|
constructor(
|
|
18
18
|
private readonly client: Pick<AztecNode, 'getTxsByHash'>,
|
|
19
|
+
private readonly txValidator: TxValidator,
|
|
19
20
|
private readonly info: string,
|
|
20
21
|
) {}
|
|
21
22
|
|
|
22
|
-
public static fromUrl(nodeUrl: string, versions: ComponentsVersions): NodeRpcTxSource {
|
|
23
|
+
public static fromUrl(nodeUrl: string, txValidator: TxValidator, versions: ComponentsVersions): NodeRpcTxSource {
|
|
23
24
|
const client = createAztecNodeClient(nodeUrl, versions, makeTracedFetch([1, 2, 3], false));
|
|
24
|
-
return new NodeRpcTxSource(client, nodeUrl);
|
|
25
|
+
return new NodeRpcTxSource(client, txValidator, nodeUrl);
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
public getInfo() {
|
|
@@ -38,8 +39,8 @@ export class NodeRpcTxSource implements TxSource {
|
|
|
38
39
|
const invalidTxHashes: string[] = [];
|
|
39
40
|
await Promise.all(
|
|
40
41
|
txs.map(async tx => {
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
42
|
+
const validation = await this.txValidator.validateTx(tx);
|
|
43
|
+
if (validation.result === 'valid') {
|
|
43
44
|
validTxs.push(tx);
|
|
44
45
|
} else {
|
|
45
46
|
invalidTxHashes.push(tx.getTxHash().toString());
|
|
@@ -50,7 +51,7 @@ export class NodeRpcTxSource implements TxSource {
|
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
53
|
|
|
53
|
-
export function createNodeRpcTxSources(urls: string[], chainConfig: ChainConfig) {
|
|
54
|
+
export function createNodeRpcTxSources(urls: string[], txValidator: TxValidator, chainConfig: ChainConfig) {
|
|
54
55
|
const versions = getComponentsVersionsFromConfig(chainConfig, protocolContractsHash, getVKTreeRoot());
|
|
55
|
-
return urls.map(url => NodeRpcTxSource.fromUrl(url, versions));
|
|
56
|
+
return urls.map(url => NodeRpcTxSource.fromUrl(url, txValidator, versions));
|
|
56
57
|
}
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
type TopicValidatorResult,
|
|
16
16
|
TypedEventEmitter,
|
|
17
17
|
} from '@libp2p/interface';
|
|
18
|
+
import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
|
|
18
19
|
|
|
19
20
|
import type { P2PConfig } from '../config.js';
|
|
20
21
|
import type { MemPools } from '../mem_pools/interface.js';
|
|
@@ -212,6 +213,14 @@ export class MockPubSub implements PubSubLibp2p {
|
|
|
212
213
|
get services() {
|
|
213
214
|
return {
|
|
214
215
|
pubsub: this.gossipSub,
|
|
216
|
+
components: {
|
|
217
|
+
addressManager: {
|
|
218
|
+
removeObservedAddr: () => {},
|
|
219
|
+
addObservedAddr: () => {},
|
|
220
|
+
confirmObservedAddr: () => {},
|
|
221
|
+
} as unknown as AddressManager,
|
|
222
|
+
connectionManager: {} as unknown as ConnectionManager,
|
|
223
|
+
},
|
|
215
224
|
};
|
|
216
225
|
}
|
|
217
226
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Used when running testbench commands.
|
|
5
5
|
*/
|
|
6
6
|
import { MockL2BlockSource } from '@aztec/archiver/test';
|
|
7
|
-
import type {
|
|
7
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
8
8
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
9
9
|
import { SecretValue } from '@aztec/foundation/config';
|
|
10
10
|
import { Secp256k1Signer } from '@aztec/foundation/crypto/secp256k1-signer';
|
|
@@ -28,7 +28,6 @@ import { type TelemetryClient, getTelemetryClient } from '@aztec/telemetry-clien
|
|
|
28
28
|
import type { Message, PeerId } from '@libp2p/interface';
|
|
29
29
|
import { TopicValidatorResult } from '@libp2p/interface';
|
|
30
30
|
import { peerIdFromString } from '@libp2p/peer-id';
|
|
31
|
-
import { mock } from 'jest-mock-extended';
|
|
32
31
|
|
|
33
32
|
import type { P2PClient } from '../client/index.js';
|
|
34
33
|
import type { P2PConfig } from '../config.js';
|
|
@@ -50,6 +49,7 @@ import {
|
|
|
50
49
|
InMemoryAttestationPool,
|
|
51
50
|
InMemoryTxPool,
|
|
52
51
|
UNLIMITED_RATE_LIMIT_QUOTA,
|
|
52
|
+
createMockEpochCache,
|
|
53
53
|
createMockWorldStateSynchronizer,
|
|
54
54
|
filterTxsByDistribution,
|
|
55
55
|
} from '../test-helpers/index.js';
|
|
@@ -321,6 +321,37 @@ let workerConfig: P2PConfig | null = null;
|
|
|
321
321
|
let workerLogger: Logger | null = null;
|
|
322
322
|
let kvStore: Awaited<ReturnType<typeof openTmpStore>> | null = null;
|
|
323
323
|
|
|
324
|
+
async function stopWorker() {
|
|
325
|
+
try {
|
|
326
|
+
if (workerClient) {
|
|
327
|
+
await workerClient.stop();
|
|
328
|
+
workerClient = null;
|
|
329
|
+
}
|
|
330
|
+
} catch (e) {
|
|
331
|
+
workerLogger?.error('Error stopping worker client', e);
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
if (kvStore?.close) {
|
|
335
|
+
await kvStore.close();
|
|
336
|
+
kvStore = null;
|
|
337
|
+
}
|
|
338
|
+
} catch (e) {
|
|
339
|
+
workerLogger?.error('Error closing kv store', e);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function gracefulExit(code: number = 0) {
|
|
344
|
+
try {
|
|
345
|
+
if (process.connected) {
|
|
346
|
+
process.disconnect();
|
|
347
|
+
}
|
|
348
|
+
} catch {
|
|
349
|
+
// IPC channel already closed
|
|
350
|
+
}
|
|
351
|
+
// Safety fallback if lingering handles prevent the event loop from draining
|
|
352
|
+
setTimeout(() => process.exit(code), 5000).unref();
|
|
353
|
+
}
|
|
354
|
+
|
|
324
355
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
325
356
|
process.on('message', async msg => {
|
|
326
357
|
const {
|
|
@@ -344,7 +375,7 @@ process.on('message', async msg => {
|
|
|
344
375
|
workerConfig = config;
|
|
345
376
|
workerTxPool = new InMemoryTxPool();
|
|
346
377
|
workerAttestationPool = new InMemoryAttestationPool();
|
|
347
|
-
const epochCache =
|
|
378
|
+
const epochCache = createMockEpochCache();
|
|
348
379
|
const worldState = createMockWorldStateSynchronizer();
|
|
349
380
|
const l2BlockSource = new MockL2BlockSource();
|
|
350
381
|
|
|
@@ -410,13 +441,8 @@ process.on('message', async msg => {
|
|
|
410
441
|
const cmd = msg as any;
|
|
411
442
|
switch (cmd.type) {
|
|
412
443
|
case 'STOP':
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
}
|
|
416
|
-
if (kvStore?.close) {
|
|
417
|
-
await kvStore.close();
|
|
418
|
-
}
|
|
419
|
-
process.exit(0);
|
|
444
|
+
await stopWorker();
|
|
445
|
+
gracefulExit(0);
|
|
420
446
|
break;
|
|
421
447
|
|
|
422
448
|
case 'SEND_TX':
|
|
@@ -493,7 +519,12 @@ process.on('message', async msg => {
|
|
|
493
519
|
}
|
|
494
520
|
}
|
|
495
521
|
} catch (err: any) {
|
|
496
|
-
|
|
497
|
-
|
|
522
|
+
try {
|
|
523
|
+
process.send!({ type: 'ERROR', error: err.message });
|
|
524
|
+
} catch {
|
|
525
|
+
// IPC channel may be closed
|
|
526
|
+
}
|
|
527
|
+
await stopWorker();
|
|
528
|
+
gracefulExit(1);
|
|
498
529
|
}
|
|
499
530
|
});
|
package/src/util.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type { GossipSub } from '@chainsafe/libp2p-gossipsub';
|
|
|
7
7
|
import { generateKeyPair, marshalPrivateKey, unmarshalPrivateKey } from '@libp2p/crypto/keys';
|
|
8
8
|
import type { Identify } from '@libp2p/identify';
|
|
9
9
|
import type { PeerId, PrivateKey } from '@libp2p/interface';
|
|
10
|
-
import type { ConnectionManager } from '@libp2p/interface-internal';
|
|
10
|
+
import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
|
|
11
11
|
import { createFromPrivKey } from '@libp2p/peer-id-factory';
|
|
12
12
|
import { resolve } from 'dns/promises';
|
|
13
13
|
import { promises as fs } from 'fs';
|
|
@@ -31,6 +31,10 @@ export interface PubSubLibp2p extends Pick<Libp2p, 'status' | 'start' | 'stop' |
|
|
|
31
31
|
| 'direct'
|
|
32
32
|
| 'getMeshPeers'
|
|
33
33
|
> & { score: Pick<GossipSub['score'], 'score'> };
|
|
34
|
+
components: {
|
|
35
|
+
connectionManager: ConnectionManager;
|
|
36
|
+
addressManager: AddressManager;
|
|
37
|
+
};
|
|
34
38
|
};
|
|
35
39
|
}
|
|
36
40
|
|
|
@@ -39,6 +43,7 @@ export type FullLibp2p = Libp2p<{
|
|
|
39
43
|
pubsub: GossipSub;
|
|
40
44
|
components: {
|
|
41
45
|
connectionManager: ConnectionManager;
|
|
46
|
+
addressManager: AddressManager;
|
|
42
47
|
};
|
|
43
48
|
}>;
|
|
44
49
|
|
|
@@ -102,24 +107,15 @@ function addressToMultiAddressType(address: string): 'ip4' | 'ip6' | 'dns' {
|
|
|
102
107
|
}
|
|
103
108
|
}
|
|
104
109
|
|
|
105
|
-
export
|
|
106
|
-
_config: P2PConfig & DataStoreConfig,
|
|
107
|
-
): Promise<P2PConfig & DataStoreConfig> {
|
|
110
|
+
export function configureP2PClientAddresses(_config: P2PConfig & DataStoreConfig): P2PConfig & DataStoreConfig {
|
|
108
111
|
const config = { ..._config };
|
|
109
|
-
const {
|
|
112
|
+
const { p2pBroadcastPort, p2pPort } = config;
|
|
110
113
|
|
|
111
114
|
// If no broadcast port is provided, use the given p2p port as the broadcast port
|
|
112
115
|
if (!p2pBroadcastPort) {
|
|
113
116
|
config.p2pBroadcastPort = p2pPort;
|
|
114
117
|
}
|
|
115
118
|
|
|
116
|
-
// check if no announce IP was provided
|
|
117
|
-
if (!p2pIp) {
|
|
118
|
-
if (queryForIp) {
|
|
119
|
-
const publicIp = await getPublicIp();
|
|
120
|
-
config.p2pIp = publicIp;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
119
|
// TODO(md): guard against setting a local ip address as the announce ip
|
|
124
120
|
|
|
125
121
|
return config;
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
-
import { type Logger } from '@aztec/foundation/log';
|
|
4
|
-
import type { TypedEventEmitter } from '@aztec/foundation/types';
|
|
5
|
-
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
6
|
-
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
7
|
-
import type { MerkleTreeReadOperations, WorldStateSynchronizer } from '@aztec/stdlib/interfaces/server';
|
|
8
|
-
import { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
9
|
-
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
10
|
-
import { ArchiveCache } from '../../msg_validators/tx_validator/archive_cache.js';
|
|
11
|
-
import { FeePayerTxInfo, type PendingTxInfo, type TxBlockReference, type TxPoolOperations } from './eviction/eviction_strategy.js';
|
|
12
|
-
import type { TxPool, TxPoolEvents, TxPoolOptions } from './tx_pool.js';
|
|
13
|
-
declare const AztecKVTxPool_base: new () => TypedEventEmitter<TxPoolEvents>;
|
|
14
|
-
/**
|
|
15
|
-
* KV implementation of the Transaction Pool.
|
|
16
|
-
*/
|
|
17
|
-
export declare class AztecKVTxPool extends AztecKVTxPool_base implements TxPool, TxPoolOperations {
|
|
18
|
-
#private;
|
|
19
|
-
/**
|
|
20
|
-
* Class constructor for KV TxPool. Initiates our transaction pool as an AztecMap.
|
|
21
|
-
* @param store - A KV store for live txs in the pool.
|
|
22
|
-
* @param archive - A KV store for archived txs.
|
|
23
|
-
* @param telemetry - A telemetry client.
|
|
24
|
-
* @param archivedTxLimit - The number of txs to archive.
|
|
25
|
-
* @param log - A logger.
|
|
26
|
-
*/
|
|
27
|
-
constructor(store: AztecAsyncKVStore, archive: AztecAsyncKVStore, worldState: WorldStateSynchronizer, telemetry?: TelemetryClient, config?: TxPoolOptions, log?: Logger);
|
|
28
|
-
private countTxs;
|
|
29
|
-
isEmpty(): Promise<boolean>;
|
|
30
|
-
/**
|
|
31
|
-
* Marks transactions as mined in a block and updates the pool state accordingly.
|
|
32
|
-
* Removes the transactions from the pending set and adds them to the mined set.
|
|
33
|
-
* Also evicts any transactions that become invalid after the block is mined.
|
|
34
|
-
* @param txHashes - Array of transaction hashes that were mined
|
|
35
|
-
* @param blockHeader - The header of the block the transactions were mined in
|
|
36
|
-
*/
|
|
37
|
-
markAsMined(txHashes: TxHash[], blockHeader: BlockHeader): Promise<void>;
|
|
38
|
-
markMinedAsPending(txHashes: TxHash[], latestBlock: BlockNumber): Promise<void>;
|
|
39
|
-
getPendingTxHashes(): Promise<TxHash[]>;
|
|
40
|
-
/**
|
|
41
|
-
* Checks if a transaction exists in the pool and returns it.
|
|
42
|
-
* @param txHash - The generated tx hash.
|
|
43
|
-
* @returns The transaction, if found, 'undefined' otherwise.
|
|
44
|
-
*/
|
|
45
|
-
getTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
46
|
-
getTxsByHash(txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
47
|
-
hasTxs(txHashes: TxHash[]): Promise<boolean[]>;
|
|
48
|
-
hasTx(txHash: TxHash): Promise<boolean>;
|
|
49
|
-
/**
|
|
50
|
-
* Checks if an archived tx exists and returns it.
|
|
51
|
-
* @param txHash - The tx hash.
|
|
52
|
-
* @returns The transaction metadata, if found, 'undefined' otherwise.
|
|
53
|
-
*/
|
|
54
|
-
getArchivedTxByHash(txHash: TxHash): Promise<Tx | undefined>;
|
|
55
|
-
/**
|
|
56
|
-
* Adds a list of transactions to the pool. Duplicates are ignored.
|
|
57
|
-
* Handles nullifier deduplication: if an incoming tx has a nullifier conflict with
|
|
58
|
-
* existing pending txs, it will either replace them (if higher fee) or be rejected.
|
|
59
|
-
* @param txs - An array of txs to be added to the pool.
|
|
60
|
-
* @returns count of added transactions
|
|
61
|
-
*/
|
|
62
|
-
addTxs(txs: Tx[], opts?: {
|
|
63
|
-
source?: string;
|
|
64
|
-
}): Promise<number>;
|
|
65
|
-
/**
|
|
66
|
-
* Deletes transactions from the pool. Tx hashes that are not present are ignored.
|
|
67
|
-
* Mined transactions are soft-deleted with a timestamp, pending transactions are permanently deleted.
|
|
68
|
-
* @param txHashes - An array of tx hashes to be deleted from the tx pool.
|
|
69
|
-
* @returns Empty promise.
|
|
70
|
-
*/
|
|
71
|
-
deleteTxs(txHashes: TxHash[], opts?: {
|
|
72
|
-
permanently?: boolean;
|
|
73
|
-
}): Promise<void>;
|
|
74
|
-
private deleteMinedTx;
|
|
75
|
-
private deletePendingTxInDbTx;
|
|
76
|
-
/**
|
|
77
|
-
* Gets all the transactions stored in the pool.
|
|
78
|
-
* @returns Array of tx objects in the order they were added to the pool.
|
|
79
|
-
*/
|
|
80
|
-
getAllTxs(): Promise<Tx[]>;
|
|
81
|
-
/**
|
|
82
|
-
* Gets the hashes of all transactions currently in the tx pool.
|
|
83
|
-
* @returns An array of transaction hashes found in the tx pool.
|
|
84
|
-
*/
|
|
85
|
-
getAllTxHashes(): Promise<TxHash[]>;
|
|
86
|
-
getPendingTxInfos(): Promise<PendingTxInfo[]>;
|
|
87
|
-
private getPendingTxInfo;
|
|
88
|
-
getPendingTxsReferencingBlocks(blockHashes: Fr[]): Promise<TxBlockReference[]>;
|
|
89
|
-
getPendingFeePayers(): Promise<AztecAddress[]>;
|
|
90
|
-
getFeePayerTxInfos(feePayer: AztecAddress): AsyncIterable<FeePayerTxInfo>;
|
|
91
|
-
getMinedTxHashes(): Promise<[TxHash, BlockNumber][]>;
|
|
92
|
-
getPendingTxCount(): Promise<number>;
|
|
93
|
-
getMinedTxCount(): Promise<number>;
|
|
94
|
-
getTxStatus(txHash: TxHash): Promise<'pending' | 'mined' | 'deleted' | undefined>;
|
|
95
|
-
updateConfig(cfg: TxPoolOptions): void;
|
|
96
|
-
markTxsAsNonEvictable(txHashes: TxHash[]): Promise<void>;
|
|
97
|
-
clearNonEvictableTxs(): Promise<void>;
|
|
98
|
-
/**
|
|
99
|
-
* Permanently deletes deleted mined transactions from blocks up to and including the specified block number.
|
|
100
|
-
* @param blockNumber - Block number threshold. Deleted mined txs from this block or earlier will be permanently deleted.
|
|
101
|
-
* @returns The number of transactions permanently deleted.
|
|
102
|
-
*/
|
|
103
|
-
cleanupDeletedMinedTxs(blockNumber: BlockNumber): Promise<number>;
|
|
104
|
-
/**
|
|
105
|
-
* Creates an ArchiveCache instance.
|
|
106
|
-
* @param db - DB for the cache to use
|
|
107
|
-
* @returns An ArchiveCache instance
|
|
108
|
-
*/
|
|
109
|
-
protected createArchiveCache(db: MerkleTreeReadOperations): ArchiveCache;
|
|
110
|
-
private archiveTxs;
|
|
111
|
-
private addPendingTxIndicesInDbTx;
|
|
112
|
-
private removePendingTxIndicesInDbTx;
|
|
113
|
-
/**
|
|
114
|
-
* Returns up to `limit` lowest-priority evictable pending tx hashes without hydrating transactions.
|
|
115
|
-
* Iterates the priority index in ascending order and skips non-evictable txs.
|
|
116
|
-
*/
|
|
117
|
-
getLowestPriorityEvictable(limit: number): Promise<TxHash[]>;
|
|
118
|
-
/**
|
|
119
|
-
* Creates a PreAddPoolAccess object for use by pre-add eviction rules.
|
|
120
|
-
* Provides read-only access to pool state during addTxs transaction.
|
|
121
|
-
*/
|
|
122
|
-
private getPreAddPoolAccess;
|
|
123
|
-
}
|
|
124
|
-
export {};
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWNfa3ZfdHhfcG9vbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbV9wb29scy90eF9wb29sL2F6dGVjX2t2X3R4X3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVwRCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUd4RyxPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFLbkYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBR2xGLE9BQU8sRUFDTCxjQUFjLEVBQ2QsS0FBSyxhQUFhLEVBRWxCLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0saUNBQWlDLENBQUM7QUFPekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBRXhFOztHQUVHO0FBQ0gscUJBQWEsYUFDWCxTQUFRLGtCQUNSLFlBQVcsTUFBTSxFQUFFLGdCQUFnQjs7SUFrRG5DOzs7Ozs7O09BT0c7SUFDSCxZQUNFLEtBQUss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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aztec_kv_tx_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool/aztec_kv_tx_pool.ts"],"names":[],"mappings":"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"}
|