@aztec/p2p 0.67.1 → 0.68.0

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 (203) hide show
  1. package/dest/bootstrap/bootstrap.js +2 -2
  2. package/dest/client/factory.d.ts +19 -0
  3. package/dest/client/factory.d.ts.map +1 -0
  4. package/dest/client/factory.js +40 -0
  5. package/dest/client/index.d.ts +1 -15
  6. package/dest/client/index.d.ts.map +1 -1
  7. package/dest/client/index.js +2 -37
  8. package/dest/client/p2p_client.d.ts +6 -6
  9. package/dest/client/p2p_client.d.ts.map +1 -1
  10. package/dest/client/p2p_client.js +12 -11
  11. package/dest/config.d.ts +1 -1
  12. package/dest/config.d.ts.map +1 -1
  13. package/dest/config.js +3 -3
  14. package/dest/errors/reqresp.error.d.ts +12 -1
  15. package/dest/errors/reqresp.error.d.ts.map +1 -1
  16. package/dest/errors/reqresp.error.js +15 -2
  17. package/dest/index.d.ts +2 -2
  18. package/dest/index.d.ts.map +1 -1
  19. package/dest/index.js +3 -3
  20. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts +9 -0
  21. package/dest/mem_pools/attestation_pool/attestation_pool.d.ts.map +1 -1
  22. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts +3 -0
  23. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.d.ts.map +1 -0
  24. package/dest/mem_pools/attestation_pool/attestation_pool_test_suite.js +171 -0
  25. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts +29 -0
  26. package/dest/mem_pools/attestation_pool/kv_attestation_pool.d.ts.map +1 -0
  27. package/dest/mem_pools/attestation_pool/kv_attestation_pool.js +114 -0
  28. package/dest/mem_pools/interface.d.ts +4 -3
  29. package/dest/mem_pools/interface.d.ts.map +1 -1
  30. package/dest/mocks/index.d.ts +7 -6
  31. package/dest/mocks/index.d.ts.map +1 -1
  32. package/dest/mocks/index.js +8 -8
  33. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts +8 -0
  34. package/dest/msg_validators/attestation_validator/attestation_validator.d.ts.map +1 -0
  35. package/dest/msg_validators/attestation_validator/attestation_validator.js +19 -0
  36. package/dest/msg_validators/attestation_validator/index.d.ts +2 -0
  37. package/dest/msg_validators/attestation_validator/index.d.ts.map +1 -0
  38. package/dest/msg_validators/attestation_validator/index.js +2 -0
  39. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts +8 -0
  40. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.d.ts.map +1 -0
  41. package/dest/msg_validators/block_proposal_validator/block_proposal_validator.js +21 -0
  42. package/dest/msg_validators/block_proposal_validator/index.d.ts +2 -0
  43. package/dest/msg_validators/block_proposal_validator/index.d.ts.map +1 -0
  44. package/dest/msg_validators/block_proposal_validator/index.js +2 -0
  45. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts +8 -0
  46. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.d.ts.map +1 -0
  47. package/dest/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.js +16 -0
  48. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts +2 -0
  49. package/dest/msg_validators/epoch_proof_quote_validator/index.d.ts.map +1 -0
  50. package/dest/msg_validators/epoch_proof_quote_validator/index.js +2 -0
  51. package/dest/msg_validators/index.d.ts +4 -0
  52. package/dest/msg_validators/index.d.ts.map +1 -0
  53. package/dest/msg_validators/index.js +4 -0
  54. package/dest/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.d.ts +1 -1
  55. package/dest/msg_validators/tx_validator/aggregate_tx_validator.d.ts.map +1 -0
  56. package/dest/msg_validators/tx_validator/aggregate_tx_validator.js +34 -0
  57. package/dest/msg_validators/tx_validator/data_validator.d.ts.map +1 -0
  58. package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.js +1 -1
  59. package/dest/{tx_validator → msg_validators/tx_validator}/double_spend_validator.d.ts +3 -2
  60. package/dest/msg_validators/tx_validator/double_spend_validator.d.ts.map +1 -0
  61. package/dest/msg_validators/tx_validator/double_spend_validator.js +56 -0
  62. package/dest/msg_validators/tx_validator/index.d.ts.map +1 -0
  63. package/dest/{tx_validator → msg_validators/tx_validator}/index.js +1 -1
  64. package/dest/msg_validators/tx_validator/metadata_validator.d.ts.map +1 -0
  65. package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.js +1 -1
  66. package/dest/msg_validators/tx_validator/tx_proof_validator.d.ts.map +1 -0
  67. package/dest/msg_validators/tx_validator/tx_proof_validator.js +29 -0
  68. package/dest/services/data_store.d.ts.map +1 -0
  69. package/dest/services/data_store.js +188 -0
  70. package/dest/{service → services/discv5}/discV5_service.d.ts +2 -2
  71. package/dest/services/discv5/discV5_service.d.ts.map +1 -0
  72. package/dest/services/discv5/discV5_service.js +144 -0
  73. package/dest/services/dummy_service.d.ts.map +1 -0
  74. package/dest/{service → services}/dummy_service.js +1 -1
  75. package/dest/{service → services}/encoding.d.ts +5 -0
  76. package/dest/services/encoding.d.ts.map +1 -0
  77. package/dest/services/encoding.js +65 -0
  78. package/dest/services/index.d.ts +3 -0
  79. package/dest/services/index.d.ts.map +1 -0
  80. package/dest/services/index.js +3 -0
  81. package/dest/services/libp2p/libp2p_service.d.ts +221 -0
  82. package/dest/services/libp2p/libp2p_service.d.ts.map +1 -0
  83. package/dest/services/libp2p/libp2p_service.js +690 -0
  84. package/dest/services/peer-scoring/peer_scoring.d.ts +19 -0
  85. package/dest/services/peer-scoring/peer_scoring.d.ts.map +1 -0
  86. package/dest/services/peer-scoring/peer_scoring.js +55 -0
  87. package/dest/{service → services}/peer_manager.d.ts +5 -4
  88. package/dest/services/peer_manager.d.ts.map +1 -0
  89. package/dest/services/peer_manager.js +270 -0
  90. package/dest/services/reqresp/config.d.ts.map +1 -0
  91. package/dest/{service → services}/reqresp/config.js +1 -1
  92. package/dest/services/reqresp/handlers.d.ts.map +1 -0
  93. package/dest/{service → services}/reqresp/handlers.js +1 -1
  94. package/dest/services/reqresp/index.d.ts.map +1 -0
  95. package/dest/{service → services}/reqresp/index.js +1 -1
  96. package/dest/services/reqresp/interface.d.ts.map +1 -0
  97. package/dest/{service → services}/reqresp/interface.js +1 -1
  98. package/dest/services/reqresp/rate_limiter/index.d.ts.map +1 -0
  99. package/dest/{service → services}/reqresp/rate_limiter/index.js +1 -1
  100. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.d.ts +0 -5
  101. package/dest/services/reqresp/rate_limiter/rate_limiter.d.ts.map +1 -0
  102. package/dest/{service → services}/reqresp/rate_limiter/rate_limiter.js +7 -2
  103. package/dest/services/reqresp/rate_limiter/rate_limits.d.ts.map +1 -0
  104. package/dest/{service → services}/reqresp/rate_limiter/rate_limits.js +1 -1
  105. package/dest/{service → services}/reqresp/reqresp.d.ts +16 -0
  106. package/dest/services/reqresp/reqresp.d.ts.map +1 -0
  107. package/dest/services/reqresp/reqresp.js +279 -0
  108. package/dest/services/service.d.ts.map +1 -0
  109. package/dest/{service → services}/service.js +1 -1
  110. package/package.json +13 -10
  111. package/src/bootstrap/bootstrap.ts +1 -1
  112. package/src/client/factory.ts +97 -0
  113. package/src/client/index.ts +1 -73
  114. package/src/client/p2p_client.ts +28 -15
  115. package/src/config.ts +2 -2
  116. package/src/errors/reqresp.error.ts +15 -1
  117. package/src/index.ts +2 -2
  118. package/src/mem_pools/attestation_pool/attestation_pool.ts +10 -0
  119. package/src/mem_pools/attestation_pool/attestation_pool_test_suite.ts +237 -0
  120. package/src/mem_pools/attestation_pool/kv_attestation_pool.ts +153 -0
  121. package/src/mem_pools/interface.ts +5 -3
  122. package/src/mocks/index.ts +16 -10
  123. package/src/msg_validators/attestation_validator/attestation_validator.ts +26 -0
  124. package/src/msg_validators/attestation_validator/index.ts +1 -0
  125. package/src/msg_validators/block_proposal_validator/block_proposal_validator.ts +29 -0
  126. package/src/msg_validators/block_proposal_validator/index.ts +1 -0
  127. package/src/msg_validators/epoch_proof_quote_validator/epoch_proof_quote_validator.ts +22 -0
  128. package/src/msg_validators/epoch_proof_quote_validator/index.ts +1 -0
  129. package/src/msg_validators/index.ts +3 -0
  130. package/src/{tx_validator → msg_validators/tx_validator}/aggregate_tx_validator.ts +5 -3
  131. package/src/{tx_validator → msg_validators/tx_validator}/double_spend_validator.ts +6 -8
  132. package/src/{service → services/discv5}/discV5_service.ts +3 -3
  133. package/src/{service → services}/encoding.ts +21 -3
  134. package/src/services/index.ts +2 -0
  135. package/src/{service → services/libp2p}/libp2p_service.ts +330 -85
  136. package/src/{service → services/peer-scoring}/peer_scoring.ts +6 -23
  137. package/src/{service → services}/peer_manager.ts +50 -3
  138. package/src/{service → services}/reqresp/rate_limiter/rate_limiter.ts +2 -1
  139. package/src/{service → services}/reqresp/reqresp.ts +83 -17
  140. package/dest/service/data_store.d.ts.map +0 -1
  141. package/dest/service/data_store.js +0 -188
  142. package/dest/service/discV5_service.d.ts.map +0 -1
  143. package/dest/service/discV5_service.js +0 -144
  144. package/dest/service/dummy_service.d.ts.map +0 -1
  145. package/dest/service/encoding.d.ts.map +0 -1
  146. package/dest/service/encoding.js +0 -49
  147. package/dest/service/index.d.ts +0 -3
  148. package/dest/service/index.d.ts.map +0 -1
  149. package/dest/service/index.js +0 -3
  150. package/dest/service/libp2p_service.d.ts +0 -136
  151. package/dest/service/libp2p_service.d.ts.map +0 -1
  152. package/dest/service/libp2p_service.js +0 -500
  153. package/dest/service/peer_manager.d.ts.map +0 -1
  154. package/dest/service/peer_manager.js +0 -214
  155. package/dest/service/peer_scoring.d.ts +0 -35
  156. package/dest/service/peer_scoring.d.ts.map +0 -1
  157. package/dest/service/peer_scoring.js +0 -72
  158. package/dest/service/reqresp/config.d.ts.map +0 -1
  159. package/dest/service/reqresp/handlers.d.ts.map +0 -1
  160. package/dest/service/reqresp/index.d.ts.map +0 -1
  161. package/dest/service/reqresp/interface.d.ts.map +0 -1
  162. package/dest/service/reqresp/rate_limiter/index.d.ts.map +0 -1
  163. package/dest/service/reqresp/rate_limiter/rate_limiter.d.ts.map +0 -1
  164. package/dest/service/reqresp/rate_limiter/rate_limits.d.ts.map +0 -1
  165. package/dest/service/reqresp/reqresp.d.ts.map +0 -1
  166. package/dest/service/reqresp/reqresp.js +0 -230
  167. package/dest/service/service.d.ts.map +0 -1
  168. package/dest/tx_validator/aggregate_tx_validator.d.ts.map +0 -1
  169. package/dest/tx_validator/aggregate_tx_validator.js +0 -32
  170. package/dest/tx_validator/data_validator.d.ts.map +0 -1
  171. package/dest/tx_validator/double_spend_validator.d.ts.map +0 -1
  172. package/dest/tx_validator/double_spend_validator.js +0 -56
  173. package/dest/tx_validator/index.d.ts.map +0 -1
  174. package/dest/tx_validator/metadata_validator.d.ts.map +0 -1
  175. package/dest/tx_validator/tx_proof_validator.d.ts.map +0 -1
  176. package/dest/tx_validator/tx_proof_validator.js +0 -29
  177. package/src/service/index.ts +0 -2
  178. /package/dest/{tx_validator → msg_validators/tx_validator}/data_validator.d.ts +0 -0
  179. /package/dest/{tx_validator → msg_validators/tx_validator}/index.d.ts +0 -0
  180. /package/dest/{tx_validator → msg_validators/tx_validator}/metadata_validator.d.ts +0 -0
  181. /package/dest/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.d.ts +0 -0
  182. /package/dest/{service → services}/data_store.d.ts +0 -0
  183. /package/dest/{service → services}/dummy_service.d.ts +0 -0
  184. /package/dest/{service → services}/reqresp/config.d.ts +0 -0
  185. /package/dest/{service → services}/reqresp/handlers.d.ts +0 -0
  186. /package/dest/{service → services}/reqresp/index.d.ts +0 -0
  187. /package/dest/{service → services}/reqresp/interface.d.ts +0 -0
  188. /package/dest/{service → services}/reqresp/rate_limiter/index.d.ts +0 -0
  189. /package/dest/{service → services}/reqresp/rate_limiter/rate_limits.d.ts +0 -0
  190. /package/dest/{service → services}/service.d.ts +0 -0
  191. /package/src/{tx_validator → msg_validators/tx_validator}/data_validator.ts +0 -0
  192. /package/src/{tx_validator → msg_validators/tx_validator}/index.ts +0 -0
  193. /package/src/{tx_validator → msg_validators/tx_validator}/metadata_validator.ts +0 -0
  194. /package/src/{tx_validator → msg_validators/tx_validator}/tx_proof_validator.ts +0 -0
  195. /package/src/{service → services}/data_store.ts +0 -0
  196. /package/src/{service → services}/dummy_service.ts +0 -0
  197. /package/src/{service → services}/reqresp/config.ts +0 -0
  198. /package/src/{service → services}/reqresp/handlers.ts +0 -0
  199. /package/src/{service → services}/reqresp/index.ts +0 -0
  200. /package/src/{service → services}/reqresp/interface.ts +0 -0
  201. /package/src/{service → services}/reqresp/rate_limiter/index.ts +0 -0
  202. /package/src/{service → services}/reqresp/rate_limiter/rate_limits.ts +0 -0
  203. /package/src/{service → services}/service.ts +0 -0
