Skip to content

Commit

Permalink
feat(net): get external IPv4 from libp2p (tronprotocol#5407)
Browse files Browse the repository at this point in the history
* get external ip from libp2p

* add test case testIpFromLibP2p
  • Loading branch information
317787106 committed Aug 30, 2023
1 parent 4d5f05a commit f9c42d6
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.tron.core.config.args.Overlay;
import org.tron.core.config.args.SeedNode;
import org.tron.core.config.args.Storage;
import org.tron.p2p.P2pConfig;
import org.tron.p2p.dns.update.PublishConfig;

public class CommonParameter {
Expand Down Expand Up @@ -169,6 +170,8 @@ public class CommonParameter {
@Setter
public int minParticipationRate;
@Getter
public P2pConfig p2pConfig;
@Getter
@Setter
public int nodeListenPort;
@Getter
Expand Down
1 change: 0 additions & 1 deletion common/src/main/java/org/tron/core/Constant.java
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,6 @@ public class Constant {
public static final String NODE_DISCOVERY_BIND_IP = "node.discovery.bind.ip";

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

public static final String NODE_BACKUP_PRIORITY = "node.backup.priority";
public static final String NODE_BACKUP_PORT = "node.backup.port";
Expand Down
37 changes: 5 additions & 32 deletions framework/src/main/java/org/tron/core/config/args/Args.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,12 @@
import com.typesafe.config.ConfigObject;
import io.grpc.internal.GrpcUtil;
import io.grpc.netty.NettyServerBuilder;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -73,6 +70,7 @@
import org.tron.core.store.AccountStore;
import org.tron.keystore.Credentials;
import org.tron.keystore.WalletUtils;
import org.tron.p2p.P2pConfig;
import org.tron.p2p.dns.update.DnsType;
import org.tron.p2p.dns.update.PublishConfig;
import org.tron.p2p.utils.NetUtil;
Expand Down Expand Up @@ -628,6 +626,7 @@ public static void setParam(final String[] args, final String confFileName) {
? config.getInt(Constant.NODE_MIN_PARTICIPATION_RATE)
: 0;

PARAMETER.p2pConfig = new P2pConfig();
PARAMETER.nodeListenPort =
config.hasPath(Constant.NODE_LISTEN_PORT)
? config.getInt(Constant.NODE_LISTEN_PORT) : 0;
Expand Down Expand Up @@ -1533,36 +1532,10 @@ private static void externalIp(final com.typesafe.config.Config config) {
if (!config.hasPath(Constant.NODE_DISCOVERY_EXTERNAL_IP) || config
.getString(Constant.NODE_DISCOVERY_EXTERNAL_IP).trim().isEmpty()) {
if (PARAMETER.nodeExternalIp == null) {
logger.info("External IP wasn't set, using checkip.amazonaws.com to identify it...");
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(
new URL(Constant.AMAZONAWS_URL).openStream()));
PARAMETER.nodeExternalIp = in.readLine();
if (PARAMETER.nodeExternalIp == null || PARAMETER.nodeExternalIp.trim().isEmpty()) {
throw new IOException("Invalid address: '" + PARAMETER.nodeExternalIp + "'");
}
try {
InetAddress.getByName(PARAMETER.nodeExternalIp);
} catch (Exception e) {
throw new IOException("Invalid address: '" + PARAMETER.nodeExternalIp + "'");
}
logger.info("External address identified: {}", PARAMETER.nodeExternalIp);
} catch (IOException e) {
logger.info("External IP wasn't set, using ipv4 from libp2p");
PARAMETER.nodeExternalIp = PARAMETER.p2pConfig.getIp();
if (StringUtils.isEmpty(PARAMETER.nodeExternalIp)) {
PARAMETER.nodeExternalIp = PARAMETER.nodeDiscoveryBindIp;
logger.warn(
"Can't get external IP. Fall back to peer.bind.ip: "
+ PARAMETER.nodeExternalIp + " :"
+ e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
//ignore
}
}

}
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ public static boolean hasIpv4Stack(Set<String> ipSet) {
}

private P2pConfig getConfig() {
P2pConfig config = new P2pConfig();
P2pConfig config = parameter.getP2pConfig();
return updateConfig(config);
}

Expand Down
45 changes: 43 additions & 2 deletions framework/src/test/java/org/tron/core/config/args/ArgsTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,16 @@
package org.tron.core.config.args;

import com.google.common.collect.Lists;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigMergeable;
import com.typesafe.config.ConfigOrigin;
import com.typesafe.config.ConfigRenderOptions;
import com.typesafe.config.ConfigValue;
import com.typesafe.config.ConfigValueType;
import io.grpc.internal.GrpcUtil;
import io.grpc.netty.NettyServerBuilder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import lombok.extern.slf4j.Slf4j;
import org.junit.After;
Expand All @@ -28,7 +36,10 @@
import org.tron.common.utils.ByteArray;
import org.tron.common.utils.LocalWitnesses;
import org.tron.common.utils.PublicMethod;
import org.tron.common.utils.ReflectUtils;
import org.tron.core.Constant;
import org.tron.core.config.Configuration;
import org.tron.core.net.peer.PeerManager;

@Slf4j
public class ArgsTest {
Expand All @@ -44,7 +55,7 @@ public void destroy() {

@Test
public void get() {
Args.setParam(new String[]{"-w"}, Constant.TEST_CONF);
Args.setParam(new String[] {"-w"}, Constant.TEST_CONF);

CommonParameter parameter = Args.getInstance();

Expand All @@ -55,7 +66,7 @@ public void get() {
localWitnesses.initWitnessAccountAddress(true);
Args.setLocalWitnesses(localWitnesses);
address = ByteArray.toHexString(Args.getLocalWitnesses()
.getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine()));
.getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine()));

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

Expand Down Expand Up @@ -112,5 +123,35 @@ public void get() {
ByteArray.toHexString(Args.getLocalWitnesses()
.getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine())));
}

@Test
public void testIpFromLibP2p()
throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Args.setParam(new String[] {"-w"}, Constant.TEST_CONF);
CommonParameter parameter = Args.getInstance();

String configuredBindIp = parameter.getNodeDiscoveryBindIp();
String configuredExternalIp = parameter.getNodeExternalIp();
Assert.assertEquals("127.0.0.1", configuredBindIp);
Assert.assertEquals("46.168.1.1", configuredExternalIp);

Config config = Configuration.getByFileName(null, Constant.TEST_CONF);
Config config2 = config.withoutPath(Constant.NODE_DISCOVERY_BIND_IP);
Config config3 = config2.withoutPath(Constant.NODE_DISCOVERY_EXTERNAL_IP);

CommonParameter.getInstance().setNodeDiscoveryBindIp(null);
CommonParameter.getInstance().setNodeExternalIp(null);

Method method1 = Args.class.getDeclaredMethod("bindIp", Config.class);
method1.setAccessible(true);
method1.invoke(Args.class, config3);

Method method2 = Args.class.getDeclaredMethod("externalIp", Config.class);
method2.setAccessible(true);
method2.invoke(Args.class, config3);

Assert.assertNotEquals(configuredBindIp, parameter.getNodeDiscoveryBindIp());
Assert.assertNotEquals(configuredExternalIp, parameter.getNodeExternalIp());
}
}

0 comments on commit f9c42d6

Please sign in to comment.