@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.
Files changed (144) hide show
  1. package/dest/bootstrap/bootstrap.js +2 -2
  2. package/dest/client/index.d.ts +5 -4
  3. package/dest/client/index.d.ts.map +1 -1
  4. package/dest/client/index.js +12 -9
  5. package/dest/client/p2p_client.d.ts +6 -6
  6. package/dest/client/p2p_client.d.ts.map +1 -1
  7. package/dest/client/p2p_client.js +12 -11
  8. package/dest/config.d.ts +1 -1
  9. package/dest/config.d.ts.map +1 -1
  10. package/dest/config.js +2 -2
  11. package/dest/errors/reqresp.error.d.ts +12 -1
  12. package/dest/errors/reqresp.error.d.ts.map +1 -1
  13. package/dest/errors/reqresp.error.js +15 -2
  14. package/dest/index.d.ts +1 -1
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +2 -2
  17. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
  18. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  19. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  20. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  21. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +171 -0
  22. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -0
  23. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  24. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -0
  25. package/dest/mem_pools/interface.d.ts +4 -3
  26. package/dest/mem_pools/interface.d.ts.map +1 -1
  27. package/dest/mocks/index.d.ts +6 -6
  28. package/dest/mocks/index.d.ts.map +1 -1
  29. package/dest/mocks/index.js +8 -8
  30. package/dest/services/data_store.d.ts.map +1 -0
  31. package/dest/services/data_store.js +188 -0
  32. package/dest/{service → services/discv5}/discV5_service.d.ts +2 -2
  33. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  34. package/dest/services/discv5/discV5_service.js +144 -0
  35. package/dest/services/dummy_service.d.ts.map +1 -0
  36. package/dest/{service → services}/dummy_service.js +1 -1
  37. package/dest/{service → services}/encoding.d.ts +5 -0
  38. package/dest/services/encoding.d.ts.map +1 -0
  39. package/dest/services/encoding.js +65 -0
  40. package/dest/services/index.d.ts +3 -0
  41. package/dest/services/index.d.ts.map +1 -0
  42. package/dest/services/index.js +3 -0
  43. package/dest/{service → services/libp2p}/libp2p_service.d.ts +48 -10
  44. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  45. package/dest/services/libp2p/libp2p_service.js +573 -0
  46. package/dest/{service → services/peer-scoring}/peer_scoring.d.ts +1 -1
  47. package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
  48. package/dest/services/peer-scoring/peer_scoring.js +72 -0
  49. package/dest/{service → services}/peer_manager.d.ts +5 -3
  50. package/dest/services/peer_manager.d.ts.map +1 -0
  51. package/dest/services/peer_manager.js +230 -0
  52. package/dest/services/reqresp/config.d.ts.map +1 -0
  53. package/dest/{service → services}/reqresp/config.js +1 -1
  54. package/dest/services/reqresp/handlers.d.ts.map +1 -0
  55. package/dest/{service → services}/reqresp/handlers.js +1 -1
  56. package/dest/services/reqresp/index.d.ts.map +1 -0
  57. package/dest/{service → services}/reqresp/index.js +1 -1
  58. package/dest/services/reqresp/interface.d.ts.map +1 -0
  59. package/dest/{service → services}/reqresp/interface.js +1 -1
  60. package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
  61. package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
  62. package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
  63. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +2 -2
  64. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
  65. package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
  66. package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
  67. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  68. package/dest/services/reqresp/reqresp.js +279 -0
  69. package/dest/services/service.d.ts.map +1 -0
  70. package/dest/{service → services}/service.js +1 -1
  71. package/dest/tx_validator/aggregate_tx_validator.d.ts +1 -1
  72. package/dest/tx_validator/aggregate_tx_validator.d.ts.map +1 -1
  73. package/dest/tx_validator/aggregate_tx_validator.js +5 -3
  74. package/dest/tx_validator/double_spend_validator.d.ts +3 -2
  75. package/dest/tx_validator/double_spend_validator.d.ts.map +1 -1
  76. package/dest/tx_validator/double_spend_validator.js +6 -6
  77. package/package.json +8 -7
  78. package/src/bootstrap/bootstrap.ts +1 -1
  79. package/src/client/index.ts +38 -16
  80. package/src/client/p2p_client.ts +28 -15
  81. package/src/config.ts +1 -1
  82. package/src/errors/reqresp.error.ts +15 -1
  83. package/src/index.ts +1 -1
  84. package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
  85. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
  86. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
  87. package/src/mem_pools/interface.ts +5 -3
  88. package/src/mocks/index.ts +13 -10
  89. package/src/{service → services/discv5}/discV5_service.ts +3 -3
  90. package/src/{service → services}/encoding.ts +21 -3
  91. package/src/services/index.ts +2 -0
  92. package/src/{service → services/libp2p}/libp2p_service.ts +192 -86
  93. package/src/{service → services/peer-scoring}/peer_scoring.ts +1 -1
  94. package/src/{service → services}/peer_manager.ts +5 -2
  95. package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +1 -1
  96. package/src/{service → services}/reqresp/reqresp.ts +83 -17
  97. package/src/tx_validator/aggregate_tx_validator.ts +5 -3
  98. package/src/tx_validator/double_spend_validator.ts +6 -8
  99. package/dest/service/data_store.d.ts.map +0 -1
  100. package/dest/service/data_store.js +0 -188
  101. package/dest/service/discV5_service.d.ts.map +0 -1
  102. package/dest/service/discV5_service.js +0 -144
  103. package/dest/service/dummy_service.d.ts.map +0 -1
  104. package/dest/service/encoding.d.ts.map +0 -1
  105. package/dest/service/encoding.js +0 -49
  106. package/dest/service/index.d.ts +0 -3
  107. package/dest/service/index.d.ts.map +0 -1
  108. package/dest/service/index.js +0 -3
  109. package/dest/service/libp2p_service.d.ts.map +0 -1
  110. package/dest/service/libp2p_service.js +0 -500
  111. package/dest/service/peer_manager.d.ts.map +0 -1
  112. package/dest/service/peer_manager.js +0 -214
  113. package/dest/service/peer_scoring.d.ts.map +0 -1
  114. package/dest/service/peer_scoring.js +0 -72
  115. package/dest/service/reqresp/config.d.ts.map +0 -1
  116. package/dest/service/reqresp/handlers.d.ts.map +0 -1
  117. package/dest/service/reqresp/index.d.ts.map +0 -1
  118. package/dest/service/reqresp/interface.d.ts.map +0 -1
  119. package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
  120. package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
  121. package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  122. package/dest/service/reqresp/reqresp.d.ts.map +0 -1
  123. package/dest/service/reqresp/reqresp.js +0 -230
  124. package/dest/service/service.d.ts.map +0 -1
  125. package/src/service/index.ts +0 -2
  126. /package/dest/{service → services}/data_store.d.ts +0 -0
  127. /package/dest/{service → services}/dummy_service.d.ts +0 -0
  128. /package/dest/{service → services}/reqresp/config.d.ts +0 -0
  129. /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
  130. /package/dest/{service → services}/reqresp/index.d.ts +0 -0
  131. /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
  132. /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
  133. /package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -0
  134. /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
  135. /package/dest/{service → services}/service.d.ts +0 -0
  136. /package/src/{service → services}/data_store.ts +0 -0
  137. /package/src/{service → services}/dummy_service.ts +0 -0
  138. /package/src/{service → services}/reqresp/config.ts +0 -0
  139. /package/src/{service → services}/reqresp/handlers.ts +0 -0
  140. /package/src/{service → services}/reqresp/index.ts +0 -0
  141. /package/src/{service → services}/reqresp/interface.ts +0 -0
  142. /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
  143. /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
  144. /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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YV9zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9kYXRhX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBR3JFLE9BQU8sRUFBOEIsR0FBRyxFQUF3QyxNQUFNLHFCQUFxQixDQUFDO0FBYzVHLE1BQU0sZ0JBQWlCLFNBQVEsS0FBSztJQUVsQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGNBQWM7SUFRekIsWUFBWSxFQUFnQixFQUFFLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFO1FBUHpFLGtEQUEwQztRQUMxQyw4Q0FBMkM7UUFFM0MsbUNBQXVCLEVBQUUsRUFBQztRQUt4Qix1QkFBQSxJQUFJLG1DQUFvQixJQUFJLEdBQUcsRUFBRSxNQUFBLENBQUM7UUFDbEMsdUJBQUEsSUFBSSwrQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBQSxDQUFDO1FBRWhELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBUTtRQUNWLE9BQU8sdUJBQUEsSUFBSSx1Q0FBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksdUJBQUEsSUFBSSxtQ0FBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVE7UUFDVixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsdUJBQUEsSUFBSSx1Q0FBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsdUJBQUEsSUFBSSxtQ0FBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVEsRUFBRSxHQUFlO1FBQzNCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUEyQjtRQUN4QyxJQUFJLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0IsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUEwQjtRQUN2QyxJQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMvQixNQUFNO2dCQUNKLEdBQUc7Z0JBQ0gsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2FBQ3JCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUEwQjtRQUMxQyxJQUFJLEtBQUssRUFBRSxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBUTtRQUNuQix1QkFBQSxJQUFJLHVDQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUM3QyxNQUFNLHVCQUFBLElBQUksbUNBQWEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPO1lBQ0wsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNsQix1QkFBQSxJQUFJLGdDQUFVLENBQUMsSUFBSSxDQUFDO29CQUNsQixJQUFJLEVBQUUsS0FBSztvQkFDWCxHQUFHO29CQUNILEtBQUs7aUJBQ04sQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDWix1QkFBQSxJQUFJLGdDQUFVLENBQUMsSUFBSSxDQUFDO29CQUNsQixJQUFJLEVBQUUsS0FBSztvQkFDWCxHQUFHO2lCQUNKLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssTUFBTSxFQUFFLElBQUksdUJBQUEsSUFBSSxnQ0FBVSxFQUFFLENBQUM7b0JBQ2hDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNsQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ25DLENBQUM7eUJBQU0sSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO3dCQUM3QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUM7Z0JBQ0QsdUJBQUEsSUFBSSw0QkFBYSxFQUFFLE1BQUEsQ0FBQyxDQUFDLGdDQUFnQztZQUN2RCxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBUTtRQUNaLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDdkIsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFckQsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkIsRUFBRSxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsU0FBUyxDQUFDLENBQVc7UUFDbkIsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ25CLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNsQixFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFRLEVBQUUsR0FBZTtRQUMxQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyx1QkFBQSxJQUFJLHVDQUFpQixDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLHVCQUFBLElBQUksdUNBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixrQkFBa0I7WUFDbEIsVUFBVSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkMsVUFBVSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixZQUFZO1lBQ1osdUJBQUEsSUFBSSx1Q0FBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsbUJBQW1CO1FBQ25CLE1BQU0sdUJBQUEsSUFBSSxtQ0FBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFekMsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU8sS0FBSyxDQUFDLENBQUMsR0FBRztRQUNoQixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksdUJBQUEsSUFBSSx1Q0FBaUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzNELE1BQU07Z0JBQ0osR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFDakIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2FBQ2xCLENBQUM7UUFDSixDQUFDO1FBRUQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLHVCQUFBLElBQUksbUNBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyx1QkFBQSxJQUFJLHVDQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNO29CQUNKLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUM7b0JBQ2pCLEtBQUs7aUJBQ04sQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssb0JBQW9CO1FBQzFCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUN6QyxJQUFJLFNBQVMsR0FBdUIsU0FBUyxDQUFDO1FBQzlDLElBQUksV0FBVyxHQUEyQixTQUFTLENBQUM7UUFFcEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLHVCQUFBLElBQUksdUNBQWlCLEVBQUUsQ0FBQztZQUNqRCxJQUFJLEtBQUssQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDNUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQztnQkFDeEMsU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDaEIsV0FBVyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM3Qix1QkFBQSxJQUFJLHVDQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
