@aztec/p2p 1.0.0 → 1.1.2
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/bootstrap/bootstrap.js +1 -1
- package/dest/client/factory.js +1 -1
- package/dest/client/p2p_client.js +1 -1
- package/dest/config.d.ts +2 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts +11 -4
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/aztec_kv_tx_pool.js +17 -10
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts +2 -2
- package/dest/mem_pools/tx_pool/memory_tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/memory_tx_pool.js +2 -2
- package/dest/mem_pools/tx_pool/tx_pool.d.ts +3 -2
- package/dest/mem_pools/tx_pool/tx_pool.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.d.ts.map +1 -1
- package/dest/mem_pools/tx_pool/tx_pool_test_suite.js +10 -3
- package/dest/msg_validators/tx_validator/factory.d.ts +2 -1
- package/dest/msg_validators/tx_validator/factory.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/factory.js +3 -2
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts +2 -0
- package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/metadata_validator.js +13 -7
- package/dest/msg_validators/tx_validator/phases_validator.d.ts +3 -2
- package/dest/msg_validators/tx_validator/phases_validator.d.ts.map +1 -1
- package/dest/msg_validators/tx_validator/phases_validator.js +4 -4
- package/dest/services/libp2p/instrumentation.d.ts +8 -1
- package/dest/services/libp2p/instrumentation.d.ts.map +1 -1
- package/dest/services/libp2p/instrumentation.js +130 -2
- package/dest/services/libp2p/libp2p_service.d.ts +8 -3
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -1
- package/dest/services/libp2p/libp2p_service.js +34 -14
- package/dest/test-helpers/make-test-p2p-clients.d.ts.map +1 -1
- package/dest/test-helpers/make-test-p2p-clients.js +2 -1
- package/dest/test-helpers/reqresp-nodes.d.ts.map +1 -1
- package/dest/test-helpers/reqresp-nodes.js +3 -2
- package/dest/testbench/p2p_client_testbench_worker.js +6 -0
- package/dest/testbench/worker_client_manager.d.ts.map +1 -1
- package/dest/testbench/worker_client_manager.js +2 -1
- package/dest/util.d.ts +3 -2
- package/dest/util.d.ts.map +1 -1
- package/dest/util.js +6 -5
- package/package.json +13 -13
- package/src/bootstrap/bootstrap.ts +1 -1
- package/src/client/factory.ts +1 -1
- package/src/client/p2p_client.ts +1 -1
- package/src/config.ts +2 -1
- package/src/mem_pools/tx_pool/aztec_kv_tx_pool.ts +22 -12
- package/src/mem_pools/tx_pool/memory_tx_pool.ts +3 -3
- package/src/mem_pools/tx_pool/tx_pool.ts +3 -2
- package/src/mem_pools/tx_pool/tx_pool_test_suite.ts +8 -4
- package/src/msg_validators/tx_validator/factory.ts +4 -1
- package/src/msg_validators/tx_validator/metadata_validator.ts +20 -9
- package/src/msg_validators/tx_validator/phases_validator.ts +3 -2
- package/src/services/libp2p/instrumentation.ts +122 -3
- package/src/services/libp2p/libp2p_service.ts +41 -15
- package/src/test-helpers/make-test-p2p-clients.ts +2 -1
- package/src/test-helpers/reqresp-nodes.ts +3 -2
- package/src/testbench/p2p_client_testbench_worker.ts +1 -0
- package/src/testbench/worker_client_manager.ts +2 -1
- package/src/util.ts +8 -7
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
import { TopicType } from '@aztec/stdlib/p2p';
|
|
1
2
|
import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
|
|
3
|
+
import { createHistogram } from 'node:perf_hooks';
|
|
2
4
|
export class P2PInstrumentation {
|
|
3
5
|
messageValidationDuration;
|
|
4
6
|
messagePrevalidationCount;
|
|
7
|
+
messageLatency;
|
|
8
|
+
aggLatencyHisto = new Map();
|
|
9
|
+
aggValidationHisto = new Map();
|
|
10
|
+
aggLatencyMetrics;
|
|
11
|
+
aggValidationMetrics;
|
|
5
12
|
constructor(client, name){
|
|
6
13
|
const meter = client.getMeter(name);
|
|
7
14
|
this.messageValidationDuration = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_VALIDATION_DURATION, {
|
|
@@ -13,12 +20,84 @@ export class P2PInstrumentation {
|
|
|
13
20
|
description: 'How many message pass/fail prevalidation',
|
|
14
21
|
valueType: ValueType.INT
|
|
15
22
|
});
|
|
23
|
+
this.messageLatency = meter.createHistogram(Metrics.P2P_GOSSIP_MESSAGE_LATENCY, {
|
|
24
|
+
unit: 'ms',
|
|
25
|
+
description: 'P2P message latency',
|
|
26
|
+
valueType: ValueType.INT
|
|
27
|
+
});
|
|
28
|
+
this.aggLatencyMetrics = {
|
|
29
|
+
avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_AVG, {
|
|
30
|
+
valueType: ValueType.DOUBLE,
|
|
31
|
+
description: 'AVG msg latency',
|
|
32
|
+
unit: 'ms'
|
|
33
|
+
}),
|
|
34
|
+
max: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_MAX, {
|
|
35
|
+
valueType: ValueType.DOUBLE,
|
|
36
|
+
description: 'MAX msg latency',
|
|
37
|
+
unit: 'ms'
|
|
38
|
+
}),
|
|
39
|
+
min: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_MIN, {
|
|
40
|
+
valueType: ValueType.DOUBLE,
|
|
41
|
+
description: 'MIN msg latency',
|
|
42
|
+
unit: 'ms'
|
|
43
|
+
}),
|
|
44
|
+
p50: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_P50, {
|
|
45
|
+
valueType: ValueType.DOUBLE,
|
|
46
|
+
description: 'P50 msg latency',
|
|
47
|
+
unit: 'ms'
|
|
48
|
+
}),
|
|
49
|
+
p90: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_LATENCY_P90, {
|
|
50
|
+
valueType: ValueType.DOUBLE,
|
|
51
|
+
description: 'P90 msg latency',
|
|
52
|
+
unit: 'ms'
|
|
53
|
+
})
|
|
54
|
+
};
|
|
55
|
+
this.aggValidationMetrics = {
|
|
56
|
+
avg: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_AVG, {
|
|
57
|
+
valueType: ValueType.DOUBLE,
|
|
58
|
+
description: 'AVG msg validation',
|
|
59
|
+
unit: 'ms'
|
|
60
|
+
}),
|
|
61
|
+
max: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_MAX, {
|
|
62
|
+
valueType: ValueType.DOUBLE,
|
|
63
|
+
description: 'MAX msg validation',
|
|
64
|
+
unit: 'ms'
|
|
65
|
+
}),
|
|
66
|
+
min: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_MIN, {
|
|
67
|
+
valueType: ValueType.DOUBLE,
|
|
68
|
+
description: 'MIN msg validation',
|
|
69
|
+
unit: 'ms'
|
|
70
|
+
}),
|
|
71
|
+
p50: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_P50, {
|
|
72
|
+
valueType: ValueType.DOUBLE,
|
|
73
|
+
description: 'P50 msg validation',
|
|
74
|
+
unit: 'ms'
|
|
75
|
+
}),
|
|
76
|
+
p90: meter.createObservableGauge(Metrics.P2P_GOSSIP_AGG_MESSAGE_VALIDATION_DURATION_P90, {
|
|
77
|
+
valueType: ValueType.DOUBLE,
|
|
78
|
+
description: 'P90 msg validation',
|
|
79
|
+
unit: 'ms'
|
|
80
|
+
})
|
|
81
|
+
};
|
|
82
|
+
meter.addBatchObservableCallback(this.aggregate, [
|
|
83
|
+
...Object.values(this.aggValidationMetrics),
|
|
84
|
+
...Object.values(this.aggLatencyMetrics)
|
|
85
|
+
]);
|
|
16
86
|
}
|
|
17
87
|
recordMessageValidation(topicName, timerOrMs) {
|
|
18
|
-
const ms = typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms();
|
|
19
|
-
this.messageValidationDuration.record(
|
|
88
|
+
const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
|
|
89
|
+
this.messageValidationDuration.record(ms, {
|
|
20
90
|
[Attributes.TOPIC_NAME]: topicName
|
|
21
91
|
});
|
|
92
|
+
let validationHistogram = this.aggValidationHisto.get(topicName);
|
|
93
|
+
if (!validationHistogram) {
|
|
94
|
+
validationHistogram = createHistogram({
|
|
95
|
+
min: 1,
|
|
96
|
+
max: 5 * 60 * 1000
|
|
97
|
+
}); // 5 mins
|
|
98
|
+
this.aggValidationHisto.set(topicName, validationHistogram);
|
|
99
|
+
}
|
|
100
|
+
validationHistogram.record(Math.max(ms, 1));
|
|
22
101
|
}
|
|
23
102
|
incMessagePrevalidationStatus(passed, topicName) {
|
|
24
103
|
this.messagePrevalidationCount.add(1, {
|
|
@@ -26,4 +105,53 @@ export class P2PInstrumentation {
|
|
|
26
105
|
[Attributes.OK]: passed
|
|
27
106
|
});
|
|
28
107
|
}
|
|
108
|
+
recordMessageLatency(topicName, timerOrMs) {
|
|
109
|
+
const ms = Math.ceil(typeof timerOrMs === 'number' ? timerOrMs : timerOrMs.ms());
|
|
110
|
+
this.messageLatency.record(ms, {
|
|
111
|
+
[Attributes.TOPIC_NAME]: topicName
|
|
112
|
+
});
|
|
113
|
+
let latencyHistogram = this.aggLatencyHisto.get(topicName);
|
|
114
|
+
if (!latencyHistogram) {
|
|
115
|
+
latencyHistogram = createHistogram({
|
|
116
|
+
min: 1,
|
|
117
|
+
max: 24 * 60 * 60 * 1000
|
|
118
|
+
}); // 24hrs
|
|
119
|
+
this.aggLatencyHisto.set(topicName, latencyHistogram);
|
|
120
|
+
}
|
|
121
|
+
latencyHistogram.record(Math.max(ms, 1));
|
|
122
|
+
}
|
|
123
|
+
aggregate = (res)=>{
|
|
124
|
+
for (const [metrics, histograms] of [
|
|
125
|
+
[
|
|
126
|
+
this.aggLatencyMetrics,
|
|
127
|
+
this.aggLatencyHisto
|
|
128
|
+
],
|
|
129
|
+
[
|
|
130
|
+
this.aggValidationMetrics,
|
|
131
|
+
this.aggValidationHisto
|
|
132
|
+
]
|
|
133
|
+
]){
|
|
134
|
+
for (const topicName of Object.values(TopicType)){
|
|
135
|
+
const histogram = histograms.get(topicName);
|
|
136
|
+
if (!histogram || histogram.count === 0) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
res.observe(metrics.avg, histogram.mean, {
|
|
140
|
+
[Attributes.TOPIC_NAME]: topicName
|
|
141
|
+
});
|
|
142
|
+
res.observe(metrics.max, histogram.max, {
|
|
143
|
+
[Attributes.TOPIC_NAME]: topicName
|
|
144
|
+
});
|
|
145
|
+
res.observe(metrics.min, histogram.min, {
|
|
146
|
+
[Attributes.TOPIC_NAME]: topicName
|
|
147
|
+
});
|
|
148
|
+
res.observe(metrics.p50, histogram.percentile(50), {
|
|
149
|
+
[Attributes.TOPIC_NAME]: topicName
|
|
150
|
+
});
|
|
151
|
+
res.observe(metrics.p90, histogram.percentile(90), {
|
|
152
|
+
[Attributes.TOPIC_NAME]: topicName
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
};
|
|
29
157
|
}
|
|
@@ -28,6 +28,7 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
28
28
|
private peerManager;
|
|
29
29
|
protected mempools: MemPools<T>;
|
|
30
30
|
private archiver;
|
|
31
|
+
private epochCache;
|
|
31
32
|
private proofVerifier;
|
|
32
33
|
private worldStateSynchronizer;
|
|
33
34
|
protected logger: Logger;
|
|
@@ -113,7 +114,10 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
113
114
|
* @returns The number of recipients the data was sent to.
|
|
114
115
|
*/
|
|
115
116
|
private publishToTopic;
|
|
116
|
-
protected preValidateReceivedMessage(msg: Message, msgId: string, source: PeerId):
|
|
117
|
+
protected preValidateReceivedMessage(msg: Message, msgId: string, source: PeerId): {
|
|
118
|
+
result: boolean;
|
|
119
|
+
topicType?: TopicType;
|
|
120
|
+
};
|
|
117
121
|
/**
|
|
118
122
|
* Handles a new gossip message that was received by the client.
|
|
119
123
|
* @param topic - The message's topic.
|
|
@@ -166,12 +170,13 @@ export declare class LibP2PService<T extends P2PClientType = P2PClientType.Full>
|
|
|
166
170
|
private getGasFees;
|
|
167
171
|
validate(txs: Tx[]): Promise<void>;
|
|
168
172
|
/**
|
|
169
|
-
* Create message validators for the given block number.
|
|
173
|
+
* Create message validators for the given block number and timestamp.
|
|
170
174
|
*
|
|
171
175
|
* Each validator is a pair of a validator and a severity.
|
|
172
176
|
* If a validator fails, the peer is penalized with the severity of the validator.
|
|
173
177
|
*
|
|
174
|
-
* @param
|
|
178
|
+
* @param currentBlockNumber - The current synced block number.
|
|
179
|
+
* @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
|
|
175
180
|
* @returns The message validators.
|
|
176
181
|
*/
|
|
177
182
|
private createMessageValidators;
|
|
@@ -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;AAC9D,OAAO,EAAE,KAAK,MAAM,EAA6C,MAAM,uBAAuB,CAAC;AAI/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAE,6BAA6B,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACvH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,KAAK,UAAU,EACf,aAAa,EAGb,SAAS,EAIV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,EAAE,EAAwC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
57
57
|
peerManager;
|
|
58
58
|
mempools;
|
|
59
59
|
archiver;
|
|
60
|
+
epochCache;
|
|
60
61
|
proofVerifier;
|
|
61
62
|
worldStateSynchronizer;
|
|
62
63
|
logger;
|
|
@@ -77,7 +78,7 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
77
78
|
gossipSubEventHandler;
|
|
78
79
|
instrumentation;
|
|
79
80
|
constructor(clientType, config, node, peerDiscoveryService, reqresp, peerManager, mempools, archiver, epochCache, proofVerifier, worldStateSynchronizer, telemetry, logger = createLogger('p2p:libp2p_service')){
|
|
80
|
-
super(telemetry, 'LibP2PService'), this.clientType = clientType, this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.logger = logger, this.jobQueue = new SerialQueue(), this.msgIdSeenValidators = {}, this.protocolVersion = '', this.topicStrings = {};
|
|
81
|
+
super(telemetry, 'LibP2PService'), this.clientType = clientType, this.config = config, this.node = node, this.peerDiscoveryService = peerDiscoveryService, this.reqresp = reqresp, this.peerManager = peerManager, this.mempools = mempools, this.archiver = archiver, this.epochCache = epochCache, this.proofVerifier = proofVerifier, this.worldStateSynchronizer = worldStateSynchronizer, this.logger = logger, this.jobQueue = new SerialQueue(), this.msgIdSeenValidators = {}, this.protocolVersion = '', this.topicStrings = {};
|
|
81
82
|
this.instrumentation = new P2PInstrumentation(telemetry, 'LibP2PService');
|
|
82
83
|
this.msgIdSeenValidators[TopicType.tx] = new MessageSeenValidator(config.seenMessageCacheSize);
|
|
83
84
|
this.msgIdSeenValidators[TopicType.block_proposal] = new MessageSeenValidator(config.seenMessageCacheSize);
|
|
@@ -388,10 +389,16 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
388
389
|
if (!validator || !validator.addMessage(msgId)) {
|
|
389
390
|
this.instrumentation.incMessagePrevalidationStatus(false, topicType);
|
|
390
391
|
this.node.services.pubsub.reportMessageValidationResult(msgId, source.toString(), TopicValidatorResult.Ignore);
|
|
391
|
-
return
|
|
392
|
+
return {
|
|
393
|
+
result: false,
|
|
394
|
+
topicType
|
|
395
|
+
};
|
|
392
396
|
}
|
|
393
397
|
this.instrumentation.incMessagePrevalidationStatus(true, topicType);
|
|
394
|
-
return
|
|
398
|
+
return {
|
|
399
|
+
result: true,
|
|
400
|
+
topicType
|
|
401
|
+
};
|
|
395
402
|
}
|
|
396
403
|
/**
|
|
397
404
|
* Handles a new gossip message that was received by the client.
|
|
@@ -406,8 +413,14 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
406
413
|
messageId: p2pMessage.id,
|
|
407
414
|
messageLatency
|
|
408
415
|
});
|
|
409
|
-
|
|
416
|
+
const preValidationResult = this.preValidateReceivedMessage(msg, msgId, source);
|
|
417
|
+
if (!preValidationResult.result) {
|
|
410
418
|
return;
|
|
419
|
+
} else if (preValidationResult.topicType !== undefined) {
|
|
420
|
+
// guard against clock skew & DST
|
|
421
|
+
if (messageLatency > 0) {
|
|
422
|
+
this.instrumentation.recordMessageLatency(preValidationResult.topicType, messageLatency);
|
|
423
|
+
}
|
|
411
424
|
}
|
|
412
425
|
if (msg.topic === this.topicStrings[TopicType.tx]) {
|
|
413
426
|
await this.handleGossipedTx(p2pMessage.payload, msgId, source);
|
|
@@ -597,8 +610,10 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
597
610
|
return true;
|
|
598
611
|
}
|
|
599
612
|
async validatePropagatedTx(tx, peerId) {
|
|
600
|
-
const
|
|
601
|
-
|
|
613
|
+
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
614
|
+
// We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
|
|
615
|
+
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
616
|
+
const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
602
617
|
for (const validator of messageValidators){
|
|
603
618
|
const outcome = await this.runValidations(tx, validator);
|
|
604
619
|
if (outcome.allPassed) {
|
|
@@ -608,7 +623,8 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
608
623
|
let { severity } = outcome.failure;
|
|
609
624
|
// Double spend validator has a special case handler
|
|
610
625
|
if (name === 'doubleSpendValidator') {
|
|
611
|
-
|
|
626
|
+
const txBlockNumber = currentBlockNumber + 1; // tx is expected to be in the next block
|
|
627
|
+
severity = await this.handleDoubleSpendFailure(tx, txBlockNumber);
|
|
612
628
|
}
|
|
613
629
|
this.peerManager.penalizePeer(peerId, severity);
|
|
614
630
|
return false;
|
|
@@ -628,8 +644,10 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
628
644
|
return gasFees;
|
|
629
645
|
}
|
|
630
646
|
async validate(txs) {
|
|
631
|
-
const
|
|
632
|
-
|
|
647
|
+
const currentBlockNumber = await this.archiver.getBlockNumber();
|
|
648
|
+
// We accept transactions if they are not expired by the next slot (checked based on the IncludeByTimestamp field)
|
|
649
|
+
const { ts: nextSlotTimestamp } = this.epochCache.getEpochAndSlotInNextL1Slot();
|
|
650
|
+
const messageValidators = await this.createMessageValidators(currentBlockNumber, nextSlotTimestamp);
|
|
633
651
|
await Promise.all(txs.map(async (tx)=>{
|
|
634
652
|
for (const validator of messageValidators){
|
|
635
653
|
const outcome = await this.runValidations(tx, validator);
|
|
@@ -644,17 +662,19 @@ import { P2PInstrumentation } from './instrumentation.js';
|
|
|
644
662
|
}));
|
|
645
663
|
}
|
|
646
664
|
/**
|
|
647
|
-
* Create message validators for the given block number.
|
|
665
|
+
* Create message validators for the given block number and timestamp.
|
|
648
666
|
*
|
|
649
667
|
* Each validator is a pair of a validator and a severity.
|
|
650
668
|
* If a validator fails, the peer is penalized with the severity of the validator.
|
|
651
669
|
*
|
|
652
|
-
* @param
|
|
670
|
+
* @param currentBlockNumber - The current synced block number.
|
|
671
|
+
* @param nextSlotTimestamp - The timestamp of the next slot (used to validate txs are not expired).
|
|
653
672
|
* @returns The message validators.
|
|
654
|
-
*/ async createMessageValidators(
|
|
655
|
-
const gasFees = await this.getGasFees(
|
|
673
|
+
*/ async createMessageValidators(currentBlockNumber, nextSlotTimestamp) {
|
|
674
|
+
const gasFees = await this.getGasFees(currentBlockNumber);
|
|
656
675
|
const allowedInSetup = this.config.txPublicSetupAllowList ?? await getDefaultAllowedSetupFunctions();
|
|
657
|
-
|
|
676
|
+
const blockNumberInWhichTheTxIsConsideredToBeIncluded = currentBlockNumber + 1;
|
|
677
|
+
return createTxMessageValidators(nextSlotTimestamp, blockNumberInWhichTheTxIsConsideredToBeIncluded, this.worldStateSynchronizer, gasFees, this.config.l1ChainId, this.config.rollupVersion, protocolContractTreeRoot, this.archiver, this.proofVerifier, allowedInSetup);
|
|
658
678
|
}
|
|
659
679
|
/**
|
|
660
680
|
* Run validations on a tx.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"make-test-p2p-clients.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-test-p2p-clients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"make-test-p2p-clients.d.ts","sourceRoot":"","sources":["../../src/test-helpers/make-test-p2p-clients.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAIlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAI5D,OAAO,EAAE,KAAK,oBAAoB,EAAkC,MAAM,kBAAkB,CAAC;AAG7F,MAAM,WAAW,wBAAwB;IACvC,mBAAmB,EAAE,eAAe,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,UAAU,CAAC;IAC3B,cAAc,EAAE,sBAAsB,CAAC;IACvC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,SAAS,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC7C,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,wBAAwB,0CAMlC;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,gBAAgB,EAAE,MAAM,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,EACE,kBAAyB,EACzB,aAAa,EACb,kBAAuB,EACvB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,MAAwC,GACzC,EAAE,wBAAwB,0CA0C5B;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB;;;;;KAuC3G;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB;;;;;KAgCnG;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,iBAG7D"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MockL2BlockSource } from '@aztec/archiver/test';
|
|
2
|
+
import { SecretValue } from '@aztec/foundation/config';
|
|
2
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
4
|
import { sleep } from '@aztec/foundation/sleep';
|
|
4
5
|
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
@@ -33,7 +34,7 @@ import { AlwaysFalseCircuitVerifier, AlwaysTrueCircuitVerifier } from './reqresp
|
|
|
33
34
|
const config = {
|
|
34
35
|
...p2pBaseConfig,
|
|
35
36
|
p2pEnabled: true,
|
|
36
|
-
peerIdPrivateKey,
|
|
37
|
+
peerIdPrivateKey: new SecretValue(peerIdPrivateKey),
|
|
37
38
|
p2pIp: `127.0.0.1`,
|
|
38
39
|
listenAddress: `127.0.0.1`,
|
|
39
40
|
p2pPort: port,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reqresp-nodes.d.ts","sourceRoot":"","sources":["../../src/test-helpers/reqresp-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"reqresp-nodes.d.ts","sourceRoot":"","sources":["../../src/test-helpers/reqresp-nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { timesParallel } from '@aztec/foundation/collection';
|
|
2
|
+
import { SecretValue } from '@aztec/foundation/config';
|
|
2
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
3
4
|
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
4
5
|
import { emptyChainConfig } from '@aztec/stdlib/config';
|
|
@@ -87,7 +88,7 @@ import { getVersions } from '../versioning.js';
|
|
|
87
88
|
peerCheckIntervalMS: 1000,
|
|
88
89
|
maxPeerCount: 5,
|
|
89
90
|
p2pEnabled: true,
|
|
90
|
-
peerIdPrivateKey: Buffer.from(peerId.privateKey).toString('hex'),
|
|
91
|
+
peerIdPrivateKey: new SecretValue(Buffer.from(peerId.privateKey).toString('hex')),
|
|
91
92
|
bootstrapNodeEnrVersionCheck: false,
|
|
92
93
|
...chainConfig
|
|
93
94
|
};
|
|
@@ -197,7 +198,7 @@ export function createBootstrapNodeConfig(privateKey, port, chainConfig) {
|
|
|
197
198
|
l1ChainId: chainConfig.l1ChainId,
|
|
198
199
|
p2pIp: '127.0.0.1',
|
|
199
200
|
p2pPort: port,
|
|
200
|
-
peerIdPrivateKey: privateKey,
|
|
201
|
+
peerIdPrivateKey: new SecretValue(privateKey),
|
|
201
202
|
dataDirectory: undefined,
|
|
202
203
|
dataStoreMapSizeKB: 0,
|
|
203
204
|
bootstrapNodes: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"worker_client_manager.d.ts","sourceRoot":"","sources":["../../src/testbench/worker_client_manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,KAAK,YAAY,EAAQ,MAAM,eAAe,CAAC;AAIxD,OAAO,EAAE,KAAK,SAAS,EAAuB,MAAM,cAAc,CAAC;AAQnE,QAAA,MAAM,eAAe,EAAE,WAMtB,CAAC;AAEF,cAAM,mBAAmB;IAChB,SAAS,EAAE,YAAY,EAAE,CAAM;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAM;IACxB,KAAK,EAAE,MAAM,EAAE,CAAM;IAC5B,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,uBAAuB,CAAgB;gBAEnC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC;IAKzD,OAAO;IAOP;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoD1B;;;;;;OAMG;IACG,iBAAiB,CAAC,eAAe,EAAE,MAAM;IA2C/C,4BAA4B;IAI5B,kCAAkC;IAIlC;;;;;OAKG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IA8CrD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;IACG,OAAO;CAiCd;AAED,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SecretValue } from '@aztec/foundation/config';
|
|
1
2
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
3
|
import { sleep } from '@aztec/foundation/sleep';
|
|
3
4
|
import { fork } from 'child_process';
|
|
@@ -40,7 +41,7 @@ class WorkerClientManager {
|
|
|
40
41
|
return {
|
|
41
42
|
...getP2PDefaultConfig(),
|
|
42
43
|
p2pEnabled: true,
|
|
43
|
-
peerIdPrivateKey: this.peerIdPrivateKeys[clientIndex],
|
|
44
|
+
peerIdPrivateKey: new SecretValue(this.peerIdPrivateKeys[clientIndex]),
|
|
44
45
|
listenAddress: '127.0.0.1',
|
|
45
46
|
p2pIp: '127.0.0.1',
|
|
46
47
|
p2pPort: port,
|
package/dest/util.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SecretValue } from '@aztec/foundation/config';
|
|
1
2
|
import type { Logger } from '@aztec/foundation/log';
|
|
2
3
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
4
|
import type { DataStoreConfig } from '@aztec/kv-store/config';
|
|
@@ -46,10 +47,10 @@ export declare function configureP2PClientAddresses(_config: P2PConfig & DataSto
|
|
|
46
47
|
*
|
|
47
48
|
*/
|
|
48
49
|
export declare function getPeerIdPrivateKey(config: {
|
|
49
|
-
peerIdPrivateKey?: string
|
|
50
|
+
peerIdPrivateKey?: SecretValue<string>;
|
|
50
51
|
peerIdPrivateKeyPath?: string;
|
|
51
52
|
dataDirectory?: string;
|
|
52
|
-
}, store: AztecAsyncKVStore, logger: Logger): Promise<string
|
|
53
|
+
}, store: AztecAsyncKVStore, logger: Logger): Promise<SecretValue<string>>;
|
|
53
54
|
/**
|
|
54
55
|
* Create a libp2p peer ID from the private key.
|
|
55
56
|
* @param privateKey - peer ID private key as hex string
|
package/dest/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAIpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxF,QAAQ,EAAE;QACR,MAAM,EAAE,IAAI,CACV,SAAS,EACT,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,GAAG,WAAW,GAAG,+BAA+B,CACvG,GAAG;YAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC;KAClD,CAAC;CACH;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE;QACV,iBAAiB,EAAE,iBAAiB,CAAC;KACtC,CAAC;CACH,CAAC,CAAC;AAEH;;;;;;;6CAO6C;AAC7C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAOjG;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW9F;AAcD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,SAAS,GAAG,eAAe,GACnC,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC,CAmBtC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,iBAAiB,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAIpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxF,QAAQ,EAAE;QACR,MAAM,EAAE,IAAI,CACV,SAAS,EACT,kBAAkB,GAAG,qBAAqB,GAAG,SAAS,GAAG,WAAW,GAAG,+BAA+B,CACvG,GAAG;YAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC;KAClD,CAAC;CACH;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE;QACV,iBAAiB,EAAE,iBAAiB,CAAC;KACtC,CAAC;CACH,CAAC,CAAC;AAEH;;;;;;;6CAO6C;AAC7C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAOjG;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAInD;AAED,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW9F;AAcD,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,SAAS,GAAG,eAAe,GACnC,OAAO,CAAC,SAAS,GAAG,eAAe,CAAC,CAmBtC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE;IAAE,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,EACzG,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CA2D9B;AAED;;;;GAIG;AACH,wBAAsB,gCAAgC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS1F"}
|
package/dest/util.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { SecretValue } from '@aztec/foundation/config';
|
|
1
2
|
import { generateKeyPair, marshalPrivateKey, unmarshalPrivateKey } from '@libp2p/crypto/keys';
|
|
2
3
|
import { createFromPrivKey } from '@libp2p/peer-id-factory';
|
|
3
4
|
import { resolve } from 'dns/promises';
|
|
@@ -85,12 +86,12 @@ export async function configureP2PClientAddresses(_config) {
|
|
|
85
86
|
await fs.writeFile(filePath, privateKey);
|
|
86
87
|
};
|
|
87
88
|
// If the peerIdPrivateKey is provided in the config, we use it and persist it in either a file or the node's store
|
|
88
|
-
if (config.peerIdPrivateKey) {
|
|
89
|
+
if (config.peerIdPrivateKey && config.peerIdPrivateKey.getValue().trim()) {
|
|
89
90
|
if (peerIdPrivateKeyFilePath) {
|
|
90
|
-
await writePrivateKeyToFile(peerIdPrivateKeyFilePath, config.peerIdPrivateKey);
|
|
91
|
+
await writePrivateKeyToFile(peerIdPrivateKeyFilePath, config.peerIdPrivateKey.getValue());
|
|
91
92
|
} else {
|
|
92
93
|
peerIdPrivateKeySingleton = store.openSingleton('peerIdPrivateKey');
|
|
93
|
-
await peerIdPrivateKeySingleton.set(config.peerIdPrivateKey);
|
|
94
|
+
await peerIdPrivateKeySingleton.set(config.peerIdPrivateKey.getValue());
|
|
94
95
|
}
|
|
95
96
|
return config.peerIdPrivateKey;
|
|
96
97
|
}
|
|
@@ -109,7 +110,7 @@ export async function configureP2PClientAddresses(_config) {
|
|
|
109
110
|
logger.verbose(`Peer ID private key found in the node's store, persisting it to ${peerIdPrivateKeyFilePath}`);
|
|
110
111
|
await writePrivateKeyToFile(peerIdPrivateKeyFilePath, storedPeerIdPrivateKey);
|
|
111
112
|
}
|
|
112
|
-
return storedPeerIdPrivateKey;
|
|
113
|
+
return new SecretValue(storedPeerIdPrivateKey);
|
|
113
114
|
}
|
|
114
115
|
// Generate and persist a new private key
|
|
115
116
|
const newPeerIdPrivateKey = await generateKeyPair('secp256k1');
|
|
@@ -121,7 +122,7 @@ export async function configureP2PClientAddresses(_config) {
|
|
|
121
122
|
logger.warn('Creating new peer ID private key and persisting it to the lmdb store. Key will be lost on rollup upgrade, specify the peer id private key path and restart the node to persist the peer id private key to a file');
|
|
122
123
|
await peerIdPrivateKeySingleton.set(privateKeyString);
|
|
123
124
|
}
|
|
124
|
-
return privateKeyString;
|
|
125
|
+
return new SecretValue(privateKeyString);
|
|
125
126
|
}
|
|
126
127
|
/**
|
|
127
128
|
* Create a libp2p peer ID from the private key.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/p2p",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.2",
|
|
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": "1.
|
|
71
|
-
"@aztec/epoch-cache": "1.
|
|
72
|
-
"@aztec/ethereum": "1.
|
|
73
|
-
"@aztec/foundation": "1.
|
|
74
|
-
"@aztec/kv-store": "1.
|
|
75
|
-
"@aztec/noir-contracts.js": "1.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "1.
|
|
77
|
-
"@aztec/protocol-contracts": "1.
|
|
78
|
-
"@aztec/simulator": "1.
|
|
79
|
-
"@aztec/stdlib": "1.
|
|
80
|
-
"@aztec/telemetry-client": "1.
|
|
70
|
+
"@aztec/constants": "1.1.2",
|
|
71
|
+
"@aztec/epoch-cache": "1.1.2",
|
|
72
|
+
"@aztec/ethereum": "1.1.2",
|
|
73
|
+
"@aztec/foundation": "1.1.2",
|
|
74
|
+
"@aztec/kv-store": "1.1.2",
|
|
75
|
+
"@aztec/noir-contracts.js": "1.1.2",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "1.1.2",
|
|
77
|
+
"@aztec/protocol-contracts": "1.1.2",
|
|
78
|
+
"@aztec/simulator": "1.1.2",
|
|
79
|
+
"@aztec/stdlib": "1.1.2",
|
|
80
|
+
"@aztec/telemetry-client": "1.1.2",
|
|
81
81
|
"@chainsafe/discv5": "9.0.0",
|
|
82
82
|
"@chainsafe/enr": "3.0.0",
|
|
83
83
|
"@chainsafe/libp2p-gossipsub": "13.0.0",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"xxhash-wasm": "^1.1.0"
|
|
108
108
|
},
|
|
109
109
|
"devDependencies": {
|
|
110
|
-
"@aztec/archiver": "1.
|
|
110
|
+
"@aztec/archiver": "1.1.2",
|
|
111
111
|
"@jest/globals": "^30.0.0",
|
|
112
112
|
"@types/jest": "^30.0.0",
|
|
113
113
|
"@types/node": "^22.15.17",
|
|
@@ -45,7 +45,7 @@ export class BootstrapNode implements P2PBootstrapApi {
|
|
|
45
45
|
const peerIdPrivateKey = await getPeerIdPrivateKey(config, this.store, this.logger);
|
|
46
46
|
|
|
47
47
|
const { enr: ourEnr, peerId } = await createBootnodeENRandPeerId(
|
|
48
|
-
peerIdPrivateKey,
|
|
48
|
+
peerIdPrivateKey.getValue(),
|
|
49
49
|
p2pIp,
|
|
50
50
|
config.p2pBroadcastPort!,
|
|
51
51
|
config.l1ChainId,
|
package/src/client/factory.ts
CHANGED
|
@@ -73,7 +73,7 @@ export const createP2PClient = async <T extends P2PClientType>(
|
|
|
73
73
|
|
|
74
74
|
// Create peer discovery service
|
|
75
75
|
const peerIdPrivateKey = await getPeerIdPrivateKey(config, store, logger);
|
|
76
|
-
const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey);
|
|
76
|
+
const peerId = await createLibP2PPeerIdFromPrivateKey(peerIdPrivateKey.getValue());
|
|
77
77
|
|
|
78
78
|
const p2pService = await (deps.p2pServiceFactory ?? LibP2PService.new<T>)(clientType, config, peerId, {
|
|
79
79
|
packageVersion,
|
package/src/client/p2p_client.ts
CHANGED
|
@@ -667,7 +667,7 @@ export class P2PClient<T extends P2PClientType = P2PClientType.Full>
|
|
|
667
667
|
private async markTxsAsMinedFromBlocks(blocks: L2Block[]): Promise<void> {
|
|
668
668
|
for (const block of blocks) {
|
|
669
669
|
const txHashes = block.body.txEffects.map(txEffect => txEffect.txHash);
|
|
670
|
-
await this.txPool.markAsMined(txHashes, block.
|
|
670
|
+
await this.txPool.markAsMined(txHashes, block.header);
|
|
671
671
|
}
|
|
672
672
|
}
|
|
673
673
|
|
package/src/config.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type ConfigMappingsType,
|
|
3
|
+
SecretValue,
|
|
3
4
|
booleanConfigHelper,
|
|
4
5
|
floatConfigHelper,
|
|
5
6
|
getConfigFromMappings,
|
|
@@ -51,7 +52,7 @@ export interface P2PConfig extends P2PReqRespConfig, ChainConfig {
|
|
|
51
52
|
listenAddress: string;
|
|
52
53
|
|
|
53
54
|
/** An optional peer id private key. If blank, will generate a random key. */
|
|
54
|
-
peerIdPrivateKey?: string
|
|
55
|
+
peerIdPrivateKey?: SecretValue<string>;
|
|
55
56
|
|
|
56
57
|
/** An optional path to store generated peer id private keys. If blank, will default to storing any generated keys in the data directory. */
|
|
57
58
|
peerIdPrivateKeyPath?: string;
|