From 30aa2c627b5d398aca564454eab70e5bb684a871 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Sun, 10 May 2026 00:45:19 +0800 Subject: [PATCH 1/5] fix(config): remove redundant JSON-RPC config fields and consolidate parameter binding Remove maxBlockFilterNum, maxAddressSize, and maxRequestTimeout from NodeConfig/CommonParameter since they were superseded by the jsonRpcMaxBatchSize/jsonRpcMaxResponseSize parameters. Consolidate the config binding path so all JSON-RPC size limits flow through a single reference.conf entry, and clean up stale test-config fixtures. Co-Authored-By: Claude Sonnet 4.6 --- .../common/parameter/CommonParameter.java | 13 ---- .../org/tron/core/config/args/NodeConfig.java | 59 +++++++------------ common/src/main/resources/reference.conf | 4 -- .../java/org/tron/core/config/args/Args.java | 6 +- framework/src/main/resources/config.conf | 2 - .../java/org/tron/common/ParameterTest.java | 8 --- .../org/tron/core/config/args/ArgsTest.java | 1 - framework/src/test/resources/args-test.conf | 2 - .../src/test/resources/config-localtest.conf | 6 -- .../src/test/resources/config-test-index.conf | 2 - .../test/resources/config-test-mainnet.conf | 2 - .../resources/config-test-storagetest.conf | 2 - framework/src/test/resources/config-test.conf | 2 - 13 files changed, 22 insertions(+), 87 deletions(-) diff --git a/common/src/main/java/org/tron/common/parameter/CommonParameter.java b/common/src/main/java/org/tron/common/parameter/CommonParameter.java index f2831b4168f..3fe1e878ffb 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -119,15 +119,9 @@ public class CommonParameter { public boolean nodeEffectiveCheckEnable; @Getter @Setter - public int nodeConnectionTimeout = 2000; // from clearParam(), consistent with mainnet.conf - @Getter - @Setter public int fetchBlockTimeout; @Getter @Setter - public int nodeChannelReadTimeout; - @Getter - @Setter public int maxConnections = 30; // from clearParam(), consistent with mainnet.conf @Getter @Setter @@ -297,13 +291,6 @@ public class CommonParameter { @Setter public long forbidTransferToContract; - // -- Netty -- - @Getter - @Setter - public int tcpNettyWorkThreadNum; - @Getter - @Setter - public int udpNettyWorkThreadNum; @Getter @Setter public String trustNodeAddr; // clearParam: "" diff --git a/common/src/main/java/org/tron/core/config/args/NodeConfig.java b/common/src/main/java/org/tron/core/config/args/NodeConfig.java index aac3e930931..ea9f26a06a0 100644 --- a/common/src/main/java/org/tron/core/config/args/NodeConfig.java +++ b/common/src/main/java/org/tron/core/config/args/NodeConfig.java @@ -5,7 +5,6 @@ import com.typesafe.config.Config; import com.typesafe.config.ConfigBeanFactory; -import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigValueFactory; import java.util.ArrayList; import java.util.List; @@ -49,6 +48,9 @@ public class NodeConfig { // node.discovery.* — HOCON merges into node { discovery { ... } }, auto-bound private DiscoveryConfig discovery = new DiscoveryConfig(); + @Getter(lombok.AccessLevel.NONE) + @Setter(lombok.AccessLevel.NONE) + private String externalIP = ""; // node.shutdown.* uses PascalCase keys (BlockTime, BlockHeight, BlockCount) // that don't match JavaBean naming. Excluded, read manually. @@ -64,7 +66,7 @@ public class NodeConfig { public boolean isDiscoveryEnable() { return discovery.isEnable(); } public boolean isDiscoveryPersist() { return discovery.isPersist(); } - public String getDiscoveryExternalIp() { return discovery.getExternal().getIp(); } + public String getDiscoveryExternalIp() { return externalIP; } public String getShutdownBlockTime() { return shutdownBlockTime; } public long getShutdownBlockHeight() { return shutdownBlockHeight; } public long getShutdownBlockCount() { return shutdownBlockCount; } @@ -76,13 +78,10 @@ public class NodeConfig { private boolean enableIpv6 = false; private boolean effectiveCheckEnable = false; private int maxFastForwardNum = 4; - private int tcpNettyWorkThreadNum = 0; - private int udpNettyWorkThreadNum = 1; private ValidContractProtoConfig validContractProto = new ValidContractProtoConfig(); private int shieldedTransInPendingMaxCounts = 10; private long blockCacheTimeout = 60; private long receiveTcpMinDataLength = 2048; - private ChannelConfig channel = new ChannelConfig(); private int maxTransactionPendingSize = 2000; private long pendingTransactionTimeout = 60000; private int maxTrxCacheSize = 50_000; @@ -91,6 +90,8 @@ public class NodeConfig { private boolean unsolidifiedBlockCheck = false; private int maxUnsolidifiedBlocks = 54; private String zenTokenId = "000000"; + @Getter(lombok.AccessLevel.NONE) + @Setter(lombok.AccessLevel.NONE) private boolean allowShieldedTransactionApi = false; private double activeConnectFactor = 0.1; private double connectFactor = 0.6; @@ -100,17 +101,15 @@ public class NodeConfig { // ---- Sub-beans matching config's dot-notation nested structure ---- private ListenConfig listen = new ListenConfig(); - private ConnectionConfig connection = new ConnectionConfig(); private FetchBlockConfig fetchBlock = new FetchBlockConfig(); private SolidityConfig solidity = new SolidityConfig(); // Convenience getters for backward compatibility with applyNodeConfig public int getListenPort() { return listen.getPort(); } - public int getConnectionTimeout() { return connection.getTimeout(); } public int getFetchBlockTimeout() { return fetchBlock.getTimeout(); } public int getSolidityThreads() { return solidity.getThreads(); } - public int getChannelReadTimeout() { return channel.getRead().getTimeout(); } public int getValidContractProtoThreads() { return validContractProto.getThreads(); } + public boolean isAllowShieldedTransactionApi() { return allowShieldedTransactionApi; } // ---- List fields (manually read) ---- private List active = new ArrayList<>(); @@ -139,13 +138,6 @@ public class NodeConfig { public static class DiscoveryConfig { private boolean enable = false; private boolean persist = false; - private ExternalConfig external = new ExternalConfig(); - - @Getter - @Setter - public static class ExternalConfig { - private String ip = ""; - } } @Getter @@ -154,12 +146,6 @@ public static class ListenConfig { private int port = 18888; } - @Getter - @Setter - public static class ConnectionConfig { - private int timeout = 2; - } - @Getter @Setter public static class FetchBlockConfig { @@ -172,18 +158,6 @@ public static class SolidityConfig { private int threads = 0; // 0 = auto (availableProcessors) } - @Getter - @Setter - public static class ChannelConfig { - private ReadConfig read = new ReadConfig(); - - @Getter - @Setter - public static class ReadConfig { - private int timeout = 0; - } - } - @Getter @Setter public static class ValidContractProtoConfig { @@ -362,7 +336,7 @@ public static class DnsConfig { /** * Create NodeConfig from the "node" section of the application config. * - *

Dot-notation keys (listen.port, connection.timeout, fetchBlock.timeout, + *

Dot-notation keys (listen.port, fetchBlock.timeout, * solidity.threads) become nested HOCON objects and cannot be auto-bound to flat * Java fields. They are read manually after ConfigBeanFactory binding. * @@ -403,14 +377,23 @@ public static NodeConfig fromConfig(Config config) { nc.maxConnectionsWithSameIp = section.getInt("maxActiveNodesWithSameIp"); } + nc.externalIP = getString(section, "discovery.external.ip", ""); + if ("null".equalsIgnoreCase(nc.externalIP)) { + nc.externalIP = ""; + } + // Legacy key fallback: node.fullNodeAllowShieldedTransaction -> allowShieldedTransactionApi. - // reference.conf does not ship the legacy key, so hasPath here reliably means the user - // set it in their config. When present, it overrides the modern key. - if (section.hasPath("fullNodeAllowShieldedTransaction")) { - nc.allowShieldedTransactionApi = section.getBoolean("fullNodeAllowShieldedTransaction"); + if (section.hasPath("allowShieldedTransactionApi")) { + nc.allowShieldedTransactionApi = + section.getBoolean("allowShieldedTransactionApi"); + } else if (section.hasPath("fullNodeAllowShieldedTransaction")) { + // for compatibility with previous configuration + nc.allowShieldedTransactionApi = + section.getBoolean("fullNodeAllowShieldedTransaction"); logger.warn("Configuring [node.fullNodeAllowShieldedTransaction] will be deprecated. " + "Please use [node.allowShieldedTransactionApi] instead."); } + // node.shutdown.* — PascalCase keys (BlockTime, BlockHeight), cannot auto-bind nc.shutdownBlockTime = config.hasPath("node.shutdown.BlockTime") ? config.getString("node.shutdown.BlockTime") : ""; diff --git a/common/src/main/resources/reference.conf b/common/src/main/resources/reference.conf index 76225aa0bed..ce162c7d6d7 100644 --- a/common/src/main/resources/reference.conf +++ b/common/src/main/resources/reference.conf @@ -174,7 +174,6 @@ node { walletExtensionApi = false listen.port = 18888 - connection.timeout = 2 fetchBlock.timeout = 500 # Number of blocks to fetch in one batch during sync. Range: [100, 2000]. @@ -211,15 +210,12 @@ node { isOpenFullTcpDisconnect = false inactiveThreshold = 600 // seconds - tcpNettyWorkThreadNum = 0 - udpNettyWorkThreadNum = 1 maxFastForwardNum = 4 activeConnectFactor = 0.1 connectFactor = 0.6 # Legacy alias `maxActiveNodesWithSameIp` is still accepted from user config # (see NodeConfig alias-fallback) but is intentionally NOT defaulted here — # shipping it in reference.conf would always mask the modern `maxConnectionsWithSameIp`. - channel.read.timeout = 0 metricsEnable = false p2p { diff --git a/framework/src/main/java/org/tron/core/config/args/Args.java b/framework/src/main/java/org/tron/core/config/args/Args.java index de8b7dba1ad..2d6660f9a6a 100644 --- a/framework/src/main/java/org/tron/core/config/args/Args.java +++ b/framework/src/main/java/org/tron/core/config/args/Args.java @@ -510,7 +510,7 @@ private static void applyBlockConfig(BlockConfig block) { * which are applied here after copying the bean value. * * @param nc the NodeConfig bean populated from config.conf "node" section - * node.discovery / node.channel.read.timeout (dot-notation paths + * node.discovery / (dot-notation paths * not part of the NodeConfig bean) */ @SuppressWarnings("checkstyle:MethodLength") @@ -578,7 +578,6 @@ private static void applyNodeConfig(NodeConfig nc) { // ---- Flat scalar fields ---- PARAMETER.nodeEffectiveCheckEnable = nc.isEffectiveCheckEnable(); - PARAMETER.nodeConnectionTimeout = nc.getConnectionTimeout() * 1000; // fetchBlock.timeout — range check [100, 1000], default 500 int fetchTimeout = nc.getFetchBlockTimeout(); @@ -606,8 +605,6 @@ private static void applyNodeConfig(NodeConfig nc) { PARAMETER.maxHttpConnectNumber = nc.getMaxHttpConnectNumber(); PARAMETER.netMaxTrxPerSecond = nc.getNetMaxTrxPerSecond(); - PARAMETER.tcpNettyWorkThreadNum = nc.getTcpNettyWorkThreadNum(); - PARAMETER.udpNettyWorkThreadNum = nc.getUdpNettyWorkThreadNum(); if (StringUtils.isEmpty(PARAMETER.trustNodeAddr)) { String trustNode = nc.getTrustNode(); @@ -654,7 +651,6 @@ private static void applyNodeConfig(NodeConfig nc) { // discovery (dot-notation, read in NodeConfig.fromConfig) PARAMETER.nodeDiscoveryEnable = nc.isDiscoveryEnable(); PARAMETER.nodeDiscoveryPersist = nc.isDiscoveryPersist(); - PARAMETER.nodeChannelReadTimeout = nc.getChannelReadTimeout(); // Legacy maxActiveNodes fallback handled in NodeConfig.fromConfig() diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index b180ecd6d10..d00f334f4ce 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -150,8 +150,6 @@ node { listen.port = 18888 - connection.timeout = 2 - fetchBlock.timeout = 200 # syncFetchBatchNum = 2000 diff --git a/framework/src/test/java/org/tron/common/ParameterTest.java b/framework/src/test/java/org/tron/common/ParameterTest.java index 1e7bbc1545c..563f487f635 100644 --- a/framework/src/test/java/org/tron/common/ParameterTest.java +++ b/framework/src/test/java/org/tron/common/ParameterTest.java @@ -76,12 +76,8 @@ public void testCommonParameter() { assertFalse(parameter.isNodeDiscoveryPersist()); parameter.setNodeEffectiveCheckEnable(false); assertFalse(parameter.isNodeEffectiveCheckEnable()); - parameter.setNodeConnectionTimeout(500); - assertEquals(500, parameter.getNodeConnectionTimeout()); parameter.setFetchBlockTimeout(500); assertEquals(500, parameter.getFetchBlockTimeout()); - parameter.setNodeChannelReadTimeout(500); - assertEquals(500, parameter.getNodeChannelReadTimeout()); parameter.setMaxConnections(500); assertEquals(500, parameter.getMaxConnections()); parameter.setMinConnections(500); @@ -170,10 +166,6 @@ public void testCommonParameter() { assertEquals(1, parameter.getAllowTvmSolidity059()); parameter.setForbidTransferToContract(1); assertEquals(1, parameter.getForbidTransferToContract()); - parameter.setTcpNettyWorkThreadNum(5); - assertEquals(5, parameter.getTcpNettyWorkThreadNum()); - parameter.setUdpNettyWorkThreadNum(5); - assertEquals(5, parameter.getUdpNettyWorkThreadNum()); parameter.setTrustNodeAddr("address"); assertEquals("address", parameter.getTrustNodeAddr()); parameter.setWalletExtensionApi(false); diff --git a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java index bb3d1c4b210..4b6b7ad0a7a 100644 --- a/framework/src/test/java/org/tron/core/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/ArgsTest.java @@ -94,7 +94,6 @@ public void get() { Assert.assertTrue(parameter.isNodeDiscoveryPersist()); Assert.assertEquals("46.168.1.1", parameter.getNodeExternalIp()); Assert.assertEquals(18888, parameter.getNodeListenPort()); - Assert.assertEquals(2000, parameter.getNodeConnectionTimeout()); Assert.assertEquals(0, parameter.getActiveNodes().size()); Assert.assertEquals(30, parameter.getMaxConnections()); Assert.assertEquals(43, parameter.getNodeP2pVersion()); diff --git a/framework/src/test/resources/args-test.conf b/framework/src/test/resources/args-test.conf index 13289949a50..db889483270 100644 --- a/framework/src/test/resources/args-test.conf +++ b/framework/src/test/resources/args-test.conf @@ -85,8 +85,6 @@ node { listen.port = 18888 - connection.timeout = 2 - active = [] maxConnections = 30 diff --git a/framework/src/test/resources/config-localtest.conf b/framework/src/test/resources/config-localtest.conf index d31705f39bd..4c6910e3d7a 100644 --- a/framework/src/test/resources/config-localtest.conf +++ b/framework/src/test/resources/config-localtest.conf @@ -77,12 +77,6 @@ node { listen.port = 6666 - connection.timeout = 2 - - tcpNettyWorkThreadNum = 0 - - udpNettyWorkThreadNum = 1 - # Number of validate sign thread, default availableProcessors / 2 # validateSignThreadNum = 16 diff --git a/framework/src/test/resources/config-test-index.conf b/framework/src/test/resources/config-test-index.conf index 72e4a04f612..583064a37f5 100644 --- a/framework/src/test/resources/config-test-index.conf +++ b/framework/src/test/resources/config-test-index.conf @@ -60,8 +60,6 @@ node.discovery = { node { listen.port = 18888 - connection.timeout = 2 - active = [ # Sample entries: # { url = "enode://@hostname.com:30303" } diff --git a/framework/src/test/resources/config-test-mainnet.conf b/framework/src/test/resources/config-test-mainnet.conf index 9f968c5628d..938812f8214 100644 --- a/framework/src/test/resources/config-test-mainnet.conf +++ b/framework/src/test/resources/config-test-mainnet.conf @@ -62,8 +62,6 @@ node { listen.port = 18888 - connection.timeout = 2 - active = [ # Sample entries: # { url = "enode://@hostname.com:30303" } diff --git a/framework/src/test/resources/config-test-storagetest.conf b/framework/src/test/resources/config-test-storagetest.conf index 39da9109cbf..113c8371ba1 100644 --- a/framework/src/test/resources/config-test-storagetest.conf +++ b/framework/src/test/resources/config-test-storagetest.conf @@ -85,8 +85,6 @@ node { listen.port = 18888 - connection.timeout = 2 - active = [ # Sample entries: # { url = "enode://@hostname.com:30303" } diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 21cebbfeef4..85172c37710 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -89,8 +89,6 @@ node { listen.port = 18888 - connection.timeout = 2 - active = [ # Sample entries: # { url = "enode://@hostname.com:30303" } From 9a2d60a43c4665ce0806f0444f5d01f7b45e29b4 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Sun, 10 May 2026 00:50:22 +0800 Subject: [PATCH 2/5] fix bug of NodeConfigTest --- .../test/java/org/tron/core/config/args/NodeConfigTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java index a52c51c1ba4..819dca07ee8 100644 --- a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java +++ b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java @@ -23,7 +23,6 @@ public void testDefaults() { Config empty = withRef(); NodeConfig nc = NodeConfig.fromConfig(empty); assertEquals(18888, nc.getListenPort()); - assertEquals(2, nc.getConnectionTimeout()); assertEquals(500, nc.getFetchBlockTimeout()); assertEquals(30, nc.getMaxConnections()); assertEquals(8, nc.getMinConnections()); @@ -32,7 +31,6 @@ public void testDefaults() { // reference.conf matches code default: discovery disabled when not configured assertFalse(nc.isDiscoveryEnable()); assertFalse(nc.isDiscoveryPersist()); - assertEquals(0, nc.getChannelReadTimeout()); } @Test @@ -42,7 +40,6 @@ public void testDotNotationFields() { + " fetchBlock { timeout = 300 }, solidity { threads = 4 } }"); NodeConfig nc = NodeConfig.fromConfig(config); assertEquals(19999, nc.getListenPort()); - assertEquals(5, nc.getConnectionTimeout()); assertEquals(300, nc.getFetchBlockTimeout()); assertEquals(4, nc.getSolidityThreads()); } From 4fad7e15ea7514fa2a74403f32ff219e611053e8 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Sun, 10 May 2026 01:07:20 +0800 Subject: [PATCH 3/5] remove allowShieldedTransactionApi from reference.conf --- common/src/main/resources/reference.conf | 2 +- .../tron/core/config/args/NodeConfigTest.java | 32 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/common/src/main/resources/reference.conf b/common/src/main/resources/reference.conf index ce162c7d6d7..688e1590788 100644 --- a/common/src/main/resources/reference.conf +++ b/common/src/main/resources/reference.conf @@ -193,7 +193,7 @@ node { minParticipationRate = 0 # Whether to enable shielded transaction API - allowShieldedTransactionApi = false + # allowShieldedTransactionApi = false # Whether to print config log at startup openPrintLog = true diff --git a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java index 819dca07ee8..5cfc5cdde94 100644 --- a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java +++ b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java @@ -301,6 +301,18 @@ public void testShieldedApiLegacyKeyRespected() { NodeConfig nc = NodeConfig.fromConfig( withRef("node.fullNodeAllowShieldedTransaction = true")); assertTrue(nc.isAllowShieldedTransactionApi()); + nc = NodeConfig.fromConfig( + withRef("node.fullNodeAllowShieldedTransaction = false")); + assertFalse(nc.isAllowShieldedTransactionApi()); + nc = NodeConfig.fromConfig( + withRef("node.allowShieldedTransactionApi = true")); + assertTrue(nc.isAllowShieldedTransactionApi()); + nc = NodeConfig.fromConfig( + withRef("node.allowShieldedTransactionApi = false")); + assertFalse(nc.isAllowShieldedTransactionApi()); + nc = NodeConfig.fromConfig( + withRef("")); + assertFalse(nc.isAllowShieldedTransactionApi()); } @Test @@ -308,9 +320,27 @@ public void testShieldedApiLegacyKeyTakesPriorityOverModern() { // Consistent with maxActiveNodesWithSameIp: legacy key presence wins over modern. NodeConfig nc = NodeConfig.fromConfig( withRef("node {\n" - + " allowShieldedTransactionApi = false\n" + + " allowShieldedTransactionApi = true\n" + " fullNodeAllowShieldedTransaction = true\n" + "}")); assertTrue(nc.isAllowShieldedTransactionApi()); + nc = NodeConfig.fromConfig( + withRef("node {\n" + + " allowShieldedTransactionApi = true\n" + + " fullNodeAllowShieldedTransaction = false\n" + + "}")); + assertTrue(nc.isAllowShieldedTransactionApi()); + nc = NodeConfig.fromConfig( + withRef("node {\n" + + " allowShieldedTransactionApi = false\n" + + " fullNodeAllowShieldedTransaction = true\n" + + "}")); + assertFalse(nc.isAllowShieldedTransactionApi()); + nc = NodeConfig.fromConfig( + withRef("node {\n" + + " allowShieldedTransactionApi = false\n" + + " fullNodeAllowShieldedTransaction = false\n" + + "}")); + assertFalse(nc.isAllowShieldedTransactionApi()); } } From 5b3cbc0ecde8f6b1b3d641618166a2eccae0603f Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Sun, 10 May 2026 10:08:26 +0800 Subject: [PATCH 4/5] add testcase of external.ip is null --- .../tron/core/config/args/NodeConfigTest.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java index 5cfc5cdde94..eba30465a57 100644 --- a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java +++ b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java @@ -316,7 +316,7 @@ public void testShieldedApiLegacyKeyRespected() { } @Test - public void testShieldedApiLegacyKeyTakesPriorityOverModern() { + public void testShieldedApiModernKeyTakesPriorityOverLegacy() { // Consistent with maxActiveNodesWithSameIp: legacy key presence wins over modern. NodeConfig nc = NodeConfig.fromConfig( withRef("node {\n" @@ -343,4 +343,41 @@ public void testShieldedApiLegacyKeyTakesPriorityOverModern() { + "}")); assertFalse(nc.isAllowShieldedTransactionApi()); } + + // ----- discovery.external.ip: null / "null" sentinel handling ----- + + @Test + public void testExternalIpAbsentDefaultsToEmpty() { + NodeConfig nc = NodeConfig.fromConfig(withRef()); + assertEquals("", nc.getDiscoveryExternalIp()); + } + + @Test + public void testExternalIpHoconNullTreatedAsEmpty() { + // HOCON `null` makes hasPath() return false; getString falls back to "". + NodeConfig nc = NodeConfig.fromConfig( + withRef("node.discovery.external.ip = null")); + assertEquals("", nc.getDiscoveryExternalIp()); + } + + @Test + public void testExternalIpStringNullSentinelConvertedToEmpty() { + // String literal "null" (case-insensitive) is an explicit sentinel that must map to "". + NodeConfig nc = NodeConfig.fromConfig( + withRef("node.discovery.external.ip = \"null\"")); + assertEquals("", nc.getDiscoveryExternalIp()); + + nc = NodeConfig.fromConfig( + withRef("node.discovery.external.ip = \"NULL\"")); + assertEquals("", nc.getDiscoveryExternalIp()); + } + + @Test + public void testExternalIpValidValuePreserved() { + NodeConfig nc = NodeConfig.fromConfig( + withRef("node.discovery.external.ip = \"1.2.3.4\"")); + assertEquals("1.2.3.4", nc.getDiscoveryExternalIp()); + } + + } From 8fea4e7b7ba4db11a127fa2d8c9e325808906f68 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Sun, 10 May 2026 10:21:35 +0800 Subject: [PATCH 5/5] change comment --- .../test/java/org/tron/core/config/args/NodeConfigTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java index eba30465a57..d4fbc05e730 100644 --- a/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java +++ b/common/src/test/java/org/tron/core/config/args/NodeConfigTest.java @@ -295,9 +295,6 @@ public void testShieldedApiModernKeyRespected() { @Test public void testShieldedApiLegacyKeyRespected() { - // Regression guard: reference.conf ships `allowShieldedTransactionApi = false`, which - // used to make the legacy-key fallback dead code. A user who only set the legacy key - // must still have their value honored. NodeConfig nc = NodeConfig.fromConfig( withRef("node.fullNodeAllowShieldedTransaction = true")); assertTrue(nc.isAllowShieldedTransactionApi()); @@ -317,7 +314,8 @@ public void testShieldedApiLegacyKeyRespected() { @Test public void testShieldedApiModernKeyTakesPriorityOverLegacy() { - // Consistent with maxActiveNodesWithSameIp: legacy key presence wins over modern. + // When both keys are set, the modern key wins; the legacy key is only used as fallback + // when modern is absent. NodeConfig nc = NodeConfig.fromConfig( withRef("node {\n" + " allowShieldedTransactionApi = true\n"