Skip to content

Commit d5ee08d

Browse files
committed
Revert "feat: detect announce IP changes automatically (#21606)"
This reverts commit 04f7026, reversing changes made to 6b12e5e.
1 parent b885a85 commit d5ee08d

8 files changed

Lines changed: 24 additions & 232 deletions

File tree

yarn-project/p2p/src/client/factory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export async function createP2PClient(
5757
telemetry: TelemetryClient = getTelemetryClient(),
5858
deps: P2PClientDeps = {},
5959
) {
60-
const config = configureP2PClientAddresses({
60+
const config = await configureP2PClientAddresses({
6161
...inputConfig,
6262
dataStoreMapSizeKb: inputConfig.p2pStoreMapSizeKb ?? inputConfig.dataStoreMapSizeKb,
6363
});

yarn-project/p2p/src/services/discv5/discV5_service.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
9696
lookupTimeout: 2000,
9797
requestTimeout: 2000,
9898
allowUnverifiedSessions: true,
99-
enrUpdate: config.queryForIp && !p2pIp, // Enable native ENR IP discovery when no static IP is configured
99+
enrUpdate: !p2pIp ? true : false, // If no p2p IP is set, enrUpdate can automatically resolve it
100100
...configOverrides.config,
101101
},
102102
metricsRegistry,
@@ -129,11 +129,9 @@ export class DiscV5Service extends EventEmitter implements PeerDiscoveryService
129129
private onMultiaddrUpdated(m: Multiaddr) {
130130
// We want to update our tcp port to match the udp port
131131
// p2pBroadcastPort is optional on config, however it is set to default within the p2p client factory
132-
const address = m.nodeAddress().address;
133-
const multiAddrTcp = multiaddr(convertToMultiaddr(address, this.config.p2pBroadcastPort!, 'tcp'));
132+
const multiAddrTcp = multiaddr(convertToMultiaddr(m.nodeAddress().address, this.config.p2pBroadcastPort!, 'tcp'));
134133
this.enr.setLocationMultiaddr(multiAddrTcp);
135134
this.logger.info('Multiaddr updated', { multiaddr: multiAddrTcp.toString() });
136-
this.emit('ip:changed', address);
137135
}
138136

139137
public async start(): Promise<void> {

yarn-project/p2p/src/services/discv5/discv5_service.test.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,12 @@ describe('Discv5Service', () => {
111111
await stopNodes(node1, node2);
112112
});
113113

114-
it('should automatically resolve p2p ip if not set and queryForIp is true', async () => {
114+
it('should automatically resolve p2p ip if not set', async () => {
115115
const extraNodes = 3;
116116
const nodes: DiscV5Service[] = [];
117117

118-
// Create a node with no p2pIp and queryForIp=true -- enrUpdate should be enabled
119-
const node = await createNode({
120-
p2pIp: undefined,
121-
queryForIp: true,
122-
config: { addrVotesToUpdateEnr: 1, pingInterval: 200 },
123-
});
118+
// Create a node with no p2pIp
119+
const node = await createNode({ p2pIp: undefined, config: { addrVotesToUpdateEnr: 1, pingInterval: 200 } });
124120
await node.start();
125121
nodes.push(node);
126122

@@ -138,19 +134,12 @@ describe('Discv5Service', () => {
138134

139135
expect(node.getEnr().ip).toEqual(undefined);
140136

141-
// ip:changed should be emitted when the ENR IP is resolved
142-
let discoveredIp: string | undefined;
143-
node.on('ip:changed', (ip: string) => {
144-
discoveredIp = ip;
145-
});
146-
147137
await runDiscoveryUntil(nodes, () => node.getEnr().ip !== undefined);
148138

149-
// Expect IP has been updated, tcp and udp ports match, and ip:changed event was emitted
139+
// Expect it's IP has been updated, and that the tcp and udp ports are the same
150140
expect(node.getEnr().ip).not.toEqual(undefined);
151141
expect(node.getEnr().tcp).not.toEqual(undefined);
152142
expect(node.getEnr().tcp).toEqual(node.getEnr().udp);
153-
expect(discoveredIp).toEqual(node.getEnr().ip?.toString());
154143

155144
await stopNodes(...nodes);
156145
});

yarn-project/p2p/src/services/libp2p/libp2p_service.test.ts

Lines changed: 0 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import { ServerWorldStateSynchronizer } from '@aztec/world-state';
2424
import { afterEach, beforeEach, describe, expect, it, jest } from '@jest/globals';
2525
import type { Message, PeerId } from '@libp2p/interface';
2626
import { TopicValidatorResult } from '@libp2p/interface';
27-
import type { ConnectionManager } from '@libp2p/interface-internal';
28-
import { multiaddr } from '@multiformats/multiaddr';
2927
import { type MockProxy, mock } from 'jest-mock-extended';
3028

3129
import { type P2PConfig, p2pConfigMappings } from '../../config.js';
@@ -38,8 +36,6 @@ import type { MemPools } from '../../mem_pools/interface.js';
3836
import type { TxPoolV2 } from '../../mem_pools/tx_pool_v2/interfaces.js';
3937
import type { TransactionValidator } from '../../msg_validators/tx_validator/factory.js';
4038
import type { PubSubLibp2p } from '../../util.js';
41-
import { convertToMultiaddr } from '../../util.js';
42-
import { DummyPeerDiscoveryService } from '../dummy_service.js';
4339
import type { PeerManagerInterface } from '../peer-manager/interface.js';
4440
import type { ReqRespInterface } from '../reqresp/interface.js';
4541
import { BitVector } from '../reqresp/protocols/block_txs/bitvector.js';
@@ -1055,148 +1051,6 @@ describe('LibP2PService', () => {
10551051
expect(allNodesCheckpointReceivedCallback).toHaveBeenCalledWith(expect.any(Object), expect.anything());
10561052
});
10571053
});
1058-
1059-
describe('discv5 ip:changed bridge (queryForIp)', () => {
1060-
const p2pPort = 40400;
1061-
const firstIp = '203.0.113.5';
1062-
const secondIp = '198.51.100.2';
1063-
1064-
function createQueryForIpService() {
1065-
const peerDiscovery = new DummyPeerDiscoveryService();
1066-
const addressManager = {
1067-
removeObservedAddr: jest.fn(),
1068-
addObservedAddr: jest.fn(),
1069-
confirmObservedAddr: jest.fn(),
1070-
};
1071-
const mockPeerId = mock<PeerId>({ toString: () => MOCK_PEER_ID });
1072-
const nodeState = { status: 'stopped' as string };
1073-
const mockNode = {
1074-
get status() {
1075-
return nodeState.status;
1076-
},
1077-
set status(v: string) {
1078-
nodeState.status = v;
1079-
},
1080-
peerId: mockPeerId,
1081-
start: jest.fn(() => {
1082-
nodeState.status = 'started';
1083-
}),
1084-
stop: jest.fn(() => {
1085-
nodeState.status = 'stopped';
1086-
}),
1087-
services: {
1088-
pubsub: {
1089-
subscribe: jest.fn(),
1090-
addEventListener: jest.fn(),
1091-
removeEventListener: jest.fn(),
1092-
getMeshPeers: jest.fn(() => []),
1093-
},
1094-
components: {
1095-
addressManager,
1096-
connectionManager: {} as unknown as ConnectionManager,
1097-
},
1098-
},
1099-
} as unknown as PubSubLibp2p;
1100-
1101-
const config: P2PConfig = {
1102-
...getDefaultConfig(p2pConfigMappings),
1103-
seenMessageCacheSize: 1000,
1104-
debugP2PInstrumentMessages: false,
1105-
disableTransactions: true,
1106-
l1ChainId: 1,
1107-
rollupVersion: 1,
1108-
l1Contracts: { rollupAddress: EthAddress.random() },
1109-
queryForIp: true,
1110-
p2pIp: undefined,
1111-
p2pPort,
1112-
p2pDiscoveryDisabled: true,
1113-
peerCheckIntervalMS: 60_000, // Long enough that heartbeat won't run during this unit test
1114-
};
1115-
1116-
const mockPeerManager = mock<PeerManagerInterface>();
1117-
mockPeerManager.initializePeers.mockResolvedValue(undefined);
1118-
mockPeerManager.stop.mockResolvedValue(undefined);
1119-
mockPeerManager.heartbeat.mockResolvedValue(undefined);
1120-
1121-
const mockReqResp = mock<ReqRespInterface>();
1122-
mockReqResp.start.mockResolvedValue(undefined);
1123-
mockReqResp.stop.mockResolvedValue(undefined);
1124-
1125-
const mempools = mock<MemPools>();
1126-
const archiver = mock<L2BlockSource & ContractDataSource>();
1127-
const epochCache = mock<EpochCacheInterface>();
1128-
const mockProofVerifier = mock<ClientProtocolCircuitVerifier>({
1129-
verifyProof: () => Promise.resolve({ valid: true, durationMs: 1, totalDurationMs: 1 }),
1130-
});
1131-
const mockWorldStateSynchronizer = mock<ServerWorldStateSynchronizer>();
1132-
1133-
const service = new LibP2PService(
1134-
config,
1135-
mockNode,
1136-
peerDiscovery,
1137-
mockReqResp,
1138-
mockPeerManager,
1139-
mempools,
1140-
archiver,
1141-
epochCache,
1142-
mockProofVerifier,
1143-
mockWorldStateSynchronizer,
1144-
getTelemetryClient(),
1145-
createLogger('p2p:test:queryForIp'),
1146-
);
1147-
1148-
return { service, peerDiscovery, addressManager, config };
1149-
}
1150-
1151-
it('registers observed announce address when discv5 emits ip:changed', async () => {
1152-
const { service, peerDiscovery, addressManager } = createQueryForIpService();
1153-
const expectedAddr = multiaddr(convertToMultiaddr(firstIp, p2pPort, 'tcp'));
1154-
1155-
await service.start();
1156-
peerDiscovery.emit('ip:changed', firstIp);
1157-
1158-
expect(addressManager.addObservedAddr).toHaveBeenCalledWith(expectedAddr);
1159-
expect(addressManager.confirmObservedAddr).toHaveBeenCalledWith(expectedAddr);
1160-
expect(addressManager.removeObservedAddr).not.toHaveBeenCalled();
1161-
1162-
await service.stop();
1163-
});
1164-
1165-
it('removes previous observed address when ip:changed fires again with a new IP', async () => {
1166-
const { service, peerDiscovery, addressManager } = createQueryForIpService();
1167-
const firstAddr = multiaddr(convertToMultiaddr(firstIp, p2pPort, 'tcp'));
1168-
const secondAddr = multiaddr(convertToMultiaddr(secondIp, p2pPort, 'tcp'));
1169-
1170-
await service.start();
1171-
peerDiscovery.emit('ip:changed', firstIp);
1172-
addressManager.removeObservedAddr.mockClear();
1173-
addressManager.addObservedAddr.mockClear();
1174-
addressManager.confirmObservedAddr.mockClear();
1175-
1176-
peerDiscovery.emit('ip:changed', secondIp);
1177-
1178-
expect(addressManager.removeObservedAddr).toHaveBeenCalledWith(firstAddr);
1179-
expect(addressManager.addObservedAddr).toHaveBeenCalledWith(secondAddr);
1180-
expect(addressManager.confirmObservedAddr).toHaveBeenCalledWith(secondAddr);
1181-
1182-
await service.stop();
1183-
});
1184-
1185-
it('unsubscribes from ip:changed on stop so later emits are ignored', async () => {
1186-
const { service, peerDiscovery, addressManager } = createQueryForIpService();
1187-
1188-
await service.start();
1189-
peerDiscovery.emit('ip:changed', firstIp);
1190-
addressManager.addObservedAddr.mockClear();
1191-
addressManager.confirmObservedAddr.mockClear();
1192-
1193-
await service.stop();
1194-
peerDiscovery.emit('ip:changed', secondIp);
1195-
1196-
expect(addressManager.addObservedAddr).not.toHaveBeenCalled();
1197-
expect(addressManager.confirmObservedAddr).not.toHaveBeenCalled();
1198-
});
1199-
});
12001054
});
12011055

12021056
/** Mock type for tx objects used in block txs validation tests. */

yarn-project/p2p/src/services/libp2p/libp2p_service.ts

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,9 @@ import { yamux } from '@chainsafe/libp2p-yamux';
5151
import { bootstrap } from '@libp2p/bootstrap';
5252
import { identify } from '@libp2p/identify';
5353
import { type Message, type MultiaddrConnection, type PeerId, TopicValidatorResult } from '@libp2p/interface';
54-
import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
54+
import type { ConnectionManager } from '@libp2p/interface-internal';
5555
import { mplex } from '@libp2p/mplex';
5656
import { tcp } from '@libp2p/tcp';
57-
import { multiaddr } from '@multiformats/multiaddr';
5857
import { ENR } from '@nethermindeth/enr';
5958
import { createLibp2p } from 'libp2p';
6059

@@ -182,10 +181,6 @@ export class LibP2PService extends WithTracer implements P2PService {
182181
private validatorCheckpointReceivedCallback: P2PCheckpointReceivedCallback;
183182

184183
private gossipSubEventHandler: (e: CustomEvent<GossipsubMessage>) => void;
185-
private ipChangedHandler?: (ip: string) => void;
186-
187-
/** Discovered public IP address (set when queryForIp is enabled and no static IP was configured). */
188-
private discoveredP2pIp?: string;
189184

190185
private instrumentation: P2PInstrumentation;
191186

@@ -457,9 +452,8 @@ export class LibP2PService extends WithTracer implements P2PService {
457452
topics: topicScoreParams,
458453
}),
459454
}) as (components: GossipSubComponents) => GossipSub,
460-
components: (components: { connectionManager: ConnectionManager; addressManager: AddressManager }) => ({
455+
components: (components: { connectionManager: ConnectionManager }) => ({
461456
connectionManager: components.connectionManager,
462-
addressManager: components.addressManager,
463457
}),
464458
},
465459
logger: createLibp2pComponentLogger(logger.module, logger.getBindings()),
@@ -518,10 +512,10 @@ export class LibP2PService extends WithTracer implements P2PService {
518512

519513
// Get listen & announce addresses for logging
520514
const { p2pIp, p2pPort } = this.config;
521-
if (!p2pIp && !this.config.queryForIp) {
515+
if (!p2pIp) {
522516
throw new Error('Announce address not provided.');
523517
}
524-
const announceTcpMultiaddr = p2pIp ? convertToMultiaddr(p2pIp, p2pPort, 'tcp') : undefined;
518+
const announceTcpMultiaddr = convertToMultiaddr(p2pIp, p2pPort, 'tcp');
525519

526520
// Create request response protocol handlers
527521
const txHandler = reqRespTxHandler(this.mempools);
@@ -575,31 +569,6 @@ export class LibP2PService extends WithTracer implements P2PService {
575569
if (!this.config.p2pDiscoveryDisabled) {
576570
await this.peerDiscoveryService.start();
577571
}
578-
579-
// When queryForIp is enabled and no static IP was configured, bridge discv5 IP discovery to libp2p.
580-
// Discv5 discovers our public IP via peer WHOAREYOU exchanges (enrUpdate=true) and emits 'ip:changed'.
581-
// We confirm the discovered address in the libp2p AddressManager so it appears in getMultiaddrs()
582-
// and is pushed to all connected peers via the identify protocol.
583-
if (this.config.queryForIp && !p2pIp) {
584-
this.ipChangedHandler = (ip: string) => {
585-
const addressManager = this.node.services.components.addressManager;
586-
const newAddr = multiaddr(convertToMultiaddr(ip, this.config.p2pPort, 'tcp'));
587-
588-
// Remove old discovered IP if one exists
589-
if (this.discoveredP2pIp) {
590-
const oldAddr = multiaddr(convertToMultiaddr(this.discoveredP2pIp, this.config.p2pPort, 'tcp'));
591-
addressManager.removeObservedAddr(oldAddr);
592-
}
593-
594-
addressManager.addObservedAddr(newAddr);
595-
addressManager.confirmObservedAddr(newAddr);
596-
// Store discovered IP
597-
this.discoveredP2pIp = ip;
598-
this.logger.info('Public IP discovered via discv5', { ip });
599-
};
600-
this.peerDiscoveryService.on('ip:changed', this.ipChangedHandler);
601-
}
602-
603572
this.discoveryRunningPromise = new RunningPromise(
604573
async () => {
605574
await this.peerManager.heartbeat();
@@ -612,7 +581,7 @@ export class LibP2PService extends WithTracer implements P2PService {
612581
this.logger.info(`Started P2P service`, {
613582
listen: this.config.listenAddress,
614583
port: this.config.p2pPort,
615-
announce: announceTcpMultiaddr ?? 'pending (queryForIp=true)',
584+
announce: announceTcpMultiaddr,
616585
peerId: this.node.peerId.toString(),
617586
});
618587
}
@@ -625,12 +594,6 @@ export class LibP2PService extends WithTracer implements P2PService {
625594
// Remove gossip sub listener
626595
this.node.services.pubsub.removeEventListener(GossipSubEvent.MESSAGE, this.gossipSubEventHandler);
627596

628-
// Remove ip:changed listener if registered
629-
if (this.ipChangedHandler) {
630-
this.peerDiscoveryService.off('ip:changed', this.ipChangedHandler);
631-
this.ipChangedHandler = undefined;
632-
}
633-
634597
// Stop peer manager
635598
this.logger.debug('Stopping peer manager...');
636599
await this.peerManager.stop();

yarn-project/p2p/src/services/service.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,6 @@ export interface PeerDiscoveryService extends EventEmitter {
201201
on(event: 'peer:discovered', listener: (enr: ENR) => void): this;
202202
emit(event: 'peer:discovered', enr: ENR): boolean;
203203

204-
/**
205-
* Event emitted when our public IP is discovered or changes via discv5 peer interactions.
206-
* Only emitted when enrUpdate is enabled (i.e. queryForIp=true and no static p2pIp).
207-
*/
208-
on(event: 'ip:changed', listener: (ip: string) => void): this;
209-
emit(event: 'ip:changed', ip: string): boolean;
210-
211204
getStatus(): PeerDiscoveryState;
212205

213206
getEnr(): ENR | undefined;

yarn-project/p2p/src/test-helpers/mock-pubsub.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
type TopicValidatorResult,
1616
TypedEventEmitter,
1717
} from '@libp2p/interface';
18-
import type { AddressManager, ConnectionManager } from '@libp2p/interface-internal';
1918

2019
import type { P2PConfig } from '../config.js';
2120
import type { MemPools } from '../mem_pools/interface.js';
@@ -213,14 +212,6 @@ export class MockPubSub implements PubSubLibp2p {
213212
get services() {
214213
return {
215214
pubsub: this.gossipSub,
216-
components: {
217-
addressManager: {
218-
removeObservedAddr: () => {},
219-
addObservedAddr: () => {},
220-
confirmObservedAddr: () => {},
221-
} as unknown as AddressManager,
222-
connectionManager: {} as unknown as ConnectionManager,
223-
},
224215
};
225216
}
226217

0 commit comments

Comments
 (0)