@aztec/p2p 0.67.0 → 0.67.1-devnet
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 +2 -2
- package/dest/client/index.d.ts +5 -4
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +12 -9
- package/dest/client/p2p_client.d.ts +6 -6
- package/dest/client/p2p_client.d.ts.map +1 -1
- package/dest/client/p2p_client.js +12 -11
- package/dest/config.d.ts +1 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +2 -2
- package/dest/errors/reqresp.error.d.ts +12 -1
- package/dest/errors/reqresp.error.d.ts.map +1 -1
- package/dest/errors/reqresp.error.js +15 -2
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -2
- package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
- 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 +3 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +171 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
- package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -0
- package/dest/mem_pools/interface.d.ts +4 -3
- package/dest/mem_pools/interface.d.ts.map +1 -1
- package/dest/mocks/index.d.ts +6 -6
- package/dest/mocks/index.d.ts.map +1 -1
- package/dest/mocks/index.js +8 -8
- package/dest/services/data_store.d.ts.map +1 -0
- package/dest/services/data_store.js +188 -0
- package/dest/{service → services/discv5}/discV5_service.d.ts +2 -2
- package/dest/services/discv5/discV5_service.d.ts.map +1 -0
- package/dest/services/discv5/discV5_service.js +144 -0
- package/dest/services/dummy_service.d.ts.map +1 -0
- package/dest/{service → services}/dummy_service.js +1 -1
- package/dest/{service → services}/encoding.d.ts +5 -0
- package/dest/services/encoding.d.ts.map +1 -0
- package/dest/services/encoding.js +65 -0
- package/dest/services/index.d.ts +3 -0
- package/dest/services/index.d.ts.map +1 -0
- package/dest/services/index.js +3 -0
- package/dest/{service → services/libp2p}/libp2p_service.d.ts +48 -10
- package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
- package/dest/services/libp2p/libp2p_service.js +573 -0
- package/dest/{service → services/peer-scoring}/peer_scoring.d.ts +1 -1
- package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
- package/dest/services/peer-scoring/peer_scoring.js +72 -0
- package/dest/{service → services}/peer_manager.d.ts +5 -3
- package/dest/services/peer_manager.d.ts.map +1 -0
- package/dest/services/peer_manager.js +230 -0
- package/dest/services/reqresp/config.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/config.js +1 -1
- package/dest/services/reqresp/handlers.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/handlers.js +1 -1
- package/dest/services/reqresp/index.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/index.js +1 -1
- package/dest/services/reqresp/interface.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/interface.js +1 -1
- package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
- package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +2 -2
- package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
- package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
- package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
- package/dest/services/reqresp/reqresp.d.ts.map +1 -0
- package/dest/services/reqresp/reqresp.js +279 -0
- package/dest/services/service.d.ts.map +1 -0
- package/dest/{service → services}/service.js +1 -1
- package/dest/tx_validator/aggregate_tx_validator.d.ts +1 -1
- package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
- package/dest/tx_validator/aggregate_tx_validator.js +5 -3
- package/dest/tx_validator/double_spend_validator.d.ts +3 -2
- package/dest/tx_validator/double_spend_validator.d.ts.map +1 -1
- package/dest/tx_validator/double_spend_validator.js +6 -6
- package/package.json +8 -7
- package/src/bootstrap/bootstrap.ts +1 -1
- package/src/client/index.ts +38 -16
- package/src/client/p2p_client.ts +28 -15
- package/src/config.ts +1 -1
- package/src/errors/reqresp.error.ts +15 -1
- package/src/index.ts +1 -1
- package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
- package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
- package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
- package/src/mem_pools/interface.ts +5 -3
- package/src/mocks/index.ts +13 -10
- package/src/{service → services/discv5}/discV5_service.ts +3 -3
- package/src/{service → services}/encoding.ts +21 -3
- package/src/services/index.ts +2 -0
- package/src/{service → services/libp2p}/libp2p_service.ts +192 -86
- package/src/{service → services/peer-scoring}/peer_scoring.ts +1 -1
- package/src/{service → services}/peer_manager.ts +5 -2
- package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +1 -1
- package/src/{service → services}/reqresp/reqresp.ts +83 -17
- package/src/tx_validator/aggregate_tx_validator.ts +5 -3
- package/src/tx_validator/double_spend_validator.ts +6 -8
- package/dest/service/data_store.d.ts.map +0 -1
- package/dest/service/data_store.js +0 -188
- package/dest/service/discV5_service.d.ts.map +0 -1
- package/dest/service/discV5_service.js +0 -144
- package/dest/service/dummy_service.d.ts.map +0 -1
- package/dest/service/encoding.d.ts.map +0 -1
- package/dest/service/encoding.js +0 -49
- package/dest/service/index.d.ts +0 -3
- package/dest/service/index.d.ts.map +0 -1
- package/dest/service/index.js +0 -3
- package/dest/service/libp2p_service.d.ts.map +0 -1
- package/dest/service/libp2p_service.js +0 -500
- package/dest/service/peer_manager.d.ts.map +0 -1
- package/dest/service/peer_manager.js +0 -214
- package/dest/service/peer_scoring.d.ts.map +0 -1
- package/dest/service/peer_scoring.js +0 -72
- package/dest/service/reqresp/config.d.ts.map +0 -1
- package/dest/service/reqresp/handlers.d.ts.map +0 -1
- package/dest/service/reqresp/index.d.ts.map +0 -1
- package/dest/service/reqresp/interface.d.ts.map +0 -1
- package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
- package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
- package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
- package/dest/service/reqresp/reqresp.d.ts.map +0 -1
- package/dest/service/reqresp/reqresp.js +0 -230
- package/dest/service/service.d.ts.map +0 -1
- package/src/service/index.ts +0 -2
- /package/dest/{service → services}/data_store.d.ts +0 -0
- /package/dest/{service → services}/dummy_service.d.ts +0 -0
- /package/dest/{service → services}/reqresp/config.d.ts +0 -0
- /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
- /package/dest/{service → services}/reqresp/index.d.ts +0 -0
- /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
- /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
- /package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -0
- /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
- /package/dest/{service → services}/service.d.ts +0 -0
- /package/src/{service → services}/data_store.ts +0 -0
- /package/src/{service → services}/dummy_service.ts +0 -0
- /package/src/{service → services}/reqresp/config.ts +0 -0
- /package/src/{service → services}/reqresp/handlers.ts +0 -0
- /package/src/{service → services}/reqresp/index.ts +0 -0
- /package/src/{service → services}/reqresp/interface.ts +0 -0
- /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
- /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
- /package/src/{service → services}/service.ts +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
var _AztecDatastore_memoryDatastore, _AztecDatastore_dbDatastore, _AztecDatastore_batchOps;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
|
+
import { filter, map, sort, take } from '@aztec/foundation/iterable';
|
|
4
|
+
import { Key } from 'interface-datastore';
|
|
5
|
+
class KeyNotFoundError extends Error {
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = 'ERR_NOT_FOUND';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class AztecDatastore {
|
|
12
|
+
constructor(db, { maxMemoryItems } = { maxMemoryItems: 50 }) {
|
|
13
|
+
_AztecDatastore_memoryDatastore.set(this, void 0);
|
|
14
|
+
_AztecDatastore_dbDatastore.set(this, void 0);
|
|
15
|
+
_AztecDatastore_batchOps.set(this, []);
|
|
16
|
+
__classPrivateFieldSet(this, _AztecDatastore_memoryDatastore, new Map(), "f");
|
|
17
|
+
__classPrivateFieldSet(this, _AztecDatastore_dbDatastore, db.openMap('p2p_datastore'), "f");
|
|
18
|
+
this.maxMemoryItems = maxMemoryItems;
|
|
19
|
+
}
|
|
20
|
+
has(key) {
|
|
21
|
+
return __classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").has(key.toString()) || __classPrivateFieldGet(this, _AztecDatastore_dbDatastore, "f").has(key.toString());
|
|
22
|
+
}
|
|
23
|
+
get(key) {
|
|
24
|
+
const keyStr = key.toString();
|
|
25
|
+
const memoryItem = __classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").get(keyStr);
|
|
26
|
+
if (memoryItem) {
|
|
27
|
+
memoryItem.lastAccessedMs = Date.now();
|
|
28
|
+
return memoryItem.data;
|
|
29
|
+
}
|
|
30
|
+
const dbItem = __classPrivateFieldGet(this, _AztecDatastore_dbDatastore, "f").get(keyStr);
|
|
31
|
+
if (!dbItem) {
|
|
32
|
+
throw new KeyNotFoundError(`Key not found`);
|
|
33
|
+
}
|
|
34
|
+
return Uint8Array.from(dbItem);
|
|
35
|
+
}
|
|
36
|
+
put(key, val) {
|
|
37
|
+
return this._put(key, val);
|
|
38
|
+
}
|
|
39
|
+
async *putMany(source) {
|
|
40
|
+
for await (const { key, value } of source) {
|
|
41
|
+
await this.put(key, value);
|
|
42
|
+
yield key;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async *getMany(source) {
|
|
46
|
+
for await (const key of source) {
|
|
47
|
+
yield {
|
|
48
|
+
key,
|
|
49
|
+
value: this.get(key),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async *deleteMany(source) {
|
|
54
|
+
for await (const key of source) {
|
|
55
|
+
await this.delete(key);
|
|
56
|
+
yield key;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async delete(key) {
|
|
60
|
+
__classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").delete(key.toString());
|
|
61
|
+
await __classPrivateFieldGet(this, _AztecDatastore_dbDatastore, "f").delete(key.toString());
|
|
62
|
+
}
|
|
63
|
+
batch() {
|
|
64
|
+
return {
|
|
65
|
+
put: (key, value) => {
|
|
66
|
+
__classPrivateFieldGet(this, _AztecDatastore_batchOps, "f").push({
|
|
67
|
+
type: 'put',
|
|
68
|
+
key,
|
|
69
|
+
value,
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
delete: key => {
|
|
73
|
+
__classPrivateFieldGet(this, _AztecDatastore_batchOps, "f").push({
|
|
74
|
+
type: 'del',
|
|
75
|
+
key,
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
commit: async () => {
|
|
79
|
+
for (const op of __classPrivateFieldGet(this, _AztecDatastore_batchOps, "f")) {
|
|
80
|
+
if (op.type === 'put' && op.value) {
|
|
81
|
+
await this.put(op.key, op.value);
|
|
82
|
+
}
|
|
83
|
+
else if (op.type === 'del') {
|
|
84
|
+
await this.delete(op.key);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
__classPrivateFieldSet(this, _AztecDatastore_batchOps, [], "f"); // Clear operations after commit
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
query(q) {
|
|
92
|
+
let it = this.all(); //
|
|
93
|
+
const { prefix, filters, orders, offset, limit } = q;
|
|
94
|
+
if (prefix != null) {
|
|
95
|
+
it = filter(it, e => e.key.toString().startsWith(`${prefix}`));
|
|
96
|
+
}
|
|
97
|
+
if (Array.isArray(filters)) {
|
|
98
|
+
it = filters.reduce((it, f) => filter(it, f), it);
|
|
99
|
+
}
|
|
100
|
+
if (Array.isArray(orders)) {
|
|
101
|
+
it = orders.reduce((it, f) => sort(it, f), it);
|
|
102
|
+
}
|
|
103
|
+
if (offset != null) {
|
|
104
|
+
let i = 0;
|
|
105
|
+
it = filter(it, () => i++ >= offset);
|
|
106
|
+
}
|
|
107
|
+
if (limit != null) {
|
|
108
|
+
it = take(it, limit);
|
|
109
|
+
}
|
|
110
|
+
return it;
|
|
111
|
+
}
|
|
112
|
+
queryKeys(q) {
|
|
113
|
+
let it = map(this.all(), ({ key }) => key);
|
|
114
|
+
const { prefix, filters, orders, offset, limit } = q;
|
|
115
|
+
if (prefix != null) {
|
|
116
|
+
it = filter(it, e => e.toString().startsWith(`${prefix}`));
|
|
117
|
+
}
|
|
118
|
+
if (Array.isArray(filters)) {
|
|
119
|
+
it = filters.reduce((it, f) => filter(it, f), it);
|
|
120
|
+
}
|
|
121
|
+
if (Array.isArray(orders)) {
|
|
122
|
+
it = orders.reduce((it, f) => sort(it, f), it);
|
|
123
|
+
}
|
|
124
|
+
if (offset != null) {
|
|
125
|
+
let i = 0;
|
|
126
|
+
it = filter(it, () => i++ >= offset);
|
|
127
|
+
}
|
|
128
|
+
if (limit != null) {
|
|
129
|
+
it = take(it, limit);
|
|
130
|
+
}
|
|
131
|
+
return it;
|
|
132
|
+
}
|
|
133
|
+
async _put(key, val) {
|
|
134
|
+
const keyStr = key.toString();
|
|
135
|
+
while (__classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").size >= this.maxMemoryItems) {
|
|
136
|
+
this.pruneMemoryDatastore();
|
|
137
|
+
}
|
|
138
|
+
const memoryItem = __classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").get(keyStr);
|
|
139
|
+
if (memoryItem) {
|
|
140
|
+
// update existing
|
|
141
|
+
memoryItem.lastAccessedMs = Date.now();
|
|
142
|
+
memoryItem.data = val;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// new entry
|
|
146
|
+
__classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").set(keyStr, { data: val, lastAccessedMs: Date.now() });
|
|
147
|
+
}
|
|
148
|
+
// Always add to DB
|
|
149
|
+
await __classPrivateFieldGet(this, _AztecDatastore_dbDatastore, "f").set(keyStr, val);
|
|
150
|
+
return key;
|
|
151
|
+
}
|
|
152
|
+
async *all() {
|
|
153
|
+
for (const [key, value] of __classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").entries()) {
|
|
154
|
+
yield {
|
|
155
|
+
key: new Key(key),
|
|
156
|
+
value: value.data,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
for (const [key, value] of __classPrivateFieldGet(this, _AztecDatastore_dbDatastore, "f").entries()) {
|
|
160
|
+
if (!__classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").has(key)) {
|
|
161
|
+
yield {
|
|
162
|
+
key: new Key(key),
|
|
163
|
+
value,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Prune memory store
|
|
170
|
+
*/
|
|
171
|
+
pruneMemoryDatastore() {
|
|
172
|
+
let oldestAccessedMs = Date.now() + 1000;
|
|
173
|
+
let oldestKey = undefined;
|
|
174
|
+
let oldestValue = undefined;
|
|
175
|
+
for (const [key, value] of __classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f")) {
|
|
176
|
+
if (value.lastAccessedMs < oldestAccessedMs) {
|
|
177
|
+
oldestAccessedMs = value.lastAccessedMs;
|
|
178
|
+
oldestKey = key;
|
|
179
|
+
oldestValue = value.data;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (oldestKey && oldestValue) {
|
|
183
|
+
__classPrivateFieldGet(this, _AztecDatastore_memoryDatastore, "f").delete(oldestKey);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
_AztecDatastore_memoryDatastore = new WeakMap(), _AztecDatastore_dbDatastore = new WeakMap(), _AztecDatastore_batchOps = new WeakMap();
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9kYXRhX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR3JFLE9BQU8sRUFBOEIsR0FBRyxFQUF3QyxNQUFNLHFCQUFxQixDQUFDO0FBYzVHLE1BQU0sZ0JBQWlCLFNBQVEsS0FBSztJQUVsQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGNBQWM7SUFRekIsWUFBWSxFQUFnQixFQUFFLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFO1FBUHpFLGtEQUEwQztRQUMxQyw4Q0FBMkM7UUFFM0MsbUNBQXVCLEVBQUUsRUFBQztRQUt4Qix1QkFBQSxJQUFJLG1DQUFvQixJQUFJLEdBQUcsRUFBRSxNQUFBLENBQUM7UUFDbEMsdUJBQUEsSUFBSSwrQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBQSxDQUFDO1FBRWhELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBUTtRQUNWLE9BQU8sdUJBQUEsSUFBSSx1Q0FBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksdUJBQUEsSUFBSSxtQ0FBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVE7UUFDVixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIs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
|
|
@@ -3,8 +3,8 @@ import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
|
3
3
|
import { ENR } from '@chainsafe/enr';
|
|
4
4
|
import type { PeerId } from '@libp2p/interface';
|
|
5
5
|
import EventEmitter from 'events';
|
|
6
|
-
import type { P2PConfig } from '
|
|
7
|
-
import { type PeerDiscoveryService, PeerDiscoveryState } from '
|
|
6
|
+
import type { P2PConfig } from '../../config.js';
|
|
7
|
+
import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
|
|
8
8
|
export declare const AZTEC_ENR_KEY = "aztec_network";
|
|
9
9
|
export declare enum AztecENR {
|
|
10
10
|
devnet = 1,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discV5_service.d.ts","sourceRoot":"","sources":["../../../src/services/discv5/discV5_service.ts"],"names":[],"mappings":";AAEA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGnF,OAAO,EAAE,GAAG,EAAe,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAE9E,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAI7C,oBAAY,QAAQ;IAClB,MAAM,IAAO;IACb,OAAO,IAAO;IACd,OAAO,IAAO;CACf;AAGD,eAAO,MAAM,SAAS,kBAAkB,CAAC;AAEzC;;GAEG;AACH,qBAAa,aAAc,SAAQ,YAAa,YAAW,oBAAoB;IAkB3E,OAAO,CAAC,MAAM;IAGd,OAAO,CAAC,MAAM;IApBhB,0BAA0B;IAC1B,OAAO,CAAC,MAAM,CAAS;IAEvB,0BAA0B;IAC1B,OAAO,CAAC,GAAG,CAAc;IAEzB,sBAAsB;IACtB,OAAO,CAAC,kBAAkB,CAAY;IAEtC,OAAO,CAAC,YAAY,CAA8B;IAElD,OAAO,CAAC,cAAc,CAAW;IACjC,OAAO,CAAC,oBAAoB,CAAgB;IAE5C,OAAO,CAAC,SAAS,CAAK;gBAGZ,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,eAAe,EAClB,MAAM,yCAAqC;IAgDxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BtB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB1C,WAAW,IAAI,GAAG,EAAE;IAIpB,MAAM,IAAI,GAAG;IAIb,SAAS,IAAI,MAAM;IAInB,SAAS,IAAI,kBAAkB;IAI/B,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,OAAO,CAAC,YAAY;CAWrB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
3
|
+
import { OtelMetricsAdapter } from '@aztec/telemetry-client';
|
|
4
|
+
import { Discv5 } from '@chainsafe/discv5';
|
|
5
|
+
import { ENR, SignableENR } from '@chainsafe/enr';
|
|
6
|
+
import { multiaddr } from '@multiformats/multiaddr';
|
|
7
|
+
import EventEmitter from 'events';
|
|
8
|
+
import { convertToMultiaddr } from '../../util.js';
|
|
9
|
+
import { PeerDiscoveryState } from '../service.js';
|
|
10
|
+
export const AZTEC_ENR_KEY = 'aztec_network';
|
|
11
|
+
const delayBeforeStart = 2000; // 2sec
|
|
12
|
+
export var AztecENR;
|
|
13
|
+
(function (AztecENR) {
|
|
14
|
+
AztecENR[AztecENR["devnet"] = 1] = "devnet";
|
|
15
|
+
AztecENR[AztecENR["testnet"] = 2] = "testnet";
|
|
16
|
+
AztecENR[AztecENR["mainnet"] = 3] = "mainnet";
|
|
17
|
+
})(AztecENR || (AztecENR = {}));
|
|
18
|
+
// TODO: Make this an env var
|
|
19
|
+
export const AZTEC_NET = AztecENR.devnet;
|
|
20
|
+
/**
|
|
21
|
+
* Peer discovery service using Discv5.
|
|
22
|
+
*/
|
|
23
|
+
export class DiscV5Service extends EventEmitter {
|
|
24
|
+
constructor(peerId, config, telemetry, logger = createLogger('p2p:discv5_service')) {
|
|
25
|
+
super();
|
|
26
|
+
this.peerId = peerId;
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
this.currentState = PeerDiscoveryState.STOPPED;
|
|
29
|
+
this.bootstrapNodePeerIds = [];
|
|
30
|
+
this.startTime = 0;
|
|
31
|
+
const { tcpAnnounceAddress, udpAnnounceAddress, udpListenAddress, bootstrapNodes } = config;
|
|
32
|
+
this.bootstrapNodes = bootstrapNodes;
|
|
33
|
+
// create ENR from PeerId
|
|
34
|
+
this.enr = SignableENR.createFromPeerId(peerId);
|
|
35
|
+
// Add aztec identification to ENR
|
|
36
|
+
this.enr.set(AZTEC_ENR_KEY, Uint8Array.from([AZTEC_NET]));
|
|
37
|
+
if (!tcpAnnounceAddress) {
|
|
38
|
+
throw new Error('You need to provide at least a TCP announce address.');
|
|
39
|
+
}
|
|
40
|
+
const multiAddrTcp = multiaddr(`${convertToMultiaddr(tcpAnnounceAddress, 'tcp')}/p2p/${peerId.toString()}`);
|
|
41
|
+
// if no udp announce address is provided, use the tcp announce address
|
|
42
|
+
const multiAddrUdp = multiaddr(`${convertToMultiaddr(udpAnnounceAddress || tcpAnnounceAddress, 'udp')}/p2p/${peerId.toString()}`);
|
|
43
|
+
this.listenMultiAddrUdp = multiaddr(convertToMultiaddr(udpListenAddress, 'udp'));
|
|
44
|
+
// set location multiaddr in ENR record
|
|
45
|
+
this.enr.setLocationMultiaddr(multiAddrUdp);
|
|
46
|
+
this.enr.setLocationMultiaddr(multiAddrTcp);
|
|
47
|
+
const metricsRegistry = new OtelMetricsAdapter(telemetry);
|
|
48
|
+
this.discv5 = Discv5.create({
|
|
49
|
+
enr: this.enr,
|
|
50
|
+
peerId,
|
|
51
|
+
bindAddrs: { ip4: this.listenMultiAddrUdp },
|
|
52
|
+
config: {
|
|
53
|
+
lookupTimeout: 2000,
|
|
54
|
+
requestTimeout: 2000,
|
|
55
|
+
allowUnverifiedSessions: true,
|
|
56
|
+
},
|
|
57
|
+
metricsRegistry,
|
|
58
|
+
});
|
|
59
|
+
this.discv5.on('discovered', (enr) => this.onDiscovered(enr));
|
|
60
|
+
this.discv5.on('enrAdded', async (enr) => {
|
|
61
|
+
const multiAddrTcp = await enr.getFullMultiaddr('tcp');
|
|
62
|
+
const multiAddrUdp = await enr.getFullMultiaddr('udp');
|
|
63
|
+
this.logger.debug(`Added ENR ${enr.encodeTxt()}`, { multiAddrTcp, multiAddrUdp, nodeId: enr.nodeId });
|
|
64
|
+
this.onDiscovered(enr);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async start() {
|
|
68
|
+
if (this.currentState === PeerDiscoveryState.RUNNING) {
|
|
69
|
+
throw new Error('DiscV5Service already started');
|
|
70
|
+
}
|
|
71
|
+
this.logger.debug('Starting DiscV5');
|
|
72
|
+
await this.discv5.start();
|
|
73
|
+
this.startTime = Date.now();
|
|
74
|
+
this.logger.info(`DiscV5 service started`, {
|
|
75
|
+
nodeId: this.enr.nodeId,
|
|
76
|
+
peerId: this.peerId,
|
|
77
|
+
enrUdp: await this.enr.getFullMultiaddr('udp'),
|
|
78
|
+
enrTcp: await this.enr.getFullMultiaddr('tcp'),
|
|
79
|
+
});
|
|
80
|
+
this.currentState = PeerDiscoveryState.RUNNING;
|
|
81
|
+
// Add bootnode ENR if provided
|
|
82
|
+
if (this.bootstrapNodes?.length) {
|
|
83
|
+
// Do this conversion once since it involves an async function call
|
|
84
|
+
this.bootstrapNodePeerIds = await Promise.all(this.bootstrapNodes.map(enr => ENR.decodeTxt(enr).peerId()));
|
|
85
|
+
this.logger.info(`Adding bootstrap nodes ENRs: ${this.bootstrapNodes.join(', ')}`);
|
|
86
|
+
try {
|
|
87
|
+
this.bootstrapNodes.forEach(enr => {
|
|
88
|
+
this.discv5.addEnr(enr);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
this.logger.error(`Error adding bootnode ENRs: ${e}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async runRandomNodesQuery() {
|
|
97
|
+
if (this.currentState !== PeerDiscoveryState.RUNNING) {
|
|
98
|
+
throw new Error('DiscV5Service not running');
|
|
99
|
+
}
|
|
100
|
+
// First, wait some time before starting the peer discovery
|
|
101
|
+
// reference: https://github.com/ChainSafe/lodestar/issues/3423
|
|
102
|
+
const msSinceStart = Date.now() - this.startTime;
|
|
103
|
+
if (Date.now() - this.startTime <= delayBeforeStart) {
|
|
104
|
+
await sleep(delayBeforeStart - msSinceStart);
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
await this.discv5.findRandomNode();
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
this.logger.error(`Error running discV5 random node query: ${err}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
getAllPeers() {
|
|
114
|
+
return this.discv5.kadValues();
|
|
115
|
+
}
|
|
116
|
+
getEnr() {
|
|
117
|
+
return this.enr.toENR();
|
|
118
|
+
}
|
|
119
|
+
getPeerId() {
|
|
120
|
+
return this.peerId;
|
|
121
|
+
}
|
|
122
|
+
getStatus() {
|
|
123
|
+
return this.currentState;
|
|
124
|
+
}
|
|
125
|
+
isBootstrapPeer(peerId) {
|
|
126
|
+
return this.bootstrapNodePeerIds.some(node => node.equals(peerId));
|
|
127
|
+
}
|
|
128
|
+
async stop() {
|
|
129
|
+
await this.discv5.stop();
|
|
130
|
+
this.currentState = PeerDiscoveryState.STOPPED;
|
|
131
|
+
}
|
|
132
|
+
onDiscovered(enr) {
|
|
133
|
+
// check the peer is an aztec peer
|
|
134
|
+
const value = enr.kvs.get(AZTEC_ENR_KEY);
|
|
135
|
+
if (value) {
|
|
136
|
+
const network = value[0];
|
|
137
|
+
// check if the peer is on the same network
|
|
138
|
+
if (network === AZTEC_NET) {
|
|
139
|
+
this.emit('peer:discovered', enr);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY1Y1X3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZGlzY3Y1L2Rpc2NWNV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGtCQUFrQixFQUF3QixNQUFNLHlCQUF5QixDQUFDO0FBRW5GLE9BQU8sRUFBRSxNQUFNLEVBQTJCLE1BQU0sbUJBQW1CLENBQUM7QUFDcEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRCxPQUFPLEVBQWtCLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUdsQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUE2QixrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDO0FBRTdDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTztBQUV0QyxNQUFNLENBQU4sSUFBWSxRQUlYO0FBSkQsV0FBWSxRQUFRO0lBQ2xCLDJDQUFhLENBQUE7SUFDYiw2Q0FBYyxDQUFBO0lBQ2QsNkNBQWMsQ0FBQTtBQUNoQixDQUFDLEVBSlcsUUFBUSxLQUFSLFFBQVEsUUFJbkI7QUFFRCw2QkFBNkI7QUFDN0IsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFFekM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sYUFBYyxTQUFRLFlBQVk7SUFpQjdDLFlBQ1UsTUFBYyxFQUN0QixNQUFpQixFQUNqQixTQUEwQixFQUNsQixTQUFTLFlB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dummy_service.d.ts","sourceRoot":"","sources":["../../src/services/dummy_service.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE1G,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9F;;GAEG;AACH,qBAAa,eAAgB,YAAW,UAAU;IAChD,wCAAwC;IACxC,QAAQ,IAAI,QAAQ,EAAE;IAItB;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,SAAS,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC;IAE3C;;;OAGG;IACI,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE;IAE7B;;OAEG;IACI,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,gBAAgB,CAAC;IAE3F;;;;;OAKG;IACI,WAAW,CAAC,QAAQ,SAAS,kBAAkB,EACpD,SAAS,EAAE,QAAQ,EACnB,QAAQ,EAAE,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GAC1D,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC;IAI1E;;;OAGG;IACI,MAAM,IAAI,SAAS;CAG3B;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,YAAa,YAAW,oBAAoB;IACzF,OAAO,CAAC,YAAY,CAA8B;IAClD;;;OAGG;IACI,KAAK;IAIZ;;;OAGG;IACI,IAAI;IAIX;;;OAGG;IACI,WAAW;IAIX,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAInC,SAAS,IAAI,kBAAkB;IAI/B,MAAM,IAAI,SAAS;CAG3B"}
|
|
@@ -97,4 +97,4 @@ export class DummyPeerDiscoveryService extends EventEmitter {
|
|
|
97
97
|
return undefined;
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9kdW1teV9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sWUFBWSxNQUFNLFFBQVEsQ0FBQztBQUdsQyxPQUFPLEVBQThDLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTlGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsd0NBQXdDO0lBQ3hDLFFBQVE7UUFDTixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLElBQUk7UUFDVCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUyxDQUF1QixDQUFJLElBQUcsQ0FBQztJQUUvQzs7O09BR0c7SUFDSSxVQUFVLENBQUMsQ0FBVyxJQUFHLENBQUM7SUFFakM7O09BRUc7SUFDSSw2QkFBNkIsQ0FBQyxDQUFzRCxJQUFHLENBQUM7SUFFL0Y7Ozs7O09BS0c7SUFDSSxXQUFXLENBQ2hCLFNBQW1CLEVBQ25CLFFBQTJEO1FBRTNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksTUFBTTtRQUNYLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHlCQUEwQixTQUFRLFlBQVk7SUFBM0Q7O1FBQ1UsaUJBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7SUF3Q3BELENBQUM7SUF2Q0M7OztPQUdHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1FBQy9DLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFDRDs7O09BR0c7SUFDSSxJQUFJO1FBQ1QsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDL0MsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7T0FHRztJQUNJLFdBQVc7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sbUJBQW1CO1FBQ3hCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxlQUFlLENBQUMsQ0FBUztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFTSxNQUFNO1FBQ1gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGIn0=
|
|
@@ -19,8 +19,13 @@ export declare function msgIdToStrFn(msgId: Uint8Array): string;
|
|
|
19
19
|
* @returns The message identifier
|
|
20
20
|
*/
|
|
21
21
|
export declare function getMsgIdFn(message: Message): Buffer;
|
|
22
|
+
/**
|
|
23
|
+
* Snappy transform for libp2p gossipsub
|
|
24
|
+
*/
|
|
22
25
|
export declare class SnappyTransform implements DataTransform {
|
|
23
26
|
inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array;
|
|
27
|
+
inboundTransformNoTopic(data: Buffer): Buffer;
|
|
24
28
|
outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array;
|
|
29
|
+
outboundTransformNoTopic(data: Buffer): Buffer;
|
|
25
30
|
}
|
|
26
31
|
//# sourceMappingURL=encoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/services/encoding.ts"],"names":[],"mappings":";;AAGA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,qCAAqC,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAajD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAKvD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAItD;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,UAK1C;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,aAAa;IAEnD,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAI1D,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQpD,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAI3D,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAMtD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Taken from lodestar: https://github.com/ChainSafe/lodestar
|
|
2
|
+
import { sha256 } from '@aztec/foundation/crypto';
|
|
3
|
+
import { compressSync, uncompressSync } from 'snappy';
|
|
4
|
+
import xxhashFactory from 'xxhash-wasm';
|
|
5
|
+
// Load WASM
|
|
6
|
+
const xxhash = await xxhashFactory();
|
|
7
|
+
// Use salt to prevent msgId from being mined for collisions
|
|
8
|
+
const h64Seed = BigInt(Math.floor(Math.random() * 1e9));
|
|
9
|
+
// Shared buffer to convert msgId to string
|
|
10
|
+
const sharedMsgIdBuf = Buffer.alloc(20);
|
|
11
|
+
/**
|
|
12
|
+
* The function used to generate a gossipsub message id
|
|
13
|
+
* We use the first 8 bytes of SHA256(data) for content addressing
|
|
14
|
+
*/
|
|
15
|
+
export function fastMsgIdFn(rpcMsg) {
|
|
16
|
+
if (rpcMsg.data) {
|
|
17
|
+
return xxhash.h64Raw(rpcMsg.data, h64Seed).toString(16);
|
|
18
|
+
}
|
|
19
|
+
return '0000000000000000';
|
|
20
|
+
}
|
|
21
|
+
export function msgIdToStrFn(msgId) {
|
|
22
|
+
// This happens serially, no need to reallocate the buffer
|
|
23
|
+
sharedMsgIdBuf.set(msgId);
|
|
24
|
+
return `0x${sharedMsgIdBuf.toString('hex')}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get the message identifier from a libp2p message
|
|
28
|
+
*
|
|
29
|
+
* Follows similarly to:
|
|
30
|
+
* https://github.com/ethereum/consensus-specs/blob/v1.1.0-alpha.7/specs/altair/p2p-interface.md#topics-and-messages
|
|
31
|
+
*
|
|
32
|
+
* @param message - The libp2p message
|
|
33
|
+
* @returns The message identifier
|
|
34
|
+
*/
|
|
35
|
+
export function getMsgIdFn(message) {
|
|
36
|
+
const { topic } = message;
|
|
37
|
+
const vec = [Buffer.from(topic), message.data];
|
|
38
|
+
return sha256(Buffer.concat(vec)).subarray(0, 20);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Snappy transform for libp2p gossipsub
|
|
42
|
+
*/
|
|
43
|
+
export class SnappyTransform {
|
|
44
|
+
// Topic string included to satisfy DataTransform interface
|
|
45
|
+
inboundTransform(_topicStr, data) {
|
|
46
|
+
return this.inboundTransformNoTopic(Buffer.from(data));
|
|
47
|
+
}
|
|
48
|
+
inboundTransformNoTopic(data) {
|
|
49
|
+
if (data.length === 0) {
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
return Buffer.from(uncompressSync(data, { asBuffer: true }));
|
|
53
|
+
}
|
|
54
|
+
// Topic string included to satisfy DataTransform interface
|
|
55
|
+
outboundTransform(_topicStr, data) {
|
|
56
|
+
return this.outboundTransformNoTopic(Buffer.from(data));
|
|
57
|
+
}
|
|
58
|
+
outboundTransformNoTopic(data) {
|
|
59
|
+
if (data.length === 0) {
|
|
60
|
+
return data;
|
|
61
|
+
}
|
|
62
|
+
return Buffer.from(compressSync(data));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkRBQTZEO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUtsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0RCxPQUFPLGFBQWEsTUFBTSxhQUFhLENBQUM7QUFFeEMsWUFBWTtBQUNaLE1BQU0sTUFBTSxHQUFHLE1BQU0sYUFBYSxFQUFFLENBQUM7QUFFckMsNERBQTREO0FBQzVELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXhELDJDQUEyQztBQUMzQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRXhDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBbUI7SUFDN0MsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWlCO0lBQzVDLDBEQUEwRDtJQUMxRCxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLE9BQU8sS0FBSyxjQUFjLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxPQUFnQjtJQUN6QyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBRTFCLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsMkRBQTJEO0lBQzNELGdCQUFnQixDQUFDLFNBQWlCLEVBQUUsSUFBZ0I7UUFDbEQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxJQUFZO1FBQ3pDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELDJEQUEyRDtJQUMzRCxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLElBQWdCO1FBQ25ELE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sd0JBQXdCLENBQUMsSUFBWTtRQUMxQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './service.js';
|
|
2
|
+
export * from './libp2p/libp2p_service.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyw0QkFBNEIsQ0FBQyJ9
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { BlockAttestation, BlockProposal, type ClientProtocolCircuitVerifier, type Gossipable, type L2BlockSource, type PeerInfo, type WorldStateSynchronizer } from '@aztec/circuit-types';
|
|
2
|
+
import { P2PClientType } from '@aztec/circuit-types';
|
|
2
3
|
import type { AztecKVStore } from '@aztec/kv-store';
|
|
3
4
|
import { type TelemetryClient, WithTracer } from '@aztec/telemetry-client';
|
|
4
5
|
import { type ENR } from '@chainsafe/enr';
|
|
5
|
-
import type
|
|
6
|
+
import { type PeerId } from '@libp2p/interface';
|
|
6
7
|
import '@libp2p/kad-dht';
|
|
7
|
-
import { type P2PConfig } from '
|
|
8
|
-
import { type MemPools } from '
|
|
9
|
-
import { type PubSubLibp2p } from '
|
|
10
|
-
import { type ReqRespSubProtocol, type ReqRespSubProtocolHandlers, type SubProtocolMap } from '
|
|
11
|
-
import { ReqResp } from '
|
|
12
|
-
import type { P2PService, PeerDiscoveryService } from '
|
|
8
|
+
import { type P2PConfig } from '../../config.js';
|
|
9
|
+
import { type MemPools } from '../../mem_pools/interface.js';
|
|
10
|
+
import { type PubSubLibp2p } from '../../util.js';
|
|
11
|
+
import { type ReqRespSubProtocol, type ReqRespSubProtocolHandlers, type SubProtocolMap } from '../reqresp/interface.js';
|
|
12
|
+
import { ReqResp } from '../reqresp/reqresp.js';
|
|
13
|
+
import type { P2PService, PeerDiscoveryService } from '../service.js';
|
|
13
14
|
/**
|
|
14
15
|
* Lib P2P implementation of the P2PService interface.
|
|
15
16
|
*/
|
|
16
|
-
export declare class LibP2PService extends WithTracer implements P2PService {
|
|
17
|
+
export declare class LibP2PService<T extends P2PClientType> extends WithTracer implements P2PService {
|
|
18
|
+
private clientType;
|
|
17
19
|
private config;
|
|
18
20
|
private node;
|
|
19
21
|
private peerDiscoveryService;
|
|
@@ -34,7 +36,7 @@ export declare class LibP2PService extends WithTracer implements P2PService {
|
|
|
34
36
|
* @returns The attestation for the block, if any.
|
|
35
37
|
*/
|
|
36
38
|
private blockReceivedCallback;
|
|
37
|
-
constructor(config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, mempools: MemPools
|
|
39
|
+
constructor(clientType: T, config: P2PConfig, node: PubSubLibp2p, peerDiscoveryService: PeerDiscoveryService, mempools: MemPools<T>, l2BlockSource: L2BlockSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, telemetry: TelemetryClient, requestResponseHandlers?: ReqRespSubProtocolHandlers, logger?: import("@aztec/foundation/log").Logger);
|
|
38
40
|
/**
|
|
39
41
|
* Starts the LibP2P service.
|
|
40
42
|
* @returns An empty promise.
|
|
@@ -51,7 +53,7 @@ export declare class LibP2PService extends WithTracer implements P2PService {
|
|
|
51
53
|
* @param txPool - The transaction pool to be accessed by the service.
|
|
52
54
|
* @returns The new service.
|
|
53
55
|
*/
|
|
54
|
-
static new(config: P2PConfig, peerDiscoveryService: PeerDiscoveryService, peerId: PeerId, mempools: MemPools
|
|
56
|
+
static new<T extends P2PClientType>(clientType: T, config: P2PConfig, peerDiscoveryService: PeerDiscoveryService, peerId: PeerId, mempools: MemPools<T>, l2BlockSource: L2BlockSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, store: AztecKVStore, telemetry: TelemetryClient): Promise<LibP2PService<T>>;
|
|
55
57
|
getPeers(includePending?: boolean): PeerInfo[];
|
|
56
58
|
/**
|
|
57
59
|
* Send Request via the ReqResp service
|
|
@@ -128,7 +130,43 @@ export declare class LibP2PService extends WithTracer implements P2PService {
|
|
|
128
130
|
* @returns True if the tx is valid, false otherwise.
|
|
129
131
|
*/
|
|
130
132
|
private validateRequestedTx;
|
|
133
|
+
private validatePropagatedTxFromMessage;
|
|
134
|
+
/**
|
|
135
|
+
* Validate a tx that has been propagated from a peer.
|
|
136
|
+
* @param tx - The tx to validate.
|
|
137
|
+
* @param peerId - The peer ID of the peer that sent the tx.
|
|
138
|
+
* @returns True if the tx is valid, false otherwise.
|
|
139
|
+
*/
|
|
131
140
|
private validatePropagatedTx;
|
|
141
|
+
/**
|
|
142
|
+
* Create message validators for the given block number.
|
|
143
|
+
*
|
|
144
|
+
* Each validator is a pair of a validator and a severity.
|
|
145
|
+
* If a validator fails, the peer is penalized with the severity of the validator.
|
|
146
|
+
*
|
|
147
|
+
* @param blockNumber - The block number to create validators for.
|
|
148
|
+
* @returns The message validators.
|
|
149
|
+
*/
|
|
150
|
+
private createMessageValidators;
|
|
151
|
+
/**
|
|
152
|
+
* Run validations on a tx.
|
|
153
|
+
* @param tx - The tx to validate.
|
|
154
|
+
* @param messageValidators - The message validators to run.
|
|
155
|
+
* @returns The validation outcome.
|
|
156
|
+
*/
|
|
157
|
+
private runValidations;
|
|
158
|
+
/**
|
|
159
|
+
* Handle a double spend failure.
|
|
160
|
+
*
|
|
161
|
+
* Double spend failures are managed on their own because they are a special case.
|
|
162
|
+
* We must check if the double spend is recent or old, if it is past a threshold, then we heavily penalize the peer.
|
|
163
|
+
*
|
|
164
|
+
* @param tx - The tx that failed the double spend validator.
|
|
165
|
+
* @param blockNumber - The block number of the tx.
|
|
166
|
+
* @param peerId - The peer ID of the peer that sent the tx.
|
|
167
|
+
* @returns True if the tx is valid, false otherwise.
|
|
168
|
+
*/
|
|
169
|
+
private handleDoubleSpendFailure;
|
|
132
170
|
getPeerScore(peerId: PeerId): number;
|
|
133
171
|
private sendToPeers;
|
|
134
172
|
private stopLibP2P;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libp2p_service.d.ts","sourceRoot":"","sources":["../../../src/services/libp2p/libp2p_service.ts"],"names":[],"mappings":"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"}
|