@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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
|
|
2
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
3
4
|
import type { AttestationPool } from './attestation_pool.js';
|
|
@@ -10,20 +11,20 @@ export declare class InMemoryAttestationPool implements AttestationPool {
|
|
|
10
11
|
constructor(telemetry?: TelemetryClient, log?: import("@aztec/foundation/log").Logger);
|
|
11
12
|
private poolStats;
|
|
12
13
|
isEmpty(): Promise<boolean>;
|
|
13
|
-
getAttestationsForSlot(slot:
|
|
14
|
-
getAttestationsForSlotAndProposal(slot:
|
|
14
|
+
getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
|
|
15
|
+
getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
|
|
15
16
|
addAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
16
|
-
deleteAttestationsOlderThan(oldestSlot:
|
|
17
|
-
deleteAttestationsForSlot(slot:
|
|
18
|
-
deleteAttestationsForSlotAndProposal(slot:
|
|
17
|
+
deleteAttestationsOlderThan(oldestSlot: SlotNumber): Promise<void>;
|
|
18
|
+
deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
|
|
19
|
+
deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
|
|
19
20
|
deleteAttestations(attestations: BlockAttestation[]): Promise<void>;
|
|
20
21
|
hasAttestation(attestation: BlockAttestation): Promise<boolean>;
|
|
21
22
|
addBlockProposal(blockProposal: BlockProposal): Promise<void>;
|
|
22
23
|
getBlockProposal(id: string): Promise<BlockProposal | undefined>;
|
|
23
24
|
hasBlockProposal(idOrProposal: string | BlockProposal): Promise<boolean>;
|
|
24
|
-
hasReachedProposalCap(slot:
|
|
25
|
-
hasReachedAttestationCap(slot:
|
|
25
|
+
hasReachedProposalCap(slot: SlotNumber): Promise<boolean>;
|
|
26
|
+
hasReachedAttestationCap(slot: SlotNumber, proposalId: string, committeeSize: number): Promise<boolean>;
|
|
26
27
|
canAddProposal(block: BlockProposal): Promise<boolean>;
|
|
27
28
|
canAddAttestation(attestation: BlockAttestation, committeeSize: number): Promise<boolean>;
|
|
28
29
|
}
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5X2F0dGVzdGF0aW9uX3Bvb2wuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1fcG9vbHMvYXR0ZXN0YXRpb25fcG9vbC9tZW1vcnlfYXR0ZXN0YXRpb25fcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVsRSxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXNCLE1BQU0seUJBQXlCLENBQUM7QUFHbkYsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHN0QscUJBQWEsdUJBQXdCLFlBQVcsZUFBZTs7SUFZM0QsT0FBTyxDQUFDLEdBQUc7SUFYYixPQUFPLENBQUMsT0FBTyxDQUF3QztJQUd2RCxPQUFPLENBQUMsWUFBWSxDQUdsQjtJQUNGLE9BQU8sQ0FBQyxTQUFTLENBQTZCO0lBRTlDLFlBQ0UsU0FBUyxHQUFFLGVBQXNDLEVBQ3pDLEdBQUcseUNBQXVDLEVBS25EO0lBRUQsT0FBTyxDQUFDLFNBQVMsQ0FJZjtJQUVLLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWpDO0lBRU0sc0JBQXNCLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQU0zRTtJQUVNLGlDQUFpQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQVMxRztJQUVNLGVBQWUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBK0J0RTtJQWNZLDJCQUEyQixDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQW1COUU7SUFFTSx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FnQmhFO0lBRU0sb0NBQW9DLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjL0Y7SUFFTSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBc0J6RTtJQUVNLGNBQWMsQ0FBQyxXQUFXLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQXFCckU7SUFFTSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FRbkU7SUFFTSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLENBRXRFO0lBRU0sZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE1BQU0sR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUc5RTtJQUVNLHFCQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUkvRDtJQUVNLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FJN0c7SUFFWSxjQUFjLENBQUMsS0FBSyxFQUFFLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBRWxFO0lBRVksaUJBQWlCLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQVNyRztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/memory_attestation_pool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory_attestation_pool.d.ts","sourceRoot":"","sources":["../../../src/mem_pools/attestation_pool/memory_attestation_pool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,yBAAyB,CAAC;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,qBAAa,uBAAwB,YAAW,eAAe;;IAY3D,OAAO,CAAC,GAAG;IAXb,OAAO,CAAC,OAAO,CAAwC;IAGvD,OAAO,CAAC,YAAY,CAGlB;IACF,OAAO,CAAC,SAAS,CAA6B;IAE9C,YACE,SAAS,GAAE,eAAsC,EACzC,GAAG,yCAAuC,EAKnD;IAED,OAAO,CAAC,SAAS,CAIf;IAEK,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjC;IAEM,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAM3E;IAEM,iCAAiC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS1G;IAEM,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BtE;IAcY,2BAA2B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9E;IAEM,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhE;IAEM,oCAAoC,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc/F;IAEM,kBAAkB,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBzE;IAEM,cAAc,CAAC,WAAW,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBrE;IAEM,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnE;IAEM,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAEtE;IAEM,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAG9E;IAEM,qBAAqB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAI/D;IAEM,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7G;IAEY,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAElE;IAEY,iBAAiB,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrG;CACF"}
|
|
@@ -5,6 +5,7 @@ import { ATTESTATION_CAP_BUFFER, MAX_PROPOSALS_PER_SLOT } from './kv_attestation
|
|
|
5
5
|
export class InMemoryAttestationPool {
|
|
6
6
|
log;
|
|
7
7
|
metrics;
|
|
8
|
+
// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
8
9
|
attestations;
|
|
9
10
|
proposals;
|
|
10
11
|
constructor(telemetry = getTelemetryClient(), log = createLogger('p2p:attestation_pool')){
|
|
@@ -43,17 +44,17 @@ export class InMemoryAttestationPool {
|
|
|
43
44
|
const sender = attestation.getSender();
|
|
44
45
|
// Skip attestations with invalid signatures
|
|
45
46
|
if (!sender) {
|
|
46
|
-
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber
|
|
47
|
+
this.log.warn(`Skipping attestation with invalid signature for slot ${slotNumber}`, {
|
|
47
48
|
signature: attestation.signature.toString(),
|
|
48
49
|
slotNumber,
|
|
49
50
|
proposalId
|
|
50
51
|
});
|
|
51
52
|
continue;
|
|
52
53
|
}
|
|
53
|
-
const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber
|
|
54
|
+
const slotAttestationMap = getSlotOrDefault(this.attestations, slotNumber);
|
|
54
55
|
const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
|
|
55
56
|
proposalAttestationMap.set(sender.toString(), attestation);
|
|
56
|
-
this.log.verbose(`Added attestation for slot ${slotNumber
|
|
57
|
+
this.log.verbose(`Added attestation for slot ${slotNumber} from ${sender}`, {
|
|
57
58
|
signature: attestation.signature.toString(),
|
|
58
59
|
slotNumber,
|
|
59
60
|
address: sender,
|
|
@@ -118,7 +119,7 @@ export class InMemoryAttestationPool {
|
|
|
118
119
|
deleteAttestations(attestations) {
|
|
119
120
|
for (const attestation of attestations){
|
|
120
121
|
const slotNumber = attestation.payload.header.slotNumber;
|
|
121
|
-
const slotAttestationMap = this.attestations.get(slotNumber
|
|
122
|
+
const slotAttestationMap = this.attestations.get(slotNumber);
|
|
122
123
|
if (slotAttestationMap) {
|
|
123
124
|
const proposalId = attestation.archive.toString();
|
|
124
125
|
const proposalAttestationMap = getProposalOrDefault(slotAttestationMap, proposalId);
|
|
@@ -126,7 +127,7 @@ export class InMemoryAttestationPool {
|
|
|
126
127
|
const sender = attestation.getSender();
|
|
127
128
|
// Skip attestations with invalid signatures
|
|
128
129
|
if (!sender) {
|
|
129
|
-
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber
|
|
130
|
+
this.log.warn(`Skipping deletion of attestation with invalid signature for slot ${slotNumber}`);
|
|
130
131
|
continue;
|
|
131
132
|
}
|
|
132
133
|
proposalAttestationMap.delete(sender.toString());
|
|
@@ -144,7 +145,7 @@ export class InMemoryAttestationPool {
|
|
|
144
145
|
if (!sender) {
|
|
145
146
|
return Promise.resolve(false);
|
|
146
147
|
}
|
|
147
|
-
const slotAttestationMap = this.attestations.get(slotNumber
|
|
148
|
+
const slotAttestationMap = this.attestations.get(slotNumber);
|
|
148
149
|
if (!slotAttestationMap) {
|
|
149
150
|
return Promise.resolve(false);
|
|
150
151
|
}
|
|
@@ -157,7 +158,7 @@ export class InMemoryAttestationPool {
|
|
|
157
158
|
addBlockProposal(blockProposal) {
|
|
158
159
|
// We initialize slot-proposal mapping if it does not exist
|
|
159
160
|
// This is important to ensure we can delete this proposal if there were not attestations for it
|
|
160
|
-
const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber
|
|
161
|
+
const slotProposalMapping = getSlotOrDefault(this.attestations, blockProposal.slotNumber);
|
|
161
162
|
slotProposalMapping.set(blockProposal.payload.archive.toString(), new Map());
|
|
162
163
|
this.proposals.set(blockProposal.payload.archive.toString(), blockProposal);
|
|
163
164
|
return Promise.resolve();
|
|
@@ -180,11 +181,11 @@ export class InMemoryAttestationPool {
|
|
|
180
181
|
return Promise.resolve(limit <= 0 || count >= limit);
|
|
181
182
|
}
|
|
182
183
|
async canAddProposal(block) {
|
|
183
|
-
return this.proposals.has(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber
|
|
184
|
+
return this.proposals.has(block.archive.toString()) || !await this.hasReachedProposalCap(block.slotNumber);
|
|
184
185
|
}
|
|
185
186
|
async canAddAttestation(attestation, committeeSize) {
|
|
186
187
|
const sender = attestation.getSender();
|
|
187
|
-
const slot = attestation.payload.header.slotNumber
|
|
188
|
+
const slot = attestation.payload.header.slotNumber;
|
|
188
189
|
const pid = attestation.archive.toString();
|
|
189
190
|
return !!sender && ((this.attestations.get(slot)?.get(pid)?.has(sender.toString()) ?? false) || !await this.hasReachedAttestationCap(slot, pid, committeeSize));
|
|
190
191
|
}
|
|
@@ -196,7 +197,8 @@ export class InMemoryAttestationPool {
|
|
|
196
197
|
* @param map - The map to fetch from
|
|
197
198
|
* @param slot - The slot to fetch
|
|
198
199
|
* @returns The slot mapping
|
|
199
|
-
*/ function getSlotOrDefault(
|
|
200
|
+
*/ function getSlotOrDefault(// eslint-disable-next-line aztec-custom/no-non-primitive-in-collections
|
|
201
|
+
map, slot) {
|
|
200
202
|
if (!map.has(slot)) {
|
|
201
203
|
map.set(slot, new Map());
|
|
202
204
|
}
|
|
@@ -18,7 +18,7 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
|
18
18
|
*/ export const mockAttestation = (signer, slot = 0, archive = Fr.random())=>{
|
|
19
19
|
// Use arbitrary numbers for all other than slot
|
|
20
20
|
const header = makeL2BlockHeader(1, 2, slot);
|
|
21
|
-
const payload = new ConsensusPayload(header.toCheckpointHeader(), archive
|
|
21
|
+
const payload = new ConsensusPayload(header.toCheckpointHeader(), archive);
|
|
22
22
|
const attestationHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockAttestation);
|
|
23
23
|
const attestationSignature = signer.sign(attestationHash);
|
|
24
24
|
const proposalHash = getHashedSignaturePayloadEthSignedMessage(payload, SignatureDomainSeparator.blockProposal);
|
|
@@ -7,4 +7,4 @@ export declare class AttestationValidator implements P2PValidator<BlockAttestati
|
|
|
7
7
|
constructor(epochCache: EpochCacheInterface);
|
|
8
8
|
validate(message: BlockAttestation): Promise<PeerErrorSeverity | undefined>;
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0YXRpb25fdmFsaWRhdG9yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbXNnX3ZhbGlkYXRvcnMvYXR0ZXN0YXRpb25fdmFsaWRhdG9yL2F0dGVzdGF0aW9uX3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlELE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBRSxLQUFLLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhHLHFCQUFhLG9CQUFxQixZQUFXLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztJQUN6RSxTQUFTLENBQUMsVUFBVSxFQUFFLG1CQUFtQixDQUFDO0lBQzFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBRXpCLFlBQVksVUFBVSxFQUFFLG1CQUFtQixFQUcxQztJQUVLLFFBQVEsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxDQXFEaEY7Q0FDRiJ9
|
|
@@ -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,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhG,qBAAa,oBAAqB,YAAW,YAAY,CAAC,gBAAgB,CAAC;IACzE,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB,YAAY,UAAU,EAAE,mBAAmB,EAG1C;IAEK,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,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,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEhG,qBAAa,oBAAqB,YAAW,YAAY,CAAC,gBAAgB,CAAC;IACzE,SAAS,CAAC,UAAU,EAAE,mBAAmB,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzB,YAAY,UAAU,EAAE,mBAAmB,EAG1C;IAEK,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAqDhF;CACF"}
|
|
@@ -9,44 +9,44 @@ export class AttestationValidator {
|
|
|
9
9
|
this.logger = createLogger('p2p:attestation-validator');
|
|
10
10
|
}
|
|
11
11
|
async validate(message) {
|
|
12
|
-
const
|
|
12
|
+
const slotNumber = message.payload.header.slotNumber;
|
|
13
13
|
try {
|
|
14
14
|
const { currentProposer, nextProposer, currentSlot, nextSlot } = await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
|
|
15
|
-
if (
|
|
16
|
-
this.logger.warn(`Attestation slot ${
|
|
15
|
+
if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
|
|
16
|
+
this.logger.warn(`Attestation slot ${slotNumber} is not current (${currentSlot}) or next (${nextSlot}) slot`);
|
|
17
17
|
return PeerErrorSeverity.HighToleranceError;
|
|
18
18
|
}
|
|
19
19
|
// Verify the signature is valid
|
|
20
20
|
const attester = message.getSender();
|
|
21
21
|
if (attester === undefined) {
|
|
22
|
-
this.logger.warn(`Invalid signature in attestation for slot ${
|
|
22
|
+
this.logger.warn(`Invalid signature in attestation for slot ${slotNumber}`);
|
|
23
23
|
return PeerErrorSeverity.LowToleranceError;
|
|
24
24
|
}
|
|
25
25
|
// Verify the attester is in the committee for this slot
|
|
26
|
-
if (!await this.epochCache.isInCommittee(
|
|
27
|
-
this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${
|
|
26
|
+
if (!await this.epochCache.isInCommittee(slotNumber, attester)) {
|
|
27
|
+
this.logger.warn(`Attester ${attester.toString()} is not in committee for slot ${slotNumber}`);
|
|
28
28
|
return PeerErrorSeverity.HighToleranceError;
|
|
29
29
|
}
|
|
30
30
|
// Verify the proposer signature matches the expected proposer for this slot
|
|
31
31
|
const proposer = message.getProposer();
|
|
32
|
-
const expectedProposer =
|
|
32
|
+
const expectedProposer = slotNumber === currentSlot ? currentProposer : nextProposer;
|
|
33
33
|
if (!expectedProposer) {
|
|
34
|
-
this.logger.warn(`No proposer defined for slot ${
|
|
34
|
+
this.logger.warn(`No proposer defined for slot ${slotNumber}`);
|
|
35
35
|
return PeerErrorSeverity.HighToleranceError;
|
|
36
36
|
}
|
|
37
37
|
if (!proposer) {
|
|
38
|
-
this.logger.warn(`Invalid proposer signature in attestation for slot ${
|
|
38
|
+
this.logger.warn(`Invalid proposer signature in attestation for slot ${slotNumber}`);
|
|
39
39
|
return PeerErrorSeverity.LowToleranceError;
|
|
40
40
|
}
|
|
41
41
|
if (!proposer.equals(expectedProposer)) {
|
|
42
|
-
this.logger.warn(`Proposer signature mismatch in attestation. ` + `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${
|
|
42
|
+
this.logger.warn(`Proposer signature mismatch in attestation. ` + `Expected ${expectedProposer?.toString() ?? 'none'} but got ${proposer.toString()} for slot ${slotNumber}`);
|
|
43
43
|
return PeerErrorSeverity.HighToleranceError;
|
|
44
44
|
}
|
|
45
45
|
return undefined;
|
|
46
46
|
} catch (e) {
|
|
47
47
|
// People shouldn't be sending us attestations if the committee doesn't exist
|
|
48
48
|
if (e instanceof NoCommitteeError) {
|
|
49
|
-
this.logger.warn(`No committee exists for attestation for slot ${
|
|
49
|
+
this.logger.warn(`No committee exists for attestation for slot ${slotNumber}`);
|
|
50
50
|
return PeerErrorSeverity.LowToleranceError;
|
|
51
51
|
}
|
|
52
52
|
throw e;
|
|
@@ -31,7 +31,7 @@ import { AttestationValidator } from './attestation_validator.js';
|
|
|
31
31
|
return baseValidationResult;
|
|
32
32
|
}
|
|
33
33
|
// fisherman validation: verify attestation payload matches proposal payload
|
|
34
|
-
const slotNumberBigInt = message.payload.header.slotNumber
|
|
34
|
+
const slotNumberBigInt = message.payload.header.slotNumber;
|
|
35
35
|
const attester = message.getSender();
|
|
36
36
|
const proposer = message.getProposer();
|
|
37
37
|
if (!attester || !proposer) {
|
|
@@ -37,25 +37,25 @@ export class BlockProposalValidator {
|
|
|
37
37
|
}
|
|
38
38
|
const { currentProposer, nextProposer, currentSlot, nextSlot } = await this.epochCache.getProposerAttesterAddressInCurrentOrNextSlot();
|
|
39
39
|
// Check that the attestation is for the current or next slot
|
|
40
|
-
const
|
|
41
|
-
if (
|
|
42
|
-
this.logger.debug(`Penalizing peer for invalid slot number ${
|
|
40
|
+
const slotNumber = block.payload.header.slotNumber;
|
|
41
|
+
if (slotNumber !== currentSlot && slotNumber !== nextSlot) {
|
|
42
|
+
this.logger.debug(`Penalizing peer for invalid slot number ${slotNumber}`, {
|
|
43
43
|
currentSlot,
|
|
44
44
|
nextSlot
|
|
45
45
|
});
|
|
46
46
|
return PeerErrorSeverity.HighToleranceError;
|
|
47
47
|
}
|
|
48
48
|
// Check that the block proposal is from the current or next proposer
|
|
49
|
-
if (
|
|
50
|
-
this.logger.debug(`Penalizing peer for invalid proposer for current slot ${
|
|
49
|
+
if (slotNumber === currentSlot && currentProposer !== undefined && !proposer.equals(currentProposer)) {
|
|
50
|
+
this.logger.debug(`Penalizing peer for invalid proposer for current slot ${slotNumber}`, {
|
|
51
51
|
currentProposer,
|
|
52
52
|
nextProposer,
|
|
53
53
|
proposer: proposer.toString()
|
|
54
54
|
});
|
|
55
55
|
return PeerErrorSeverity.MidToleranceError;
|
|
56
56
|
}
|
|
57
|
-
if (
|
|
58
|
-
this.logger.debug(`Penalizing peer for invalid proposer for next slot ${
|
|
57
|
+
if (slotNumber === nextSlot && nextProposer !== undefined && !proposer.equals(nextProposer)) {
|
|
58
|
+
this.logger.debug(`Penalizing peer for invalid proposer for next slot ${slotNumber}`, {
|
|
59
59
|
currentProposer,
|
|
60
60
|
nextProposer,
|
|
61
61
|
proposer: proposer.toString()
|
|
@@ -66,7 +66,7 @@ export class BlockProposalValidator {
|
|
|
66
66
|
if (!(await Promise.all(block.txs?.map((tx)=>tx.validateTxHash()) ?? [])).every((v)=>v)) {
|
|
67
67
|
this.logger.warn(`Penalizing peer for invalid tx hashes in block proposal`, {
|
|
68
68
|
proposer,
|
|
69
|
-
slotNumber
|
|
69
|
+
slotNumber
|
|
70
70
|
});
|
|
71
71
|
return PeerErrorSeverity.LowToleranceError;
|
|
72
72
|
}
|
|
@@ -172,4 +172,4 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
172
172
|
private stopLibP2P;
|
|
173
173
|
}
|
|
174
174
|
export {};
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicDJwX3NlcnZpY2UuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9saWJwMnAvbGlicDJwX3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUk5RCxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQTZDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0YsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQVcsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUUsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVqRSxPQUFPLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxRQUFRLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2SCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixLQUFLLFVBQVUsRUFDZixhQUFhLEVBR2IsU0FBUyxFQUlWLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsT0FBTyxFQUFFLEVBQUUsRUFBMEQsTUFBTSxrQkFBa0IsQ0FBQztBQUc5RixPQUFPLEVBQWtDLEtBQUssZUFBZSxFQUFFLFVBQVUsRUFBYSxNQUFNLHlCQUF5QixDQUFDO0FBY3RILE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBNEIsS0FBSyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk5RyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHekMsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakQsT0FBTyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFpQjdELE9BQU8sRUFBRSxLQUFL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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
4
4
|
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
}
|
|
7
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
7
8
|
import { randomInt } from '@aztec/foundation/crypto';
|
|
8
9
|
import { Fr } from '@aztec/foundation/fields';
|
|
9
10
|
import { createLibp2pComponentLogger, createLogger } from '@aztec/foundation/log';
|
|
@@ -101,7 +102,7 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
101
102
|
});
|
|
102
103
|
this.gossipSubEventHandler = this.handleGossipSubEvent.bind(this);
|
|
103
104
|
this.blockReceivedCallback = async (block)=>{
|
|
104
|
-
this.logger.debug(`Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber
|
|
105
|
+
this.logger.debug(`Handler not yet registered: Block received callback not set. Received block for slot ${block.slotNumber} from peer.`, {
|
|
105
106
|
p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier()
|
|
106
107
|
});
|
|
107
108
|
return undefined;
|
|
@@ -598,7 +599,7 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
598
599
|
const exists = isValid && await pool.hasAttestation(attestation);
|
|
599
600
|
let canAdd = true;
|
|
600
601
|
if (isValid && !exists) {
|
|
601
|
-
const slot = attestation.payload.header.slotNumber
|
|
602
|
+
const slot = attestation.payload.header.slotNumber;
|
|
602
603
|
const { committee } = await this.epochCache.getCommittee(slot);
|
|
603
604
|
const committeeSize = committee?.length ?? 0;
|
|
604
605
|
canAdd = await pool.canAddAttestation(attestation, committeeSize);
|
|
@@ -640,9 +641,9 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
640
641
|
if (result !== TopicValidatorResult.Accept || !attestation) {
|
|
641
642
|
return;
|
|
642
643
|
}
|
|
643
|
-
this.logger.debug(`Received attestation for slot ${attestation.slotNumber
|
|
644
|
+
this.logger.debug(`Received attestation for slot ${attestation.slotNumber} from external peer ${source.toString()}`, {
|
|
644
645
|
p2pMessageIdentifier: await attestation.p2pMessageLoggingIdentifier(),
|
|
645
|
-
slot: attestation.slotNumber
|
|
646
|
+
slot: attestation.slotNumber,
|
|
646
647
|
archive: attestation.archive.toString(),
|
|
647
648
|
source: source.toString()
|
|
648
649
|
});
|
|
@@ -700,11 +701,11 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
700
701
|
}
|
|
701
702
|
// REVIEW: callback pattern https://github.com/AztecProtocol/aztec-packages/issues/7963
|
|
702
703
|
async processValidBlockProposal(block, sender) {
|
|
703
|
-
const slot = block.slotNumber
|
|
704
|
-
const previousSlot = slot -
|
|
704
|
+
const slot = block.slotNumber;
|
|
705
|
+
const previousSlot = SlotNumber(slot - 1);
|
|
705
706
|
this.logger.verbose(`Received block proposal for slot ${slot} from external peer ${sender.toString()}.`, {
|
|
706
707
|
p2pMessageIdentifier: await block.p2pMessageLoggingIdentifier(),
|
|
707
|
-
slot: block.slotNumber
|
|
708
|
+
slot: block.slotNumber,
|
|
708
709
|
archive: block.archive.toString(),
|
|
709
710
|
source: sender.toString()
|
|
710
711
|
});
|
|
@@ -719,7 +720,7 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
719
720
|
// Drop proposals if we hit per-slot cap in the attestation pool; rethrow unknown errors
|
|
720
721
|
if (err instanceof ProposalSlotCapExceededError) {
|
|
721
722
|
this.logger.warn(`Dropping block proposal due to per-slot proposal cap`, {
|
|
722
|
-
slot: slot
|
|
723
|
+
slot: String(slot),
|
|
723
724
|
archive: block.archive.toString(),
|
|
724
725
|
error: err.message
|
|
725
726
|
});
|
|
@@ -733,9 +734,9 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
733
734
|
// The attestation can be undefined if no handler is registered / the validator deems the block invalid / in fisherman mode
|
|
734
735
|
if (attestations?.length) {
|
|
735
736
|
for (const attestation of attestations){
|
|
736
|
-
this.logger.verbose(`Broadcasting attestation for slot ${attestation.slotNumber
|
|
737
|
+
this.logger.verbose(`Broadcasting attestation for slot ${attestation.slotNumber}`, {
|
|
737
738
|
p2pMessageIdentifier: await attestation.p2pMessageLoggingIdentifier(),
|
|
738
|
-
slot: attestation.slotNumber
|
|
739
|
+
slot: attestation.slotNumber,
|
|
739
740
|
archive: attestation.archive.toString()
|
|
740
741
|
});
|
|
741
742
|
await this.broadcastAttestation(attestation);
|
|
@@ -1117,14 +1118,14 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
1117
1118
|
}
|
|
1118
1119
|
_ts_decorate([
|
|
1119
1120
|
trackSpan('Libp2pService.processValidBlockProposal', async (block)=>({
|
|
1120
|
-
[Attributes.SLOT_NUMBER]: block.slotNumber
|
|
1121
|
+
[Attributes.SLOT_NUMBER]: block.slotNumber,
|
|
1121
1122
|
[Attributes.BLOCK_ARCHIVE]: block.archive.toString(),
|
|
1122
1123
|
[Attributes.P2P_ID]: await block.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
1123
1124
|
}))
|
|
1124
1125
|
], LibP2PService.prototype, "processValidBlockProposal", null);
|
|
1125
1126
|
_ts_decorate([
|
|
1126
1127
|
trackSpan('Libp2pService.broadcastAttestation', async (attestation)=>({
|
|
1127
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber
|
|
1128
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
1128
1129
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
1129
1130
|
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
1130
1131
|
}))
|
|
@@ -1151,7 +1152,7 @@ _ts_decorate([
|
|
|
1151
1152
|
], LibP2PService.prototype, "validatePropagatedTx", null);
|
|
1152
1153
|
_ts_decorate([
|
|
1153
1154
|
trackSpan('Libp2pService.validateAttestation', async (_, attestation)=>({
|
|
1154
|
-
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber
|
|
1155
|
+
[Attributes.SLOT_NUMBER]: attestation.payload.header.slotNumber,
|
|
1155
1156
|
[Attributes.BLOCK_ARCHIVE]: attestation.archive.toString(),
|
|
1156
1157
|
[Attributes.P2P_ID]: await attestation.p2pMessageLoggingIdentifier().then((i)=>i.toString())
|
|
1157
1158
|
}))
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Used when running testbench commands
|
|
5
5
|
*/ import { MockL2BlockSource } from '@aztec/archiver/test';
|
|
6
|
-
import { EpochNumber } from '@aztec/foundation/branded-types';
|
|
6
|
+
import { EpochNumber, SlotNumber } from '@aztec/foundation/branded-types';
|
|
7
7
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
8
8
|
import { createLogger } from '@aztec/foundation/log';
|
|
9
9
|
import { sleep } from '@aztec/foundation/sleep';
|
|
@@ -70,19 +70,19 @@ function mockEpochCache() {
|
|
|
70
70
|
getProposerIndexEncoding: ()=>'0x',
|
|
71
71
|
getEpochAndSlotNow: ()=>({
|
|
72
72
|
epoch: EpochNumber.ZERO,
|
|
73
|
-
slot:
|
|
73
|
+
slot: SlotNumber.ZERO,
|
|
74
74
|
ts: 0n
|
|
75
75
|
}),
|
|
76
76
|
computeProposerIndex: ()=>0n,
|
|
77
77
|
getProposerAttesterAddressInCurrentOrNextSlot: ()=>Promise.resolve({
|
|
78
78
|
currentProposer: EthAddress.ZERO,
|
|
79
79
|
nextProposer: EthAddress.ZERO,
|
|
80
|
-
currentSlot:
|
|
81
|
-
nextSlot:
|
|
80
|
+
currentSlot: SlotNumber.ZERO,
|
|
81
|
+
nextSlot: SlotNumber.ZERO
|
|
82
82
|
}),
|
|
83
83
|
getEpochAndSlotInNextL1Slot: ()=>({
|
|
84
84
|
epoch: EpochNumber.ZERO,
|
|
85
|
-
slot:
|
|
85
|
+
slot: SlotNumber.ZERO,
|
|
86
86
|
ts: 0n,
|
|
87
87
|
now: 0n
|
|
88
88
|
}),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "3.0.0-nightly.
|
|
3
|
+
"version": "3.0.0-nightly.20251202",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -67,17 +67,17 @@
|
|
|
67
67
|
]
|
|
68
68
|
},
|
|
69
69
|
"dependencies": {
|
|
70
|
-
"@aztec/constants": "3.0.0-nightly.
|
|
71
|
-
"@aztec/epoch-cache": "3.0.0-nightly.
|
|
72
|
-
"@aztec/ethereum": "3.0.0-nightly.
|
|
73
|
-
"@aztec/foundation": "3.0.0-nightly.
|
|
74
|
-
"@aztec/kv-store": "3.0.0-nightly.
|
|
75
|
-
"@aztec/noir-contracts.js": "3.0.0-nightly.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.
|
|
77
|
-
"@aztec/protocol-contracts": "3.0.0-nightly.
|
|
78
|
-
"@aztec/simulator": "3.0.0-nightly.
|
|
79
|
-
"@aztec/stdlib": "3.0.0-nightly.
|
|
80
|
-
"@aztec/telemetry-client": "3.0.0-nightly.
|
|
70
|
+
"@aztec/constants": "3.0.0-nightly.20251202",
|
|
71
|
+
"@aztec/epoch-cache": "3.0.0-nightly.20251202",
|
|
72
|
+
"@aztec/ethereum": "3.0.0-nightly.20251202",
|
|
73
|
+
"@aztec/foundation": "3.0.0-nightly.20251202",
|
|
74
|
+
"@aztec/kv-store": "3.0.0-nightly.20251202",
|
|
75
|
+
"@aztec/noir-contracts.js": "3.0.0-nightly.20251202",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251202",
|
|
77
|
+
"@aztec/protocol-contracts": "3.0.0-nightly.20251202",
|
|
78
|
+
"@aztec/simulator": "3.0.0-nightly.20251202",
|
|
79
|
+
"@aztec/stdlib": "3.0.0-nightly.20251202",
|
|
80
|
+
"@aztec/telemetry-client": "3.0.0-nightly.20251202",
|
|
81
81
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
82
82
|
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
83
83
|
"@chainsafe/libp2p-yamux": "^6.0.2",
|
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
"xxhash-wasm": "^1.1.0"
|
|
105
105
|
},
|
|
106
106
|
"devDependencies": {
|
|
107
|
-
"@aztec/archiver": "3.0.0-nightly.
|
|
108
|
-
"@aztec/world-state": "3.0.0-nightly.
|
|
107
|
+
"@aztec/archiver": "3.0.0-nightly.20251202",
|
|
108
|
+
"@aztec/world-state": "3.0.0-nightly.20251202",
|
|
109
109
|
"@jest/globals": "^30.0.0",
|
|
110
110
|
"@types/jest": "^30.0.0",
|
|
111
111
|
"@types/node": "^22.15.17",
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
|
|
2
|
+
import { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
4
|
import { DateProvider } from '@aztec/foundation/timer';
|
|
4
5
|
import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncSingleton } from '@aztec/kv-store';
|
|
@@ -121,7 +122,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
121
122
|
this.log.debug(`Received block proposal from ${sender.toString()}`);
|
|
122
123
|
// TODO(palla/txs): Need to subtract validatorReexecuteDeadlineMs from this deadline (see ValidatorClient.getReexecutionDeadline)
|
|
123
124
|
const constants = this.txCollection.getConstants();
|
|
124
|
-
const nextSlotTimestampSeconds = Number(getTimestampForSlot(block.slotNumber
|
|
125
|
+
const nextSlotTimestampSeconds = Number(getTimestampForSlot(SlotNumber(block.slotNumber + 1), constants));
|
|
125
126
|
const deadline = new Date(nextSlotTimestampSeconds * 1000);
|
|
126
127
|
const parentBlock = await this.l2BlockSource.getBlockHeaderByArchive(block.payload.header.lastArchiveRoot);
|
|
127
128
|
if (!parentBlock) {
|
|
@@ -371,12 +372,12 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
371
372
|
}
|
|
372
373
|
|
|
373
374
|
@trackSpan('p2pClient.broadcastProposal', async proposal => ({
|
|
374
|
-
[Attributes.SLOT_NUMBER]: proposal.slotNumber
|
|
375
|
+
[Attributes.SLOT_NUMBER]: proposal.slotNumber,
|
|
375
376
|
[Attributes.BLOCK_ARCHIVE]: proposal.archive.toString(),
|
|
376
377
|
[Attributes.P2P_ID]: (await proposal.p2pMessageLoggingIdentifier()).toString(),
|
|
377
378
|
}))
|
|
378
379
|
public broadcastProposal(proposal: BlockProposal): Promise<void> {
|
|
379
|
-
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber
|
|
380
|
+
this.log.verbose(`Broadcasting proposal for slot ${proposal.slotNumber} to peers`);
|
|
380
381
|
return this.p2pService.propagate(proposal);
|
|
381
382
|
}
|
|
382
383
|
|
|
@@ -385,7 +386,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
385
386
|
await Promise.all(attestations.map(att => this.p2pService.propagate(att)));
|
|
386
387
|
}
|
|
387
388
|
|
|
388
|
-
public async getAttestationsForSlot(slot:
|
|
389
|
+
public async getAttestationsForSlot(slot: SlotNumber, proposalId?: string): Promise<BlockAttestation[]> {
|
|
389
390
|
return (
|
|
390
391
|
(await (proposalId
|
|
391
392
|
? this.attestationPool?.getAttestationsForSlotAndProposal(slot, proposalId)
|
|
@@ -726,7 +727,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
726
727
|
);
|
|
727
728
|
|
|
728
729
|
await this.synchedLatestBlockNumber.set(lastBlock.number);
|
|
729
|
-
await this.synchedLatestSlot.set(lastBlock.header.getSlot());
|
|
730
|
+
await this.synchedLatestSlot.set(BigInt(lastBlock.header.getSlot()));
|
|
730
731
|
this.log.verbose(`Synched to latest block ${lastBlock.number}`);
|
|
731
732
|
await this.startServiceIfSynched();
|
|
732
733
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
1
2
|
import type { BlockAttestation, BlockProposal } from '@aztec/stdlib/p2p';
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -51,7 +52,7 @@ export interface AttestationPool {
|
|
|
51
52
|
*
|
|
52
53
|
* @param slot - The oldest slot to keep.
|
|
53
54
|
*/
|
|
54
|
-
deleteAttestationsOlderThan(slot:
|
|
55
|
+
deleteAttestationsOlderThan(slot: SlotNumber): Promise<void>;
|
|
55
56
|
|
|
56
57
|
/**
|
|
57
58
|
* Delete Attestations for slot
|
|
@@ -60,7 +61,7 @@ export interface AttestationPool {
|
|
|
60
61
|
*
|
|
61
62
|
* @param slot - The slot to delete.
|
|
62
63
|
*/
|
|
63
|
-
deleteAttestationsForSlot(slot:
|
|
64
|
+
deleteAttestationsForSlot(slot: SlotNumber): Promise<void>;
|
|
64
65
|
|
|
65
66
|
/**
|
|
66
67
|
* Delete Attestations for slot and proposal
|
|
@@ -70,7 +71,7 @@ export interface AttestationPool {
|
|
|
70
71
|
* @param slot - The slot to delete.
|
|
71
72
|
* @param proposalId - The proposal to delete.
|
|
72
73
|
*/
|
|
73
|
-
deleteAttestationsForSlotAndProposal(slot:
|
|
74
|
+
deleteAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<void>;
|
|
74
75
|
|
|
75
76
|
/**
|
|
76
77
|
* Get all Attestations for all proposals for a given slot
|
|
@@ -80,7 +81,7 @@ export interface AttestationPool {
|
|
|
80
81
|
* @param slot - The slot to query
|
|
81
82
|
* @return BlockAttestations
|
|
82
83
|
*/
|
|
83
|
-
getAttestationsForSlot(slot:
|
|
84
|
+
getAttestationsForSlot(slot: SlotNumber): Promise<BlockAttestation[]>;
|
|
84
85
|
|
|
85
86
|
/**
|
|
86
87
|
* Get Attestations for slot and given proposal
|
|
@@ -91,7 +92,7 @@ export interface AttestationPool {
|
|
|
91
92
|
* @param proposalId - The proposal to query
|
|
92
93
|
* @return BlockAttestations
|
|
93
94
|
*/
|
|
94
|
-
getAttestationsForSlotAndProposal(slot:
|
|
95
|
+
getAttestationsForSlotAndProposal(slot: SlotNumber, proposalId: string): Promise<BlockAttestation[]>;
|
|
95
96
|
|
|
96
97
|
/**
|
|
97
98
|
* Check if a specific attestation exists in the pool
|