@@ -1,9 +1,11 @@
1
1
  import {
2
2
  type ClientProtocolCircuitVerifier,
3
3
  type L2BlockSource,
4
+ type P2PClientType,
4
5
  type Tx,
5
6
  type WorldStateSynchronizer,
6
7
  } from '@aztec/circuit-types';
8
+ import { type EpochCache } from '@aztec/epoch-cache';
7
9
  import { type DataStoreConfig } from '@aztec/kv-store/config';
8
10
  import { openTmpStore } from '@aztec/kv-store/lmdb';
9
11
  import { type TelemetryClient } from '@aztec/telemetry-client';
@@ -23,11 +25,11 @@ import { type Libp2p, type Libp2pOptions, createLibp2p } from 'libp2p';
23
25
  import { BootstrapNode } from '../bootstrap/bootstrap.js';
24
26
  import { type BootnodeConfig, type P2PConfig } from '../config.js';
25
27
  import { type MemPools } from '../mem_pools/interface.js';
26
- import { DiscV5Service } from '../service/discV5_service.js';
27
- import { LibP2PService } from '../service/libp2p_service.js';
28
- import { type PeerManager } from '../service/peer_manager.js';
29
- import { type P2PReqRespConfig } from '../service/reqresp/config.js';
30
- import { pingHandler, statusHandler } from '../service/reqresp/handlers.js';
28
+ import { DiscV5Service } from '../services/discv5/discV5_service.js';
29
+ import { LibP2PService } from '../services/libp2p/libp2p_service.js';
30
+ import { type PeerManager } from '../services/peer_manager.js';
31
+ import { type P2PReqRespConfig } from '../services/reqresp/config.js';
32
+ import { pingHandler, statusHandler } from '../services/reqresp/handlers.js';
31
33
  import {
32
34
  PING_PROTOCOL,
33
35
  type ReqRespSubProtocolHandlers,
@@ -35,8 +37,8 @@ import {
35
37
  STATUS_PROTOCOL,
36
38
  TX_REQ_PROTOCOL,
37
39
  noopValidator,
38
- } from '../service/reqresp/interface.js';
39
- import { ReqResp } from '../service/reqresp/reqresp.js';
40
+ } from '../services/reqresp/interface.js';
41
+ import { ReqResp } from '../services/reqresp/reqresp.js';
40
42
  import { type PubSubLibp2p } from '../util.js';
