Skip to content

Commit f9c42d6

Browse files
authored
feat(net): get external IPv4 from libp2p (#5407)
* get external ip from libp2p * add test case testIpFromLibP2p
1 parent 4d5f05a commit f9c42d6

File tree

5 files changed

+52
-36
lines changed

5 files changed

+52
-36
lines changed

common/src/main/java/org/tron/common/parameter/CommonParameter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.tron.core.config.args.Overlay;
1919
import org.tron.core.config.args.SeedNode;
2020
import org.tron.core.config.args.Storage;
21+
import org.tron.p2p.P2pConfig;
2122
import org.tron.p2p.dns.update.PublishConfig;
2223

2324
public class CommonParameter {
@@ -169,6 +170,8 @@ public class CommonParameter {
169170
@Setter
170171
public int minParticipationRate;
171172
@Getter
173+
public P2pConfig p2pConfig;
174+
@Getter
172175
@Setter
173176
public int nodeListenPort;
174177
@Getter

common/src/main/java/org/tron/core/Constant.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,6 @@ public class Constant {
280280
public static final String NODE_DISCOVERY_BIND_IP = "node.discovery.bind.ip";
281281

282282
public static final String NODE_DISCOVERY_EXTERNAL_IP = "node.discovery.external.ip";
283-
public static final String AMAZONAWS_URL = "http://checkip.amazonaws.com";
284283

285284
public static final String NODE_BACKUP_PRIORITY = "node.backup.priority";
286285
public static final String NODE_BACKUP_PORT = "node.backup.port";

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,12 @@
1515
import com.typesafe.config.ConfigObject;
1616
import io.grpc.internal.GrpcUtil;
1717
import io.grpc.netty.NettyServerBuilder;
18-
import java.io.BufferedReader;
1918
import java.io.File;
2019
import java.io.IOException;
2120
import java.io.InputStream;
22-
import java.io.InputStreamReader;
2321
import java.net.InetAddress;
2422
import java.net.InetSocketAddress;
2523
import java.net.Socket;
26-
import java.net.URL;
2724
import java.text.ParseException;
2825
import java.util.ArrayList;
2926
import java.util.Arrays;
@@ -73,6 +70,7 @@
7370
import org.tron.core.store.AccountStore;
7471
import org.tron.keystore.Credentials;
7572
import org.tron.keystore.WalletUtils;
73+
import org.tron.p2p.P2pConfig;
7674
import org.tron.p2p.dns.update.DnsType;
7775
import org.tron.p2p.dns.update.PublishConfig;
7876
import org.tron.p2p.utils.NetUtil;
@@ -628,6 +626,7 @@ public static void setParam(final String[] args, final String confFileName) {
628626
? config.getInt(Constant.NODE_MIN_PARTICIPATION_RATE)
629627
: 0;
630628

629+
PARAMETER.p2pConfig = new P2pConfig();
631630
PARAMETER.nodeListenPort =
632631
config.hasPath(Constant.NODE_LISTEN_PORT)
633632
? config.getInt(Constant.NODE_LISTEN_PORT) : 0;
@@ -1533,36 +1532,10 @@ private static void externalIp(final com.typesafe.config.Config config) {
15331532
if (!config.hasPath(Constant.NODE_DISCOVERY_EXTERNAL_IP) || config
15341533
.getString(Constant.NODE_DISCOVERY_EXTERNAL_IP).trim().isEmpty()) {
15351534
if (PARAMETER.nodeExternalIp == null) {
1536-
logger.info("External IP wasn't set, using checkip.amazonaws.com to identify it...");
1537-
BufferedReader in = null;
1538-
try {
1539-
in = new BufferedReader(new InputStreamReader(
1540-
new URL(Constant.AMAZONAWS_URL).openStream()));
1541-
PARAMETER.nodeExternalIp = in.readLine();
1542-
if (PARAMETER.nodeExternalIp == null || PARAMETER.nodeExternalIp.trim().isEmpty()) {
1543-
throw new IOException("Invalid address: '" + PARAMETER.nodeExternalIp + "'");
1544-
}
1545-
try {
1546-
InetAddress.getByName(PARAMETER.nodeExternalIp);
1547-
} catch (Exception e) {
1548-
throw new IOException("Invalid address: '" + PARAMETER.nodeExternalIp + "'");
1549-
}
1550-
logger.info("External address identified: {}", PARAMETER.nodeExternalIp);
1551-
} catch (IOException e) {
1535+
logger.info("External IP wasn't set, using ipv4 from libp2p");
1536+
PARAMETER.nodeExternalIp = PARAMETER.p2pConfig.getIp();
1537+
if (StringUtils.isEmpty(PARAMETER.nodeExternalIp)) {
15521538
PARAMETER.nodeExternalIp = PARAMETER.nodeDiscoveryBindIp;
1553-
logger.warn(
1554-
"Can't get external IP. Fall back to peer.bind.ip: "
1555-
+ PARAMETER.nodeExternalIp + " :"
1556-
+ e);
1557-
} finally {
1558-
if (in != null) {
1559-
try {
1560-
in.close();
1561-
} catch (IOException e) {
1562-
//ignore
1563-
}
1564-
}
1565-
15661539
}
15671540
}
15681541
} else {

framework/src/main/java/org/tron/core/net/TronNetService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public static boolean hasIpv4Stack(Set<String> ipSet) {
148148
}
149149

150150
private P2pConfig getConfig() {
151-
P2pConfig config = new P2pConfig();
151+
P2pConfig config = parameter.getP2pConfig();
152152
return updateConfig(config);
153153
}
154154

framework/src/test/java/org/tron/core/config/args/ArgsTest.java

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,16 @@
1616
package org.tron.core.config.args;
1717

1818
import com.google.common.collect.Lists;
19+
import com.typesafe.config.Config;
20+
import com.typesafe.config.ConfigMergeable;
21+
import com.typesafe.config.ConfigOrigin;
22+
import com.typesafe.config.ConfigRenderOptions;
23+
import com.typesafe.config.ConfigValue;
24+
import com.typesafe.config.ConfigValueType;
1925
import io.grpc.internal.GrpcUtil;
2026
import io.grpc.netty.NettyServerBuilder;
27+
import java.lang.reflect.InvocationTargetException;
28+
import java.lang.reflect.Method;
2129
import java.util.Arrays;
2230
import lombok.extern.slf4j.Slf4j;
2331
import org.junit.After;
@@ -28,7 +36,10 @@
2836
import org.tron.common.utils.ByteArray;
2937
import org.tron.common.utils.LocalWitnesses;
3038
import org.tron.common.utils.PublicMethod;
39+
import org.tron.common.utils.ReflectUtils;
3140
import org.tron.core.Constant;
41+
import org.tron.core.config.Configuration;
42+
import org.tron.core.net.peer.PeerManager;
3243

3344
@Slf4j
3445
public class ArgsTest {
@@ -44,7 +55,7 @@ public void destroy() {
4455

4556
@Test
4657
public void get() {
47-
Args.setParam(new String[]{"-w"}, Constant.TEST_CONF);
58+
Args.setParam(new String[] {"-w"}, Constant.TEST_CONF);
4859

4960
CommonParameter parameter = Args.getInstance();
5061

@@ -55,7 +66,7 @@ public void get() {
5566
localWitnesses.initWitnessAccountAddress(true);
5667
Args.setLocalWitnesses(localWitnesses);
5768
address = ByteArray.toHexString(Args.getLocalWitnesses()
58-
.getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine()));
69+
.getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine()));
5970

6071
Assert.assertEquals(0, parameter.getBackupPriority());
6172

@@ -112,5 +123,35 @@ public void get() {
112123
ByteArray.toHexString(Args.getLocalWitnesses()
113124
.getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine())));
114125
}
126+
127+
@Test
128+
public void testIpFromLibP2p()
129+
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
130+
Args.setParam(new String[] {"-w"}, Constant.TEST_CONF);
131+
CommonParameter parameter = Args.getInstance();
132+
133+
String configuredBindIp = parameter.getNodeDiscoveryBindIp();
134+
String configuredExternalIp = parameter.getNodeExternalIp();
135+
Assert.assertEquals("127.0.0.1", configuredBindIp);
136+
Assert.assertEquals("46.168.1.1", configuredExternalIp);
137+
138+
Config config = Configuration.getByFileName(null, Constant.TEST_CONF);
139+
Config config2 = config.withoutPath(Constant.NODE_DISCOVERY_BIND_IP);
140+
Config config3 = config2.withoutPath(Constant.NODE_DISCOVERY_EXTERNAL_IP);
141+
142+
CommonParameter.getInstance().setNodeDiscoveryBindIp(null);
143+
CommonParameter.getInstance().setNodeExternalIp(null);
144+
145+
Method method1 = Args.class.getDeclaredMethod("bindIp", Config.class);
146+
method1.setAccessible(true);
147+
method1.invoke(Args.class, config3);
148+
149+
Method method2 = Args.class.getDeclaredMethod("externalIp", Config.class);
150+
method2.setAccessible(true);
151+
method2.invoke(Args.class, config3);
152+
153+
Assert.assertNotEquals(configuredBindIp, parameter.getNodeDiscoveryBindIp());
154+
Assert.assertNotEquals(configuredExternalIp, parameter.getNodeExternalIp());
155+
}
115156
}
116157

0 commit comments

Comments
 (0)