@@ -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 '../config.js';
7
- import { type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlL2R1bW15X3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBR2xDLE9BQU8sRUFBOEMsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUY7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUMxQix3Q0FBd0M7SUFDeEMsUUFBUTtRQUNOLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUs7UUFDVixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksSUFBSTtRQUNULE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxTQUFTLENBQXVCLENBQUksSUFBRyxDQUFDO0lBRS9DOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxDQUFXLElBQUcsQ0FBQztJQUVqQzs7T0FFRztJQUNJLDZCQUE2QixDQUFDLENBQXNELElBQUcsQ0FBQztJQUUvRjs7Ozs7T0FLRztJQUNJLFdBQVcsQ0FDaEIsU0FBbUIsRUFDbkIsUUFBMkQ7UUFFM0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNO1FBQ1gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8seUJBQTBCLFNBQVEsWUFBWTtJQUEzRDs7UUFDVSxpQkFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztJQXdDcEQsQ0FBQztJQXZDQzs7O09BR0c7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDL0MsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNEOzs7T0FHRztJQUNJLElBQUk7UUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztRQUMvQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ksV0FBVztRQUNoQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLGVBQWUsQ0FBQyxDQUFTO1FBQzlCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0NBQ0YifQ==
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,3 @@
1
+ export * from './service.js';
2
+ export * from './libp2p/libp2p_service.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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 { PeerId } from '@libp2p/interface';
6
+ import { type PeerId } from '@libp2p/interface';
6
7
  import '@libp2p/kad-dht';
7
- import { type P2PConfig } from '../config.js';
8
- import { type MemPools } from '../mem_pools/interface.js';
9
- import { type PubSubLibp2p } from '../util.js';
10
- import { type ReqRespSubProtocol, type ReqRespSubProtocolHandlers, type SubProtocolMap } from './reqresp/interface.js';
11
- import { ReqResp } from './reqresp/reqresp.js';
12
- import type { P2PService, PeerDiscoveryService } from './service.js';
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, l2BlockSource: L2BlockSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, telemetry: TelemetryClient, requestResponseHandlers?: ReqRespSubProtocolHandlers, logger?: import("@aztec/foundation/log").Logger);
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, l2BlockSource: L2BlockSource, proofVerifier: ClientProtocolCircuitVerifier, worldStateSynchronizer: WorldStateSynchronizer, store: AztecKVStore, telemetry: TelemetryClient): Promise<LibP2PService>;
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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"}