@aztec/p2p 0.0.0-test.0
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/README.md +7 -0
- package/dest/bootstrap/bootstrap.d.ts +38 -0
- package/dest/bootstrap/bootstrap.d.ts.map +1 -0
- package/dest/bootstrap/bootstrap.js +123 -0
- package/dest/client/factory.d.ts +21 -0
- package/dest/client/factory.d.ts.map +1 -0
- package/dest/client/factory.js +37 -0
- package/dest/client/index.d.ts +3 -0
- package/dest/client/index.d.ts.map +1 -0
- package/dest/client/index.js +2 -0
- package/dest/client/p2p_client.d.ts +314 -0
- package/dest/client/p2p_client.d.ts.map +1 -0
- package/dest/client/p2p_client.js +505 -0
- package/dest/config.d.ts +180 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +193 -0
- package/dest/enr/generate-enr.d.ts +9 -0
- package/dest/enr/generate-enr.d.ts.map +1 -0
- package/dest/enr/generate-enr.js +30 -0
- package/dest/enr/index.d.ts +2 -0
- package/dest/enr/index.d.ts.map +1 -0
- package/dest/enr/index.js +1 -0
- package/dest/errors/reqresp.error.d.ts +28 -0
- package/dest/errors/reqresp.error.d.ts.map +1 -0
- package/dest/errors/reqresp.error.js +30 -0
- package/dest/index.d.ts +8 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +7 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +57 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool.js +6 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +195 -0
- package/dest/mem_pools/attestation_pool/index.d.ts +3 -0
- package/dest/mem_pools/attestation_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/index.js +2 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +22 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +112 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +17 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +129 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts +19 -0
- package/dest/mem_pools/attestation_pool/mocks.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/mocks.js +33 -0
- package/dest/mem_pools/index.d.ts +4 -0
- package/dest/mem_pools/index.d.ts.map +1 -0
- package/dest/mem_pools/index.js +1 -0
- package/dest/mem_pools/instrumentation.d.ts +30 -0
- package/dest/mem_pools/instrumentation.d.ts.map +1 -0
- package/dest/mem_pools/instrumentation.js +84 -0
- package/dest/mem_pools/interface.d.ts +11 -0
- package/dest/mem_pools/interface.d.ts.map +1 -0
- package/dest/mem_pools/interface.js +3 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +245 -0
- package/dest/mem_pools/tx_pool/index.d.ts +4 -0
- package/dest/mem_pools/tx_pool/index.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/index.js +3 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +56 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +141 -0
- package/dest/mem_pools/tx_pool/priority.d.ts +8 -0
- package/dest/mem_pools/tx_pool/priority.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/priority.js +10 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +66 -0
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool.js +3 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts +7 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +169 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/attestation_validator.js +19 -0
- package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
- package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/attestation_validator/index.js +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -0
- package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
- package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/block_proposal_validator/index.js +1 -0
- package/dest/msg_validators/index.d.ts +4 -0
- package/dest/msg_validators/index.d.ts.map +1 -0
- package/dest/msg_validators/index.js +3 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts +7 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +31 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts +11 -0
- package/dest/msg_validators/tx_validator/block_header_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/block_header_validator.js +26 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts +6 -0
- package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/data_validator.js +107 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts +12 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/double_spend_validator.js +41 -0
- package/dest/msg_validators/tx_validator/index.d.ts +7 -0
- package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/index.js +6 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +10 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/metadata_validator.js +44 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts +9 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
- package/dest/msg_validators/tx_validator/tx_proof_validator.js +25 -0
- package/dest/services/data_store.d.ts +27 -0
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +188 -0
- package/dest/services/discv5/discV5_service.d.ts +42 -0
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +214 -0
- package/dest/services/dummy_service.d.ts +85 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/services/dummy_service.js +92 -0
- package/dest/services/encoding.d.ts +31 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +66 -0
- package/dest/services/gossipsub/scoring.d.ts +7 -0
- package/dest/services/gossipsub/scoring.d.ts.map +1 -0
- package/dest/services/gossipsub/scoring.js +10 -0
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +2 -0
- package/dest/services/libp2p/libp2p_service.d.ts +186 -0
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +712 -0
- package/dest/services/peer-manager/metrics.d.ts +12 -0
- package/dest/services/peer-manager/metrics.d.ts.map +1 -0
- package/dest/services/peer-manager/metrics.js +33 -0
- package/dest/services/peer-manager/peer_manager.d.ts +94 -0
- package/dest/services/peer-manager/peer_manager.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_manager.js +445 -0
- package/dest/services/peer-manager/peer_scoring.d.ts +28 -0
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-manager/peer_scoring.js +86 -0
- package/dest/services/reqresp/config.d.ts +16 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/services/reqresp/config.js +20 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts +45 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/batch_connection_sampler.js +88 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts +61 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.d.ts.map +1 -0
- package/dest/services/reqresp/connection-sampler/connection_sampler.js +181 -0
- package/dest/services/reqresp/index.d.ts +6 -0
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/services/reqresp/index.js +4 -0
- package/dest/services/reqresp/interface.d.ts +116 -0
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/services/reqresp/interface.js +84 -0
- package/dest/services/reqresp/metrics.d.ts +15 -0
- package/dest/services/reqresp/metrics.d.ts.map +1 -0
- package/dest/services/reqresp/metrics.js +55 -0
- package/dest/services/reqresp/protocols/block.d.ts +4 -0
- package/dest/services/reqresp/protocols/block.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/block.js +8 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts +51 -0
- package/dest/services/reqresp/protocols/goodbye.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/goodbye.js +87 -0
- package/dest/services/reqresp/protocols/index.d.ts +9 -0
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/index.js +7 -0
- package/dest/services/reqresp/protocols/ping.d.ts +9 -0
- package/dest/services/reqresp/protocols/ping.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/ping.js +7 -0
- package/dest/services/reqresp/protocols/status.d.ts +9 -0
- package/dest/services/reqresp/protocols/status.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/status.js +7 -0
- package/dest/services/reqresp/protocols/tx.d.ts +13 -0
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -0
- package/dest/services/reqresp/protocols/tx.js +20 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts +2 -0
- package/dest/services/reqresp/rate-limiter/index.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/index.js +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts +102 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limiter.js +184 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts +3 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -0
- package/dest/services/reqresp/rate-limiter/rate_limits.js +54 -0
- package/dest/services/reqresp/reqresp.d.ts +166 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +516 -0
- package/dest/services/reqresp/status.d.ts +31 -0
- package/dest/services/reqresp/status.d.ts.map +1 -0
- package/dest/services/reqresp/status.js +51 -0
- package/dest/services/service.d.ts +87 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/services/service.js +5 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts +7 -0
- package/dest/test-helpers/generate-peer-id-private-keys.d.ts.map +1 -0
- package/dest/test-helpers/generate-peer-id-private-keys.js +13 -0
- package/dest/test-helpers/get-ports.d.ts +7 -0
- package/dest/test-helpers/get-ports.d.ts.map +1 -0
- package/dest/test-helpers/get-ports.js +8 -0
- package/dest/test-helpers/index.d.ts +6 -0
- package/dest/test-helpers/index.d.ts.map +1 -0
- package/dest/test-helpers/index.js +5 -0
- package/dest/test-helpers/make-enrs.d.ts +16 -0
- package/dest/test-helpers/make-enrs.d.ts.map +1 -0
- package/dest/test-helpers/make-enrs.js +32 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts +36 -0
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -0
- package/dest/test-helpers/make-test-p2p-clients.js +68 -0
- package/dest/test-helpers/reqresp-nodes.d.ts +66 -0
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -0
- package/dest/test-helpers/reqresp-nodes.js +207 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts +2 -0
- package/dest/testbench/p2p_client_testbench_worker.d.ts.map +1 -0
- package/dest/testbench/p2p_client_testbench_worker.js +132 -0
- package/dest/testbench/parse_log_file.d.ts +2 -0
- package/dest/testbench/parse_log_file.d.ts.map +1 -0
- package/dest/testbench/parse_log_file.js +131 -0
- package/dest/testbench/testbench.d.ts +2 -0
- package/dest/testbench/testbench.d.ts.map +1 -0
- package/dest/testbench/testbench.js +61 -0
- package/dest/testbench/worker_client_manager.d.ts +56 -0
- package/dest/testbench/worker_client_manager.d.ts.map +1 -0
- package/dest/testbench/worker_client_manager.js +266 -0
- package/dest/types/index.d.ts +32 -0
- package/dest/types/index.d.ts.map +1 -0
- package/dest/types/index.js +28 -0
- package/dest/util.d.ts +53 -0
- package/dest/util.d.ts.map +1 -0
- package/dest/util.js +140 -0
- package/dest/versioning.d.ts +12 -0
- package/dest/versioning.d.ts.map +1 -0
- package/dest/versioning.js +33 -0
- package/package.json +127 -0
- package/src/bootstrap/bootstrap.ts +146 -0
- package/src/client/factory.ts +89 -0
- package/src/client/index.ts +2 -0
- package/src/client/p2p_client.ts +754 -0
- package/src/config.ts +371 -0
- package/src/enr/generate-enr.ts +39 -0
- package/src/enr/index.ts +1 -0
- package/src/errors/reqresp.error.ts +35 -0
- package/src/index.ts +7 -0
- package/src/mem_pools/attestation_pool/attestation_pool.ts +62 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +230 -0
- package/src/mem_pools/attestation_pool/index.ts +2 -0
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +159 -0
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +161 -0
- package/src/mem_pools/attestation_pool/mocks.ts +44 -0
- package/src/mem_pools/index.ts +3 -0
- package/src/mem_pools/instrumentation.ts +126 -0
- package/src/mem_pools/interface.ts +12 -0
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +309 -0
- package/src/mem_pools/tx_pool/index.ts +3 -0
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +174 -0
- package/src/mem_pools/tx_pool/priority.ts +13 -0
- package/src/mem_pools/tx_pool/tx_pool.ts +76 -0
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +130 -0
- package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -0
- package/src/msg_validators/attestation_validator/index.ts +1 -0
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +29 -0
- package/src/msg_validators/block_proposal_validator/index.ts +1 -0
- package/src/msg_validators/index.ts +3 -0
- package/src/msg_validators/tx_validator/aggregate_tx_validator.ts +32 -0
- package/src/msg_validators/tx_validator/block_header_validator.ts +25 -0
- package/src/msg_validators/tx_validator/data_validator.ts +106 -0
- package/src/msg_validators/tx_validator/double_spend_validator.ts +38 -0
- package/src/msg_validators/tx_validator/index.ts +6 -0
- package/src/msg_validators/tx_validator/metadata_validator.ts +48 -0
- package/src/msg_validators/tx_validator/tx_proof_validator.ts +18 -0
- package/src/services/data_store.ts +235 -0
- package/src/services/discv5/discV5_service.ts +256 -0
- package/src/services/dummy_service.ts +134 -0
- package/src/services/encoding.ts +79 -0
- package/src/services/gossipsub/scoring.ts +13 -0
- package/src/services/index.ts +2 -0
- package/src/services/libp2p/libp2p_service.ts +871 -0
- package/src/services/peer-manager/metrics.ts +41 -0
- package/src/services/peer-manager/peer_manager.ts +530 -0
- package/src/services/peer-manager/peer_scoring.ts +105 -0
- package/src/services/reqresp/config.ts +35 -0
- package/src/services/reqresp/connection-sampler/batch_connection_sampler.ts +94 -0
- package/src/services/reqresp/connection-sampler/connection_sampler.ts +217 -0
- package/src/services/reqresp/index.ts +4 -0
- package/src/services/reqresp/interface.ts +185 -0
- package/src/services/reqresp/metrics.ts +57 -0
- package/src/services/reqresp/protocols/block.ts +15 -0
- package/src/services/reqresp/protocols/goodbye.ts +101 -0
- package/src/services/reqresp/protocols/index.ts +8 -0
- package/src/services/reqresp/protocols/ping.ts +8 -0
- package/src/services/reqresp/protocols/status.ts +8 -0
- package/src/services/reqresp/protocols/tx.ts +29 -0
- package/src/services/reqresp/rate-limiter/index.ts +1 -0
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +228 -0
- package/src/services/reqresp/rate-limiter/rate_limits.ts +55 -0
- package/src/services/reqresp/reqresp.ts +661 -0
- package/src/services/reqresp/status.ts +59 -0
- package/src/services/service.ts +112 -0
- package/src/test-helpers/generate-peer-id-private-keys.ts +15 -0
- package/src/test-helpers/get-ports.ts +8 -0
- package/src/test-helpers/index.ts +5 -0
- package/src/test-helpers/make-enrs.ts +44 -0
- package/src/test-helpers/make-test-p2p-clients.ts +122 -0
- package/src/test-helpers/reqresp-nodes.ts +289 -0
- package/src/testbench/README.md +20 -0
- package/src/testbench/p2p_client_testbench_worker.ts +152 -0
- package/src/testbench/parse_log_file.ts +175 -0
- package/src/testbench/testbench.ts +66 -0
- package/src/testbench/worker_client_manager.ts +318 -0
- package/src/types/index.ts +36 -0
- package/src/util.ts +196 -0
- package/src/versioning.ts +50 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { unfreeze } from '@aztec/foundation/types';
|
|
2
|
+
import { GasFees } from '@aztec/stdlib/gas';
|
|
3
|
+
import { mockTx } from '@aztec/stdlib/testing';
|
|
4
|
+
/**
|
|
5
|
+
* Tests a TxPool implementation.
|
|
6
|
+
* @param getTxPool - Gets a fresh TxPool
|
|
7
|
+
*/ export function describeTxPool(getTxPool) {
|
|
8
|
+
let pool;
|
|
9
|
+
beforeEach(()=>{
|
|
10
|
+
pool = getTxPool();
|
|
11
|
+
});
|
|
12
|
+
it('Adds txs to the pool as pending', async ()=>{
|
|
13
|
+
const tx1 = await mockTx();
|
|
14
|
+
await pool.addTxs([
|
|
15
|
+
tx1
|
|
16
|
+
]);
|
|
17
|
+
const poolTx = await pool.getTxByHash(await tx1.getTxHash());
|
|
18
|
+
expect(await poolTx.getTxHash()).toEqual(await tx1.getTxHash());
|
|
19
|
+
await expect(pool.getTxStatus(await tx1.getTxHash())).resolves.toEqual('pending');
|
|
20
|
+
await expect(pool.getPendingTxHashes()).resolves.toEqual([
|
|
21
|
+
await tx1.getTxHash()
|
|
22
|
+
]);
|
|
23
|
+
});
|
|
24
|
+
it('Removes txs from the pool', async ()=>{
|
|
25
|
+
const tx1 = await mockTx();
|
|
26
|
+
await pool.addTxs([
|
|
27
|
+
tx1
|
|
28
|
+
]);
|
|
29
|
+
await pool.deleteTxs([
|
|
30
|
+
await tx1.getTxHash()
|
|
31
|
+
]);
|
|
32
|
+
await expect(pool.getTxByHash(await tx1.getTxHash())).resolves.toBeFalsy();
|
|
33
|
+
await expect(pool.getTxStatus(await tx1.getTxHash())).resolves.toBeUndefined();
|
|
34
|
+
});
|
|
35
|
+
it('Marks txs as mined', async ()=>{
|
|
36
|
+
const tx1 = await mockTx(1);
|
|
37
|
+
const tx2 = await mockTx(2);
|
|
38
|
+
await pool.addTxs([
|
|
39
|
+
tx1,
|
|
40
|
+
tx2
|
|
41
|
+
]);
|
|
42
|
+
await pool.markAsMined([
|
|
43
|
+
await tx1.getTxHash()
|
|
44
|
+
], 1);
|
|
45
|
+
await expect(pool.getTxByHash(await tx1.getTxHash())).resolves.toEqual(tx1);
|
|
46
|
+
await expect(pool.getTxStatus(await tx1.getTxHash())).resolves.toEqual('mined');
|
|
47
|
+
await expect(pool.getMinedTxHashes()).resolves.toEqual([
|
|
48
|
+
[
|
|
49
|
+
await tx1.getTxHash(),
|
|
50
|
+
1
|
|
51
|
+
]
|
|
52
|
+
]);
|
|
53
|
+
await expect(pool.getPendingTxHashes()).resolves.toEqual([
|
|
54
|
+
await tx2.getTxHash()
|
|
55
|
+
]);
|
|
56
|
+
});
|
|
57
|
+
it('Marks txs as pending after being mined', async ()=>{
|
|
58
|
+
const tx1 = await mockTx(1);
|
|
59
|
+
const tx2 = await mockTx(2);
|
|
60
|
+
await pool.addTxs([
|
|
61
|
+
tx1,
|
|
62
|
+
tx2
|
|
63
|
+
]);
|
|
64
|
+
await pool.markAsMined([
|
|
65
|
+
await tx1.getTxHash()
|
|
66
|
+
], 1);
|
|
67
|
+
await pool.markMinedAsPending([
|
|
68
|
+
await tx1.getTxHash()
|
|
69
|
+
]);
|
|
70
|
+
await expect(pool.getMinedTxHashes()).resolves.toEqual([]);
|
|
71
|
+
const pending = await pool.getPendingTxHashes();
|
|
72
|
+
expect(pending).toHaveLength(2);
|
|
73
|
+
expect(pending).toEqual(expect.arrayContaining([
|
|
74
|
+
await tx1.getTxHash(),
|
|
75
|
+
await tx2.getTxHash()
|
|
76
|
+
]));
|
|
77
|
+
});
|
|
78
|
+
it('Only marks txs as pending if they are known', async ()=>{
|
|
79
|
+
const tx1 = await mockTx(1);
|
|
80
|
+
// simulate a situation where not all peers have all the txs
|
|
81
|
+
const tx2 = await mockTx(2);
|
|
82
|
+
const someTxHashThatThisPeerDidNotSee = await tx2.getTxHash();
|
|
83
|
+
await pool.addTxs([
|
|
84
|
+
tx1
|
|
85
|
+
]);
|
|
86
|
+
// this peer knows that tx2 was mined, but it does not have the tx object
|
|
87
|
+
await pool.markAsMined([
|
|
88
|
+
await tx1.getTxHash(),
|
|
89
|
+
someTxHashThatThisPeerDidNotSee
|
|
90
|
+
], 1);
|
|
91
|
+
expect(await pool.getMinedTxHashes()).toEqual(expect.arrayContaining([
|
|
92
|
+
[
|
|
93
|
+
await tx1.getTxHash(),
|
|
94
|
+
1
|
|
95
|
+
],
|
|
96
|
+
[
|
|
97
|
+
someTxHashThatThisPeerDidNotSee,
|
|
98
|
+
1
|
|
99
|
+
]
|
|
100
|
+
]));
|
|
101
|
+
// reorg: both txs should now become available again
|
|
102
|
+
await pool.markMinedAsPending([
|
|
103
|
+
await tx1.getTxHash(),
|
|
104
|
+
someTxHashThatThisPeerDidNotSee
|
|
105
|
+
]);
|
|
106
|
+
await expect(pool.getMinedTxHashes()).resolves.toEqual([]);
|
|
107
|
+
await expect(pool.getPendingTxHashes()).resolves.toEqual([
|
|
108
|
+
await tx1.getTxHash()
|
|
109
|
+
]); // tx2 is not in the pool
|
|
110
|
+
});
|
|
111
|
+
it('Returns all transactions in the pool', async ()=>{
|
|
112
|
+
const tx1 = await mockTx(1);
|
|
113
|
+
const tx2 = await mockTx(2);
|
|
114
|
+
const tx3 = await mockTx(3);
|
|
115
|
+
await pool.addTxs([
|
|
116
|
+
tx1,
|
|
117
|
+
tx2,
|
|
118
|
+
tx3
|
|
119
|
+
]);
|
|
120
|
+
const poolTxs = await pool.getAllTxs();
|
|
121
|
+
expect(poolTxs).toHaveLength(3);
|
|
122
|
+
expect(poolTxs).toEqual(expect.arrayContaining([
|
|
123
|
+
tx1,
|
|
124
|
+
tx2,
|
|
125
|
+
tx3
|
|
126
|
+
]));
|
|
127
|
+
});
|
|
128
|
+
it('Returns all txHashes in the pool', async ()=>{
|
|
129
|
+
const tx1 = await mockTx(1);
|
|
130
|
+
const tx2 = await mockTx(2);
|
|
131
|
+
const tx3 = await mockTx(3);
|
|
132
|
+
await pool.addTxs([
|
|
133
|
+
tx1,
|
|
134
|
+
tx2,
|
|
135
|
+
tx3
|
|
136
|
+
]);
|
|
137
|
+
const poolTxHashes = await pool.getAllTxHashes();
|
|
138
|
+
expect(poolTxHashes).toHaveLength(3);
|
|
139
|
+
expect(poolTxHashes).toEqual(expect.arrayContaining([
|
|
140
|
+
await tx1.getTxHash(),
|
|
141
|
+
await tx2.getTxHash(),
|
|
142
|
+
await tx3.getTxHash()
|
|
143
|
+
]));
|
|
144
|
+
});
|
|
145
|
+
it('Returns pending tx hashes sorted by priority', async ()=>{
|
|
146
|
+
const withPriorityFee = (tx, fee)=>{
|
|
147
|
+
unfreeze(tx.data.constants.txContext.gasSettings).maxPriorityFeesPerGas = new GasFees(fee, fee);
|
|
148
|
+
return tx;
|
|
149
|
+
};
|
|
150
|
+
const tx1 = withPriorityFee(await mockTx(0), 1000);
|
|
151
|
+
const tx2 = withPriorityFee(await mockTx(1), 100);
|
|
152
|
+
const tx3 = withPriorityFee(await mockTx(2), 200);
|
|
153
|
+
const tx4 = withPriorityFee(await mockTx(3), 3000);
|
|
154
|
+
await pool.addTxs([
|
|
155
|
+
tx1,
|
|
156
|
+
tx2,
|
|
157
|
+
tx3,
|
|
158
|
+
tx4
|
|
159
|
+
]);
|
|
160
|
+
const poolTxHashes = await pool.getPendingTxHashes();
|
|
161
|
+
expect(poolTxHashes).toHaveLength(4);
|
|
162
|
+
expect(poolTxHashes).toEqual(await Promise.all([
|
|
163
|
+
tx4,
|
|
164
|
+
tx1,
|
|
165
|
+
tx3,
|
|
166
|
+
tx2
|
|
167
|
+
].map((tx)=>tx.getTxHash())));
|
|
168
|
+
});
|
|
169
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import { type BlockAttestation, type P2PValidator, PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
3
|
+
export declare class AttestationValidator implements P2PValidator<BlockAttestation> {
|
|
4
|
+
private epochCache;
|
|
5
|
+
constructor(epochCache: EpochCacheInterface);
|
|
6
|
+
validate(message: BlockAttestation): Promise<PeerErrorSeverity | undefined>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=attestation_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhG,qBAAa,oBAAqB,YAAW,YAAY,CAAC,gBAAgB,CAAC;IACzE,OAAO,CAAC,UAAU,CAAsB;gBAE5B,UAAU,EAAE,mBAAmB;IAIrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;CAelF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
2
|
+
export class AttestationValidator {
|
|
3
|
+
epochCache;
|
|
4
|
+
constructor(epochCache){
|
|
5
|
+
this.epochCache = epochCache;
|
|
6
|
+
}
|
|
7
|
+
async validate(message) {
|
|
8
|
+
const { currentSlot, nextSlot } = await this.epochCache.getProposerInCurrentOrNextSlot();
|
|
9
|
+
const slotNumberBigInt = message.payload.header.globalVariables.slotNumber.toBigInt();
|
|
10
|
+
if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
|
|
11
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
12
|
+
}
|
|
13
|
+
const attester = await message.getSender();
|
|
14
|
+
if (!await this.epochCache.isInCommittee(attester)) {
|
|
15
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './attestation_validator.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import { type BlockProposal, type P2PValidator, PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
3
|
+
export declare class BlockProposalValidator implements P2PValidator<BlockProposal> {
|
|
4
|
+
private epochCache;
|
|
5
|
+
constructor(epochCache: EpochCacheInterface);
|
|
6
|
+
validate(block: BlockProposal): Promise<PeerErrorSeverity | undefined>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=block_proposal_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/block_proposal_validator/block_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE7F,qBAAa,sBAAuB,YAAW,YAAY,CAAC,aAAa,CAAC;IACxE,OAAO,CAAC,UAAU,CAAsB;gBAE5B,UAAU,EAAE,mBAAmB;IAIrC,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;CAkB7E"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
2
|
+
export class BlockProposalValidator {
|
|
3
|
+
epochCache;
|
|
4
|
+
constructor(epochCache){
|
|
5
|
+
this.epochCache = epochCache;
|
|
6
|
+
}
|
|
7
|
+
async validate(block) {
|
|
8
|
+
const { currentProposer, nextProposer, currentSlot, nextSlot } = await this.epochCache.getProposerInCurrentOrNextSlot();
|
|
9
|
+
// Check that the attestation is for the current or next slot
|
|
10
|
+
const slotNumberBigInt = block.payload.header.globalVariables.slotNumber.toBigInt();
|
|
11
|
+
if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
|
|
12
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
13
|
+
}
|
|
14
|
+
// Check that the block proposal is from the current or next proposer
|
|
15
|
+
const proposer = await block.getSender();
|
|
16
|
+
if (!proposer.equals(currentProposer) && !proposer.equals(nextProposer)) {
|
|
17
|
+
return PeerErrorSeverity.HighToleranceError;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/block_proposal_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './block_proposal_validator.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/msg_validators/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProcessedTx, Tx, TxValidationResult, TxValidator } from '@aztec/stdlib/tx';
|
|
2
|
+
export declare class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValidator<T> {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(...validators: TxValidator<T>[]);
|
|
5
|
+
validateTx(tx: T): Promise<TxValidationResult>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=aggregate_tx_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate_tx_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/aggregate_tx_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEzF,qBAAa,oBAAoB,CAAC,CAAC,SAAS,EAAE,GAAG,WAAW,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAEzE,GAAG,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE;IAQrC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAmBrD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class AggregateTxValidator {
|
|
2
|
+
#validators;
|
|
3
|
+
constructor(...validators){
|
|
4
|
+
if (validators.length === 0) {
|
|
5
|
+
throw new Error('At least one validator must be provided');
|
|
6
|
+
}
|
|
7
|
+
this.#validators = validators;
|
|
8
|
+
}
|
|
9
|
+
async validateTx(tx) {
|
|
10
|
+
const aggregate = {
|
|
11
|
+
result: 'valid',
|
|
12
|
+
reason: []
|
|
13
|
+
};
|
|
14
|
+
for (const validator of this.#validators){
|
|
15
|
+
const result = await validator.validateTx(tx);
|
|
16
|
+
if (result.result === 'invalid') {
|
|
17
|
+
aggregate.result = 'invalid';
|
|
18
|
+
aggregate.reason.push(...result.reason);
|
|
19
|
+
} else if (result.result === 'skipped') {
|
|
20
|
+
if (aggregate.result === 'valid') {
|
|
21
|
+
aggregate.result = 'skipped';
|
|
22
|
+
}
|
|
23
|
+
aggregate.reason.push(...result.reason);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (aggregate.result === 'valid') {
|
|
27
|
+
delete aggregate.reason;
|
|
28
|
+
}
|
|
29
|
+
return aggregate;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
3
|
+
export interface ArchiveSource {
|
|
4
|
+
getArchiveIndices: (archives: Fr[]) => Promise<(bigint | undefined)[]>;
|
|
5
|
+
}
|
|
6
|
+
export declare class BlockHeaderTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(archiveSource: ArchiveSource);
|
|
9
|
+
validateTx(tx: T): Promise<TxValidationResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=block_header_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block_header_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/block_header_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC5B,iBAAiB,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;CACxE;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAIhE,aAAa,EAAE,aAAa;IAIlC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAQrD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { Tx } from '@aztec/stdlib/tx';
|
|
3
|
+
export class BlockHeaderTxValidator {
|
|
4
|
+
#log = createLogger('p2p:tx_validator:tx_block_header');
|
|
5
|
+
#archiveSource;
|
|
6
|
+
constructor(archiveSource){
|
|
7
|
+
this.#archiveSource = archiveSource;
|
|
8
|
+
}
|
|
9
|
+
async validateTx(tx) {
|
|
10
|
+
const [index] = await this.#archiveSource.getArchiveIndices([
|
|
11
|
+
await tx.data.constants.historicalHeader.hash()
|
|
12
|
+
]);
|
|
13
|
+
if (index === undefined) {
|
|
14
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for referencing an unknown block header`);
|
|
15
|
+
return {
|
|
16
|
+
result: 'invalid',
|
|
17
|
+
reason: [
|
|
18
|
+
'Block header not found'
|
|
19
|
+
]
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
result: 'valid'
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/data_validator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEjF,qBAAa,eAAgB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG/C,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAkGtD"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS } from '@aztec/constants';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { Tx } from '@aztec/stdlib/tx';
|
|
4
|
+
export class DataTxValidator {
|
|
5
|
+
#log = createLogger('p2p:tx_validator:tx_data');
|
|
6
|
+
async validateTx(tx) {
|
|
7
|
+
const execRequestRes = this.#hasCorrectExecutionRequests(tx);
|
|
8
|
+
// Note: If we ever skip txs here, must change this return statement to account for them.
|
|
9
|
+
return (await execRequestRes).result === 'invalid' ? execRequestRes : this.#hasCorrectContractClassLogs(tx);
|
|
10
|
+
}
|
|
11
|
+
async #hasCorrectExecutionRequests(tx) {
|
|
12
|
+
const callRequests = [
|
|
13
|
+
...tx.data.getRevertiblePublicCallRequests(),
|
|
14
|
+
...tx.data.getNonRevertiblePublicCallRequests()
|
|
15
|
+
];
|
|
16
|
+
if (callRequests.length !== tx.enqueuedPublicFunctionCalls.length) {
|
|
17
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatch number of execution requests for public calls. Expected ${callRequests.length}. Got ${tx.enqueuedPublicFunctionCalls.length}.`);
|
|
18
|
+
return {
|
|
19
|
+
result: 'invalid',
|
|
20
|
+
reason: [
|
|
21
|
+
'Wrong number of execution requests for public calls'
|
|
22
|
+
]
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (tx.getTotalPublicArgsCount() > MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS) {
|
|
26
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because the total length of args to public enqueued calls is greater than ${MAX_FR_ARGS_TO_ALL_ENQUEUED_CALLS}`);
|
|
27
|
+
return {
|
|
28
|
+
result: 'invalid',
|
|
29
|
+
reason: [
|
|
30
|
+
'Too many args in total to enqueued public calls'
|
|
31
|
+
]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const invalidExecutionRequestIndex = (await Promise.all(tx.enqueuedPublicFunctionCalls.map(async (execRequest, i)=>!await execRequest.isForCallRequest(callRequests[i])))).findIndex(Boolean);
|
|
35
|
+
if (invalidExecutionRequestIndex !== -1) {
|
|
36
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect execution requests for public call at index ${invalidExecutionRequestIndex}.`);
|
|
37
|
+
return {
|
|
38
|
+
result: 'invalid',
|
|
39
|
+
reason: [
|
|
40
|
+
'Incorrect execution request for public call'
|
|
41
|
+
]
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const teardownCallRequest = tx.data.getTeardownPublicCallRequest();
|
|
45
|
+
const isInvalidTeardownExecutionRequest = !teardownCallRequest && !tx.publicTeardownFunctionCall.isEmpty() || teardownCallRequest && !await tx.publicTeardownFunctionCall.isForCallRequest(teardownCallRequest);
|
|
46
|
+
if (isInvalidTeardownExecutionRequest) {
|
|
47
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect teardown execution requests.`);
|
|
48
|
+
return {
|
|
49
|
+
result: 'invalid',
|
|
50
|
+
reason: [
|
|
51
|
+
'Incorrect teardown execution request'
|
|
52
|
+
]
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
result: 'valid'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async #hasCorrectContractClassLogs(tx) {
|
|
60
|
+
const contractClassLogsHashes = tx.data.getNonEmptyContractClassLogsHashes();
|
|
61
|
+
const hashedContractClasslogs = await Promise.all(tx.contractClassLogs.map((l)=>l.hash()));
|
|
62
|
+
if (contractClassLogsHashes.length !== hashedContractClasslogs.length) {
|
|
63
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched number of contract class logs. Expected ${contractClassLogsHashes.length}. Got ${hashedContractClasslogs.length}.`);
|
|
64
|
+
return {
|
|
65
|
+
result: 'invalid',
|
|
66
|
+
reason: [
|
|
67
|
+
'Mismatched number of contract class logs'
|
|
68
|
+
]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
for (const [i, logHash] of contractClassLogsHashes.entries()){
|
|
72
|
+
const hashedLog = hashedContractClasslogs[i];
|
|
73
|
+
if (!logHash.value.equals(hashedLog)) {
|
|
74
|
+
if (hashedContractClasslogs.some((l)=>logHash.value.equals(l))) {
|
|
75
|
+
const matchingLogIndex = hashedContractClasslogs.findIndex((l)=>logHash.value.equals(l));
|
|
76
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs indices. Expected ${i} from the kernel's log hashes. Got ${matchingLogIndex} in the tx.`);
|
|
77
|
+
return {
|
|
78
|
+
result: 'invalid',
|
|
79
|
+
reason: [
|
|
80
|
+
'Incorrectly sorted contract class logs'
|
|
81
|
+
]
|
|
82
|
+
};
|
|
83
|
+
} else {
|
|
84
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs. Expected hash ${logHash.value} from the kernels. Got ${hashedLog} in the tx.`);
|
|
85
|
+
return {
|
|
86
|
+
result: 'invalid',
|
|
87
|
+
reason: [
|
|
88
|
+
'Mismatched contract class logs'
|
|
89
|
+
]
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (logHash.logHash.length !== tx.contractClassLogs[i].getEmittedLength()) {
|
|
94
|
+
this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} because of mismatched contract class logs length. Expected ${logHash.logHash.length} from the kernel's log hashes. Got ${tx.contractClassLogs[i].getEmittedLength()} in the tx.`);
|
|
95
|
+
return {
|
|
96
|
+
result: 'invalid',
|
|
97
|
+
reason: [
|
|
98
|
+
'Mismatched contract class logs length'
|
|
99
|
+
]
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
result: 'valid'
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
4
|
+
export interface NullifierSource {
|
|
5
|
+
nullifiersExist: (nullifiers: Buffer[]) => Promise<boolean[]>;
|
|
6
|
+
}
|
|
7
|
+
export declare class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(nullifierSource: NullifierSource);
|
|
10
|
+
validateTx(tx: T): Promise<TxValidationResult>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=double_spend_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"double_spend_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/double_spend_validator.ts"],"names":[],"mappings":";;AACA,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAkB,MAAM,kBAAkB,CAAC;AAE7G,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAC/D;AAED,qBAAa,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;gBAIhE,eAAe,EAAE,eAAe;IAItC,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsBrD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { Tx, hasPublicCalls } from '@aztec/stdlib/tx';
|
|
3
|
+
export class DoubleSpendTxValidator {
|
|
4
|
+
#log = createLogger('p2p:tx_validator:tx_double_spend');
|
|
5
|
+
#nullifierSource;
|
|
6
|
+
constructor(nullifierSource){
|
|
7
|
+
this.#nullifierSource = nullifierSource;
|
|
8
|
+
}
|
|
9
|
+
async validateTx(tx) {
|
|
10
|
+
// Don't need to check for duplicate nullifiers if the tx has public calls
|
|
11
|
+
// because the AVM will perform merkle insertions as it goes and will fail on
|
|
12
|
+
// duplicate nullifier. In fact we CANNOT check here because the nullifiers
|
|
13
|
+
// have already been inserted, and so they will exist in nullifierSource.
|
|
14
|
+
if (!hasPublicCalls(tx)) {
|
|
15
|
+
const nullifiers = tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers;
|
|
16
|
+
// Ditch this tx if it has repeated nullifiers
|
|
17
|
+
const uniqueNullifiers = new Set(nullifiers);
|
|
18
|
+
if (uniqueNullifiers.size !== nullifiers.length) {
|
|
19
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for emitting duplicate nullifiers`);
|
|
20
|
+
return {
|
|
21
|
+
result: 'invalid',
|
|
22
|
+
reason: [
|
|
23
|
+
'Duplicate nullifier in tx'
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if ((await this.#nullifierSource.nullifiersExist(nullifiers.map((n)=>n.toBuffer()))).some(Boolean)) {
|
|
28
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for repeating a nullifier`);
|
|
29
|
+
return {
|
|
30
|
+
result: 'invalid',
|
|
31
|
+
reason: [
|
|
32
|
+
'Existing nullifier'
|
|
33
|
+
]
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
result: 'valid'
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './aggregate_tx_validator.js';
|
|
2
|
+
export * from './data_validator.js';
|
|
3
|
+
export * from './double_spend_validator.js';
|
|
4
|
+
export * from './metadata_validator.js';
|
|
5
|
+
export * from './tx_proof_validator.js';
|
|
6
|
+
export * from './block_header_validator.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { type AnyTx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
3
|
+
export declare class MetadataTxValidator<T extends AnyTx> implements TxValidator<T> {
|
|
4
|
+
#private;
|
|
5
|
+
private chainId;
|
|
6
|
+
private blockNumber;
|
|
7
|
+
constructor(chainId: Fr, blockNumber: Fr);
|
|
8
|
+
validateTx(tx: T): Promise<TxValidationResult>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=metadata_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/metadata_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,KAAK,KAAK,EAAM,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7F,qBAAa,mBAAmB,CAAC,CAAC,SAAS,KAAK,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;;IAG7D,OAAO,CAAC,OAAO;IAAM,OAAO,CAAC,WAAW;gBAAhC,OAAO,EAAE,EAAE,EAAU,WAAW,EAAE,EAAE;IAElD,UAAU,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsCrD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { Tx } from '@aztec/stdlib/tx';
|
|
3
|
+
export class MetadataTxValidator {
|
|
4
|
+
chainId;
|
|
5
|
+
blockNumber;
|
|
6
|
+
#log;
|
|
7
|
+
constructor(chainId, blockNumber){
|
|
8
|
+
this.chainId = chainId;
|
|
9
|
+
this.blockNumber = blockNumber;
|
|
10
|
+
this.#log = createLogger('p2p:tx_validator:tx_metadata');
|
|
11
|
+
}
|
|
12
|
+
async validateTx(tx) {
|
|
13
|
+
const errors = [];
|
|
14
|
+
if (!await this.#hasCorrectChainId(tx)) {
|
|
15
|
+
errors.push('Incorrect chain id');
|
|
16
|
+
}
|
|
17
|
+
if (!await this.#isValidForBlockNumber(tx)) {
|
|
18
|
+
errors.push('Invalid block number');
|
|
19
|
+
}
|
|
20
|
+
return errors.length > 0 ? {
|
|
21
|
+
result: 'invalid',
|
|
22
|
+
reason: errors
|
|
23
|
+
} : {
|
|
24
|
+
result: 'valid'
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async #hasCorrectChainId(tx) {
|
|
28
|
+
if (!tx.data.constants.txContext.chainId.equals(this.chainId)) {
|
|
29
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} because of incorrect chain ${tx.data.constants.txContext.chainId.toNumber()} != ${this.chainId.toNumber()}`);
|
|
30
|
+
return false;
|
|
31
|
+
} else {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async #isValidForBlockNumber(tx) {
|
|
36
|
+
const maxBlockNumber = tx.data.rollupValidationRequests.maxBlockNumber;
|
|
37
|
+
if (maxBlockNumber.isSome && maxBlockNumber.value < this.blockNumber) {
|
|
38
|
+
this.#log.warn(`Rejecting tx ${await Tx.getHash(tx)} for low max block number. Tx max block number: ${maxBlockNumber.value}, current block number: ${this.blockNumber}.`);
|
|
39
|
+
return false;
|
|
40
|
+
} else {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ClientProtocolCircuitVerifier } from '@aztec/stdlib/interfaces/server';
|
|
2
|
+
import { Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
3
|
+
export declare class TxProofValidator implements TxValidator<Tx> {
|
|
4
|
+
#private;
|
|
5
|
+
private verifier;
|
|
6
|
+
constructor(verifier: ClientProtocolCircuitVerifier);
|
|
7
|
+
validateTx(tx: Tx): Promise<TxValidationResult>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=tx_proof_validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tx_proof_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/tx_proof_validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,EAAE,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEjF,qBAAa,gBAAiB,YAAW,WAAW,CAAC,EAAE,CAAC;;IAG1C,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,6BAA6B;IAErD,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAQtD"}
|