@aztec/p2p 3.0.0-nightly.20251128 → 3.0.0-nightly.20251202
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/p2p_client.d.ts +3 -2
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +5 -4
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +7 -6
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +33 -32
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +9 -8
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +19 -20
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts +9 -8
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.d.ts.map +1 -1
- package/dest/mem_pools/attestation_pool/memory_attestation_pool.js +12 -10
- package/dest/mem_pools/attestation_pool/mocks.js +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -1
- package/dest/msg_validators/attestation_validator/attestation_validator.js +11 -11
- package/dest/msg_validators/attestation_validator/fisherman_attestation_validator.js +1 -1
- package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +8 -8
- package/dest/services/libp2p/libp2p_service.d.ts +1 -1
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +14 -13
- package/dest/testbench/p2p_client_testbench_worker.js +5 -5
- package/package.json +14 -14
- package/src/client/p2p_client.ts +6 -5
- package/src/mem_pools/attestation_pool/attestation_pool.ts +6 -5
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +45 -32
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +28 -29
- package/src/mem_pools/attestation_pool/memory_attestation_pool.ts +26 -22
- package/src/mem_pools/attestation_pool/mocks.ts +1 -1
- package/src/msg_validators/attestation_validator/attestation_validator.ts +11 -13
- package/src/msg_validators/attestation_validator/fisherman_attestation_validator.ts +1 -1
- package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +8 -8
- package/src/services/libp2p/libp2p_service.ts +14 -13
- package/src/services/tx_collection/slow_tx_collection.ts +2 -2
- package/src/testbench/p2p_client_testbench_worker.ts +5 -5
|
@@ -51,15 +51,15 @@ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
|
|
|
51
51
|
await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
|
|
52
52
|
|
|
53
53
|
// Check that the attestation is for the current or next slot
|
|
54
|
-
const
|
|
55
|
-
if (
|
|
56
|
-
this.logger.debug(`Penalizing peer for invalid slot number ${
|
|
54
|
+
const slotNumber = block.payload.header.slotNumber;
|
|
55
|
+
if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
|
|
56
|
+
this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, { currentSlot, nextSlot });
|
|
57
57
|
return PeerErrorSeverity.HighToleranceError;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
// Check that the block proposal is from the current or next proposer
|
|
61
|
-
if (
|
|
62
|
-
this.logger.debug(`Penalizing peer for invalid proposer for current slot ${
|
|
61
|
+
if (slotNumber === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
|
|
62
|
+
this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
|
|
63
63
|
currentProposer,
|
|
64
64
|
nextProposer,
|
|
65
65
|
proposer: proposer.toString(),
|
|
@@ -67,8 +67,8 @@ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
|
|
|
67
67
|
return PeerErrorSeverity.MidToleranceError;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
if (
|
|
71
|
-
this.logger.debug(`Penalizing peer for invalid proposer for next slot ${
|
|
70
|
+
if (slotNumber === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
|
|
71
|
+
this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumber}`, {
|
|
72
72
|
currentProposer,
|
|
73
73
|
nextProposer,
|
|
74
74
|
proposer: proposer.toString(),
|
|
@@ -80,7 +80,7 @@ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
|
|
|
80
80
|
if (!(await Promise.all(block.txs?.map(tx => tx.validateTxHash()) ?? [])).every(v => v)) {
|
|
81
81
|
this.logger.warn(`Penalizing peer for invalid tx hashes in block proposal`, {
|
|
82
82
|
proposer,
|
|
83
|
-
slotNumber
|
|
83
|
+
slotNumber,
|
|
84
84
|
});
|
|
85
85
|
return PeerErrorSeverity.LowToleranceError;
|
|
86
86
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
2
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { randomInt } from '@aztec/foundation/crypto';
|
|
3
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
4
5
|
import { type Logger, createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
@@ -192,7 +193,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
192
193
|
|
|
193
194
|
this.blockReceivedCallback = async (block: BlockProposal): Promise<BlockAttestation[] | undefined> => {
|
|
194
195
|
this.logger.debug(
|
|
195
|
-
`Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber
|
|
196
|
+
`Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`,
|
|
196
197
|
{ p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier() },
|
|
197
198
|
);
|
|
198
199
|
return undefined;
|
|
@@ -814,7 +815,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
814
815
|
|
|
815
816
|
let canAdd = true;
|
|
816
817
|
if (isValid && !exists) {
|
|
817
|
-
const slot = attestation.payload.header.slotNumber
|
|
818
|
+
const slot = attestation.payload.header.slotNumber;
|
|
818
819
|
const { committee } = await this.epochCache.getCommittee(slot);
|
|
819
820
|
const committeeSize = committee?.length ?? 0;
|
|
820
821
|
canAdd = await pool.canAddAttestation(attestation, committeeSize);
|
|
@@ -856,10 +857,10 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
856
857
|
}
|
|
857
858
|
|
|
858
859
|
this.logger.debug(
|
|
859
|
-
`Received attestation for slot ${attestation.slotNumber
|
|
860
|
+
`Received attestation for slot ${attestation.slotNumber} from external peer ${source.toString()}`,
|
|
860
861
|
{
|
|
861
862
|
p2pMessageIdentifier: await attestation.p2pMessageLoggingIdentifier(),
|
|
862
|
-
slot: attestation.slotNumber
|
|
863
|
+
slot: attestation.slotNumber,
|
|
863
864
|
archive: attestation.archive.toString(),
|
|
864
865
|
source: source.toString(),
|
|
865
866
|
},
|
|
@@ -920,16 +921,16 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
920
921
|
|
|
921
922
|
// REVIEW: callback pattern https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
922
923
|
@trackSpan('Libp2pService.processValidBlockProposal', async block => ({
|
|
923
|
-
[Attributes.SLOT_NUMBER]: block.slotNumber
|
|
924
|
+
[Attributes.SLOT_NUMBER]: block.slotNumber,
|
|
924
925
|
[Attributes.BLOCK_ARCHIVE]: block.archive.toString(),
|
|
925
926
|
[Attributes.P2P_ID]: await block.p2pMessageLoggingIdentifier().then(i => i.toString()),
|
|
926
927
|
}))
|
|
927
928
|
private async processValidBlockProposal(block: BlockProposal, sender: PeerId) {
|
|
928
|
-
const slot = block.slotNumber
|
|
929
|
-
const previousSlot = slot -
|
|
929
|
+
const slot = block.slotNumber;
|
|
930
|
+
const previousSlot = SlotNumber(slot - 1);
|
|
930
931
|
this.logger.verbose(`Received block proposal for slot ${slot} from external peer ${sender.toString()}.`, {
|
|
931
932
|
p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier(),
|
|
932
|
-
slot: block.slotNumber
|
|
933
|
+
slot: block.slotNumber,
|
|
933
934
|
archive: block.archive.toString(),
|
|
934
935
|
source: sender.toString(),
|
|
935
936
|
});
|
|
@@ -945,7 +946,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
945
946
|
// Drop proposals if we hit per-slot cap in the attestation pool; rethrow unknown errors
|
|
946
947
|
if (err instanceof ProposalSlotCapExceededError) {
|
|
947
948
|
this.logger.warn(`Dropping block proposal due to per-slot proposal cap`, {
|
|
948
|
-
slot: slot
|
|
949
|
+
slot: String(slot),
|
|
949
950
|
archive: block.archive.toString(),
|
|
950
951
|
error: (err as Error).message,
|
|
951
952
|
});
|
|
@@ -960,9 +961,9 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
960
961
|
// The attestation can be undefined if no handler is registered / the validator deems the block invalid / in fisherman mode
|
|
961
962
|
if (attestations?.length) {
|
|
962
963
|
for (const attestation of attestations) {
|
|
963
|
-
this.logger.verbose(`Broadcasting attestation for slot ${attestation.slotNumber
|
|
964
|
+
this.logger.verbose(`Broadcasting attestation for slot ${attestation.slotNumber}`, {
|
|
964
965
|
p2pMessageIdentifier: await attestation.p2pMessageLoggingIdentifier(),
|
|
965
|
-
slot: attestation.slotNumber
|
|
966
|
+
slot: attestation.slotNumber,
|
|
966
967
|
archive: attestation.archive.toString(),
|
|
967
968
|
});
|
|
968
969
|
await this.broadcastAttestation(attestation);
|
|
@@ -975,7 +976,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
975
976
|
* @param attestation - The attestation to broadcast.
|
|
976
977
|
*/
|
|
977
978
|
@trackSpan('Libp2pService.broadcastAttestation', async attestation => ({
|
|
978
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber
|
|
979
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
979
980
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
980
981
|
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
|
|
981
982
|
}))
|
|
@@ -1371,7 +1372,7 @@ export class LibP2PService<T extends P2PClientType = P2PClientType.Full> extends
|
|
|
1371
1372
|
* @returns True if the attestation is valid, false otherwise.
|
|
1372
1373
|
*/
|
|
1373
1374
|
@trackSpan('Libp2pService.validateAttestation', async (_, attestation) => ({
|
|
1374
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber
|
|
1375
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
1375
1376
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
1376
1377
|
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then(i => i.toString()),
|
|
1377
1378
|
}))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
1
|
+
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { chunk } from '@aztec/foundation/collection';
|
|
3
3
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { boundInclusive } from '@aztec/foundation/number';
|
|
@@ -224,7 +224,7 @@ export class SlowTxCollection {
|
|
|
224
224
|
}
|
|
225
225
|
|
|
226
226
|
/** Computes the proof submission deadline for a given slot, a tx mined in this slot is no longer interesting after this deadline */
|
|
227
|
-
private getDeadlineForSlot(slotNumber:
|
|
227
|
+
private getDeadlineForSlot(slotNumber: SlotNumber): Date {
|
|
228
228
|
const epoch = getEpochAtSlot(slotNumber, this.constants);
|
|
229
229
|
const submissionEndEpoch = EpochNumber(epoch + this.constants.proofSubmissionEpochs);
|
|
230
230
|
const submissionEndTimestamp = getTimestampRangeForEpoch(submissionEndEpoch, this.constants)[1];
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { MockL2BlockSource } from '@aztec/archiver/test';
|
|
7
7
|
import type { EpochCacheInterface } from '@aztec/epoch-cache';
|
|
8
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
8
|
+
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
9
9
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
10
10
|
import { createLogger } from '@aztec/foundation/log';
|
|
11
11
|
import { sleep } from '@aztec/foundation/sleep';
|
|
@@ -84,16 +84,16 @@ function mockEpochCache(): EpochCacheInterface {
|
|
|
84
84
|
return {
|
|
85
85
|
getCommittee: () => Promise.resolve({ committee: [], seed: 1n, epoch: EpochNumber.ZERO }),
|
|
86
86
|
getProposerIndexEncoding: () => '0x' as `0x${string}`,
|
|
87
|
-
getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot:
|
|
87
|
+
getEpochAndSlotNow: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n }),
|
|
88
88
|
computeProposerIndex: () => 0n,
|
|
89
89
|
getProposerAttesterAddressInCurrentOrNextSlot: () =>
|
|
90
90
|
Promise.resolve({
|
|
91
91
|
currentProposer: EthAddress.ZERO,
|
|
92
92
|
nextProposer: EthAddress.ZERO,
|
|
93
|
-
currentSlot:
|
|
94
|
-
nextSlot:
|
|
93
|
+
currentSlot: SlotNumber.ZERO,
|
|
94
|
+
nextSlot: SlotNumber.ZERO,
|
|
95
95
|
}),
|
|
96
|
-
getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot:
|
|
96
|
+
getEpochAndSlotInNextL1Slot: () => ({ epoch: EpochNumber.ZERO, slot: SlotNumber.ZERO, ts: 0n, now: 0n }),
|
|
97
97
|
isInCommittee: () => Promise.resolve(false),
|
|
98
98
|
getRegisteredValidators: () => Promise.resolve([]),
|
|
99
99
|
filterInCommittee: () => Promise.resolve([]),
|