Skip to content

Commit e0f7edd

Browse files
committed
process invalid witness address
1 parent 28aaa52 commit e0f7edd

5 files changed

Lines changed: 145 additions & 81 deletions

File tree

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

Lines changed: 1 addition & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import org.tron.common.args.Witness;
5454
import org.tron.common.config.DbBackupConfig;
5555
import org.tron.common.cron.CronExpression;
56-
import org.tron.common.crypto.SignInterface;
5756
import org.tron.common.logsfilter.EventPluginConfig;
5857
import org.tron.common.logsfilter.FilterQuery;
5958
import org.tron.common.logsfilter.TriggerConfig;
@@ -62,19 +61,15 @@
6261
import org.tron.common.parameter.CommonParameter;
6362
import org.tron.common.parameter.RateLimiterInitialization;
6463
import org.tron.common.setting.RocksDbSettings;
65-
import org.tron.common.utils.ByteArray;
6664
import org.tron.common.utils.Commons;
6765
import org.tron.common.utils.LocalWitnesses;
6866
import org.tron.core.Constant;
6967
import org.tron.core.Wallet;
7068
import org.tron.core.config.Configuration;
7169
import org.tron.core.config.Parameter.NetConstants;
7270
import org.tron.core.config.Parameter.NodeConstant;
73-
import org.tron.core.exception.CipherException;
7471
import org.tron.core.exception.TronError;
7572
import org.tron.core.store.AccountStore;
76-
import org.tron.keystore.Credentials;
77-
import org.tron.keystore.WalletUtils;
7873
import org.tron.p2p.P2pConfig;
7974
import org.tron.p2p.dns.update.DnsType;
8075
import org.tron.p2p.dns.update.PublishConfig;
@@ -412,63 +407,7 @@ public static void setParam(final Config config) {
412407
PARAMETER.cryptoEngine = config.hasPath(Constant.CRYPTO_ENGINE) ? config
413408
.getString(Constant.CRYPTO_ENGINE) : Constant.ECKey_ENGINE;
414409

415-
if (StringUtils.isNoneBlank(PARAMETER.privateKey)) {
416-
localWitnesses = (new LocalWitnesses(PARAMETER.privateKey));
417-
byte[] witnessAddress = null;
418-
if (StringUtils.isNoneBlank(PARAMETER.witnessAddress)) {
419-
witnessAddress = Commons.decodeFromBase58Check(PARAMETER.witnessAddress);
420-
if (witnessAddress != null) {
421-
logger.debug("Got localWitnessAccountAddress from cmd");
422-
} else {
423-
PARAMETER.witnessAddress = "";
424-
logger.warn(IGNORE_WRONG_WITNESS_ADDRESS_FORMAT);
425-
}
426-
}
427-
localWitnesses.initWitnessAccountAddress(witnessAddress, PARAMETER.isECKeyCryptoEngine());
428-
logger.debug("Got privateKey from cmd");
429-
} else if (config.hasPath(Constant.LOCAL_WITNESS)) {
430-
localWitnesses = new LocalWitnesses();
431-
byte[] witnessAddress = getWitnessAddress(config);
432-
List<String> localwitness = config.getStringList(Constant.LOCAL_WITNESS);
433-
if (!localwitness.isEmpty()) {
434-
localWitnesses.setPrivateKeys(localwitness);
435-
logger.debug("Got privateKey from config.conf");
436-
}
437-
localWitnesses.initWitnessAccountAddress(witnessAddress, PARAMETER.isECKeyCryptoEngine());
438-
} else if (config.hasPath(Constant.LOCAL_WITNESS_KEYSTORE)) {
439-
localWitnesses = new LocalWitnesses();
440-
List<String> privateKeys = new ArrayList<String>();
441-
if (PARAMETER.isWitness()) {
442-
List<String> localwitness = config.getStringList(Constant.LOCAL_WITNESS_KEYSTORE);
443-
if (!localwitness.isEmpty()) {
444-
String fileName = System.getProperty("user.dir") + "/" + localwitness.get(0);
445-
String password;
446-
if (StringUtils.isEmpty(PARAMETER.password)) {
447-
System.out.println("Please input your password.");
448-
password = WalletUtils.inputPassword();
449-
} else {
450-
password = PARAMETER.password;
451-
PARAMETER.password = null;
452-
}
453-
454-
try {
455-
Credentials credentials = WalletUtils
456-
.loadCredentials(password, new File(fileName));
457-
SignInterface sign = credentials.getSignInterface();
458-
String prikey = ByteArray.toHexString(sign.getPrivateKey());
459-
privateKeys.add(prikey);
460-
} catch (IOException | CipherException e) {
461-
logger.error("Witness node start failed!");
462-
throw new TronError(e, TronError.ErrCode.WITNESS_KEYSTORE_LOAD);
463-
}
464-
}
465-
}
466-
localWitnesses.setPrivateKeys(privateKeys);
467-
byte[] witnessAddress = getWitnessAddress(config);
468-
localWitnesses.initWitnessAccountAddress(witnessAddress, PARAMETER.isECKeyCryptoEngine());
469-
logger.debug("Got privateKey from keystore");
470-
}
471-
410+
localWitnesses = new WitnessInitializer(config).initLocalWitnesses();
472411
if (PARAMETER.isWitness()
473412
&& CollectionUtils.isEmpty(localWitnesses.getPrivateKeys())) {
474413
throw new TronError("This is a witness node, but localWitnesses is null",
@@ -1819,20 +1758,6 @@ public static void logConfig() {
18191758
logger.info("\n");
18201759
}
18211760

1822-
private static byte[] getWitnessAddress(Config config) {
1823-
byte[] witnessAddress = null;
1824-
if (config.hasPath(Constant.LOCAL_WITNESS_ACCOUNT_ADDRESS)) {
1825-
witnessAddress = Commons
1826-
.decodeFromBase58Check(config.getString(Constant.LOCAL_WITNESS_ACCOUNT_ADDRESS));
1827-
if (witnessAddress != null) {
1828-
logger.debug("Got localWitnessAccountAddress from config.conf");
1829-
} else {
1830-
logger.warn(IGNORE_WRONG_WITNESS_ADDRESS_FORMAT);
1831-
}
1832-
}
1833-
return witnessAddress;
1834-
}
1835-
18361761
/**
18371762
* get output directory.
18381763
*/
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package org.tron.core.config.args;
2+
3+
import com.typesafe.config.Config;
4+
import java.io.File;
5+
import java.io.IOException;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.apache.commons.lang3.StringUtils;
10+
import org.tron.common.crypto.SignInterface;
11+
import org.tron.common.utils.ByteArray;
12+
import org.tron.common.utils.Commons;
13+
import org.tron.common.utils.LocalWitnesses;
14+
import org.tron.core.Constant;
15+
import org.tron.core.exception.CipherException;
16+
import org.tron.core.exception.TronError;
17+
import org.tron.keystore.Credentials;
18+
import org.tron.keystore.WalletUtils;
19+
20+
@Slf4j
21+
public class WitnessInitializer {
22+
23+
private final Config config;
24+
25+
private LocalWitnesses localWitnesses;
26+
27+
public WitnessInitializer(Config config) {
28+
this.config = config;
29+
}
30+
31+
public LocalWitnesses initLocalWitnesses() {
32+
localWitnesses = new LocalWitnesses();
33+
34+
if (!Args.PARAMETER.isWitness()) {
35+
return localWitnesses;
36+
}
37+
38+
if (tryInitFromCommandLine()) {
39+
return localWitnesses;
40+
}
41+
42+
if (tryInitFromConfig()) {
43+
return localWitnesses;
44+
}
45+
46+
tryInitFromKeystore();
47+
48+
return localWitnesses;
49+
}
50+
51+
private boolean tryInitFromCommandLine() {
52+
if (StringUtils.isNotBlank(Args.PARAMETER.privateKey)) {
53+
byte[] witnessAddress = null;
54+
localWitnesses = new LocalWitnesses(Args.PARAMETER.privateKey);
55+
if (StringUtils.isNotBlank(Args.PARAMETER.witnessAddress)) {
56+
witnessAddress = Commons.decodeFromBase58Check(Args.PARAMETER.witnessAddress);
57+
if (witnessAddress != null) {
58+
logger.debug("Got localWitnessAccountAddress from cmd");
59+
} else {
60+
throw new TronError("LocalWitnessAccountAddress format from cmd is incorrect",
61+
TronError.ErrCode.WITNESS_INIT);
62+
}
63+
}
64+
localWitnesses.initWitnessAccountAddress(witnessAddress,
65+
Args.PARAMETER.isECKeyCryptoEngine());
66+
logger.debug("Got privateKey from cmd");
67+
return true;
68+
}
69+
return false;
70+
}
71+
72+
private boolean tryInitFromConfig() {
73+
if (config.hasPath(Constant.LOCAL_WITNESS) && !config.getStringList(Constant.LOCAL_WITNESS)
74+
.isEmpty()) {
75+
List<String> localWitness = config.getStringList(Constant.LOCAL_WITNESS);
76+
localWitnesses.setPrivateKeys(localWitness);
77+
logger.debug("Got privateKey from config.conf");
78+
byte[] witnessAddress = getWitnessAddress();
79+
localWitnesses.initWitnessAccountAddress(witnessAddress,
80+
Args.PARAMETER.isECKeyCryptoEngine());
81+
return true;
82+
}
83+
return false;
84+
}
85+
86+
private void tryInitFromKeystore() {
87+
if (config.hasPath(Constant.LOCAL_WITNESS_KEYSTORE)) {
88+
List<String> localWitness = config.getStringList(Constant.LOCAL_WITNESS_KEYSTORE);
89+
if (!localWitness.isEmpty()) {
90+
List<String> privateKeys = new ArrayList<>();
91+
String fileName = System.getProperty("user.dir") + "/" + localWitness.get(0);
92+
String password;
93+
if (StringUtils.isEmpty(Args.PARAMETER.password)) {
94+
System.out.println("Please input your password.");
95+
password = WalletUtils.inputPassword();
96+
} else {
97+
password = Args.PARAMETER.password;
98+
Args.PARAMETER.password = null;
99+
}
100+
101+
try {
102+
Credentials credentials = WalletUtils
103+
.loadCredentials(password, new File(fileName));
104+
SignInterface sign = credentials.getSignInterface();
105+
String prikey = ByteArray.toHexString(sign.getPrivateKey());
106+
privateKeys.add(prikey);
107+
} catch (IOException | CipherException e) {
108+
logger.error("Witness node start failed!");
109+
throw new TronError(e, TronError.ErrCode.WITNESS_KEYSTORE_LOAD);
110+
}
111+
112+
localWitnesses.setPrivateKeys(privateKeys);
113+
byte[] witnessAddress = getWitnessAddress();
114+
localWitnesses.initWitnessAccountAddress(witnessAddress,
115+
Args.PARAMETER.isECKeyCryptoEngine());
116+
logger.debug("Got privateKey from keystore");
117+
}
118+
}
119+
}
120+
121+
private byte[] getWitnessAddress() {
122+
byte[] witnessAddress = null;
123+
if (config.hasPath(Constant.LOCAL_WITNESS_ACCOUNT_ADDRESS)) {
124+
if (localWitnesses.getPrivateKeys().size() != 1) {
125+
throw new TronError(
126+
"LocalWitnessAccountAddress can only be set when there is only one private key",
127+
TronError.ErrCode.WITNESS_INIT);
128+
}
129+
witnessAddress = Commons
130+
.decodeFromBase58Check(config.getString(Constant.LOCAL_WITNESS_ACCOUNT_ADDRESS));
131+
if (witnessAddress != null) {
132+
logger.debug("Got localWitnessAccountAddress from config.conf");
133+
} else {
134+
throw new TronError("LocalWitnessAccountAddress format from config is incorrect",
135+
TronError.ErrCode.WITNESS_INIT);
136+
}
137+
}
138+
return witnessAddress;
139+
}
140+
}

framework/src/main/java/org/tron/core/metrics/node/NodeMetricManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import org.springframework.beans.factory.annotation.Autowired;
55
import org.springframework.stereotype.Component;
66
import org.tron.common.backup.BackupManager;
7-
import org.tron.common.parameter.CommonParameter;
8-
import org.tron.common.utils.ByteUtil;
7+
import org.tron.common.utils.ByteArray;
98
import org.tron.core.ChainBaseManager;
109
import org.tron.core.config.args.Args;
1110
import org.tron.program.Version;
@@ -38,7 +37,7 @@ private void setNodeInfo(NodeInfo nodeInfo) {
3837
nodeInfo.setIp(Args.getInstance().getNodeExternalIp());
3938

4039
byte[] witnessAccountAddress = Args.getLocalWitnesses().getWitnessAccountAddress();
41-
ByteString witnessAddress = !ByteUtil.isNullOrZeroArray(witnessAccountAddress) ? ByteString
40+
ByteString witnessAddress = !ByteArray.isEmpty(witnessAccountAddress) ? ByteString
4241
.copyFrom(witnessAccountAddress) : null;
4342
if (chainBaseManager.getWitnessScheduleStore().getActiveWitnesses().contains(witnessAddress)) {
4443
nodeInfo.setNodeType(1);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public void testConstructor() {
198198
@Test
199199
public void testLocalWitnessConfig() throws IOException {
200200
Args.setParam(
201-
new String[]{"--output-directory", temporaryFolder.newFolder().toString(), "--debug"},
201+
new String[]{"--output-directory", temporaryFolder.newFolder().toString(), "-w", "--debug"},
202202
"config-localtest.conf");
203203
LocalWitnesses witness = Args.getLocalWitnesses();
204204
Assert.assertNotNull(witness.getPrivateKey());

framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public class ShieldedReceiveTest extends BaseTest {
128128
private static boolean init;
129129

130130
static {
131-
Args.setParam(new String[]{"--output-directory", dbPath()}, "config-localtest.conf");
131+
Args.setParam(new String[]{"--output-directory", dbPath(), "-w"}, "config-localtest.conf");
132132
ADDRESS_ONE_PRIVATE_KEY = getRandomPrivateKey();
133133
FROM_ADDRESS = getHexAddressByPrivateKey(ADDRESS_ONE_PRIVATE_KEY);
134134
}

0 commit comments

Comments
 (0)