41
43
 
42
44
  /**
@@ -95,11 +97,13 @@ export async function createLibp2pNode(
95
97
  *
96
98
  *
97
99
  */
98
- export async function createTestLibP2PService(
100
+ export async function createTestLibP2PService<T extends P2PClientType>(
101
+ clientType: T,
99
102
  boostrapAddrs: string[] = [],
100
103
  l2BlockSource: L2BlockSource,
101
104
  worldStateSynchronizer: WorldStateSynchronizer,
102
- mempools: MemPools,
105
+ epochCache: EpochCache,
106
+ mempools: MemPools<T>,
103
107
  telemetry: TelemetryClient,
104
108
  port: number = 0,
105
109
  peerId?: PeerId,
@@ -123,12 +127,14 @@ export async function createTestLibP2PService(
123
127
  // No bootstrap nodes provided as the libp2p service will register them in the constructor
124
128
  const p2pNode = await createLibp2pNode([], peerId, port, /*enable gossip */ true, /**start */ false);
125
129
 
126
- return new LibP2PService(
130
+ return new LibP2PService<T>(
131
+ clientType,
127
132
  config,
128
133
  p2pNode as PubSubLibp2p,
129
134
  discoveryService,
130
135
  mempools,
131
136
  l2BlockSource,
137
+ epochCache,
132
138
  proofVerifier,
133
139
  worldStateSynchronizer,
134
140
  telemetry,
@@ -0,0 +1,26 @@
1
+ import { type BlockAttestation, type P2PValidator, PeerErrorSeverity } from '@aztec/circuit-types';
2
+ import { type EpochCache } from '@aztec/epoch-cache';
3
+
4
+ export class AttestationValidator implements P2PValidator<BlockAttestation> {
5
+ private epochCache: EpochCache;
6
+
7
+ constructor(epochCache: EpochCache) {
8
+ this.epochCache = epochCache;
9
+ }
10
+
11
+ async validate(message: BlockAttestation): Promise<PeerErrorSeverity | undefined> {
12
+ const { currentSlot, nextSlot } = await this.epochCache.getProposerInCurrentOrNextSlot();
13
+
14
+ const slotNumberBigInt = message.payload.header.globalVariables.slotNumber.toBigInt();
15
+ if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
16
+ return PeerErrorSeverity.HighToleranceError;
17
+ }
18
+
19
+ const attester = message.getSender();
20
+ if (!(await this.epochCache.isInCommittee(attester))) {
21
+ return PeerErrorSeverity.HighToleranceError;
22
+ }
23
+
24
+ return undefined;
25
+ }
26
+ }
@@ -0,0 +1 @@
1
+ export * from './attestation_validator.js';
@@ -0,0 +1,29 @@
1
+ import { type BlockProposal, type P2PValidator, PeerErrorSeverity } from '@aztec/circuit-types';
2
+ import { type EpochCache } from '@aztec/epoch-cache';
3
+
4
+ export class BlockProposalValidator implements P2PValidator<BlockProposal> {
5
+ private epochCache: EpochCache;
6
+
7
+ constructor(epochCache: EpochCache) {
8
+ this.epochCache = epochCache;
9
+ }
10
+
11
+ async validate(block: BlockProposal): Promise<PeerErrorSeverity | undefined> {
12
+ const { currentProposer, nextProposer, currentSlot, nextSlot } =
13
+ await this.epochCache.getProposerInCurrentOrNextSlot();
14
+
15
+ // Check that the attestation is for the current or next slot
16
+ const slotNumberBigInt = block.payload.header.globalVariables.slotNumber.toBigInt();
17
+ if (slotNumberBigInt !== currentSlot && slotNumberBigInt !== nextSlot) {
18
+ return PeerErrorSeverity.HighToleranceError;
19
+ }
20
+
21
+ // Check that the block proposal is from the current or next proposer
22
+ const proposer = block.getSender();
23
+ if (!proposer.equals(currentProposer) && !proposer.equals(nextProposer)) {
24
+ return PeerErrorSeverity.HighToleranceError;
25
+ }
26
+
27
+ return undefined;
28
+ }
29
+ }
@@ -0,0 +1 @@
1
+ export * from './block_proposal_validator.js';
@@ -0,0 +1,22 @@
1
+ import { type EpochProofQuote, type P2PValidator, PeerErrorSeverity } from '@aztec/circuit-types';
2
+ import { type EpochCache } from '@aztec/epoch-cache';
3
+
4
+ export class EpochProofQuoteValidator implements P2PValidator<EpochProofQuote> {
5
+ private epochCache: EpochCache;
6
+
7
+ constructor(epochCache: EpochCache) {
8
+ this.epochCache = epochCache;
9
+ }
10
+
11
+ validate(message: EpochProofQuote): Promise<PeerErrorSeverity | undefined> {
12
+ const { epoch } = this.epochCache.getEpochAndSlotNow();
13
+
14
+ // Check that the epoch proof quote is for the current epoch
15
+ const epochToProve = message.payload.epochToProve;
16
+ if (epochToProve !== epoch && epochToProve !== epoch - 1n) {
17
+ return Promise.resolve(PeerErrorSeverity.HighToleranceError);
18
+ }
19
+
20
+ return Promise.resolve(undefined);
21
+ }
22
+ }
@@ -0,0 +1 @@
1
+ export { EpochProofQuoteValidator } from './epoch_proof_quote_validator.js';
@@ -0,0 +1,3 @@
1
+ export * from './tx_validator/index.js';
2
+ export * from './block_proposal_validator/index.js';
3
+ export * from './attestation_validator/index.js';
@@ -10,16 +10,18 @@ export class AggregateTxValidator<T extends Tx | ProcessedTx> implements TxValid
10
10
  this.#validators = validators;
11
11
  }
12
12
 
13
- async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[]]> {
13
+ async validateTxs(txs: T[]): Promise<[validTxs: T[], invalidTxs: T[], skippedTxs: T[]]> {
14
14
  const invalidTxs: T[] = [];
15
+ const skippedTxs: T[] = [];
15
16
  let txPool = txs;
16
17
  for (const validator of this.#validators) {
17
- const [valid, invalid] = await validator.validateTxs(txPool);
18
+ const [valid, invalid, skipped] = await validator.validateTxs(txPool);
18
19
  invalidTxs.push(...invalid);
20
+ skippedTxs.push(...(skipped ?? []));
19
21
  txPool = valid;
20
22
  }
21
23
 
22
- return [txPool, invalidTxs];
24
+ return [txPool, invalidTxs, skippedTxs];
23
25
  }
24
26
 
25
27
  async validateTx(tx: T): Promise<boolean> {
@@ -1,9 +1,8 @@
1
1
  import { type AnyTx, Tx, type TxValidator } from '@aztec/circuit-types';
2
- import { Fr } from '@aztec/circuits.js';
3
2
  import { createLogger } from '@aztec/foundation/log';
4
3
 
5
4
  export interface NullifierSource {
6
- getNullifierIndex: (nullifier: Fr) => Promise<bigint | undefined>;
5
+ getNullifierIndices: (nullifiers: Buffer[]) => Promise<(bigint | undefined)[]>;
7
6
  }
8
7
 
9
8
  export class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
@@ -36,9 +35,7 @@ export class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
36
35
  }
37
36
 
38
37
  async #uniqueNullifiers(tx: AnyTx, thisBlockNullifiers: Set<bigint>): Promise<boolean> {
39
- const nullifiers = (tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers).map(x =>
40
- x.toBigInt(),
41
- );
38
+ const nullifiers = tx instanceof Tx ? tx.data.getNonEmptyNullifiers() : tx.txEffect.nullifiers;
42
39
 
43
40
  // Ditch this tx if it has repeated nullifiers
44
41
  const uniqueNullifiers = new Set(nullifiers);
@@ -49,16 +46,17 @@ export class DoubleSpendTxValidator<T extends AnyTx> implements TxValidator<T> {
49
46
 
50
47
  if (this.isValidatingBlock) {
51
48
  for (const nullifier of nullifiers) {
52
- if (thisBlockNullifiers.has(nullifier)) {
49
+ const nullifierBigInt = nullifier.toBigInt();
50
+ if (thisBlockNullifiers.has(nullifierBigInt)) {
53
51
  this.#log.warn(`Rejecting tx ${Tx.getHash(tx)} for repeating a nullifier in the same block`);
54
52
  return false;
55
53
  }
56
54
 
57
- thisBlockNullifiers.add(nullifier);
55
+ thisBlockNullifiers.add(nullifierBigInt);
58
56
  }
59
57
  }
60
58
 
61
- const nullifierIndexes = await Promise.all(nullifiers.map(n => this.#nullifierSource.getNullifierIndex(new Fr(n))));
59
+ const nullifierIndexes = await this.#nullifierSource.getNullifierIndices(nullifiers.map(n => n.toBuffer()));
62
60
 
63
61
  const hasDuplicates = nullifierIndexes.some(index => index !== undefined);
64
62
  if (hasDuplicates) {
@@ -8,9 +8,9 @@ import type { PeerId } from '@libp2p/interface';
8
8
  import { type Multiaddr, multiaddr } from '@multiformats/multiaddr';
9
9
  import EventEmitter from 'events';
10
10
 
11
- import type { P2PConfig } from '../config.js';
12
- import { convertToMultiaddr } from '../util.js';
13
- import { type PeerDiscoveryService, PeerDiscoveryState } from './service.js';
11
+ import type { P2PConfig } from '../../config.js';
12
+ import { convertToMultiaddr } from '../../util.js';
13
+ import { type PeerDiscoveryService, PeerDiscoveryState } from '../service.js';
14
14
 
15
15
  export const AZTEC_ENR_KEY = 'aztec_network';
16
16
 
@@ -49,13 +49,31 @@ export function getMsgIdFn(message: Message) {
49
49
  return sha256(Buffer.concat(vec)).subarray(0, 20);
50
50
  }
51
51
 
52
+ /**
53
+ * Snappy transform for libp2p gossipsub
54
+ */
52
55
  export class SnappyTransform implements DataTransform {
56
+ // Topic string included to satisfy DataTransform interface
53
57
  inboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
54
- const uncompressed = Buffer.from(uncompressSync(Buffer.from(data), { asBuffer: true }));
55
- return new Uint8Array(uncompressed);
58
+ return this.inboundTransformNoTopic(Buffer.from(data));
59
+ }
60
+
61
+ public inboundTransformNoTopic(data: Buffer): Buffer {
62
+ if (data.length === 0) {
63
+ return data;
64
+ }
65
+ return Buffer.from(uncompressSync(data, { asBuffer: true }));
56
66
  }
57
67
 
68
+ // Topic string included to satisfy DataTransform interface
58
69
  outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
59
- return new Uint8Array(compressSync(Buffer.from(data)));
70
+ return this.outboundTransformNoTopic(Buffer.from(data));
71
+ }
72
+
73
+ public outboundTransformNoTopic(data: Buffer): Buffer {
74
+ if (data.length === 0) {
75
+ return data;
76
+ }
77
+ return Buffer.from(compressSync(data));
60
78
  }
61
79
  }
@@ -0,0 +1,2 @@
1
+ export * from './service.js';
2
+ export * from './libp2p/libp2p_service.js';