From f55e9cf56a3272b3ca1ee0a3b5bd6492ec97a649 Mon Sep 17 00:00:00 2001 From: vividctrlalt Date: Mon, 16 Mar 2026 06:02:33 +0000 Subject: [PATCH 1/2] fix(config): deprecate CLI params and add safety guardrails for #6569 review follow-up - Mark 23 config-file-replaceable CLI parameters as @Deprecated in CLIParameter - Add runtime deprecation warning via reflection when deprecated CLI options are used - Add max(3_000_000L, ...) guardrail for --max-energy-limit-for-constant CLI path, consistent with config-file validation (addresses waynercheung's review feedback) - Document seedNodes positional parameter behavior and add deprecation warning - Retain 11 essential CLI params: -c, -d, --log-config, -h, -v, -w, -p, --witness-address, --password, --keystore-factory, --debug --- .../java/org/tron/core/config/args/Args.java | 23 ++++++++++++- .../tron/core/config/args/CLIParameter.java | 34 +++++++++++++++++-- 2 files changed, 54 insertions(+), 3 deletions(-) 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 0e71294d78..475d229b11 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 @@ -998,6 +998,21 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) { .map(ParameterDescription::getLongestName) .collect(Collectors.toSet()); + jc.getParameters().stream() + .filter(ParameterDescription::isAssigned) + .filter(pd -> { + try { + return CLIParameter.class.getDeclaredField(pd.getParameterized().getName()) + .isAnnotationPresent(Deprecated.class); + } catch (NoSuchFieldException e) { + return false; + } + }) + .forEach(pd -> logger.warn( + "CLI option '{}' is deprecated and will be removed in a future release. " + + "Please use the corresponding config-file option instead.", + pd.getLongestName())); + if (assigned.contains("--output-directory")) { PARAMETER.outputDirectory = cmd.outputDirectory; } @@ -1008,7 +1023,8 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) { PARAMETER.supportConstant = cmd.supportConstant; } if (assigned.contains("--max-energy-limit-for-constant")) { - PARAMETER.maxEnergyLimitForConstant = cmd.maxEnergyLimitForConstant; + PARAMETER.maxEnergyLimitForConstant = max(3_000_000L, + cmd.maxEnergyLimitForConstant, true); } if (assigned.contains("--lru-cache-size")) { PARAMETER.lruCacheSize = cmd.lruCacheSize; @@ -1091,7 +1107,12 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) { if (assigned.contains("--log-config")) { PARAMETER.logbackPath = cmd.logbackPath; } + // seedNodes is a JCommander positional (main) parameter, which does not support + // isAssigned(). An empty-check is used instead — this is safe because the default + // is an empty list, so non-empty means the user explicitly passed values on CLI. if (!cmd.seedNodes.isEmpty()) { + logger.warn("Positional seed-node arguments are deprecated. " + + "Please use seed.node.ip.list in the config file instead."); List seeds = new ArrayList<>(); for (String s : cmd.seedNodes) { seeds.add(NetUtil.parseInetSocketAddress(s)); diff --git a/framework/src/main/java/org/tron/core/config/args/CLIParameter.java b/framework/src/main/java/org/tron/core/config/args/CLIParameter.java index b5bd0e2e85..4d68a6990c 100644 --- a/framework/src/main/java/org/tron/core/config/args/CLIParameter.java +++ b/framework/src/main/java/org/tron/core/config/args/CLIParameter.java @@ -10,6 +10,9 @@ * Fields here have NO default values — defaults live in CommonParameter. * JCommander only populates fields that are explicitly passed on the * command line. + * + *

Parameters marked {@code @Deprecated} are scheduled for removal. + * Use the corresponding config-file options instead.

