From 6533628056d52adf99df267603d23ce9b1f869fb Mon Sep 17 00:00:00 2001 From: federico Date: Thu, 19 Mar 2026 20:13:34 +0800 Subject: [PATCH] refactor(toolkit): move keystore-factory to plugins module --- .../common/parameter/CommonParameter.java | 6 --- .../common/crypto}/keystore/Credentials.java | 2 +- .../tron/common/crypto}/keystore/Wallet.java | 5 +- .../common/crypto}/keystore/WalletFile.java | 2 +- .../common/crypto}/keystore/WalletUtils.java | 9 ++-- .../src/main/java/org/tron/core/Wallet.java | 8 ++-- .../java/org/tron/core/config/args/Args.java | 5 +- .../tron/core/config/args/CLIParameter.java | 3 -- .../core/config/args/WitnessInitializer.java | 4 +- .../tron/core/zen/address/DiversifierT.java | 2 +- .../main/java/org/tron/program/FullNode.java | 4 -- .../PrecompiledContractsVerifyProofTest.java | 2 +- .../org/tron/core/config/args/ArgsTest.java | 2 - .../config/args/WitnessInitializerTest.java | 4 +- .../tron/core/db/TransactionExpireTest.java | 4 +- .../org/tron/core/db/TxCacheDBInitTest.java | 4 +- .../java/org/tron/core/db/TxCacheDBTest.java | 4 +- .../org/tron/core/jsonrpc/ApiUtilTest.java | 2 +- .../tron/core/zksnark/SendCoinShieldTest.java | 13 ++--- .../core/zksnark/ShieldedReceiveTest.java | 16 +++---- .../org/tron/keystore/CredentialsTest.java | 4 +- .../org/tron/keystore/WalletFileTest.java | 4 +- .../org/tron/keystroe/CredentialsTest.java | 2 +- .../java/org/tron/program/SupplementTest.java | 4 +- plugins/README.md | 48 +++++++++++++++++++ plugins/build.gradle | 8 +++- .../org/tron/plugins}/KeystoreFactory.java | 23 ++++----- .../java/common/org/tron/plugins/Toolkit.java | 7 ++- 28 files changed, 120 insertions(+), 81 deletions(-) rename {framework/src/main/java/org/tron => crypto/src/main/java/org/tron/common/crypto}/keystore/Credentials.java (97%) rename {framework/src/main/java/org/tron => crypto/src/main/java/org/tron/common/crypto}/keystore/Wallet.java (98%) rename {framework/src/main/java/org/tron => crypto/src/main/java/org/tron/common/crypto}/keystore/WalletFile.java (99%) rename {framework/src/main/java/org/tron => crypto/src/main/java/org/tron/common/crypto}/keystore/WalletUtils.java (95%) rename {framework/src/main/java/org/tron/program => plugins/src/main/java/common/org/tron/plugins}/KeystoreFactory.java (90%) mode change 100755 => 100644 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 fbb39a13288..141c41bb849 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -153,12 +153,6 @@ public class CommonParameter { @Setter public boolean solidityNode = false; - // If you are running KeystoreFactory, - // this flag is set to true - @Getter - @Setter - public boolean keystoreFactory = false; - // -- RPC / HTTP -- @Getter @Setter diff --git a/framework/src/main/java/org/tron/keystore/Credentials.java b/crypto/src/main/java/org/tron/common/crypto/keystore/Credentials.java similarity index 97% rename from framework/src/main/java/org/tron/keystore/Credentials.java rename to crypto/src/main/java/org/tron/common/crypto/keystore/Credentials.java index 1c44b21a80c..75431c8c4f7 100644 --- a/framework/src/main/java/org/tron/keystore/Credentials.java +++ b/crypto/src/main/java/org/tron/common/crypto/keystore/Credentials.java @@ -1,4 +1,4 @@ -package org.tron.keystore; +package org.tron.common.crypto.keystore; import java.util.Objects; import org.tron.common.crypto.SignInterface; diff --git a/framework/src/main/java/org/tron/keystore/Wallet.java b/crypto/src/main/java/org/tron/common/crypto/keystore/Wallet.java similarity index 98% rename from framework/src/main/java/org/tron/keystore/Wallet.java rename to crypto/src/main/java/org/tron/common/crypto/keystore/Wallet.java index d38b1c74984..c07a8d25e82 100644 --- a/framework/src/main/java/org/tron/keystore/Wallet.java +++ b/crypto/src/main/java/org/tron/common/crypto/keystore/Wallet.java @@ -1,4 +1,4 @@ -package org.tron.keystore; +package org.tron.common.crypto.keystore; import static java.nio.charset.StandardCharsets.UTF_8; @@ -23,7 +23,6 @@ import org.tron.common.crypto.SignUtils; import org.tron.common.utils.ByteArray; import org.tron.common.utils.StringUtil; -import org.tron.core.config.args.Args; import org.tron.core.exception.CipherException; /** @@ -212,7 +211,7 @@ public static SignInterface decrypt(String password, WalletFile walletFile) byte[] encryptKey = Arrays.copyOfRange(derivedKey, 0, 16); byte[] privateKey = performCipherOperation(Cipher.DECRYPT_MODE, iv, encryptKey, cipherText); - return SignUtils.fromPrivate(privateKey, Args.getInstance().isECKeyCryptoEngine()); + return SignUtils.fromPrivate(privateKey, true); } static void validate(WalletFile walletFile) throws CipherException { diff --git a/framework/src/main/java/org/tron/keystore/WalletFile.java b/crypto/src/main/java/org/tron/common/crypto/keystore/WalletFile.java similarity index 99% rename from framework/src/main/java/org/tron/keystore/WalletFile.java rename to crypto/src/main/java/org/tron/common/crypto/keystore/WalletFile.java index 1f5135fefd3..0571f75731b 100644 --- a/framework/src/main/java/org/tron/keystore/WalletFile.java +++ b/crypto/src/main/java/org/tron/common/crypto/keystore/WalletFile.java @@ -1,4 +1,4 @@ -package org.tron.keystore; +package org.tron.common.crypto.keystore; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.JsonSubTypes; diff --git a/framework/src/main/java/org/tron/keystore/WalletUtils.java b/crypto/src/main/java/org/tron/common/crypto/keystore/WalletUtils.java similarity index 95% rename from framework/src/main/java/org/tron/keystore/WalletUtils.java rename to crypto/src/main/java/org/tron/common/crypto/keystore/WalletUtils.java index 8bcc68cbab0..efb35c6dfe6 100644 --- a/framework/src/main/java/org/tron/keystore/WalletUtils.java +++ b/crypto/src/main/java/org/tron/common/crypto/keystore/WalletUtils.java @@ -1,4 +1,4 @@ -package org.tron.keystore; +package org.tron.common.crypto.keystore; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -17,7 +17,6 @@ import org.tron.common.crypto.SignInterface; import org.tron.common.crypto.SignUtils; import org.tron.common.utils.Utils; -import org.tron.core.config.args.Args; import org.tron.core.exception.CipherException; /** @@ -48,11 +47,9 @@ public static String generateLightNewWalletFile(String password, File destinatio public static String generateNewWalletFile( String password, File destinationDirectory, boolean useFullScrypt) - throws CipherException, IOException, InvalidAlgorithmParameterException, - NoSuchAlgorithmException, NoSuchProviderException { + throws CipherException, IOException { - SignInterface ecKeyPair = SignUtils.getGeneratedRandomSign(Utils.getRandom(), - Args.getInstance().isECKeyCryptoEngine()); + SignInterface ecKeyPair = SignUtils.getGeneratedRandomSign(Utils.getRandom(), true); return generateWalletFile(password, ecKeyPair, destinationDirectory, useFullScrypt); } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 8c86f2f66ac..c8a05ca976d 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -780,7 +780,7 @@ public WitnessList getPaginatedNowWitnessList(long offset, long limit) throws if (limit > WITNESS_COUNT_LIMIT_MAX) { limit = WITNESS_COUNT_LIMIT_MAX; } - + /* In the maintenance period, the VoteStores will be cleared. To avoid the race condition of VoteStores deleted but Witness vote counts not updated, @@ -1502,8 +1502,8 @@ public Protocol.ChainParameters getChainParameters() { builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() .setKey("getAllowTvmSelfdestructRestriction") .setValue(dbManager.getDynamicPropertiesStore().getAllowTvmSelfdestructRestriction()) - .build()); - + .build()); + builder.addChainParameter(Protocol.ChainParameters.ChainParameter.newBuilder() .setKey("getProposalExpireTime") .setValue(dbManager.getDynamicPropertiesStore().getProposalExpireTime()) @@ -2603,7 +2603,7 @@ public DiversifierMessage getDiversifier() throws ZksnarkException { byte[] d; while (true) { - d = org.tron.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE); + d = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE); if (JLibrustzcash.librustzcashCheckDiversifier(d)) { break; } 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 0e71294d786..c98b1d501ae 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 @@ -1064,9 +1064,6 @@ private static void applyCLIParams(CLIParameter cmd, JCommander jc) { if (assigned.contains("--solidity")) { PARAMETER.solidityNode = cmd.solidityNode; } - if (assigned.contains("--keystore-factory")) { - PARAMETER.keystoreFactory = cmd.keystoreFactory; - } if (assigned.contains("--rpc-thread")) { PARAMETER.rpcThreadNum = cmd.rpcThreadNum; } @@ -1733,7 +1730,7 @@ private static String getCommitIdAbbrev() { private static Map getOptionGroup() { String[] tronOption = new String[] {"version", "help", "shellConfFileName", "logbackPath", - "eventSubscribe", "solidityNode", "keystoreFactory"}; + "eventSubscribe", "solidityNode"}; String[] dbOption = new String[] {"outputDirectory"}; String[] witnessOption = new String[] {"witness", "privateKey"}; String[] vmOption = new String[] {"debug"}; 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 b5bd0e2e85a..d6f2ca1508c 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 @@ -47,9 +47,6 @@ public class CLIParameter { @Parameter(names = {"--solidity"}, description = "running a solidity node for java tron") public boolean solidityNode; - @Parameter(names = {"--keystore-factory"}, description = "running KeystoreFactory") - public boolean keystoreFactory; - @Parameter(names = {"--fast-forward"}) public boolean fastForward; diff --git a/framework/src/main/java/org/tron/core/config/args/WitnessInitializer.java b/framework/src/main/java/org/tron/core/config/args/WitnessInitializer.java index 30711eb6190..5a4a09e78c8 100644 --- a/framework/src/main/java/org/tron/core/config/args/WitnessInitializer.java +++ b/framework/src/main/java/org/tron/core/config/args/WitnessInitializer.java @@ -7,13 +7,13 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.tron.common.crypto.SignInterface; +import org.tron.common.crypto.keystore.Credentials; +import org.tron.common.crypto.keystore.WalletUtils; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; import org.tron.common.utils.LocalWitnesses; import org.tron.core.exception.CipherException; import org.tron.core.exception.TronError; -import org.tron.keystore.Credentials; -import org.tron.keystore.WalletUtils; @Slf4j public class WitnessInitializer { diff --git a/framework/src/main/java/org/tron/core/zen/address/DiversifierT.java b/framework/src/main/java/org/tron/core/zen/address/DiversifierT.java index fa614e141d9..15170b0dbb0 100644 --- a/framework/src/main/java/org/tron/core/zen/address/DiversifierT.java +++ b/framework/src/main/java/org/tron/core/zen/address/DiversifierT.java @@ -3,10 +3,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import org.tron.common.crypto.keystore.Wallet; import org.tron.common.zksnark.JLibrustzcash; import org.tron.core.Constant; import org.tron.core.exception.ZksnarkException; -import org.tron.keystore.Wallet; @AllArgsConstructor public class DiversifierT { diff --git a/framework/src/main/java/org/tron/program/FullNode.java b/framework/src/main/java/org/tron/program/FullNode.java index 95257d77f8e..2e6c2457ebb 100644 --- a/framework/src/main/java/org/tron/program/FullNode.java +++ b/framework/src/main/java/org/tron/program/FullNode.java @@ -32,10 +32,6 @@ public static void main(String[] args) { SolidityNode.start(); return; } - if (parameter.isKeystoreFactory()) { - KeystoreFactory.start(); - return; - } logger.info("Full node running."); if (Args.getInstance().isDebug()) { logger.info("in debug mode, it won't check energy time"); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java index 27e7891e6d8..7050c552e8a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsVerifyProofTest.java @@ -15,6 +15,7 @@ import org.junit.Test; import org.tron.api.GrpcAPI.ShieldedTRC20Parameters; import org.tron.common.BaseTest; +import org.tron.common.crypto.keystore.Wallet; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.FileUtil; @@ -41,7 +42,6 @@ import org.tron.core.zen.address.PaymentAddress; import org.tron.core.zen.address.SpendingKey; import org.tron.core.zen.note.Note; -import org.tron.keystore.Wallet; import org.tron.protos.contract.ShieldContract; @Slf4j 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 a4ce9a5030e..76315aec8f9 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 @@ -130,8 +130,6 @@ public void get() { Assert.assertEquals(address, ByteArray.toHexString(Args.getLocalWitnesses() .getWitnessAccountAddress())); - - Assert.assertTrue(parameter.isKeystoreFactory()); } @Test diff --git a/framework/src/test/java/org/tron/core/config/args/WitnessInitializerTest.java b/framework/src/test/java/org/tron/core/config/args/WitnessInitializerTest.java index 3ecef5b10c9..f4594540f69 100644 --- a/framework/src/test/java/org/tron/core/config/args/WitnessInitializerTest.java +++ b/framework/src/test/java/org/tron/core/config/args/WitnessInitializerTest.java @@ -21,14 +21,14 @@ import org.junit.Test; import org.mockito.MockedStatic; import org.tron.common.crypto.SignInterface; +import org.tron.common.crypto.keystore.Credentials; +import org.tron.common.crypto.keystore.WalletUtils; import org.tron.common.utils.ByteArray; import org.tron.common.utils.LocalWitnesses; import org.tron.common.utils.PublicMethod; import org.tron.common.utils.client.utils.Base58; import org.tron.core.exception.TronError; import org.tron.core.exception.TronError.ErrCode; -import org.tron.keystore.Credentials; -import org.tron.keystore.WalletUtils; public class WitnessInitializerTest { diff --git a/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java index 8e1b295a4ca..60e457552b4 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java @@ -182,14 +182,14 @@ public void testTransactionApprovedList() { transactionApprovedList = wallet.getTransactionApprovedList(transactionCapsule.getInstance()); Assert.assertEquals("", transactionApprovedList.getResult().getMessage()); - byte[] randomSig = org.tron.keystore.Wallet.generateRandomBytes(64); + byte[] randomSig = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(64); Transaction transaction = transactionCapsule.getInstance().toBuilder().clearSignature() .addSignature(ByteString.copyFrom(randomSig)).build(); transactionApprovedList = wallet.getTransactionApprovedList(transaction); Assert.assertEquals(TransactionApprovedList.Result.response_code.SIGNATURE_FORMAT_ERROR, transactionApprovedList.getResult().getCode()); - randomSig = org.tron.keystore.Wallet.generateRandomBytes(65); + randomSig = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(65); transaction = transactionCapsule.getInstance().toBuilder().clearSignature() .addSignature(ByteString.copyFrom(randomSig)).build(); transactionApprovedList = wallet.getTransactionApprovedList(transaction); diff --git a/framework/src/test/java/org/tron/core/db/TxCacheDBInitTest.java b/framework/src/test/java/org/tron/core/db/TxCacheDBInitTest.java index eb9c3ebdbc7..8a17c23af72 100644 --- a/framework/src/test/java/org/tron/core/db/TxCacheDBInitTest.java +++ b/framework/src/test/java/org/tron/core/db/TxCacheDBInitTest.java @@ -11,12 +11,12 @@ import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.tron.common.TestConstants; import org.tron.common.application.TronApplicationContext; +import org.tron.common.crypto.keystore.Wallet; import org.tron.common.utils.ByteArray; import org.tron.core.capsule.BytesCapsule; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.store.DynamicPropertiesStore; -import org.tron.keystore.Wallet; @Slf4j public class TxCacheDBInitTest { @@ -100,4 +100,4 @@ private void queryTransaction() { } } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java b/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java index e47ef72a29d..68120e8c9d0 100644 --- a/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java +++ b/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java @@ -5,10 +5,10 @@ import org.junit.Test; import org.tron.common.BaseTest; import org.tron.common.TestConstants; +import org.tron.common.crypto.keystore.Wallet; import org.tron.common.utils.ByteArray; import org.tron.core.capsule.BytesCapsule; import org.tron.core.config.args.Args; -import org.tron.keystore.Wallet; public class TxCacheDBTest extends BaseTest { @@ -48,4 +48,4 @@ public void putTransactionTest() { } } } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java b/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java index f62d47d5367..f9bb4537bcb 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/ApiUtilTest.java @@ -1,7 +1,7 @@ package org.tron.core.jsonrpc; +import static org.tron.common.crypto.keystore.Wallet.generateRandomBytes; import static org.tron.common.utils.Commons.decodeFromBase58Check; -import static org.tron.keystore.Wallet.generateRandomBytes; import com.google.protobuf.ByteString; import org.junit.AfterClass; diff --git a/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java b/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java index e7dfa06d094..b77d69a73c8 100644 --- a/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java @@ -245,7 +245,7 @@ public void testGenerateSpendProof() throws Exception { DiversifierT diversifierT = new DiversifierT(); byte[] d; do { - d = org.tron.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE); + d = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE); } while (!JLibrustzcash.librustzcashCheckDiversifier(d)); diversifierT.setData(d); @@ -331,7 +331,7 @@ public void testDecryptReceiveWithIvk() throws ZksnarkException { PaymentAddress paymentAddress = optional.get(); long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + byte[] memo = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(512); builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, memo); ZenTransactionBuilder.ReceiveDescriptionInfo output = builder.getReceives().get(0); @@ -401,7 +401,7 @@ public void testDecryptReceiveWithOvk() throws Exception { Note note = new Note(paymentAddress2, 4000);//construct function:this.pkD = address.getPkD(); note.setRcm(ByteArray .fromHexString("83d36fd4c8eebec516c3a8ce2fe4832e01eb57bd7f9f9c9e0bd68cc69a5b0f06")); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + byte[] memo = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(512); note.setMemo(memo); byte[] cmuOpt = note.cm(); @@ -486,7 +486,7 @@ public void pushShieldedTransactionAndDecryptWithIvk() Optional optional = incomingViewingKey.address(new DiversifierT()); if (optional.isPresent()) { PaymentAddress paymentAddress = optional.get(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + byte[] memo = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(512); builder.addOutput(senderOvk, paymentAddress, 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo); @@ -574,7 +574,7 @@ public void pushShieldedTransactionAndDecryptWithOvk() Optional optional = incomingViewingKey.address(new DiversifierT()); if (optional.isPresent()) { PaymentAddress paymentAddress = optional.get(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + byte[] memo = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(512); builder.addOutput(senderOvk, paymentAddress, 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo); @@ -909,7 +909,8 @@ public void getSpendingKey() throws Exception { DiversifierT diversifierT = new DiversifierT(); byte[] d; do { - d = org.tron.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE); + d = org.tron.common.crypto.keystore.Wallet.generateRandomBytes( + Constant.ZC_DIVERSIFIER_SIZE); } while (!JLibrustzcash.librustzcashCheckDiversifier(d)); diversifierT.setData(d); System.out.println("d is: " + ByteArray.toHexString(d)); diff --git a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java index 118e0e1f384..ad9c0e5129e 100755 --- a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java @@ -152,19 +152,19 @@ public void init() { } private static byte[] randomUint256() { - return org.tron.keystore.Wallet.generateRandomBytes(32); + return org.tron.common.crypto.keystore.Wallet.generateRandomBytes(32); } private static byte[] randomUint640() { - return org.tron.keystore.Wallet.generateRandomBytes(80); + return org.tron.common.crypto.keystore.Wallet.generateRandomBytes(80); } private static byte[] randomUint1536() { - return org.tron.keystore.Wallet.generateRandomBytes(192); + return org.tron.common.crypto.keystore.Wallet.generateRandomBytes(192); } private static byte[] randomUint4640() { - return org.tron.keystore.Wallet.generateRandomBytes(580); + return org.tron.common.crypto.keystore.Wallet.generateRandomBytes(580); } /** @@ -2229,7 +2229,7 @@ public void testMemoTooLong() throws ContractValidateException, TooBigTransactio FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(1024); + byte[] memo = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(1024); builder.addOutput(expsk.getOvk(), paymentAddress, 100 * 1000000L - wallet.getShieldedTransactionFee(), memo); @@ -2311,7 +2311,7 @@ public void testMemoNotEnough() throws ContractValidateException, TooBigTransact FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(128); + byte[] memo = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(128); builder.addOutput(expsk.getOvk(), paymentAddress, 100 * 1000000L - wallet.getShieldedTransactionFee(), memo); @@ -2405,7 +2405,7 @@ public void pushSameSkAndScanAndSpend() throws Exception { FullViewingKey fullViewingKey = sk2.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + byte[] memo = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(512); //send coin to 2 different address generated by same sk DiversifierT d1 = DiversifierT.random(); @@ -2489,7 +2489,7 @@ public void pushSameSkAndScanAndSpend() throws Exception { DiversifierT d3 = DiversifierT.random(); PaymentAddress paymentAddress3 = incomingViewingKey.address(d3).get(); - byte[] memo3 = org.tron.keystore.Wallet.generateRandomBytes(512); + byte[] memo3 = org.tron.common.crypto.keystore.Wallet.generateRandomBytes(512); builder2.addOutput(expsk2.getOvk(), paymentAddress3, (1000 * 1000000L - wallet.getShieldedTransactionFee()) / 2 - wallet .getShieldedTransactionFee(), memo3); diff --git a/framework/src/test/java/org/tron/keystore/CredentialsTest.java b/framework/src/test/java/org/tron/keystore/CredentialsTest.java index 3fe2ce02b63..9612ccf6292 100644 --- a/framework/src/test/java/org/tron/keystore/CredentialsTest.java +++ b/framework/src/test/java/org/tron/keystore/CredentialsTest.java @@ -7,6 +7,7 @@ import org.junit.Test; import org.springframework.util.Assert; import org.tron.common.crypto.SignUtils; +import org.tron.common.crypto.keystore.Credentials; import org.tron.common.crypto.sm2.SM2; import org.tron.common.utils.ByteUtil; @@ -44,5 +45,4 @@ public void testEquals() throws NoSuchAlgorithmException { Assert.isTrue(!(credentials1.hashCode() == credentials2.hashCode()), "Credentials instance hashcode should be not equal!"); } - -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/keystore/WalletFileTest.java b/framework/src/test/java/org/tron/keystore/WalletFileTest.java index c24647be322..5e2baca83aa 100644 --- a/framework/src/test/java/org/tron/keystore/WalletFileTest.java +++ b/framework/src/test/java/org/tron/keystore/WalletFileTest.java @@ -6,6 +6,8 @@ import org.junit.Assert; import org.junit.Test; import org.tron.common.crypto.SignUtils; +import org.tron.common.crypto.keystore.Wallet; +import org.tron.common.crypto.keystore.WalletFile; import org.tron.core.exception.CipherException; @Slf4j @@ -72,4 +74,4 @@ private Object getSame(Object obj) { return obj; } -} \ No newline at end of file +} diff --git a/framework/src/test/java/org/tron/keystroe/CredentialsTest.java b/framework/src/test/java/org/tron/keystroe/CredentialsTest.java index 2642129e00a..c8fa90d97e5 100644 --- a/framework/src/test/java/org/tron/keystroe/CredentialsTest.java +++ b/framework/src/test/java/org/tron/keystroe/CredentialsTest.java @@ -4,7 +4,7 @@ import org.junit.Test; import org.mockito.Mockito; import org.tron.common.crypto.SignInterface; -import org.tron.keystore.Credentials; +import org.tron.common.crypto.keystore.Credentials; public class CredentialsTest { diff --git a/framework/src/test/java/org/tron/program/SupplementTest.java b/framework/src/test/java/org/tron/program/SupplementTest.java index 38a1b8426dd..95ba020650d 100644 --- a/framework/src/test/java/org/tron/program/SupplementTest.java +++ b/framework/src/test/java/org/tron/program/SupplementTest.java @@ -4,7 +4,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import static org.tron.keystore.WalletUtils.passwordValid; +import static org.tron.common.crypto.keystore.WalletUtils.passwordValid; import java.io.File; import java.io.IOException; @@ -17,6 +17,7 @@ import org.tron.common.BaseTest; import org.tron.common.TestConstants; import org.tron.common.config.DbBackupConfig; +import org.tron.common.crypto.keystore.WalletUtils; import org.tron.common.entity.PeerInfo; import org.tron.common.utils.CompactEncoder; import org.tron.common.utils.JsonUtil; @@ -27,7 +28,6 @@ import org.tron.core.config.args.Args; import org.tron.core.services.http.HttpSelfFormatFieldName; import org.tron.core.store.StorageRowStore; -import org.tron.keystore.WalletUtils; public class SupplementTest extends BaseTest { diff --git a/plugins/README.md b/plugins/README.md index db25811882f..16c031ea3f2 100644 --- a/plugins/README.md +++ b/plugins/README.md @@ -143,3 +143,51 @@ NOTE: large db may GC overhead limit exceeded. - ``: Source path for database. Default: output-directory/database - `--db`: db name. - `-h | --help`: provide the help info + +## Keystore Factory + +Keystore factory provides the ability to generate wallet keystore files or import private keys. + +### Available commands: + +- `GenKeystore`: Generate a new wallet keystore file with a random private key. +- `ImportPrivateKey`: Import an existing private key and create a keystore file. +- `Exit` or `Quit`: Exit the tool. + +### Examples: + +```shell script +# start keystore factory +java -jar Toolkit.jar keystore-factory + +# interactive commands +keystore-factory> GenKeystore +keystore-factory> ImportPrivateKey +keystore-factory> Exit +``` + +### Usage flow: + +1. Run `java -jar Toolkit.jar keystore-factory` to start the tool. +2. Enter `GenKeystore` to generate a new wallet, you will be prompted to: + - Input password (hidden input) + - Input password again for confirmation + - View the generated keystore file name and wallet address +3. Enter `ImportPrivateKey` to import an existing private key, you will be prompted to: + - Input the 64-character hex private key + - Input password (hidden input) + - Input password again for confirmation + - View the generated keystore file name and wallet address +4. Enter `Exit` or `Quit` to exit the tool. + +### Output: + +Keystore files are saved in the `Wallet` directory with the following naming convention: +``` +UTC--yyyy-MM-ddTHH-mm-ss.nVV--
.json +``` + +Example: +``` +UTC--2024-01-15T10-30-45.123Z--TJRyHRFpmjG6mZ95mZaMvHx5fU7fGvRQoN.json +``` diff --git a/plugins/build.gradle b/plugins/build.gradle index 85dcdd2342d..95a4e57a727 100644 --- a/plugins/build.gradle +++ b/plugins/build.gradle @@ -38,6 +38,12 @@ dependencies { implementation group: 'com.typesafe', name: 'config', version: '1.3.2' implementation group: 'me.tongfei', name: 'progressbar', version: '0.9.3' implementation group: 'org.bouncycastle', name: 'bcprov-jdk18on', version: '1.79' + implementation(project(":crypto")) { + exclude(group: 'io.github.tronprotocol', module: 'libp2p') + exclude(group: 'io.prometheus') + exclude(group: 'org.aspectj') + exclude(group: 'org.apache.httpcomponents') + } if (rootProject.archInfo.isArm64) { testRuntimeOnly group: 'org.fusesource.hawtjni', name: 'hawtjni-runtime', version: '1.18' // for test implementation project(":platform") @@ -124,7 +130,7 @@ def binaryRelease(taskName, jarName, mainClass) { from(sourceSets.main.output) { include "/**" } - dependsOn (project(':protocol').jar, project(':platform').jar) // explicit_dependency + dependsOn (project(':protocol').jar, project(':platform').jar, project(':crypto').jar, project(':common').jar) from { configurations.runtimeClasspath.collect { // https://docs.gradle.org/current/userguide/upgrading_version_6.html#changes_6.3 it.isDirectory() ? it : zipTree(it) diff --git a/framework/src/main/java/org/tron/program/KeystoreFactory.java b/plugins/src/main/java/common/org/tron/plugins/KeystoreFactory.java old mode 100755 new mode 100644 similarity index 90% rename from framework/src/main/java/org/tron/program/KeystoreFactory.java rename to plugins/src/main/java/common/org/tron/plugins/KeystoreFactory.java index 8199d7e9076..dd2e127785c --- a/framework/src/main/java/org/tron/program/KeystoreFactory.java +++ b/plugins/src/main/java/common/org/tron/plugins/KeystoreFactory.java @@ -1,4 +1,4 @@ -package org.tron.program; +package org.tron.plugins; import java.io.File; import java.io.IOException; @@ -7,23 +7,23 @@ import org.apache.commons.lang3.StringUtils; import org.tron.common.crypto.SignInterface; import org.tron.common.crypto.SignUtils; +import org.tron.common.crypto.keystore.Credentials; +import org.tron.common.crypto.keystore.WalletUtils; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Utils; import org.tron.core.exception.CipherException; -import org.tron.keystore.Credentials; -import org.tron.keystore.WalletUtils; +import picocli.CommandLine; @Slf4j(topic = "app") -public class KeystoreFactory { +@CommandLine.Command(name = "keystore-factory", + mixinStandardHelpOptions = true, + version = "keystore-factory 1.0", + description = "Generate wallet keystores or import private keys.") +public class KeystoreFactory implements Runnable { private static final String FilePath = "Wallet"; - public static void start() { - KeystoreFactory cli = new KeystoreFactory(); - cli.run(); - } - private boolean priKeyValid(String priKey) { if (StringUtils.isEmpty(priKey)) { logger.warn("Warning: PrivateKey is empty!"); @@ -102,7 +102,8 @@ private void help() { System.out.println("Input any one of them, you will get more tips."); } - private void run() { + @Override + public void run() { Scanner in = new Scanner(System.in); help(); while (in.hasNextLine()) { @@ -145,4 +146,4 @@ private void run() { } } } -} \ No newline at end of file +} diff --git a/plugins/src/main/java/common/org/tron/plugins/Toolkit.java b/plugins/src/main/java/common/org/tron/plugins/Toolkit.java index 3b9972de1c5..7a036eac0ac 100644 --- a/plugins/src/main/java/common/org/tron/plugins/Toolkit.java +++ b/plugins/src/main/java/common/org/tron/plugins/Toolkit.java @@ -3,10 +3,13 @@ import java.util.concurrent.Callable; import picocli.CommandLine; -@CommandLine.Command(subcommands = { CommandLine.HelpCommand.class, Db.class}) +@CommandLine.Command(subcommands = { + CommandLine.HelpCommand.class, + Db.class, + KeystoreFactory.class +}) public class Toolkit implements Callable { - public static void main(String[] args) { CommandLine cli = new CommandLine(new Toolkit()); if (args == null || args.length == 0) {