@aztec/p2p 0.0.1-commit.3e3d0c9cd → 0.0.1-commit.3f5453c7b
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 +5 -4
- package/dest/client/interface.d.ts +9 -2
- package/dest/client/interface.d.ts.map +1 -1
- package/dest/client/p2p_client.d.ts +3 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +21 -6
- package/dest/client/test/tx_proposal_collector/proposal_tx_collector_worker.js +17 -6
- package/dest/config.d.ts +10 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +15 -0
- package/dest/errors/p2p-service.error.d.ts +9 -0
- package/dest/errors/p2p-service.error.d.ts.map +1 -0
- package/dest/errors/p2p-service.error.js +10 -0
- 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/attestation_pool/attestation_pool.d.ts +7 -5
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool.js +11 -8
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +6 -6
- 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/interfaces.d.ts +4 -4
- 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/attestation_validator/attestation_validator.d.ts +5 -2
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +20 -11
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts +4 -2
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +2 -2
- package/dest/msg_validators/clock_tolerance.d.ts +12 -1
- package/dest/msg_validators/clock_tolerance.d.ts.map +1 -1
- package/dest/msg_validators/clock_tolerance.js +54 -3
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts +2 -1
- package/dest/msg_validators/proposal_validator/block_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts +2 -1
- package/dest/msg_validators/proposal_validator/checkpoint_proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts +3 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.d.ts.map +1 -1
- package/dest/msg_validators/proposal_validator/proposal_validator.js +19 -11
- 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/gas_validator.d.ts +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/gas_validator.js +11 -9
- package/dest/msg_validators/tx_validator/phases_validator.js +1 -1
- 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 +5 -5
- package/dest/services/dummy_service.d.ts +6 -3
- package/dest/services/dummy_service.d.ts.map +1 -1
- package/dest/services/dummy_service.js +6 -1
- package/dest/services/encoding.d.ts +5 -1
- package/dest/services/encoding.d.ts.map +1 -1
- package/dest/services/encoding.js +7 -1
- package/dest/services/gossipsub/topic_score_params.d.ts +13 -2
- package/dest/services/gossipsub/topic_score_params.d.ts.map +1 -1
- package/dest/services/gossipsub/topic_score_params.js +21 -4
- package/dest/services/libp2p/libp2p_service.d.ts +15 -25
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +121 -112
- 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 +37 -10
- package/dest/services/peer-manager/peer_scoring.d.ts +7 -2
- package/dest/services/peer-manager/peer_scoring.d.ts.map +1 -1
- package/dest/services/peer-manager/peer_scoring.js +32 -10
- package/dest/services/reqresp/batch-tx-requester/batch_tx_requester.d.ts +4 -7
- 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 +43 -56
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts +1 -2
- package/dest/services/reqresp/batch-tx-requester/interface.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts +4 -4
- package/dest/services/reqresp/batch-tx-requester/missing_txs.d.ts.map +1 -1
- package/dest/services/reqresp/batch-tx-requester/missing_txs.js +7 -7
- package/dest/services/reqresp/interface.d.ts +14 -9
- package/dest/services/reqresp/interface.d.ts.map +1 -1
- package/dest/services/reqresp/interface.js +10 -11
- package/dest/services/reqresp/metrics.d.ts +1 -1
- package/dest/services/reqresp/metrics.d.ts.map +1 -1
- package/dest/services/reqresp/metrics.js +0 -1
- package/dest/services/reqresp/protocols/index.d.ts +1 -2
- package/dest/services/reqresp/protocols/index.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/index.js +0 -1
- package/dest/services/reqresp/protocols/tx.d.ts +1 -1
- package/dest/services/reqresp/protocols/tx.d.ts.map +1 -1
- package/dest/services/reqresp/protocols/tx.js +1 -3
- 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/reqresp/rate-limiter/rate_limits.d.ts +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.d.ts.map +1 -1
- package/dest/services/reqresp/rate-limiter/rate_limits.js +0 -10
- package/dest/services/reqresp/reqresp.d.ts +4 -2
- package/dest/services/reqresp/reqresp.d.ts.map +1 -1
- package/dest/services/reqresp/reqresp.js +27 -10
- package/dest/services/service.d.ts +5 -2
- package/dest/services/service.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.d.ts +1 -4
- package/dest/services/tx_collection/fast_tx_collection.d.ts.map +1 -1
- package/dest/services/tx_collection/fast_tx_collection.js +57 -73
- 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/proposal_tx_collector.d.ts +6 -7
- package/dest/services/tx_collection/proposal_tx_collector.d.ts.map +1 -1
- package/dest/services/tx_collection/proposal_tx_collector.js +4 -4
- package/dest/services/tx_collection/request_tracker.d.ts +53 -0
- package/dest/services/tx_collection/request_tracker.d.ts.map +1 -0
- package/dest/services/tx_collection/request_tracker.js +84 -0
- package/dest/services/tx_collection/slow_tx_collection.js +1 -1
- package/dest/services/tx_collection/tx_collection.d.ts +3 -6
- package/dest/services/tx_collection/tx_collection.d.ts.map +1 -1
- 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 +11 -3
- package/dest/test-helpers/mock-pubsub.d.ts.map +1 -1
- package/dest/test-helpers/mock-pubsub.js +35 -10
- package/dest/test-helpers/reqresp-nodes.d.ts +1 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +1 -2
- package/dest/test-helpers/testbench-utils.d.ts +1 -1
- package/dest/test-helpers/testbench-utils.d.ts.map +1 -1
- package/dest/test-helpers/testbench-utils.js +21 -2
- package/dest/testbench/p2p_client_testbench_worker.js +66 -15
- package/dest/testbench/worker_client_manager.d.ts +8 -1
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +49 -1
- package/package.json +14 -14
- package/src/client/factory.ts +7 -2
- package/src/client/interface.ts +9 -1
- package/src/client/p2p_client.ts +23 -6
- package/src/client/test/tx_proposal_collector/proposal_tx_collector_worker.ts +18 -8
- package/src/config.ts +30 -1
- package/src/errors/p2p-service.error.ts +11 -0
- package/src/index.ts +0 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +12 -8
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +6 -6
- package/src/mem_pools/index.ts +0 -3
- package/src/mem_pools/tx_pool_v2/interfaces.ts +4 -4
- package/src/mem_pools/tx_pool_v2/tx_metadata.ts +7 -1
- package/src/msg_validators/attestation_validator/README.md +1 -1
- package/src/msg_validators/attestation_validator/attestation_validator.ts +21 -9
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +4 -1
- package/src/msg_validators/clock_tolerance.ts +72 -3
- package/src/msg_validators/proposal_validator/README.md +4 -4
- package/src/msg_validators/proposal_validator/block_proposal_validator.ts +4 -1
- package/src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts +4 -1
- package/src/msg_validators/proposal_validator/proposal_validator.ts +17 -10
- 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/gas_validator.ts +25 -9
- package/src/msg_validators/tx_validator/phases_validator.ts +1 -1
- package/src/services/data_store.ts +5 -13
- package/src/services/dummy_service.ts +8 -2
- package/src/services/encoding.ts +9 -1
- package/src/services/gossipsub/topic_score_params.ts +36 -4
- package/src/services/libp2p/libp2p_service.ts +122 -128
- package/src/services/peer-manager/peer_manager.ts +43 -10
- package/src/services/peer-manager/peer_scoring.ts +27 -5
- package/src/services/reqresp/batch-tx-requester/README.md +46 -7
- package/src/services/reqresp/batch-tx-requester/batch_tx_requester.ts +35 -60
- package/src/services/reqresp/batch-tx-requester/interface.ts +0 -1
- package/src/services/reqresp/batch-tx-requester/missing_txs.ts +6 -6
- package/src/services/reqresp/interface.ts +21 -11
- package/src/services/reqresp/metrics.ts +0 -1
- package/src/services/reqresp/protocols/index.ts +0 -1
- package/src/services/reqresp/protocols/tx.ts +1 -3
- package/src/services/reqresp/rate-limiter/rate_limiter.ts +13 -9
- package/src/services/reqresp/rate-limiter/rate_limits.ts +0 -10
- package/src/services/reqresp/reqresp.ts +36 -11
- package/src/services/service.ts +6 -1
- package/src/services/tx_collection/fast_tx_collection.ts +57 -83
- package/src/services/tx_collection/file_store_tx_source.ts +43 -31
- package/src/services/tx_collection/proposal_tx_collector.ts +8 -13
- package/src/services/tx_collection/request_tracker.ts +127 -0
- package/src/services/tx_collection/slow_tx_collection.ts +1 -1
- package/src/services/tx_collection/tx_collection.ts +3 -5
- package/src/services/tx_collection/tx_source.ts +8 -7
- package/src/test-helpers/mock-pubsub.ts +31 -5
- package/src/test-helpers/reqresp-nodes.ts +2 -2
- package/src/test-helpers/testbench-utils.ts +29 -3
- package/src/testbench/p2p_client_testbench_worker.ts +70 -14
- package/src/testbench/worker_client_manager.ts +55 -1
- 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/dest/services/reqresp/protocols/block.d.ts +0 -9
- package/dest/services/reqresp/protocols/block.d.ts.map +0 -1
- package/dest/services/reqresp/protocols/block.js +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts +0 -32
- package/dest/services/tx_collection/missing_txs_tracker.d.ts.map +0 -1
- package/dest/services/tx_collection/missing_txs_tracker.js +0 -27
- 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
- package/src/services/reqresp/protocols/block.ts +0 -37
- package/src/services/tx_collection/missing_txs_tracker.ts +0 -52
|
@@ -4,9 +4,9 @@ import { createLogger } from '@aztec/foundation/log';
|
|
|
4
4
|
import { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
|
|
5
5
|
import { getTelemetryClient } from '@aztec/telemetry-client';
|
|
6
6
|
import { PoolInstrumentation, PoolName } from '../instrumentation.js';
|
|
7
|
-
export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT =
|
|
8
|
-
export const MAX_BLOCK_PROPOSALS_PER_POSITION =
|
|
9
|
-
/** Maximum attestations a single signer can make per slot before being rejected. */ export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER =
|
|
7
|
+
export const MAX_CHECKPOINT_PROPOSALS_PER_SLOT = 2;
|
|
8
|
+
export const MAX_BLOCK_PROPOSALS_PER_POSITION = 2;
|
|
9
|
+
/** Maximum attestations a single signer can make per slot before being rejected. */ export const MAX_ATTESTATIONS_PER_SLOT_AND_SIGNER = 2;
|
|
10
10
|
/**
|
|
11
11
|
* Pool for storing attestations and proposals collected by a validator.
|
|
12
12
|
*
|
|
@@ -89,11 +89,13 @@ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
|
|
|
89
89
|
}
|
|
90
90
|
/** Number of bits reserved for indexWithinCheckpoint in position keys. */ static INDEX_BITS = 10;
|
|
91
91
|
/** Maximum indexWithinCheckpoint value (2^10 - 1 = 1023). */ static MAX_INDEX = (1 << AttestationPool.INDEX_BITS) - 1;
|
|
92
|
-
/** Creates a position key for block proposals:
|
|
92
|
+
/** Creates a position key for block proposals: slot * 1024 + indexWithinCheckpoint.
|
|
93
|
+
* Uses multiplication instead of bit-shift to avoid 32-bit signed integer overflow
|
|
94
|
+
* (bit-shift overflows after slot ~2^21, roughly 278 days of uptime). */ getBlockPositionKey(slot, indexWithinCheckpoint) {
|
|
93
95
|
if (indexWithinCheckpoint > AttestationPool.MAX_INDEX) {
|
|
94
96
|
throw new Error(`Value for indexWithinCheckpoint ${indexWithinCheckpoint} exceeds maximum ${AttestationPool.MAX_INDEX}`);
|
|
95
97
|
}
|
|
96
|
-
return slot << AttestationPool.INDEX_BITS
|
|
98
|
+
return slot * (1 << AttestationPool.INDEX_BITS) + indexWithinCheckpoint;
|
|
97
99
|
}
|
|
98
100
|
/**
|
|
99
101
|
* Attempts to add a block proposal to the pool.
|
|
@@ -190,7 +192,7 @@ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
|
|
|
190
192
|
* @param proposal - The checkpoint proposal core to add
|
|
191
193
|
* @returns Result indicating whether the proposal was added and duplicate detection info
|
|
192
194
|
*/ async tryAddCheckpointProposal(proposal) {
|
|
193
|
-
|
|
195
|
+
const result = await this.store.transactionAsync(async ()=>{
|
|
194
196
|
const proposalId = proposal.archive.toString();
|
|
195
197
|
// Check if already exists
|
|
196
198
|
const alreadyExists = await this.checkpointProposals.hasAsync(proposalId);
|
|
@@ -223,6 +225,7 @@ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
|
|
|
223
225
|
count: count + 1
|
|
224
226
|
};
|
|
225
227
|
});
|
|
228
|
+
return result;
|
|
226
229
|
}
|
|
227
230
|
/** Internal method - must be called within a transaction. */ async addCheckpointProposal(proposal) {
|
|
228
231
|
const slotKey = proposal.slotNumber;
|
|
@@ -256,7 +259,7 @@ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
|
|
|
256
259
|
await this.store.transactionAsync(async ()=>{
|
|
257
260
|
for (const attestation of attestations){
|
|
258
261
|
const slotNumber = attestation.payload.header.slotNumber;
|
|
259
|
-
const proposalId = attestation.archive;
|
|
262
|
+
const proposalId = attestation.archive.toString();
|
|
260
263
|
const sender = attestation.getSender();
|
|
261
264
|
// Skip attestations with invalid signatures
|
|
262
265
|
if (!sender) {
|
|
@@ -348,7 +351,7 @@ export const MAX_BLOCK_PROPOSALS_PER_POSITION = 3;
|
|
|
348
351
|
}
|
|
349
352
|
// Delete block proposals for slots < oldestSlot, using blockProposalsForSlotAndIndex as index
|
|
350
353
|
// Key format: (slot << INDEX_BITS) | indexWithinCheckpoint
|
|
351
|
-
const blockPositionEndKey = oldestSlot << AttestationPool.INDEX_BITS;
|
|
354
|
+
const blockPositionEndKey = oldestSlot * (1 << AttestationPool.INDEX_BITS);
|
|
352
355
|
for await (const positionKey of this.blockProposalsForSlotAndIndex.keysAsync({
|
|
353
356
|
end: blockPositionEndKey
|
|
354
357
|
})){
|
|
@@ -367,11 +367,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
367
367
|
const proposal2 = await mockBlockProposalWithIndex(signers[1], slotNumber, indexWithinCheckpoint);
|
|
368
368
|
const result2 = await ap.tryAddBlockProposal(proposal2);
|
|
369
369
|
expect(result2.count).toBe(2);
|
|
370
|
-
//
|
|
370
|
+
// Third proposal for same position should be rejected (cap is 2)
|
|
371
371
|
const proposal3 = await mockBlockProposalWithIndex(signers[2], slotNumber, indexWithinCheckpoint);
|
|
372
372
|
const result3 = await ap.tryAddBlockProposal(proposal3);
|
|
373
|
-
expect(result3.added).toBe(
|
|
374
|
-
expect(result3.count).toBe(
|
|
373
|
+
expect(result3.added).toBe(false);
|
|
374
|
+
expect(result3.count).toBe(2);
|
|
375
375
|
});
|
|
376
376
|
it('should return added=false when exceeding capacity', async ()=>{
|
|
377
377
|
const slotNumber = 100;
|
|
@@ -537,11 +537,11 @@ export function describeAttestationPool(getAttestationPool) {
|
|
|
537
537
|
const proposal2 = await mockCheckpointProposalCoreForPool(signers[1], slotNumber);
|
|
538
538
|
const result2 = await ap.tryAddCheckpointProposal(proposal2);
|
|
539
539
|
expect(result2.count).toBe(2);
|
|
540
|
-
//
|
|
540
|
+
// Third proposal for same slot should be rejected (cap is 2)
|
|
541
541
|
const proposal3 = await mockCheckpointProposalCoreForPool(signers[2], slotNumber);
|
|
542
542
|
const result3 = await ap.tryAddCheckpointProposal(proposal3);
|
|
543
|
-
expect(result3.added).toBe(
|
|
544
|
-
expect(result3.count).toBe(
|
|
543
|
+
expect(result3.added).toBe(false);
|
|
544
|
+
expect(result3.count).toBe(2);
|
|
545
545
|
});
|
|
546
546
|
it('should not count attestations as proposals for duplicate detection', async ()=>{
|
|
547
547
|
const slotNumber = 100;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
export { AttestationPool, type AttestationPoolApi } from './attestation_pool/attestation_pool.js';
|
|
2
2
|
export { type MemPools } from './interface.js';
|
|
3
|
-
export { type TxPool } from './tx_pool/tx_pool.js';
|
|
4
3
|
export { type TxPoolV2, type TxPoolV2Config, type TxPoolV2Events, type AddTxsResult } from './tx_pool_v2/index.js';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZW1fcG9vbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDbEcsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssY0FBYyxFQUFFLEtBQUssWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mem_pools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mem_pools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAClG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -147,10 +147,10 @@ export interface TxPoolV2 extends TypedEventEmitter<TxPoolV2Events> {
|
|
|
147
147
|
*/
|
|
148
148
|
handleMinedBlock(block: L2Block): Promise<void>;
|
|
149
149
|
/**
|
|
150
|
-
* Prepares the pool for a new slot
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
150
|
+
* Prepares the pool for a new slot by unprotecting transactions from earlier
|
|
151
|
+
* slots and re-validating them before returning to pending state.
|
|
152
|
+
* @param slotNumber - The pipeline slot we are building for (i.e. the slot
|
|
153
|
+
* the resulting blocks will target on L1).
|
|
154
154
|
*/
|
|
155
155
|
prepareForSlot(slotNumber: SlotNumber): Promise<void>;
|
|
156
156
|
/**
|
|
@@ -131,4 +131,4 @@ export declare function stubTxMetaData(txHash: string, overrides?: {
|
|
|
131
131
|
anchorBlockHeaderHash?: string;
|
|
132
132
|
allowedSetupCalls?: boolean;
|
|
133
133
|
}): TxMetaData;
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhfbWV0YWRhdGEuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvdHhfcG9vbF92Mi90eF9tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFHbkQsT0FBTyxFQUFFLEtBQUssWUFBWSxFQUF1QixNQUFNLDBCQUEwQixDQUFDO0FBRWxGLDRIQUE0SDtBQUM1SCxNQUFNLE1BQU0sb0JBQW9CLEdBQUc7SUFDakMscUJBQXFCLElBQUksRUFBRSxFQUFFLENBQUM7SUFDOUIsbUJBQW1CLEVBQUUsTUFBTSxDQUFDO0lBQzVCLGtGQUFrRjtJQUNsRixTQUFTLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDcEIsU0FBUyxFQUFFO1FBQ1QsaUJBQWlCLEVBQUU7WUFDakIsSUFBSSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixlQUFlLEVBQUU7Z0JBQ2YsV0FBVyxFQUFFLFdBQVcsQ0FBQzthQUMxQixDQUFDO1NBQ0gsQ0FBQztRQUNGLFNBQVMsRUFBRTtZQUNULFdBQVcsRUFBRTtnQkFBRSxTQUFTLEVBQUUsR0FBRyxDQUFBO2FBQUUsQ0FBQztTQUNqQyxDQUFDO0tBQ0gsQ0FBQztDQUNILENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxNQUFNLFVBQVUsR0FBRztJQUN2Qix5Q0FBeUM7SUFDekMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFeEIsa0ZBQWtGO0lBQ2xGLFFBQVEsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDO0lBRTlCLDZGQUE2RjtJQUM3RixjQUFjLENBQUMsRUFBRSxTQUFTLENBQUM7SUFFM0IsK0VBQStFO0lBQy9FLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUM7SUFFdkMsZ0VBQWdFO0lBQ2hFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDO0lBRTdCLDBDQUEwQztJQUMxQyxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztJQUUxQix5Q0FBeUM7SUFDekMsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUM7SUFFN0Isb0JBQW9CO0lBQ3BCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0lBRTFCLG9FQUFvRTtJQUNwRSxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsTUFBTSxFQUFFLENBQUM7SUFFdkMsa0ZBQWtGO0lBQ2xGLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUM7SUFFckMsOEZBQThGO0lBQzlGLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUM7SUFFcEMsK0VBQStFO0lBQy9FLFFBQVEsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUM7SUFFcEMsbUdBQW1HO0lBQ25HLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFFbkIsa0VBQWtFO0lBQ2xFLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUM7Q0FDckMsQ0FBQztBQUVGLGtGQUFrRjtBQUNsRixNQUFNLE1BQU0sT0FBTyxHQUFHLFNBQVMsR0FBRyxXQUFXLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUVwRTs7Ozs7Ozs7R0FRRztBQUNILHdCQUFzQixlQUFlLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsR0FBRSxPQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQTZDcEc7QUF1QkQscUZBQXFGO0FBQ3JGLHdCQUFnQixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FFdEQ7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxHQUFHLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQztBQUU3Rjs7O0dBR0c7QUFDSCx3QkFBZ0IsVUFBVSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUUzRDtBQUVEOzs7O0dBSUc7QUFDSCx3QkFBZ0IsYUFBYSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUU5RDtBQUVEOzs7O0dBSUc7QUFDSCx3QkFBZ0IsZUFBZSxDQUFDLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FNeEY7QUFFRDs7O0dBR0c7QUFDSCx3QkFBZ0Isc0JBQXNCLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQU0vRjtBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsd0JBQWdCLHNCQUFzQixDQUNwQyxZQUFZLEVBQUUsVUFBVSxFQUN4QixvQkFBb0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEtBQUssTUFBTSxHQUFHLFNBQVMsRUFDL0QsV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sS0FBSyxVQUFVLEdBQUcsU0FBUyxFQUN2RCxtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sR0FDM0IsWUFBWSxDQW9EZDtBQUVELG9GQUFvRjtBQUNwRix3QkFBZ0Isd0JBQXdCLENBQUMsU0FBUyxHQUFFO0lBQUUsbUJBQW1CLENBQUMsRUFBRSxNQUFNLENBQUE7Q0FBTyxHQUFHLG9CQUFvQixDQWMvRztBQUVELG9HQUFvRztBQUNwRyx3QkFBZ0IsY0FBYyxDQUM1QixNQUFNLEVBQUUsTUFBTSxFQUNkLFNBQVMsR0FBRTtJQUNULFdBQVcsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNyQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDbEIsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3JCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQixVQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUN0QixtQkFBbUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUM3QixxQkFBcUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUMvQixpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUN4QixHQUNMLFVBQVUsQ0FvQloifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tx_metadata.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_metadata.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tx_metadata.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/tx_pool_v2/tx_metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { minBigint } from '@aztec/foundation/bigint';
|
|
1
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
@@ -5,7 +6,6 @@ import { BlockHash } from '@aztec/stdlib/block';
|
|
|
5
6
|
import { Gas } from '@aztec/stdlib/gas';
|
|
6
7
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
7
8
|
import { getFeePayerBalanceDelta } from '../../msg_validators/tx_validator/fee_payer_balance.js';
|
|
8
|
-
import { getTxPriorityFee } from '../tx_pool/priority.js';
|
|
9
9
|
import { TxPoolRejectionCode } from './eviction/interfaces.js';
|
|
10
10
|
/**
|
|
11
11
|
* Builds TxMetaData from a full Tx object.
|
|
@@ -214,3 +214,7 @@ const FIXED_METADATA_BYTES = OBJECT_OVERHEAD + 3 * HEX_STRING_BYTES + 5 * BIGINT
|
|
|
214
214
|
})
|
|
215
215
|
};
|
|
216
216
|
}
|
|
217
|
+
/** Returns the priority fee for a tx, based on the L2 priority fee capped by the max fee per gas. */ function getTxPriorityFee(tx) {
|
|
218
|
+
const { maxPriorityFeesPerGas: priorityFees, maxFeesPerGas } = tx.getGasSettings();
|
|
219
|
+
return minBigint(maxFeesPerGas.feePerL2Gas, priorityFees.feePerL2Gas);
|
|
220
|
+
}
|
|
@@ -4,7 +4,10 @@ import { type CheckpointAttestation, type P2PValidator, type ValidationResult }
|
|
|
4
4
|
export declare class CheckpointAttestationValidator implements P2PValidator<CheckpointAttestation> {
|
|
5
5
|
protected epochCache: EpochCacheInterface;
|
|
6
6
|
protected logger: Logger;
|
|
7
|
-
|
|
7
|
+
private readonly pipeliningWindow;
|
|
8
|
+
constructor(epochCache: EpochCacheInterface, opts: {
|
|
9
|
+
l1PublishingTime?: number;
|
|
10
|
+
});
|
|
8
11
|
validate(message: CheckpointAttestation): Promise<ValidationResult>;
|
|
9
12
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvYXR0ZXN0YXRpb25fdmFsaWRhdG9yL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsS0FBSyxxQkFBcUIsRUFDMUIsS0FBSyxZQUFZLEVBRWpCLEtBQUssZ0JBQWdCLEVBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFJM0IscUJBQWEsOEJBQStCLFlBQVcsWUFBWSxDQUFDLHFCQUFxQixDQUFDO0lBQ3hGLFNBQVMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUM7SUFDMUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDekIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBbUI7SUFFcEQsWUFDRSxVQUFVLEVBQUUsbUJBQW1CLEVBQy9CLElBQUksRUFBRTtRQUNKLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxDQUFDO0tBQzNCLEVBS0Y7SUFFSyxRQUFRLENBQUMsT0FBTyxFQUFFLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQWtFeEU7Q0FDRiJ9
|
|
@@ -1 +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;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,8BAA+B,YAAW,YAAY,CAAC,qBAAqB,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;
|
|
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;AAE9D,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAEjB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,8BAA+B,YAAW,YAAY,CAAC,qBAAqB,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QACJ,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,EAKF;IAEK,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAkExE;CACF"}
|
|
@@ -1,31 +1,40 @@
|
|
|
1
1
|
import { NoCommitteeError } from '@aztec/ethereum/contracts';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
|
-
import { isWithinClockTolerance } from '../clock_tolerance.js';
|
|
4
|
+
import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
|
|
5
5
|
export class CheckpointAttestationValidator {
|
|
6
6
|
epochCache;
|
|
7
7
|
logger;
|
|
8
|
-
|
|
8
|
+
pipeliningWindow;
|
|
9
|
+
constructor(epochCache, opts){
|
|
9
10
|
this.epochCache = epochCache;
|
|
11
|
+
this.pipeliningWindow = new PipeliningWindow(epochCache, {
|
|
12
|
+
l1PublishingTime: opts.l1PublishingTime
|
|
13
|
+
});
|
|
10
14
|
this.logger = createLogger('p2p:checkpoint-attestation-validator');
|
|
11
15
|
}
|
|
12
16
|
async validate(message) {
|
|
13
17
|
const slotNumber = message.payload.header.slotNumber;
|
|
14
18
|
try {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
// Use target slots since proposals target pipeline slots (slot + 1 when pipelining).
|
|
20
|
+
const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
|
|
21
|
+
if (slotNumber !== targetSlot && slotNumber !== nextSlot) {
|
|
22
|
+
// When pipelining, accept attestations for the current slot (built in the previous slot)
|
|
23
|
+
// until the target slot reaches its L1 publish cutoff.
|
|
24
|
+
if (this.pipeliningWindow.acceptsAttestation(slotNumber)) {
|
|
25
|
+
// Fall through to remaining validation (signature, committee, etc.)
|
|
26
|
+
} else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
|
|
27
|
+
this.logger.warn(`Checkpoint attestation slot ${slotNumber} is not current (${targetSlot}) or next (${nextSlot}) slot`);
|
|
20
28
|
return {
|
|
21
29
|
result: 'reject',
|
|
22
30
|
severity: PeerErrorSeverity.HighToleranceError
|
|
23
31
|
};
|
|
32
|
+
} else {
|
|
33
|
+
this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
|
|
34
|
+
return {
|
|
35
|
+
result: 'ignore'
|
|
36
|
+
};
|
|
24
37
|
}
|
|
25
|
-
this.logger.debug(`Ignoring checkpoint attestation for previous slot ${slotNumber} within clock tolerance`);
|
|
26
|
-
return {
|
|
27
|
-
result: 'ignore'
|
|
28
|
-
};
|
|
29
38
|
}
|
|
30
39
|
// Verify the signature is valid
|
|
31
40
|
const attester = message.getSender();
|
|
@@ -14,7 +14,9 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
|
|
|
14
14
|
export declare class FishermanAttestationValidator extends CheckpointAttestationValidator {
|
|
15
15
|
private attestationPool;
|
|
16
16
|
private invalidAttestationCounter;
|
|
17
|
-
constructor(epochCache: EpochCacheInterface, attestationPool: AttestationPoolApi, telemetryClient: TelemetryClient
|
|
17
|
+
constructor(epochCache: EpochCacheInterface, attestationPool: AttestationPoolApi, telemetryClient: TelemetryClient, opts?: {
|
|
18
|
+
l1PublishingTime?: number;
|
|
19
|
+
});
|
|
18
20
|
validate(message: CheckpointAttestation): Promise<ValidationResult>;
|
|
19
21
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlzaGVybWFuX2F0dGVzdGF0aW9uX3ZhbGlkYXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21zZ192YWxpZGF0b3JzL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci9maXNoZXJtYW5fYXR0ZXN0YXRpb25fdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUsscUJBQXFCLEVBQXFCLEtBQUssZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RyxPQUFPLEVBQXVCLEtBQUssZUFBZSxFQUFrQyxNQUFNLHlCQUF5QixDQUFDO0FBRXBILE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0YsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUU7Ozs7Ozs7R0FPRztBQUNILHFCQUFhLDZCQUE4QixTQUFRLDhCQUE4QjtJQUs3RSxPQUFPLENBQUMsZUFBZTtJQUp6QixPQUFPLENBQUMseUJBQXlCLENBQUM7SUFFbEMsWUFDRSxVQUFVLEVBQUUsbUJBQW1CLEVBQ3ZCLGVBQWUsRUFBRSxrQkFBa0IsRUFDM0MsZUFBZSxFQUFFLGVBQWUsRUFDaEMsSUFBSSxHQUFFO1FBQ0osZ0JBQWdCLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDdEIsRUFhUDtJQUVjLFFBQVEsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBd0RqRjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fisherman_attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/fisherman_attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,qBAAqB,EAAqB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAAuB,KAAK,eAAe,EAAkC,MAAM,yBAAyB,CAAC;AAEpH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,6BAA8B,SAAQ,8BAA8B;IAK7E,OAAO,CAAC,eAAe;IAJzB,OAAO,CAAC,yBAAyB,CAAC;IAElC,YACE,UAAU,EAAE,mBAAmB,EACvB,eAAe,EAAE,kBAAkB,EAC3C,eAAe,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"fisherman_attestation_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/attestation_validator/fisherman_attestation_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,KAAK,qBAAqB,EAAqB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACzG,OAAO,EAAuB,KAAK,eAAe,EAAkC,MAAM,yBAAyB,CAAC;AAEpH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAC;AAC/F,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAE5E;;;;;;;GAOG;AACH,qBAAa,6BAA8B,SAAQ,8BAA8B;IAK7E,OAAO,CAAC,eAAe;IAJzB,OAAO,CAAC,yBAAyB,CAAC;IAElC,YACE,UAAU,EAAE,mBAAmB,EACvB,eAAe,EAAE,kBAAkB,EAC3C,eAAe,EAAE,eAAe,EAChC,IAAI,GAAE;QACJ,gBAAgB,CAAC,EAAE,MAAM,CAAC;KACtB,EAaP;IAEc,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwDjF;CACF"}
|
|
@@ -11,8 +11,8 @@ import { CheckpointAttestationValidator } from './attestation_validator.js';
|
|
|
11
11
|
*/ export class FishermanAttestationValidator extends CheckpointAttestationValidator {
|
|
12
12
|
attestationPool;
|
|
13
13
|
invalidAttestationCounter;
|
|
14
|
-
constructor(epochCache, attestationPool, telemetryClient){
|
|
15
|
-
super(epochCache), this.attestationPool = attestationPool;
|
|
14
|
+
constructor(epochCache, attestationPool, telemetryClient, opts = {}){
|
|
15
|
+
super(epochCache, opts), this.attestationPool = attestationPool;
|
|
16
16
|
this.logger = this.logger.createChild('[FISHERMAN]');
|
|
17
17
|
const meter = telemetryClient.getMeter('FishermanAttestationValidator');
|
|
18
18
|
this.invalidAttestationCounter = createUpDownCounterWithDefault(meter, Metrics.VALIDATOR_INVALID_ATTESTATION_RECEIVED_COUNT, {
|
|
@@ -18,4 +18,15 @@ export declare const MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS = 500;
|
|
|
18
18
|
* @returns true if the message is for the previous slot AND we're within the clock tolerance window
|
|
19
19
|
*/
|
|
20
20
|
export declare function isWithinClockTolerance(messageSlot: SlotNumber, currentSlot: SlotNumber, epochCache: EpochCacheInterface): boolean;
|
|
21
|
-
|
|
21
|
+
export declare class PipeliningWindow {
|
|
22
|
+
private readonly epochCache;
|
|
23
|
+
private readonly proposalWindowIntoTargetSlot;
|
|
24
|
+
private readonly attestationWindowIntoTargetSlot;
|
|
25
|
+
constructor(epochCache: EpochCacheInterface, opts?: {
|
|
26
|
+
p2pPropagationTime?: number;
|
|
27
|
+
l1PublishingTime?: number;
|
|
28
|
+
});
|
|
29
|
+
acceptsProposal(messageSlot: SlotNumber): boolean;
|
|
30
|
+
acceptsAttestation(messageSlot: SlotNumber): boolean;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvY2tfdG9sZXJhbmNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvY2xvY2tfdG9sZXJhbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzdEOzs7Ozs7O0dBT0c7QUFDSCxlQUFPLE1BQU0saUNBQWlDLE1BQU0sQ0FBQztBQUVyRDs7Ozs7OztHQU9HO0FBQ0gsd0JBQWdCLHNCQUFzQixDQUNwQyxXQUFXLEVBQUUsVUFBVSxFQUN2QixXQUFXLEVBQUUsVUFBVSxFQUN2QixVQUFVLEVBQUUsbUJBQW1CLEdBQzlCLE9BQU8sQ0EwQlQ7QUFxQ0QscUJBQWEsZ0JBQWdCO0lBS3pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVTtJQUo3QixPQUFPLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFTO0lBQ3RELE9BQU8sQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQVM7SUFFekQsWUFDbUIsVUFBVSxFQUFFLG1CQUFtQixFQUNoRCxJQUFJLEdBQUU7UUFDSixrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQztLQUN0QixFQVlQO0lBRU0sZUFBZSxDQUFDLFdBQVcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUV2RDtJQUVNLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUUxRDtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clock_tolerance.d.ts","sourceRoot":"","sources":["../../src/msg_validators/clock_tolerance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"clock_tolerance.d.ts","sourceRoot":"","sources":["../../src/msg_validators/clock_tolerance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAG7D;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,UAAU,EACvB,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,mBAAmB,GAC9B,OAAO,CA0BT;AAqCD,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAS;IACtD,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAS;IAEzD,YACmB,UAAU,EAAE,mBAAmB,EAChD,IAAI,GAAE;QACJ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;KACtB,EAYP;IAEM,eAAe,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAEvD;IAEM,kBAAkB,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAE1D;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { DEFAULT_P2P_PROPAGATION_TIME, createPipelinedCheckpointTimingModel } from '@aztec/stdlib/timetable';
|
|
2
3
|
/**
|
|
3
4
|
* Maximum clock disparity tolerance for P2P message validation (in milliseconds).
|
|
4
5
|
* Messages for the previous slot are accepted if we're within this many milliseconds
|
|
@@ -25,9 +26,10 @@ import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
|
25
26
|
return false;
|
|
26
27
|
}
|
|
27
28
|
// Check how far we are into the current slot (in milliseconds)
|
|
28
|
-
const { ts: slotStartTs, nowMs
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
const { ts: slotStartTs, nowMs } = epochCache.getEpochAndSlotNow();
|
|
30
|
+
const targetSlot = epochCache.getTargetSlot();
|
|
31
|
+
// Sanity check: ensure the epoch cache's target slot matches the expected current slot
|
|
32
|
+
if (targetSlot !== currentSlot) {
|
|
31
33
|
return false;
|
|
32
34
|
}
|
|
33
35
|
// ts is in seconds, convert to ms; nowMs is already in milliseconds
|
|
@@ -35,3 +37,52 @@ import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
|
35
37
|
const elapsedMs = Number(nowMs - slotStartMs);
|
|
36
38
|
return elapsedMs < MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
|
|
37
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Checks if a message should be accepted under the pipelining grace period.
|
|
42
|
+
*
|
|
43
|
+
* When pipelining is enabled, `targetSlot = slotNow + 1`. A proposal built in slot N-1
|
|
44
|
+
* for slot N arrives when validators are in slot N, so their `targetSlot = N+1`.
|
|
45
|
+
* This function accepts proposals for the current wallclock slot if we're within the
|
|
46
|
+
* first `windowSeconds` seconds of the slot (the pipelining grace period). - see stdlib/timetable/index.ts
|
|
47
|
+
*
|
|
48
|
+
* @param messageSlot - The slot number from the received message
|
|
49
|
+
* @param epochCache - EpochCache to get timing and pipelining state
|
|
50
|
+
* @param windowSeconds - The window grace period allowed for attestations into the next slot
|
|
51
|
+
* @returns true if pipelining is enabled, the message is for the current slot, and we're within the grace period
|
|
52
|
+
*/ function isWithinPipeliningWindow(messageSlot, epochCache, windowSeconds) {
|
|
53
|
+
if (!epochCache.isProposerPipeliningEnabled()) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const currentSlot = epochCache.getSlotNow();
|
|
57
|
+
if (messageSlot !== currentSlot) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const { ts: slotStartTs, nowMs } = epochCache.getEpochAndSlotNow();
|
|
61
|
+
const slotStartMs = slotStartTs * 1000n;
|
|
62
|
+
const elapsedMs = Number(nowMs - slotStartMs);
|
|
63
|
+
const windowMs = windowSeconds * 1000 + MAXIMUM_GOSSIP_CLOCK_DISPARITY_MS;
|
|
64
|
+
return elapsedMs < windowMs;
|
|
65
|
+
}
|
|
66
|
+
export class PipeliningWindow {
|
|
67
|
+
epochCache;
|
|
68
|
+
proposalWindowIntoTargetSlot;
|
|
69
|
+
attestationWindowIntoTargetSlot;
|
|
70
|
+
constructor(epochCache, opts = {}){
|
|
71
|
+
this.epochCache = epochCache;
|
|
72
|
+
const l1Constants = epochCache.getL1Constants();
|
|
73
|
+
const checkpointTiming = createPipelinedCheckpointTimingModel({
|
|
74
|
+
aztecSlotDuration: l1Constants.slotDuration,
|
|
75
|
+
ethereumSlotDuration: l1Constants.ethereumSlotDuration,
|
|
76
|
+
l1PublishingTime: opts.l1PublishingTime ?? l1Constants.ethereumSlotDuration,
|
|
77
|
+
p2pPropagationTime: opts.p2pPropagationTime ?? DEFAULT_P2P_PROPAGATION_TIME
|
|
78
|
+
});
|
|
79
|
+
this.proposalWindowIntoTargetSlot = checkpointTiming.proposalWindowIntoTargetSlot;
|
|
80
|
+
this.attestationWindowIntoTargetSlot = checkpointTiming.attestationWindowIntoTargetSlot;
|
|
81
|
+
}
|
|
82
|
+
acceptsProposal(messageSlot) {
|
|
83
|
+
return isWithinPipeliningWindow(messageSlot, this.epochCache, this.proposalWindowIntoTargetSlot);
|
|
84
|
+
}
|
|
85
|
+
acceptsAttestation(messageSlot) {
|
|
86
|
+
return isWithinPipeliningWindow(messageSlot, this.epochCache, this.attestationWindowIntoTargetSlot);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -5,7 +5,8 @@ export declare class BlockProposalValidator implements P2PValidator<BlockProposa
|
|
|
5
5
|
constructor(epochCache: EpochCacheInterface, opts: {
|
|
6
6
|
txsPermitted: boolean;
|
|
7
7
|
maxTxsPerBlock?: number;
|
|
8
|
+
p2pPropagationTime?: number;
|
|
8
9
|
});
|
|
9
10
|
validate(proposal: BlockProposal): Promise<ValidationResult>;
|
|
10
11
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfcHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL2Jsb2NrX3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUl2RixxQkFBYSxzQkFBdUIsWUFBVyxZQUFZLENBQUMsYUFBYSxDQUFDO0lBQ3hFLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBb0I7SUFFN0MsWUFDRSxVQUFVLEVBQUUsbUJBQW1CLEVBQy9CLElBQUksRUFBRTtRQUFFLFlBQVksRUFBRSxPQUFPLENBQUM7UUFBQyxjQUFjLENBQUMsRUFBRSxNQUFNLENBQUM7UUFBQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sQ0FBQTtLQUFFLEVBR3RGO0lBRUssUUFBUSxDQUFDLFFBQVEsRUFBRSxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBTWpFO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/block_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIvF,qBAAa,sBAAuB,YAAW,YAAY,CAAC,aAAa,CAAC;IACxE,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,
|
|
1
|
+
{"version":3,"file":"block_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/block_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIvF,qBAAa,sBAAuB,YAAW,YAAY,CAAC,aAAa,CAAC;IACxE,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,EAGtF;IAEK,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAMjE;CACF"}
|
|
@@ -5,7 +5,8 @@ export declare class CheckpointProposalValidator implements P2PValidator<Checkpo
|
|
|
5
5
|
constructor(epochCache: EpochCacheInterface, opts: {
|
|
6
6
|
txsPermitted: boolean;
|
|
7
7
|
maxTxsPerBlock?: number;
|
|
8
|
+
p2pPropagationTime?: number;
|
|
8
9
|
});
|
|
9
10
|
validate(proposal: CheckpointProposal): Promise<ValidationResult>;
|
|
10
11
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2twb2ludF9wcm9wb3NhbF92YWxpZGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy9wcm9wb3NhbF92YWxpZGF0b3IvY2hlY2twb2ludF9wcm9wb3NhbF92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk1RixxQkFBYSwyQkFBNEIsWUFBVyxZQUFZLENBQUMsa0JBQWtCLENBQUM7SUFDbEYsT0FBTyxDQUFDLGlCQUFpQixDQUFvQjtJQUU3QyxZQUNFLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFHdEY7SUFFSyxRQUFRLENBQUMsUUFBUSxFQUFFLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQVl0RTtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpoint_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI5F,qBAAa,2BAA4B,YAAW,YAAY,CAAC,kBAAkB,CAAC;IAClF,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,
|
|
1
|
+
{"version":3,"file":"checkpoint_proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/checkpoint_proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI5F,qBAAa,2BAA4B,YAAW,YAAY,CAAC,kBAAkB,CAAC;IAClF,OAAO,CAAC,iBAAiB,CAAoB;IAE7C,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,EAGtF;IAEK,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAYtE;CACF"}
|
|
@@ -6,13 +6,15 @@ export declare class ProposalValidator {
|
|
|
6
6
|
private logger;
|
|
7
7
|
private txsPermitted;
|
|
8
8
|
private maxTxsPerBlock?;
|
|
9
|
+
private pipeliningWindow;
|
|
9
10
|
constructor(epochCache: EpochCacheInterface, opts: {
|
|
10
11
|
txsPermitted: boolean;
|
|
11
12
|
maxTxsPerBlock?: number;
|
|
13
|
+
p2pPropagationTime?: number;
|
|
12
14
|
}, loggerName: string);
|
|
13
15
|
/** Validates header-level fields: slot, signature, and proposer. */
|
|
14
16
|
validate(proposal: BlockProposal | CheckpointProposalCore): Promise<ValidationResult>;
|
|
15
17
|
/** Validates transaction-related fields of a block proposal. */
|
|
16
18
|
validateTxs(proposal: BlockProposal): Promise<ValidationResult>;
|
|
17
19
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcG9zYWxfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvcHJvcG9zYWxfdmFsaWRhdG9yL3Byb3Bvc2FsX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRzlELE9BQU8sRUFDTCxLQUFLLGFBQWEsRUFDbEIsS0FBSyxzQkFBc0IsRUFFM0IsS0FBSyxnQkFBZ0IsRUFDdEIsTUFBTSxtQkFBbUIsQ0FBQztBQUkzQixvRkFBb0Y7QUFDcEYscUJBQWEsaUJBQWlCO0lBQzVCLE9BQU8sQ0FBQyxVQUFVLENBQXNCO0lBQ3hDLE9BQU8sQ0FBQyxNQUFNLENBQVM7SUFDdkIsT0FBTyxDQUFDLFlBQVksQ0FBVTtJQUM5QixPQUFPLENBQUMsY0FBYyxDQUFDLENBQVM7SUFDaEMsT0FBTyxDQUFDLGdCQUFnQixDQUFtQjtJQUUzQyxZQUNFLFVBQVUsRUFBRSxtQkFBbUIsRUFDL0IsSUFBSSxFQUFFO1FBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQztRQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQztRQUFDLGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFBO0tBQUUsRUFDckYsVUFBVSxFQUFFLE1BQU0sRUFPbkI7SUFFRCxvRUFBb0U7SUFDdkQsUUFBUSxDQUFDLFFBQVEsRUFBRSxhQUFhLEdBQUcsc0JBQXNCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBNENqRztJQUVELGdFQUFnRTtJQUNuRCxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0F3QzNFO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAE3B,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAI3B,oFAAoF;AACpF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAS;
|
|
1
|
+
{"version":3,"file":"proposal_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/proposal_validator/proposal_validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAE3B,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAI3B,oFAAoF;AACpF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,gBAAgB,CAAmB;IAE3C,YACE,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,EACrF,UAAU,EAAE,MAAM,EAOnB;IAED,oEAAoE;IACvD,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4CjG;IAED,gEAAgE;IACnD,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwC3E;CACF"}
|
|
@@ -1,39 +1,47 @@
|
|
|
1
1
|
import { NoCommitteeError } from '@aztec/ethereum/contracts';
|
|
2
2
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { PeerErrorSeverity } from '@aztec/stdlib/p2p';
|
|
4
|
-
import { isWithinClockTolerance } from '../clock_tolerance.js';
|
|
4
|
+
import { PipeliningWindow, isWithinClockTolerance } from '../clock_tolerance.js';
|
|
5
5
|
/** Validates header-level and tx-level fields of block and checkpoint proposals. */ export class ProposalValidator {
|
|
6
6
|
epochCache;
|
|
7
7
|
logger;
|
|
8
8
|
txsPermitted;
|
|
9
9
|
maxTxsPerBlock;
|
|
10
|
+
pipeliningWindow;
|
|
10
11
|
constructor(epochCache, opts, loggerName){
|
|
11
12
|
this.epochCache = epochCache;
|
|
12
13
|
this.txsPermitted = opts.txsPermitted;
|
|
13
14
|
this.maxTxsPerBlock = opts.maxTxsPerBlock;
|
|
15
|
+
this.pipeliningWindow = new PipeliningWindow(epochCache, {
|
|
16
|
+
p2pPropagationTime: opts.p2pPropagationTime
|
|
17
|
+
});
|
|
14
18
|
this.logger = createLogger(loggerName);
|
|
15
19
|
}
|
|
16
20
|
/** Validates header-level fields: slot, signature, and proposer. */ async validate(proposal) {
|
|
17
21
|
try {
|
|
18
|
-
// Slot check
|
|
19
|
-
const {
|
|
22
|
+
// Slot check: use target slots since proposals target pipeline slots (slot + 1 when pipelining).
|
|
23
|
+
const { targetSlot, nextSlot } = this.epochCache.getTargetAndNextSlot();
|
|
20
24
|
const slotNumber = proposal.slotNumber;
|
|
21
|
-
if (slotNumber !==
|
|
22
|
-
//
|
|
23
|
-
if
|
|
25
|
+
if (slotNumber !== targetSlot && slotNumber !== nextSlot) {
|
|
26
|
+
// When pipelining, accept proposals for the current slot (built in the previous slot)
|
|
27
|
+
// if they're still within the shared proposal acceptance window.
|
|
28
|
+
if (this.pipeliningWindow.acceptsProposal(slotNumber)) {
|
|
29
|
+
// Fall through to remaining validation (signature, proposer, etc.)
|
|
30
|
+
} else if (!isWithinClockTolerance(slotNumber, targetSlot, this.epochCache)) {
|
|
24
31
|
this.logger.warn(`Penalizing peer for invalid slot number ${slotNumber}`, {
|
|
25
|
-
|
|
32
|
+
targetSlot,
|
|
26
33
|
nextSlot
|
|
27
34
|
});
|
|
28
35
|
return {
|
|
29
36
|
result: 'reject',
|
|
30
37
|
severity: PeerErrorSeverity.HighToleranceError
|
|
31
38
|
};
|
|
39
|
+
} else {
|
|
40
|
+
this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
|
|
41
|
+
return {
|
|
42
|
+
result: 'ignore'
|
|
43
|
+
};
|
|
32
44
|
}
|
|
33
|
-
this.logger.verbose(`Ignoring proposal for previous slot ${slotNumber} within clock tolerance`);
|
|
34
|
-
return {
|
|
35
|
-
result: 'ignore'
|
|
36
|
-
};
|
|
37
45
|
}
|
|
38
46
|
// Signature validity
|
|
39
47
|
const proposer = proposal.getSender();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type LoggerBindings } from '@aztec/foundation/log';
|
|
2
|
+
import { type Tx, type TxValidationResult, type TxValidator } from '@aztec/stdlib/tx';
|
|
3
|
+
/** Validates that contract instance deployment logs contain correct addresses. */
|
|
4
|
+
export declare class ContractInstanceTxValidator implements TxValidator<Tx> {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(bindings?: LoggerBindings);
|
|
7
|
+
validateTx(tx: Tx): Promise<TxValidationResult>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RfaW5zdGFuY2VfdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvdHhfdmFsaWRhdG9yL2NvbnRyYWN0X2luc3RhbmNlX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHdkYsT0FBTyxFQUdMLEtBQUssRUFBRSxFQUNQLEtBQUssa0JBQWtCLEVBQ3ZCLEtBQUssV0FBVyxFQUNqQixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLGtGQUFrRjtBQUNsRixxQkFBYSwyQkFBNEIsWUFBVyxXQUFXLENBQUMsRUFBRSxDQUFDOztJQUdqRSxZQUFZLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFFcEM7SUFFSyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FHcEQ7Q0FpQ0YifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract_instance_validator.d.ts","sourceRoot":"","sources":["../../../src/msg_validators/tx_validator/contract_instance_validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAGvF,OAAO,EAGL,KAAK,EAAE,EACP,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B,kFAAkF;AAClF,qBAAa,2BAA4B,YAAW,WAAW,CAAC,EAAE,CAAC;;IAGjE,YAAY,QAAQ,CAAC,EAAE,cAAc,EAEpC;IAEK,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAGpD;CAiCF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { ContractInstancePublishedEvent } from '@aztec/protocol-contracts/instance-registry';
|
|
3
|
+
import { computeContractAddressFromInstance } from '@aztec/stdlib/contract';
|
|
4
|
+
import { TX_ERROR_INCORRECT_CONTRACT_ADDRESS, TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG } from '@aztec/stdlib/tx';
|
|
5
|
+
/** Validates that contract instance deployment logs contain correct addresses. */ export class ContractInstanceTxValidator {
|
|
6
|
+
#log;
|
|
7
|
+
constructor(bindings){
|
|
8
|
+
this.#log = createLogger('p2p:tx_validator:contract_instance', bindings);
|
|
9
|
+
}
|
|
10
|
+
async validateTx(tx) {
|
|
11
|
+
const reason = await this.#hasCorrectContractInstanceAddresses(tx);
|
|
12
|
+
return reason ? {
|
|
13
|
+
result: 'invalid',
|
|
14
|
+
reason: [
|
|
15
|
+
reason
|
|
16
|
+
]
|
|
17
|
+
} : {
|
|
18
|
+
result: 'valid'
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async #hasCorrectContractInstanceAddresses(tx) {
|
|
22
|
+
const privateLogs = tx.data.getNonEmptyPrivateLogs();
|
|
23
|
+
for (const log of privateLogs){
|
|
24
|
+
if (!ContractInstancePublishedEvent.isContractInstancePublishedEvent(log)) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
let event;
|
|
28
|
+
try {
|
|
29
|
+
event = ContractInstancePublishedEvent.fromLog(log);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to parse contract instance event: ${e}`);
|
|
32
|
+
return TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const instance = event.toContractInstance();
|
|
36
|
+
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
37
|
+
if (!computedAddress.equals(instance.address)) {
|
|
38
|
+
this.#log.warn(`Rejecting tx ${tx.getTxHash()}: contract instance address mismatch. Claimed ${instance.address}, computed ${computedAddress}`);
|
|
39
|
+
return TX_ERROR_INCORRECT_CONTRACT_ADDRESS;
|
|
40
|
+
}
|
|
41
|
+
} catch (e) {
|
|
42
|
+
this.#log.warn(`Rejecting tx ${tx.getTxHash()}: failed to compute contract instance address: ${e}`);
|
|
43
|
+
return TX_ERROR_MALFORMED_CONTRACT_INSTANCE_LOG;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -5,4 +5,4 @@ export declare class DataTxValidator implements TxValidator<Tx> {
|
|
|
5
5
|
constructor(bindings?: LoggerBindings);
|
|
6
6
|
validateTx(tx: Tx): Promise<TxValidationResult>;
|
|
7
7
|
}
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV92YWxpZGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tc2dfdmFsaWRhdG9ycy90eF92YWxpZGF0b3IvZGF0YV92YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFlLEtBQUssY0FBYyxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBSXZGLE9BQU8sRUFXTCxFQUFFLEVBQ0YsS0FBSyxrQkFBa0IsRUFDdkIsS0FBSyxXQUFXLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIscUJBQWEsZUFBZ0IsWUFBVyxXQUFXLENBQUMsRUFBRSxDQUFDOztJQUdyRCxZQUFZLFFBQVEsQ0FBQyxFQUFFLGNBQWMsRUFFcEM7SUFFSyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FPcEQ7Q0F1SUYifQ==
|