*/ @NoArgsConstructor public class CLIParameter { @@ -44,63 +47,78 @@ public class CLIParameter { @Parameter(names = {"--password"}, description = "password") public String password; + @Deprecated @Parameter(names = {"--solidity"}, description = "running a solidity node for java tron") public boolean solidityNode; @Parameter(names = {"--keystore-factory"}, description = "running KeystoreFactory") public boolean keystoreFactory; + @Deprecated @Parameter(names = {"--fast-forward"}) public boolean fastForward; + @Deprecated @Parameter(names = {"--es"}, description = "Start event subscribe server") public boolean eventSubscribe; + @Deprecated @Parameter(names = {"--p2p-disable"}, description = "Switch for p2p module initialization. " + "(default: false)", arity = 1) public boolean p2pDisable; + @Deprecated @Parameter(description = "--seed-nodes") public List seedNodes = new ArrayList<>(); - // -- Storage parameters -- + // -- Storage parameters (deprecated, use config file instead) -- + @Deprecated @Parameter(names = {"--storage-db-directory"}, description = "Storage db directory") public String storageDbDirectory; + @Deprecated @Parameter(names = {"--storage-db-engine"}, description = "Storage db engine.(leveldb or rocksdb)") public String storageDbEngine; + @Deprecated @Parameter(names = {"--storage-db-synchronous"}, description = "Storage db is synchronous or not.(true or false)") public String storageDbSynchronous; + @Deprecated @Parameter(names = {"--storage-index-directory"}, description = "Storage index directory") public String storageIndexDirectory; + @Deprecated @Parameter(names = {"--storage-index-switch"}, description = "Storage index switch.(on or off)") public String storageIndexSwitch; + @Deprecated @Parameter(names = {"--storage-transactionHistory-switch"}, description = "Storage transaction history switch.(on or off)") public String storageTransactionHistorySwitch; + @Deprecated @Parameter(names = {"--contract-parse-enable"}, description = "Switch for contract parses in " + "java-tron. (default: true)") public String contractParseEnable; - // -- Runtime parameters -- + // -- Runtime parameters (deprecated except --debug, use config file instead) -- + @Deprecated @Parameter(names = {"--support-constant"}, description = "Support constant calling for TVM. " + "(default: false)") public boolean supportConstant; + @Deprecated @Parameter(names = {"--max-energy-limit-for-constant"}, description = "Max energy limit for constant calling. (default: 100,000,000)") public long maxEnergyLimitForConstant; + @Deprecated @Parameter(names = {"--lru-cache-size"}, description = "Max LRU size for caching bytecode and " + "result of JUMPDEST analysis. (default: 500)") public int lruCacheSize; @@ -109,48 +127,60 @@ public class CLIParameter { + "will not check for timeout. (default: false)") public boolean debug; + @Deprecated @Parameter(names = {"--min-time-ratio"}, description = "Minimum CPU tolerance when executing " + "timeout transactions while synchronizing blocks. (default: 0.0)") public double minTimeRatio; + @Deprecated @Parameter(names = {"--max-time-ratio"}, description = "Maximum CPU tolerance when executing " + "non-timeout transactions while synchronizing blocks. (default: 5.0)") public double maxTimeRatio; + @Deprecated @Parameter(names = {"--save-internaltx"}, description = "Save internal transactions generated " + "during TVM execution, such as create, call and suicide. (default: false)") public boolean saveInternalTx; + @Deprecated @Parameter(names = {"--save-featured-internaltx"}, description = "Save featured internal " + "transactions generated during TVM execution, such as freeze, vote and so on. " + "(default: false)") public boolean saveFeaturedInternalTx; + @Deprecated @Parameter(names = {"--save-cancel-all-unfreeze-v2-details"}, description = "Record the details of the internal transactions generated by the " + "CANCELALLUNFREEZEV2 opcode, such as bandwidth/energy/tronpower cancel amount. " + "(default: false)") public boolean saveCancelAllUnfreezeV2Details; + @Deprecated @Parameter(names = {"--long-running-time"}) public int longRunningTime; + @Deprecated @Parameter(names = {"--max-connect-number"}, description = "Http server max connect number " + "(default:50)") public int maxHttpConnectNumber; + @Deprecated @Parameter(names = {"--rpc-thread"}, description = "Num of gRPC thread") public int rpcThreadNum; + @Deprecated @Parameter(names = {"--solidity-thread"}, description = "Num of solidity thread") public int solidityThreads; + @Deprecated @Parameter(names = {"--validate-sign-thread"}, description = "Num of validate thread") public int validateSignThreadNum; + @Deprecated @Parameter(names = {"--trust-node"}, description = "Trust node addr") public String trustNodeAddr; + @Deprecated @Parameter(names = {"--history-balance-lookup"}) public boolean historyBalanceLookup; } From 84027da2487c6f55a05a1b2ab7bd9df44b5681f0 Mon Sep 17 00:00:00 2001 From: vividctrlalt Date: Mon, 16 Mar 2026 17:38:39 +0000 Subject: [PATCH 2/2] fix(config): add deprecated hints to --help output for CLI params Mark deprecated options with "(deprecated)" in help text and add a note below the Usage line that positional seedNode args are deprecated. --- .../java/org/tron/core/config/args/Args.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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 475d229b11..533e7a663c 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 @@ -1698,6 +1698,9 @@ public static void printHelp(JCommander jCommander) { jCommander.getProgramName(); helpStr.append(String.format("%nUsage: java -jar %s [options] [seedNode ...]%n", programName)); + helpStr.append(String.format( + "%nNote: Positional seedNode arguments are deprecated." + + " Use seed.node.ip.list in the config file instead.%n")); helpStr.append(String.format("%nVERSION: %n%s-%s%n", Version.getVersion(), getCommitIdAbbrev())); @@ -1719,9 +1722,21 @@ public static void printHelp(JCommander jCommander) { logger.warn("Miss option:{}", option); continue; } + boolean isDeprecated; + try { + isDeprecated = CLIParameter.class.getDeclaredField( + parameterDescription.getParameterized().getName()) + .isAnnotationPresent(Deprecated.class); + } catch (NoSuchFieldException e) { + isDeprecated = false; + } + String desc = upperFirst(parameterDescription.getDescription()); + if (isDeprecated) { + desc += " (deprecated)"; + } String tmpOptionDesc = String.format("%s\t\t\t%s%n", Strings.padEnd(parameterDescription.getNames(), optionMaxLength, ' '), - upperFirst(parameterDescription.getDescription())); + desc); helpStr.append(tmpOptionDesc); } }