From ef7c388198d3b889a8f4815a27ed35b478d62a7a Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Tue, 31 Jan 2023 12:22:22 +0800 Subject: [PATCH 001/142] feat(net): optimize network log --- .../main/java/org/tron/core/net/P2pEventHandlerImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java b/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java index 94f8191323b..f6a01b1cf95 100644 --- a/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java +++ b/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java @@ -221,8 +221,13 @@ private void processException(PeerConnection peer, TronMessage msg, Exception ex code = Protocol.ReasonCode.UNKNOWN; break; } - logger.warn("Message from {} process failed, {} \n type: {}, detail: {}", - peer.getInetSocketAddress(), msg, type, ex.getMessage()); + if (type.equals(P2pException.TypeEnum.BAD_MESSAGE)) { + logger.error("Message from {} process failed, {} \n type: {}", + peer.getInetSocketAddress(), msg, type, ex); + } else { + logger.warn("Message from {} process failed, {} \n type: {}, detail: {}", + peer.getInetSocketAddress(), msg, type, ex.getMessage()); + } } else { code = Protocol.ReasonCode.UNKNOWN; logger.warn("Message from {} process failed, {}", From 0b0597702ee8846ebf0a5a8c515892e75b9ab822 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Tue, 17 Jan 2023 12:29:20 +0800 Subject: [PATCH 002/142] fix(unitTest): optimize unit test --- framework/build.gradle | 2 + .../test/java/org/tron/common/BaseTest.java | 85 +++++++++++ .../org/tron/core/BandwidthProcessorTest.java | 43 +----- .../java/org/tron/core/BlockCapsuleTest.java | 23 --- .../java/org/tron/core/BlockUtilTest.java | 2 - .../core/CreateCommonTransactionTest.java | 4 +- .../org/tron/core/EnergyProcessorTest.java | 39 +----- .../tron/core/ShieldedTRC20BuilderTest.java | 55 ++------ .../java/org/tron/core/StorageMarketTest.java | 50 +------ .../test/java/org/tron/core/WalletTest.java | 132 +++++++----------- .../AccountPermissionUpdateActuatorTest.java | 46 +----- .../core/actuator/ActuatorConstantTest.java | 34 +---- .../core/actuator/AssetIssueActuatorTest.java | 40 +----- .../ClearABIContractActuatorTest.java | 40 +----- .../actuator/CreateAccountActuatorTest.java | 41 +----- .../DelegateResourceActuatorTest.java | 42 +----- .../actuator/ExchangeCreateActuatorTest.java | 44 +----- .../actuator/ExchangeInjectActuatorTest.java | 41 +----- .../ExchangeTransactionActuatorTest.java | 41 +----- .../ExchangeWithdrawActuatorTest.java | 41 +----- .../actuator/FreezeBalanceActuatorTest.java | 41 +----- .../actuator/FreezeBalanceV2ActuatorTest.java | 44 +----- .../MarketCancelOrderActuatorTest.java | 42 +----- .../actuator/MarketSellAssetActuatorTest.java | 42 +----- .../ParticipateAssetIssueActuatorTest.java | 47 +------ .../actuator/ProposalApproveActuatorTest.java | 38 +---- .../actuator/ProposalCreateActuatorTest.java | 41 +----- .../actuator/ProposalDeleteActuatorTest.java | 38 +---- .../actuator/SetAccountIdActuatorTest.java | 37 +---- .../ShieldedTransferActuatorTest.java | 43 ++---- .../core/actuator/TransferActuatorTest.java | 41 +----- .../actuator/TransferAssetActuatorTest.java | 40 +----- .../UnDelegateResourceActuatorTest.java | 42 +----- .../actuator/UnfreezeAssetActuatorTest.java | 38 +---- .../actuator/UnfreezeBalanceActuatorTest.java | 42 +----- .../UnfreezeBalanceV2ActuatorTest.java | 42 +----- .../actuator/UpdateAccountActuatorTest.java | 37 +---- .../actuator/UpdateAssetActuatorTest.java | 41 +----- .../actuator/UpdateBrokerageActuatorTest.java | 41 +----- ...UpdateEnergyLimitContractActuatorTest.java | 39 +----- .../UpdateSettingContractActuatorTest.java | 37 +---- .../actuator/VoteWitnessActuatorTest.java | 49 ++----- .../actuator/WithdrawBalanceActuatorTest.java | 41 +----- .../WithdrawExpireUnfreezeActuatorTest.java | 42 +----- .../actuator/WitnessCreateActuatorTest.java | 39 +----- .../actuator/WitnessUpdateActuatorTest.java | 37 +---- .../tron/core/db/AccountIdIndexStoreTest.java | 30 ++-- .../tron/core/db/AccountIndexStoreTest.java | 30 ++-- .../org/tron/core/db/AccountStoreTest.java | 54 +++---- .../java/org/tron/core/db/BlockGenerate.java | 1 + .../java/org/tron/core/db/BlockStoreTest.java | 27 +--- .../org/tron/core/db/CommonStoreTest.java | 29 +--- .../core/db/EnergyPriceHistoryLoaderTest.java | 40 +----- .../org/tron/core/db/KhaosDatabaseTest.java | 24 +--- .../db/MarketPairPriceToOrderStoreTest.java | 34 +---- .../org/tron/core/db/NullifierStoreTest.java | 33 ++--- .../tron/core/db/TransactionHistoryTest.java | 35 ++--- .../tron/core/db/TransactionRetStoreTest.java | 44 +++--- .../tron/core/db/TransactionStoreTest.java | 35 ++--- .../tron/core/db/TransactionTraceTest.java | 69 +-------- .../java/org/tron/core/db/TxCacheDBTest.java | 30 +--- .../java/org/tron/core/db/VotesStoreTest.java | 29 +--- .../org/tron/core/db/WitnessStoreTest.java | 30 +--- 63 files changed, 463 insertions(+), 2017 deletions(-) create mode 100644 framework/src/test/java/org/tron/common/BaseTest.java delete mode 100644 framework/src/test/java/org/tron/core/BlockCapsuleTest.java diff --git a/framework/build.gradle b/framework/build.gradle index 93757755446..e7b6d5ab5fa 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -88,6 +88,8 @@ dependencies { compile "io.vavr:vavr:0.9.2" compile group: 'org.pf4j', name: 'pf4j', version: '2.5.0' + testImplementation group: 'org.springframework', name: 'spring-test', version: '5.2.0.RELEASE' + compile group: 'org.zeromq', name: 'jeromq', version: '0.5.0' compile project(":chainbase") compile project(":protocol") diff --git a/framework/src/test/java/org/tron/common/BaseTest.java b/framework/src/test/java/org/tron/common/BaseTest.java new file mode 100644 index 00000000000..f7d453013b4 --- /dev/null +++ b/framework/src/test/java/org/tron/common/BaseTest.java @@ -0,0 +1,85 @@ +package org.tron.common; + +import com.google.protobuf.ByteString; +import java.io.File; +import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.junit.AfterClass; +import org.junit.runner.RunWith; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.tron.common.crypto.ECKey; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.FileUtil; +import org.tron.common.utils.Sha256Hash; +import org.tron.consensus.base.Param; +import org.tron.core.ChainBaseManager; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.db.Manager; +import org.tron.protos.Protocol; + +@Slf4j +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = {DefaultConfig.class}) +@DirtiesContext +public abstract class BaseTest { + + protected static String dbPath; + + @Resource + protected Manager dbManager; + @Resource + protected ChainBaseManager chainBaseManager; + + @AfterClass + public static void destroy() { + Args.clearParam(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + + public Protocol.Block getSignedBlock(ByteString witness, long time, byte[] privateKey) { + long blockTime = System.currentTimeMillis() / 3000 * 3000; + if (time != 0) { + blockTime = time; + } else { + if (chainBaseManager.getHeadBlockId().getNum() != 0) { + blockTime = chainBaseManager.getHeadBlockTimeStamp() + 3000; + } + } + Param param = Param.getInstance(); + Param.Miner miner = param.new Miner(privateKey, witness, witness); + BlockCapsule blockCapsule = dbManager + .generateBlock(miner, time, System.currentTimeMillis() + 1000); + Protocol.Block block = blockCapsule.getInstance(); + + Protocol.BlockHeader.raw raw = block.getBlockHeader().getRawData().toBuilder() + .setParentHash(ByteString + .copyFrom(chainBaseManager.getDynamicPropertiesStore() + .getLatestBlockHeaderHash().getBytes())) + .setNumber(chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1) + .setTimestamp(blockTime) + .setWitnessAddress(witness) + .build(); + + ECKey ecKey = ECKey.fromPrivate(privateKey); + assert ecKey != null; + ECKey.ECDSASignature signature = ecKey.sign(Sha256Hash.of(CommonParameter + .getInstance().isECKeyCryptoEngine(), raw.toByteArray()).getBytes()); + ByteString sign = ByteString.copyFrom(signature.toByteArray()); + + Protocol.BlockHeader blockHeader = block.getBlockHeader().toBuilder() + .setRawData(raw) + .setWitnessSignature(sign) + .build(); + + return block.toBuilder().setBlockHeader(blockHeader).build(); + } + +} diff --git a/framework/src/test/java/org/tron/core/BandwidthProcessorTest.java b/framework/src/test/java/org/tron/core/BandwidthProcessorTest.java index 4d000d375b5..69501c4e393 100755 --- a/framework/src/test/java/org/tron/core/BandwidthProcessorTest.java +++ b/framework/src/test/java/org/tron/core/BandwidthProcessorTest.java @@ -2,26 +2,20 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.joda.time.DateTime; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.db.BandwidthProcessor; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionTrace; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.ContractValidateException; @@ -34,9 +28,8 @@ import org.tron.protos.contract.BalanceContract.TransferContract; @Slf4j -public class BandwidthProcessorTest { +public class BandwidthProcessorTest extends BaseTest { - private static final String dbPath = "output_bandwidth_test"; private static final String ASSET_NAME; private static final String ASSET_NAME_V2; private static final String OWNER_ADDRESS; @@ -49,16 +42,13 @@ public class BandwidthProcessorTest { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; - private static TronApplicationContext context; - private static long START_TIME; - private static long END_TIME; + private static final long START_TIME; + private static final long END_TIME; static { + dbPath = "output_bandwidth_processor_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); ASSET_NAME = "test_token"; ASSET_NAME_V2 = "2"; OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -69,29 +59,6 @@ public class BandwidthProcessorTest { END_TIME = DateTime.now().getMillis(); } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/BlockCapsuleTest.java b/framework/src/test/java/org/tron/core/BlockCapsuleTest.java deleted file mode 100644 index ad129c6d471..00000000000 --- a/framework/src/test/java/org/tron/core/BlockCapsuleTest.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * java-tron is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * java-tron is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package org.tron.core; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class BlockCapsuleTest { - -} diff --git a/framework/src/test/java/org/tron/core/BlockUtilTest.java b/framework/src/test/java/org/tron/core/BlockUtilTest.java index 25e998d7a70..b122c3082f7 100644 --- a/framework/src/test/java/org/tron/core/BlockUtilTest.java +++ b/framework/src/test/java/org/tron/core/BlockUtilTest.java @@ -69,9 +69,7 @@ public void testBlockUtil() { .fromHexString(blockCapsule2.getBlockId().toString()))) )).build()); - Assert.assertEquals(false, BlockUtil.isParentOf(blockCapsule1, blockCapsule2)); Assert.assertFalse(BlockUtil.isParentOf(blockCapsule1, blockCapsule2)); - Assert.assertEquals(true, BlockUtil.isParentOf(blockCapsule2, blockCapsule3)); Assert.assertTrue(BlockUtil.isParentOf(blockCapsule2, blockCapsule3)); } } diff --git a/framework/src/test/java/org/tron/core/CreateCommonTransactionTest.java b/framework/src/test/java/org/tron/core/CreateCommonTransactionTest.java index e787fe16e96..542373a1234 100644 --- a/framework/src/test/java/org/tron/core/CreateCommonTransactionTest.java +++ b/framework/src/test/java/org/tron/core/CreateCommonTransactionTest.java @@ -16,14 +16,14 @@ public class CreateCommonTransactionTest { - private static String fullnode = "127.0.0.1:50051"; + private static final String FULL_NODE = "127.0.0.1:50051"; /** * for example create UpdateBrokerageContract */ public static void testCreateUpdateBrokerageContract() { WalletBlockingStub walletStub = WalletGrpc - .newBlockingStub(ManagedChannelBuilder.forTarget(fullnode).usePlaintext(true).build()); + .newBlockingStub(ManagedChannelBuilder.forTarget(FULL_NODE).usePlaintext(true).build()); UpdateBrokerageContract.Builder updateBrokerageContract = UpdateBrokerageContract.newBuilder(); updateBrokerageContract.setOwnerAddress( ByteString.copyFrom(decodeFromBase58Check("TN3zfjYUmMFK3ZsHSsrdJoNRtGkQmZLBLz"))) diff --git a/framework/src/test/java/org/tron/core/EnergyProcessorTest.java b/framework/src/test/java/org/tron/core/EnergyProcessorTest.java index b66b79ba07f..f4311930bb2 100755 --- a/framework/src/test/java/org/tron/core/EnergyProcessorTest.java +++ b/framework/src/test/java/org/tron/core/EnergyProcessorTest.java @@ -1,69 +1,36 @@ package org.tron.core; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter.AdaptiveResourceLimitConstants; import org.tron.core.config.Parameter.ChainConstant; import org.tron.core.config.args.Args; import org.tron.core.db.EnergyProcessor; -import org.tron.core.db.Manager; import org.tron.protos.Protocol.AccountType; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; @Slf4j -public class EnergyProcessorTest { +public class EnergyProcessorTest extends BaseTest { - private static final String dbPath = "EnergyProcessorTest"; private static final String ASSET_NAME; private static final String CONTRACT_PROVIDER_ADDRESS; private static final String USER_ADDRESS; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; - private static TronApplicationContext context; static { + dbPath = "energy_processor_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); ASSET_NAME = "test_token"; CONTRACT_PROVIDER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; USER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java b/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java index ba407b42e0b..5468e90c924 100644 --- a/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java +++ b/framework/src/test/java/org/tron/core/ShieldedTRC20BuilderTest.java @@ -3,21 +3,18 @@ import static org.tron.core.zksnark.LibrustzcashTest.librustzcashInitZksnarkParams; import com.google.protobuf.ByteString; -import java.io.File; import java.math.BigInteger; import java.util.Arrays; import java.util.List; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.tron.api.GrpcAPI; import org.tron.api.GrpcAPI.BytesMessage; import org.tron.api.GrpcAPI.PrivateShieldedTRC20Parameters; @@ -25,20 +22,16 @@ import org.tron.api.GrpcAPI.ShieldedTRC20Parameters; import org.tron.api.GrpcAPI.ShieldedTRC20TriggerContractParameters; import org.tron.api.GrpcAPI.SpendAuthSigParameters; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FileUtil; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; import org.tron.common.zksnark.IncrementalMerkleVoucherContainer; import org.tron.common.zksnark.JLibrustzcash; import org.tron.common.zksnark.LibrustzcashParam; import org.tron.core.capsule.IncrementalMerkleTreeCapsule; import org.tron.core.capsule.PedersenHashCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.BlockGenerate; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ZksnarkException; @@ -59,14 +52,10 @@ import stest.tron.wallet.common.client.WalletClient; @Slf4j -public class ShieldedTRC20BuilderTest extends BlockGenerate { - - private static String dbPath = "output_Shielded_TRC20_Api_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; - private static Wallet wallet; - private String privateKey = "650950B193DDDDB35B6E48912DD28F7AB0E7140C1BFDEFD493348F02295BD812"; - private String pubAddress = "TFsrP7YcSSRwHzLPwaCnXyTKagHs8rXKNJ"; +public class ShieldedTRC20BuilderTest extends BaseTest { + @Resource + private Wallet wallet; + private final String priKey = "650950B193DDDDB35B6E48912DD28F7AB0E7140C1BFDEFD493348F02295BD812"; private static final String SHIELDED_CONTRACT_ADDRESS_STR = "TGAmX5AqVUoXCf8MoHxbuhQPmhGfWTnEgA"; private static final byte[] SHIELDED_CONTRACT_ADDRESS; private static final byte[] DEFAULT_OVK; @@ -74,8 +63,8 @@ public class ShieldedTRC20BuilderTest extends BlockGenerate { private static final byte[] PUBLIC_TO_ADDRESS; static { + dbPath = "output_Shielded_TRC20_Api_test"; Args.setParam(new String[]{"--output-directory", dbPath}, "config-test-mainnet.conf"); - context = new TronApplicationContext(DefaultConfig.class); SHIELDED_CONTRACT_ADDRESS = WalletClient.decodeFromBase58Check(SHIELDED_CONTRACT_ADDRESS_STR); DEFAULT_OVK = ByteArray .fromHexString("030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); @@ -87,25 +76,6 @@ public class ShieldedTRC20BuilderTest extends BlockGenerate { VerifyTransferProof transferContract = new VerifyTransferProof(); VerifyBurnProof burnContract = new VerifyBurnProof(); - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - wallet = context.getBean(Wallet.class); - dbManager.getDynamicPropertiesStore().saveAllowShieldedTRC20Transaction(1); - dbManager.getDynamicPropertiesStore().saveAllowShieldedTransaction(1); - } - - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Before public void before() { } @@ -121,7 +91,7 @@ public void createShieldedContractParametersForMint() for (int countNum = 0; countNum < totalCountNum; countNum++) { GrpcAPI.PrivateShieldedTRC20Parameters mintPrivateParam1 = mintParams( - privateKey, value, SHIELDED_CONTRACT_ADDRESS_STR, null); + priKey, value, SHIELDED_CONTRACT_ADDRESS_STR, null); GrpcAPI.ShieldedTRC20Parameters trc20MintParams = wallet .createShieldedContractParameters(mintPrivateParam1); @@ -159,7 +129,7 @@ public void createShieldedContractParametersForTransfer1to1() IncrementalMerkleTreeContainer tree = new IncrementalMerkleTreeContainer( new IncrementalMerkleTreeCapsule()); for (int countNum = 0; countNum < totalCountNum; countNum++) { - SpendingKey senderSk = SpendingKey.decode(privateKey); + SpendingKey senderSk = SpendingKey.decode(priKey); FullViewingKey senderFvk = senderSk.fullViewingKey(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm1 = new byte[32]; @@ -2203,6 +2173,7 @@ public void createShieldedContractParametersWithoutAskForBurn1to2() @Test public void getTriggerInputForForMint() throws Exception { librustzcashInitZksnarkParams(); + String pubAddress = "TFsrP7YcSSRwHzLPwaCnXyTKagHs8rXKNJ"; byte[] callerAddress = WalletClient.decodeFromBase58Check(pubAddress); SpendingKey sk = SpendingKey.random(); ExpandedSpendingKey expsk = sk.expandedSpendingKey(); @@ -2273,7 +2244,7 @@ public void testScanShieldedTRC20NotesByIvk() throws Exception { int statNum = 1; int endNum = 100; librustzcashInitZksnarkParams(); - SpendingKey sk = SpendingKey.decode(privateKey); + SpendingKey sk = SpendingKey.decode(priKey); FullViewingKey fvk = sk.fullViewingKey(); byte[] ivk = fvk.inViewingKey().value; @@ -2289,7 +2260,7 @@ public void testScanShieldedTRC20NotesByIvk() throws Exception { public void testscanShieldedTRC20NotesByOvk() throws Exception { int statNum = 9200; int endNum = 9240; - SpendingKey sk = SpendingKey.decode(privateKey); + SpendingKey sk = SpendingKey.decode(priKey); FullViewingKey fvk = sk.fullViewingKey(); GrpcAPI.DecryptNotesTRC20 scannedNotes = wallet.scanShieldedTRC20NotesByOvk( @@ -2305,7 +2276,7 @@ public void isShieldedTRC20ContractNoteSpent() throws Exception { int statNum = 9200; int endNum = 9240; librustzcashInitZksnarkParams(); - SpendingKey sk = SpendingKey.decode(privateKey); + SpendingKey sk = SpendingKey.decode(priKey); FullViewingKey fvk = sk.fullViewingKey(); byte[] ivk = fvk.inViewingKey().value; diff --git a/framework/src/test/java/org/tron/core/StorageMarketTest.java b/framework/src/test/java/org/tron/core/StorageMarketTest.java index 039f919c9f4..1c471032861 100644 --- a/framework/src/test/java/org/tron/core/StorageMarketTest.java +++ b/framework/src/test/java/org/tron/core/StorageMarketTest.java @@ -4,70 +4,29 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.StorageMarket; import org.tron.protos.Protocol.AccountType; import org.tron.protos.contract.StorageContract.BuyStorageContract; @Slf4j -public class StorageMarketTest { +public class StorageMarketTest extends BaseTest { - private static final String dbPath = "output_storage_market_test"; private static final String OWNER_ADDRESS; - private static final String OWNER_ADDRESS_INVALID = "aaaa"; - private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000_000_000L; - private static Manager dbManager; private static StorageMarket storageMarket; - private static TronApplicationContext context; static { + dbPath = "output_storage_market_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - OWNER_ACCOUNT_INVALID = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - storageMarket = new StorageMarket(dbManager.getAccountStore(), - dbManager.getDynamicPropertiesStore()); - // Args.setParam(new String[]{"--output-directory", dbPath}, - // "config-junit.conf"); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** @@ -75,6 +34,9 @@ public static void destroy() { */ @Before public void createAccountCapsule() { + storageMarket = new StorageMarket(dbManager.getAccountStore(), + dbManager.getDynamicPropertiesStore()); + AccountCapsule ownerCapsule = new AccountCapsule( ByteString.copyFromUtf8("owner"), diff --git a/framework/src/test/java/org/tron/core/WalletTest.java b/framework/src/test/java/org/tron/core/WalletTest.java index 41afd1b0c8e..b353f665823 100644 --- a/framework/src/test/java/org/tron/core/WalletTest.java +++ b/framework/src/test/java/org/tron/core/WalletTest.java @@ -20,7 +20,7 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; @@ -28,16 +28,13 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Arrays; - +import javax.annotation.Resource; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.joda.time.DateTime; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import org.tron.api.GrpcAPI; @@ -45,10 +42,9 @@ import org.tron.api.GrpcAPI.BlockList; import org.tron.api.GrpcAPI.ExchangeList; import org.tron.api.GrpcAPI.ProposalList; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Utils; import org.tron.core.actuator.DelegateResourceActuator; import org.tron.core.actuator.FreezeBalanceActuator; @@ -65,9 +61,7 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.TransactionInfoCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.NonUniqueObjectException; @@ -76,7 +70,6 @@ import org.tron.core.utils.TransactionUtil; import org.tron.core.vm.program.Program; import org.tron.protos.Protocol; -import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.BlockHeader; import org.tron.protos.Protocol.BlockHeader.raw; @@ -94,21 +87,18 @@ @Slf4j -public class WalletTest { +public class WalletTest extends BaseTest { public static final String ACCOUNT_ADDRESS_ONE = "121212a9cf"; public static final String ACCOUNT_ADDRESS_TWO = "232323a9cf"; public static final String ACCOUNT_ADDRESS_THREE = "343434a9cf"; public static final String ACCOUNT_ADDRESS_FOUR = "454545a9cf"; public static final String ACCOUNT_ADDRESS_FIVE = "565656a9cf"; - public static final String ACCOUNT_ADDRESS_SIX = "12344349cf"; public static final long BLOCK_NUM_ONE = 1; public static final long BLOCK_NUM_TWO = 2; public static final long BLOCK_NUM_THREE = 3; public static final long BLOCK_NUM_FOUR = 4; public static final long BLOCK_NUM_FIVE = 5; - public static final long CYCLE_NUM_ONE = 1; - public static final long CYCLE_NUM_TWO = 2; public static final long BLOCK_TIMESTAMP_ONE = DateTime.now().minusDays(4).getMillis(); public static final long BLOCK_TIMESTAMP_TWO = DateTime.now().minusDays(3).getMillis(); public static final long BLOCK_TIMESTAMP_THREE = DateTime.now().minusDays(2).getMillis(); @@ -119,16 +109,13 @@ public class WalletTest { public static final long BLOCK_WITNESS_THREE = 14; public static final long BLOCK_WITNESS_FOUR = 15; public static final long BLOCK_WITNESS_FIVE = 16; - //private static DeferredTransaction deferredTransaction; public static final long TRANSACTION_TIMESTAMP_ONE = DateTime.now().minusDays(4).getMillis(); public static final long TRANSACTION_TIMESTAMP_TWO = DateTime.now().minusDays(3).getMillis(); public static final long TRANSACTION_TIMESTAMP_THREE = DateTime.now().minusDays(2).getMillis(); public static final long TRANSACTION_TIMESTAMP_FOUR = DateTime.now().minusDays(1).getMillis(); public static final long TRANSACTION_TIMESTAMP_FIVE = DateTime.now().getMillis(); - private static TronApplicationContext context; - private static Wallet wallet; - private static ChainBaseManager chainBaseManager; - private static String dbPath = "output_wallet_test"; + @Resource + private Wallet wallet; private static Block block1; private static Block block2; private static Block block3; @@ -139,70 +126,32 @@ public class WalletTest { private static Transaction transaction3; private static Transaction transaction4; private static Transaction transaction5; - private static Transaction transaction6; private static AssetIssueCapsule Asset1; - private static Manager dbManager; private static final String OWNER_ADDRESS; private static final String RECEIVER_ADDRESS; private static final long initBalance = 43_200_000_000L; static { + dbPath = "output_wallet_test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; } - @BeforeClass - public static void init() { - wallet = context.getBean(Wallet.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - dbManager = context.getBean(Manager.class); + @Before + public void before() { initTransaction(); initBlock(); + initAccountCapsule(); chainBaseManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(5); chainBaseManager.getDelegatedResourceStore().reset(); } - @Before - public void createAccountCapsule() { - AccountCapsule ownerCapsule = - new AccountCapsule( - ByteString.copyFromUtf8("owner"), - ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), - AccountType.Normal, - initBalance); - dbManager.getAccountStore().put(ownerCapsule.getAddress().toByteArray(), ownerCapsule); - - AccountCapsule receiverCapsule = - new AccountCapsule( - ByteString.copyFromUtf8("receiver"), - ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS)), - AccountType.Normal, - initBalance); - dbManager.getAccountStore().put(receiverCapsule.getAddress().toByteArray(), receiverCapsule); - - byte[] dbKey = DelegatedResourceCapsule.createDbKey( - ByteArray.fromHexString(OWNER_ADDRESS), - ByteArray.fromHexString(RECEIVER_ADDRESS)); - byte[] dbKeyV2 = DelegatedResourceCapsule.createDbKeyV2( - ByteArray.fromHexString(OWNER_ADDRESS), - ByteArray.fromHexString(RECEIVER_ADDRESS), - false); - chainBaseManager.getDelegatedResourceStore().delete(dbKey); - chainBaseManager.getDelegatedResourceStore().delete(dbKeyV2); - chainBaseManager.getDelegatedResourceAccountIndexStore() - .delete(ByteArray.fromHexString(OWNER_ADDRESS)); - - dbManager.getDynamicPropertiesStore().saveAllowDelegateResource(1); - dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(0L); - } - /** * initTransaction. */ - private static void initTransaction() { + private void initTransaction() { transaction1 = getBuildTransaction( getBuildTransferContract(ACCOUNT_ADDRESS_ONE, ACCOUNT_ADDRESS_TWO), TRANSACTION_TIMESTAMP_ONE, BLOCK_NUM_ONE); @@ -227,20 +176,48 @@ private static void initTransaction() { getBuildTransferContract(ACCOUNT_ADDRESS_FIVE, ACCOUNT_ADDRESS_ONE), TRANSACTION_TIMESTAMP_FIVE, BLOCK_NUM_FIVE); addTransactionToStore(transaction5); + } - transaction6 = getBuildTransaction( - getBuildTransferContract(ACCOUNT_ADDRESS_ONE, ACCOUNT_ADDRESS_SIX), - TRANSACTION_TIMESTAMP_FIVE, BLOCK_NUM_FIVE); - addTransactionToStore(transaction5); + private void initAccountCapsule() { + AccountCapsule ownerCapsule = + new AccountCapsule( + ByteString.copyFromUtf8("owner"), + ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), + Protocol.AccountType.Normal, + initBalance); + dbManager.getAccountStore().put(ownerCapsule.getAddress().toByteArray(), ownerCapsule); + + AccountCapsule receiverCapsule = + new AccountCapsule( + ByteString.copyFromUtf8("receiver"), + ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS)), + Protocol.AccountType.Normal, + initBalance); + dbManager.getAccountStore().put(receiverCapsule.getAddress().toByteArray(), receiverCapsule); + + byte[] dbKey = DelegatedResourceCapsule.createDbKey( + ByteArray.fromHexString(OWNER_ADDRESS), + ByteArray.fromHexString(RECEIVER_ADDRESS)); + byte[] dbKeyV2 = DelegatedResourceCapsule.createDbKeyV2( + ByteArray.fromHexString(OWNER_ADDRESS), + ByteArray.fromHexString(RECEIVER_ADDRESS), + false); + chainBaseManager.getDelegatedResourceStore().delete(dbKey); + chainBaseManager.getDelegatedResourceStore().delete(dbKeyV2); + chainBaseManager.getDelegatedResourceAccountIndexStore() + .delete(ByteArray.fromHexString(OWNER_ADDRESS)); + + dbManager.getDynamicPropertiesStore().saveAllowDelegateResource(1); + dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(0L); } - private static void addTransactionToStore(Transaction transaction) { + private void addTransactionToStore(Transaction transaction) { TransactionCapsule transactionCapsule = new TransactionCapsule(transaction); chainBaseManager.getTransactionStore() .put(transactionCapsule.getTransactionId().getBytes(), transactionCapsule); } - private static void addTransactionInfoToStore(Transaction transaction) { + private void addTransactionInfoToStore(Transaction transaction) { TransactionInfoCapsule transactionInfo = new TransactionInfoCapsule(); byte[] trxId = transaction.getRawData().toByteArray(); transactionInfo.setId(trxId); @@ -268,7 +245,7 @@ private static TransferContract getBuildTransferContract(String ownerAddress, St /** * initBlock. */ - private static void initBlock() { + private void initBlock() { block1 = getBuildBlock(BLOCK_TIMESTAMP_ONE, BLOCK_NUM_ONE, BLOCK_WITNESS_ONE, ACCOUNT_ADDRESS_ONE, transaction1, transaction2); @@ -296,7 +273,7 @@ private static void initBlock() { addTransactionInfoToStore(transaction5); } - private static void addBlockToStore(Block block) { + private void addBlockToStore(Block block) { BlockCapsule blockCapsule = new BlockCapsule(block); chainBaseManager.getBlockStore().put(blockCapsule.getBlockId().getBytes(), blockCapsule); } @@ -311,14 +288,14 @@ private static Block getBuildBlock(long timestamp, long num, long witnessId, } - private static void buildAssetIssue() { + private void buildAssetIssue() { AssetIssueContract.Builder builder = AssetIssueContract.newBuilder(); builder.setName(ByteString.copyFromUtf8("Asset1")); Asset1 = new AssetIssueCapsule(builder.build()); chainBaseManager.getAssetIssueStore().put(Asset1.createDbKey(), Asset1); } - private static void buildProposal() { + private void buildProposal() { Proposal.Builder builder = Proposal.newBuilder(); builder.setProposalId(1L).setProposerAddress(ByteString.copyFromUtf8("Address1")); ProposalCapsule proposalCapsule = new ProposalCapsule(builder.build()); @@ -330,7 +307,7 @@ private static void buildProposal() { chainBaseManager.getDynamicPropertiesStore().saveLatestProposalNum(2L); } - private static void buildExchange() { + private void buildExchange() { Exchange.Builder builder = Exchange.newBuilder(); builder.setExchangeId(1L).setCreatorAddress(ByteString.copyFromUtf8("Address1")); ExchangeCapsule ExchangeCapsule = new ExchangeCapsule(builder.build()); @@ -344,13 +321,6 @@ private static void buildExchange() { } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - @Test public void testWallet() { Wallet wallet1 = new Wallet(); @@ -359,7 +329,7 @@ public void testWallet() { .getAddress())); logger.info("wallet2 address = {}", ByteArray.toHexString(wallet2 .getAddress())); - assertFalse(wallet1.getAddress().equals(wallet2.getAddress())); + assertNotEquals(wallet1.getAddress(), wallet2.getAddress()); } @Test diff --git a/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java index ab0847ff072..2b98557e957 100644 --- a/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/AccountPermissionUpdateActuatorTest.java @@ -4,27 +4,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -37,9 +29,8 @@ import org.tron.protos.contract.AccountContract.AccountPermissionUpdateContract; @Slf4j -public class AccountPermissionUpdateActuatorTest { +public class AccountPermissionUpdateActuatorTest extends BaseTest { - private static final String dbPath = "output_transfer_test"; private static final String OWNER_ADDRESS; private static final String WITNESS_ADDRESS; private static final String KEY_ADDRESS; @@ -58,14 +49,10 @@ public class AccountPermissionUpdateActuatorTest { private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; private static final String KEY_ADDRESS_INVALID = "bbbb"; - public static Application AppT; - private static Manager dbManager; - private static TronApplicationContext context; static { + dbPath = "output_account_permission_update_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; WITNESS_ADDRESS = Wallet.getAddressPreFixString() + "8CFC572CC20CA18B636BDD93B4FB15EA84CC2B4E"; KEY_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -98,35 +85,14 @@ public class AccountPermissionUpdateActuatorTest { .setWeight(KEY_WEIGHT).build(); } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveAllowMultiSign(1); - dbManager.getDynamicPropertiesStore().saveTotalSignNum(5); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createCapsule() { + dbManager.getDynamicPropertiesStore().saveAllowMultiSign(1); + dbManager.getDynamicPropertiesStore().saveTotalSignNum(5); + AccountCapsule ownerCapsule = new AccountCapsule( ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), ByteString.copyFromUtf8("owner"), AccountType.Normal); diff --git a/framework/src/test/java/org/tron/core/actuator/ActuatorConstantTest.java b/framework/src/test/java/org/tron/core/actuator/ActuatorConstantTest.java index fe17d7ae7c4..3ad6aa1d6dd 100644 --- a/framework/src/test/java/org/tron/core/actuator/ActuatorConstantTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ActuatorConstantTest.java @@ -1,59 +1,33 @@ package org.tron.core.actuator; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; @Slf4j(topic = "actuator") -public class ActuatorConstantTest { - - private static final String dbPath = "output_actuatorConstant_test"; - public static Application AppT; - private static TronApplicationContext context; +public class ActuatorConstantTest extends BaseTest { /** * Init . */ @BeforeClass public static void init() { + dbPath = "output_actuatorConstant_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } @Test - public void variablecheck() { + public void variableCheck() { ActuatorConstant actuator = new ActuatorConstant(); Assert.assertEquals("Account[", actuator.ACCOUNT_EXCEPTION_STR); Assert.assertEquals("Witness[", actuator.WITNESS_EXCEPTION_STR); Assert.assertEquals("Proposal[", actuator.PROPOSAL_EXCEPTION_STR); Assert.assertEquals("] not exists", actuator.NOT_EXIST_STR); - Assert.assertTrue(actuator instanceof ActuatorConstant); } } diff --git a/framework/src/test/java/org/tron/core/actuator/AssetIssueActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/AssetIssueActuatorTest.java index 1fc858f0804..17cf0e2286c 100755 --- a/framework/src/test/java/org/tron/core/actuator/AssetIssueActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/AssetIssueActuatorTest.java @@ -4,31 +4,24 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.After; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter.ForkBlockVersionConsts; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -38,9 +31,8 @@ import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract.FrozenSupply; @Slf4j -public class AssetIssueActuatorTest { +public class AssetIssueActuatorTest extends BaseTest { - private static final String dbPath = "output_assetIssue_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_SECOND; private static final String NAME = "trx-my"; @@ -50,44 +42,18 @@ public class AssetIssueActuatorTest { private static final String DESCRIPTION = "myCoin"; private static final String URL = "tron-my.com"; private static final String ASSET_NAME_SECOND = "asset_name2"; - private static TronApplicationContext context; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; private static long now = 0; private static long startTime = 0; private static long endTime = 0; static { + dbPath = "output_assetIssue_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ADDRESS_SECOND = Wallet .getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/ClearABIContractActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ClearABIContractActuatorTest.java index de6a426f1ef..fb26aca1979 100644 --- a/framework/src/test/java/org/tron/core/actuator/ClearABIContractActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ClearABIContractActuatorTest.java @@ -5,25 +5,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol; @@ -32,11 +26,9 @@ import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI; - @Slf4j -public class ClearABIContractActuatorTest { +public class ClearABIContractActuatorTest extends BaseTest { - private static final String dbPath = "output_clearabicontract_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "test_account"; private static final String SECOND_ACCOUNT_ADDRESS; @@ -49,12 +41,10 @@ public class ClearABIContractActuatorTest { "[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\"" + ":\"constructor\"}]"); private static final ABI TARGET_ABI = ABI.getDefaultInstance(); - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_clearabicontract_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_NOTEXIST = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -62,34 +52,12 @@ public class ClearABIContractActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d427122222"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveAllowTvmConstantinople(1); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createCapsule() { + dbManager.getDynamicPropertiesStore().saveAllowTvmConstantinople(1); // address in accountStore and the owner of contract AccountCapsule accountCapsule = new AccountCapsule( diff --git a/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java index 11c8f7754fc..11f68c0b8bb 100755 --- a/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java @@ -4,24 +4,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -30,19 +24,16 @@ import org.tron.protos.contract.AssetIssueContractOuterClass; @Slf4j -public class CreateAccountActuatorTest { +public class CreateAccountActuatorTest extends BaseTest { - private static final String dbPath = "output_CreateAccount_test"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; private static final String OWNER_ADDRESS_SECOND; private static final String INVALID_ACCOUNT_ADDRESS; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_CreateAccount_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = @@ -50,32 +41,6 @@ public class CreateAccountActuatorTest { INVALID_ACCOUNT_ADDRESS = Wallet.getAddressPreFixString() + "12344500882809695a8a687866"; } - /** - * 548794500882809695a8a687866e76d4271a1abc Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - // Args.setParam(new String[]{"--output-directory", dbPath}, - // "config-junit.conf"); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java index df7d7436f6a..afbe6895bb9 100644 --- a/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/DelegateResourceActuatorTest.java @@ -4,25 +4,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.DelegatedResourceAccountIndexCapsule; import org.tron.core.capsule.DelegatedResourceCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.store.DynamicPropertiesStore; @@ -33,55 +27,31 @@ import org.tron.protos.contract.Common.ResourceCode; @Slf4j -public class DelegateResourceActuatorTest { +public class DelegateResourceActuatorTest extends BaseTest { - private static final String dbPath = "output_delegate_resource_test"; private static final String OWNER_ADDRESS; private static final String RECEIVER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; - private static Manager dbManager; - private static final TronApplicationContext context; static { + dbPath = "output_delegate_resource_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); - dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createAccountCapsule() { + dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); + dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); + byte[] owner = ByteArray.fromHexString(OWNER_ADDRESS); byte[] receiver = ByteArray.fromHexString(RECEIVER_ADDRESS); AccountCapsule ownerCapsule = diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java index 51f658bcbb4..f37016845d4 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeCreateActuatorTest.java @@ -4,27 +4,21 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Arrays; import java.util.Map; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.ExchangeCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -36,53 +30,24 @@ @Slf4j -public class ExchangeCreateActuatorTest { +public class ExchangeCreateActuatorTest extends BaseTest { - private static final String dbPath = "output_ExchangeCreate_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; private static final String OWNER_ADDRESS_SECOND; - private static final String URL = "https://tron.network"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; - private static final String OWNER_ADDRESS_BALANCENOTSUFFIENT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_ExchangeCreate_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ADDRESS_NOACCOUNT = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1aed"; - OWNER_ADDRESS_BALANCENOTSUFFIENT = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e06d4271a1ced"; - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** @@ -446,8 +411,7 @@ public void sameTokenNameOpenSuccessExchangeCreate() { Assert.assertEquals(id, exchangeCapsuleV2.getID()); Assert.assertEquals(1000000, exchangeCapsuleV2.getCreateTime()); - Assert - .assertTrue(Arrays.equals(firstTokenId.getBytes(), exchangeCapsuleV2.getFirstTokenId())); + Assert.assertArrayEquals(firstTokenId.getBytes(), exchangeCapsuleV2.getFirstTokenId()); Assert.assertEquals(firstTokenId, ByteArray.toStr(exchangeCapsuleV2.getFirstTokenId())); Assert.assertEquals(firstTokenBalance, exchangeCapsuleV2.getFirstTokenBalance()); Assert.assertEquals(secondTokenId, ByteArray.toStr(exchangeCapsuleV2.getSecondTokenId())); diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java index 28d699a26e0..49a80fd3253 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeInjectActuatorTest.java @@ -5,27 +5,21 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Arrays; import java.util.Map; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.ExchangeCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -37,53 +31,24 @@ @Slf4j -public class ExchangeInjectActuatorTest { +public class ExchangeInjectActuatorTest extends BaseTest { - private static final String dbPath = "output_ExchangeInject_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; private static final String OWNER_ADDRESS_SECOND; - private static final String URL = "https://tron.network"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; - private static final String OWNER_ADDRESS_BALANCENOTSUFFIENT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_ExchangeInject_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ADDRESS_NOACCOUNT = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1aed"; - OWNER_ADDRESS_BALANCENOTSUFFIENT = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e06d4271a1ced"; - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java index c3381da72df..dad6b24e03e 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeTransactionActuatorTest.java @@ -5,28 +5,22 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Arrays; import java.util.Map; import junit.framework.TestCase; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.ExchangeCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -38,53 +32,24 @@ @Slf4j -public class ExchangeTransactionActuatorTest { +public class ExchangeTransactionActuatorTest extends BaseTest { - private static final String dbPath = "output_ExchangeTransaction_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; private static final String OWNER_ADDRESS_SECOND; - private static final String URL = "https://tron.network"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; - private static final String OWNER_ADDRESS_BALANCENOTSUFFIENT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_ExchangeTransaction_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ADDRESS_NOACCOUNT = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1aed"; - OWNER_ADDRESS_BALANCENOTSUFFIENT = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e06d4271a1ced"; - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** diff --git a/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java index 78b0c18294a..ad08b49c9ee 100644 --- a/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ExchangeWithdrawActuatorTest.java @@ -5,28 +5,22 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Arrays; import java.util.Map; import junit.framework.TestCase; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.ExchangeCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -38,53 +32,24 @@ @Slf4j -public class ExchangeWithdrawActuatorTest { +public class ExchangeWithdrawActuatorTest extends BaseTest { - private static final String dbPath = "output_ExchangeWithdraw_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; private static final String OWNER_ADDRESS_SECOND; - private static final String URL = "https://tron.network"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; - private static final String OWNER_ADDRESS_BALANCENOTSUFFIENT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_ExchangeWithdraw_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ADDRESS_NOACCOUNT = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1aed"; - OWNER_ADDRESS_BALANCENOTSUFFIENT = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e06d4271a1ced"; - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** diff --git a/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java index 3494ddb0624..abcaf538e93 100644 --- a/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/FreezeBalanceActuatorTest.java @@ -5,18 +5,14 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.List; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Utils; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; @@ -25,10 +21,8 @@ import org.tron.core.capsule.DelegatedResourceAccountIndexCapsule; import org.tron.core.capsule.DelegatedResourceCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter.ChainConstant; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -38,52 +32,23 @@ import org.tron.protos.contract.Common.ResourceCode; @Slf4j -public class FreezeBalanceActuatorTest { +public class FreezeBalanceActuatorTest extends BaseTest { - private static final String dbPath = "output_freeze_balance_test"; private static final String OWNER_ADDRESS; private static final String RECEIVER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; - private static Manager dbManager; - private static TronApplicationContext context; static { + dbPath = "output_freeze_balance_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - // Args.setParam(new String[]{"--output-directory", dbPath}, - // "config-junit.conf"); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/FreezeBalanceV2ActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/FreezeBalanceV2ActuatorTest.java index 1296886637d..082338df753 100644 --- a/framework/src/test/java/org/tron/core/actuator/FreezeBalanceV2ActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/FreezeBalanceV2ActuatorTest.java @@ -5,25 +5,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter.ChainConstant; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -32,58 +26,32 @@ import org.tron.protos.contract.BalanceContract; import org.tron.protos.contract.Common.ResourceCode; - - @Slf4j -public class FreezeBalanceV2ActuatorTest { +public class FreezeBalanceV2ActuatorTest extends BaseTest { - private static final String dbPath = "output_freeze_balance_test"; private static final String OWNER_ADDRESS; private static final String RECEIVER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; - private static Manager dbManager; - private static TronApplicationContext context; static { + dbPath = "output_freeze_balance_v2_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); - dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createAccountCapsule() { + dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); + dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); + AccountCapsule ownerCapsule = new AccountCapsule( ByteString.copyFromUtf8("owner"), diff --git a/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java index ec6404b47a1..a9daf0871b1 100644 --- a/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/MarketCancelOrderActuatorTest.java @@ -4,17 +4,13 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.List; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -25,9 +21,7 @@ import org.tron.core.capsule.MarketOrderIdListCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.utils.MarketUtils; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -46,9 +40,8 @@ @Slf4j -public class MarketCancelOrderActuatorTest { +public class MarketCancelOrderActuatorTest extends BaseTest { - private static final String dbPath = "output_MarketCancelOrder_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; @@ -58,12 +51,10 @@ public class MarketCancelOrderActuatorTest { private static final String TOKEN_ID_ONE = String.valueOf(1L); private static final String TOKEN_ID_TWO = String.valueOf(2L); private static final String TRX = "_"; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_MarketCancelOrder_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = @@ -73,37 +64,16 @@ public class MarketCancelOrderActuatorTest { } /** - * Init data. + * create temp Capsule test need. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void initTest() { dbManager.getDynamicPropertiesStore().saveAllowMarketTransaction(1L); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1000000); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(10); dbManager.getDynamicPropertiesStore().saveNextMaintenanceTime(2000000); dbManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** - * create temp Capsule test need. - */ - @Before - public void initTest() { byte[] ownerAddressFirstBytes = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); byte[] ownerAddressSecondBytes = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); diff --git a/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java index cf654af891d..587a6b5aacd 100644 --- a/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/MarketSellAssetActuatorTest.java @@ -4,18 +4,14 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.After; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -26,9 +22,7 @@ import org.tron.core.capsule.MarketOrderIdListCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.utils.MarketUtils; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -46,9 +40,8 @@ @Slf4j -public class MarketSellAssetActuatorTest { +public class MarketSellAssetActuatorTest extends BaseTest { - private static final String dbPath = "output_MarketSellAsset_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; @@ -58,12 +51,10 @@ public class MarketSellAssetActuatorTest { private static final String TOKEN_ID_ONE = String.valueOf(1L); private static final String TOKEN_ID_TWO = String.valueOf(2L); private static final String TRX = "_"; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_MarketSellAsset_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = @@ -73,37 +64,16 @@ public class MarketSellAssetActuatorTest { } /** - * Init data. + * create temp Capsule test need. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void initTest() { dbManager.getDynamicPropertiesStore().saveAllowMarketTransaction(1L); dbManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1000000); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(10); dbManager.getDynamicPropertiesStore().saveNextMaintenanceTime(2000000); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** - * create temp Capsule test need. - */ - @Before - public void initTest() { byte[] ownerAddressFirstBytes = ByteArray.fromHexString(OWNER_ADDRESS_FIRST); byte[] ownerAddressSecondBytes = ByteArray.fromHexString(OWNER_ADDRESS_SECOND); diff --git a/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java index 168725f9634..0bcfbc8820f 100755 --- a/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java @@ -2,27 +2,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import org.joda.time.DateTime; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -31,10 +22,8 @@ import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; import org.tron.protos.contract.AssetIssueContractOuterClass.ParticipateAssetIssueContract; -public class ParticipateAssetIssueActuatorTest { +public class ParticipateAssetIssueActuatorTest extends BaseTest { - private static final Logger logger = LoggerFactory.getLogger("Test"); - private static final String dbPath = "output_participateAsset_test"; private static final String OWNER_ADDRESS; private static final String TO_ADDRESS; private static final String TO_ADDRESS_2; @@ -49,14 +38,11 @@ public class ParticipateAssetIssueActuatorTest { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; - private static TronApplicationContext context; private static long AMOUNT = TOTAL_SUPPLY - (1000L) / TRX_NUM * NUM; static { + dbPath = "output_participateAsset_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1234"; TO_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; TO_ADDRESS_2 = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e048892"; @@ -64,36 +50,13 @@ public class ParticipateAssetIssueActuatorTest { NOT_EXIT_ADDRESS = Wallet.getAddressPreFixString() + "B56446E617E924805E4D6CA021D341FEF6E2013B"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - - chainBaseManager.getDynamicPropertiesStore().saveTokenIdNum(1000000); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createCapsule() { + chainBaseManager.getDynamicPropertiesStore().saveTokenIdNum(1000000); + AccountCapsule ownerCapsule = new AccountCapsule( ByteString.copyFromUtf8("owner"), diff --git a/framework/src/test/java/org/tron/core/actuator/ProposalApproveActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ProposalApproveActuatorTest.java index 5ca4d7abfcf..484c6666941 100644 --- a/framework/src/test/java/org/tron/core/actuator/ProposalApproveActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ProposalApproveActuatorTest.java @@ -4,17 +4,13 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.HashMap; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -22,9 +18,7 @@ import org.tron.core.capsule.ProposalCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -35,10 +29,8 @@ import org.tron.protos.contract.ProposalContract; @Slf4j +public class ProposalApproveActuatorTest extends BaseTest { -public class ProposalApproveActuatorTest { - - private static final String dbPath = "output_ProposalApprove_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; @@ -46,12 +38,10 @@ public class ProposalApproveActuatorTest { private static final String URL = "https://tron.network"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_ProposalApprove_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = @@ -60,28 +50,6 @@ public class ProposalApproveActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1aed"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/ProposalCreateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ProposalCreateActuatorTest.java index 56bf9504730..1e95911884c 100644 --- a/framework/src/test/java/org/tron/core/actuator/ProposalCreateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ProposalCreateActuatorTest.java @@ -4,26 +4,20 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.HashMap; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ProposalCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -33,10 +27,8 @@ import org.tron.protos.contract.ProposalContract.ProposalCreateContract; @Slf4j +public class ProposalCreateActuatorTest extends BaseTest { -public class ProposalCreateActuatorTest { - - private static final String dbPath = "output_ProposalCreate_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; @@ -44,43 +36,16 @@ public class ProposalCreateActuatorTest { private static final String URL = "https://tron.network"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; - private static final String OWNER_ADDRESS_BALANCENOTSUFFIENT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_ProposalCreate_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ADDRESS_NOACCOUNT = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1aed"; - OWNER_ADDRESS_BALANCENOTSUFFIENT = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e06d4271a1ced"; - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** diff --git a/framework/src/test/java/org/tron/core/actuator/ProposalDeleteActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ProposalDeleteActuatorTest.java index e8d7829f90c..63e5758a907 100644 --- a/framework/src/test/java/org/tron/core/actuator/ProposalDeleteActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ProposalDeleteActuatorTest.java @@ -4,17 +4,13 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.HashMap; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -22,9 +18,7 @@ import org.tron.core.capsule.ProposalCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -35,10 +29,8 @@ import org.tron.protos.contract.ProposalContract; @Slf4j +public class ProposalDeleteActuatorTest extends BaseTest { -public class ProposalDeleteActuatorTest { - - private static final String dbPath = "output_ProposalApprove_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; @@ -46,12 +38,10 @@ public class ProposalDeleteActuatorTest { private static final String URL = "https://tron.network"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_ProposalDelete_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = @@ -60,28 +50,6 @@ public class ProposalDeleteActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1aed"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java index 018ae6401bc..0b4311ca46f 100644 --- a/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/SetAccountIdActuatorTest.java @@ -2,23 +2,17 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -27,46 +21,21 @@ import org.tron.protos.contract.AssetIssueContractOuterClass; @Slf4j -public class SetAccountIdActuatorTest { +public class SetAccountIdActuatorTest extends BaseTest { - private static final String dbPath = "output_setaccountid_test"; private static final String ACCOUNT_NAME = "ownertest"; private static final String ACCOUNT_NAME_1 = "ownertest1"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_1; private static final String OWNER_ADDRESS_INVALID = "aaaa"; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_setaccountid_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ADDRESS_1 = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java index 3042a745d94..88748e48dcd 100755 --- a/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java @@ -1,16 +1,14 @@ package org.tron.core.actuator; import com.google.protobuf.ByteString; -import java.io.File; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; import org.tron.common.zksnark.IncrementalMerkleVoucherContainer; import org.tron.core.Constant; @@ -22,9 +20,7 @@ import org.tron.core.capsule.PedersenHashCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.PermissionException; import org.tron.core.exception.ValidateSignatureException; @@ -47,14 +43,12 @@ import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; @Slf4j -public class ShieldedTransferActuatorTest { +public class ShieldedTransferActuatorTest extends BaseTest { - private static final String dbPath = "output_shield_transfer_test"; private static final String PUBLIC_ADDRESS_ONE; private static final String ADDRESS_ONE_PRIVATE_KEY; private static final String PUBLIC_ADDRESS_TWO; private static final String ADDRESS_TWO_PRIVATE_KEY; - private static final String PUBLIC_ADDRESS_OFF_LINE; private static final long AMOUNT = 100000000L; private static final long OWNER_BALANCE = 9999999000000L; private static final long TO_BALANCE = 100001000000L; @@ -69,22 +63,20 @@ public class ShieldedTransferActuatorTest { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; - private static Wallet wallet; - private static Manager dbManager; - private static TronApplicationContext context; - private static TransactionUtil transactionUtil; + @Resource + private Wallet wallet; + @Resource + private TransactionUtil transactionUtil; static { + dbPath = "output_shield_transfer_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); PUBLIC_ADDRESS_ONE = Wallet.getAddressPreFixString() + "a7d8a35b260395c14aa456297662092ba3b76fc0"; ADDRESS_ONE_PRIVATE_KEY = "7f7f701e94d4f1dd60ee5205e7ea8ee31121427210417b608a6b2e96433549a7"; PUBLIC_ADDRESS_TWO = Wallet.getAddressPreFixString() + "8ba2aaae540c642e44e3bed5522c63bbc21fff92"; ADDRESS_TWO_PRIVATE_KEY = "e4e0edd6bff7b353dfc69a590721e902e6915c5e3e87d36dcb567a9716304720"; - PUBLIC_ADDRESS_OFF_LINE = - Wallet.getAddressPreFixString() + "7bcb781f4743afaacf9f9528f3ea903b3782339f"; DEFAULT_OVK = ByteArray.fromHexString( "030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); } @@ -95,27 +87,10 @@ public class ShieldedTransferActuatorTest { @BeforeClass public static void init() throws ZksnarkException { Args.setFullNodeAllowShieldedTransaction(true); - wallet = context.getBean(Wallet.class); - transactionUtil = context.getBean(TransactionUtil.class); - dbManager = context.getBean(Manager.class); librustzcashInitZksnarkParams(); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - - private static void librustzcashInitZksnarkParams() throws ZksnarkException { + private static void librustzcashInitZksnarkParams() { FullNodeHttpApiService.librustzcashInitZksnarkParams(); } diff --git a/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java index c8f55768910..05aea41e7c7 100644 --- a/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/TransferActuatorTest.java @@ -5,26 +5,20 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Date; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -38,9 +32,8 @@ import org.tron.protos.contract.BalanceContract.TransferContract; @Slf4j -public class TransferActuatorTest { +public class TransferActuatorTest extends BaseTest { - private static final String dbPath = "output_transfer_test"; private static final String OWNER_ADDRESS; private static final String TO_ADDRESS; private static final long AMOUNT = 100; @@ -51,12 +44,10 @@ public class TransferActuatorTest { private static final String OWNER_ACCOUNT_INVALID; private static final String OWNER_NO_BALANCE; private static final String To_ACCOUNT_INVALID; - private static Manager dbManager; - private static TronApplicationContext context; static { + dbPath = "output_transfer_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; TO_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ACCOUNT_INVALID = @@ -66,32 +57,6 @@ public class TransferActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3422"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - // Args.setParam(new String[]{"--output-directory", dbPath}, - // "config-junit.conf"); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java index 440cbc3a4a7..07bb8415068 100755 --- a/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java @@ -20,28 +20,20 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; - -import java.io.File; - import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -57,9 +49,8 @@ import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; @Slf4j -public class TransferAssetActuatorTest { +public class TransferAssetActuatorTest extends BaseTest { - private static final String dbPath = "output_transferasset_test"; private static final String ASSET_NAME = "trx"; private static final String OWNER_ADDRESS; private static final String TO_ADDRESS; @@ -79,13 +70,10 @@ public class TransferAssetActuatorTest { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; - private static TronApplicationContext context; - private static Manager dbManager; - private static Any contract; static { + dbPath = "output_transferasset_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; TO_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a146a"; NOT_EXIT_ADDRESS = Wallet.getAddressPreFixString() + "B56446E617E924805E4D6CA021D341FEF6E2013B"; @@ -95,28 +83,6 @@ public class TransferAssetActuatorTest { Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049010"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/UnDelegateResourceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UnDelegateResourceActuatorTest.java index f57c82935e2..e825364be39 100644 --- a/framework/src/test/java/org/tron/core/actuator/UnDelegateResourceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UnDelegateResourceActuatorTest.java @@ -6,25 +6,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.DelegatedResourceAccountIndexCapsule; import org.tron.core.capsule.DelegatedResourceCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -34,56 +28,32 @@ import org.tron.protos.contract.Common.ResourceCode; @Slf4j -public class UnDelegateResourceActuatorTest { +public class UnDelegateResourceActuatorTest extends BaseTest { - private static final String dbPath = "output_unDelegate_resource_test"; private static final String OWNER_ADDRESS; private static final String RECEIVER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; private static final long delegateBalance = 1_000_000_000L; - private static Manager dbManager; - private static final TronApplicationContext context; static { + dbPath = "output_unDelegate_resource_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); - dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createAccountCapsule() { + dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); + dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); + AccountCapsule ownerCapsule = new AccountCapsule(ByteString.copyFromUtf8("owner"), ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), AccountType.Normal, initBalance); diff --git a/framework/src/test/java/org/tron/core/actuator/UnfreezeAssetActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UnfreezeAssetActuatorTest.java index 70437a890df..0a624faf113 100644 --- a/framework/src/test/java/org/tron/core/actuator/UnfreezeAssetActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UnfreezeAssetActuatorTest.java @@ -2,25 +2,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.Account; @@ -32,49 +26,23 @@ import org.tron.protos.contract.AssetIssueContractOuterClass.UnfreezeAssetContract; @Slf4j -public class UnfreezeAssetActuatorTest { +public class UnfreezeAssetActuatorTest extends BaseTest { - private static final String dbPath = "output_unfreeze_asset_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; private static final long frozenBalance = 1_000_000_000L; private static final String assetName = "testCoin"; - private static final String assetID = "123456"; - private static Manager dbManager; - private static TronApplicationContext context; static { + dbPath = "output_unfreeze_asset_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java index de24f581c04..3f9b999228c 100644 --- a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceActuatorTest.java @@ -4,18 +4,14 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; @@ -23,9 +19,7 @@ import org.tron.core.capsule.DelegatedResourceCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.VotesCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -36,54 +30,24 @@ import org.tron.protos.contract.Common.ResourceCode; @Slf4j -public class UnfreezeBalanceActuatorTest { +public class UnfreezeBalanceActuatorTest extends BaseTest { - private static final String dbPath = "output_unfreeze_balance_test"; private static final String OWNER_ADDRESS; private static final String RECEIVER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; private static final long frozenBalance = 1_000_000_000L; - private static final long smallTatalResource = 100L; - private static Manager dbManager; - private static TronApplicationContext context; static { + dbPath = "output_unfreeze_balance_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - // Args.setParam(new String[]{"--output-directory", dbPath}, - // "config-junit.conf"); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java index 6caa3727a0c..14a6de98606 100644 --- a/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UnfreezeBalanceV2ActuatorTest.java @@ -6,24 +6,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.VotesCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -34,56 +28,32 @@ import org.tron.protos.contract.Common.ResourceCode; @Slf4j -public class UnfreezeBalanceV2ActuatorTest { +public class UnfreezeBalanceV2ActuatorTest extends BaseTest { - private static final String dbPath = "output_unfreeze_balance_test"; private static final String OWNER_ADDRESS; private static final String RECEIVER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; private static final long frozenBalance = 1_000_000_000L; - private static Manager dbManager; - private static final TronApplicationContext context; static { + dbPath = "output_unfreeze_balance_v2_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; RECEIVER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049150"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); - dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createAccountCapsule() { + dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); + dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); + AccountCapsule ownerCapsule = new AccountCapsule(ByteString.copyFromUtf8("owner"), ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), AccountType.Normal, initBalance); diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java index 315a045128a..acbb9fb4d0b 100755 --- a/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateAccountActuatorTest.java @@ -4,23 +4,17 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -29,46 +23,21 @@ import org.tron.protos.contract.AssetIssueContractOuterClass; @Slf4j -public class UpdateAccountActuatorTest { +public class UpdateAccountActuatorTest extends BaseTest { - private static final String dbPath = "output_updateaccount_test"; private static final String ACCOUNT_NAME = "ownerTest"; private static final String ACCOUNT_NAME_1 = "ownerTest1"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_1; private static final String OWNER_ADDRESS_INVALID = "aaaa"; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_updateaccount_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ADDRESS_1 = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java index 6bd57c85361..b7583bc335b 100644 --- a/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateAssetActuatorTest.java @@ -4,28 +4,20 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Date; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol; @@ -34,9 +26,8 @@ import org.tron.protos.contract.AssetIssueContractOuterClass.UpdateAssetContract; @Slf4j -public class UpdateAssetActuatorTest { +public class UpdateAssetActuatorTest extends BaseTest { - private static final String dbPath = "output_updateAsset_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "test_account"; private static final String SECOND_ACCOUNT_ADDRESS; @@ -46,14 +37,10 @@ public class UpdateAssetActuatorTest { private static final long TOTAL_SUPPLY = 10000L; private static final String DESCRIPTION = "myCoin"; private static final String URL = "tron-my.com"; - private static TronApplicationContext context; - private static Application AppT; - private static Manager dbManager; static { + dbPath = "output_updateAsset_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_NOTEXIST = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -61,28 +48,6 @@ public class UpdateAssetActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d427122222"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateBrokerageActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateBrokerageActuatorTest.java index e2ce611c56b..034415e0ef1 100644 --- a/framework/src/test/java/org/tron/core/actuator/UpdateBrokerageActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateBrokerageActuatorTest.java @@ -4,25 +4,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.store.DelegationStore; @@ -32,19 +26,16 @@ import org.tron.protos.contract.StorageContract.UpdateBrokerageContract; @Slf4j(topic = "actuator") -public class UpdateBrokerageActuatorTest { +public class UpdateBrokerageActuatorTest extends BaseTest { - private static final String dbPath = "output_updatebrokerageactuator_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_NOTEXIST; private static final String OWNER_ADDRESS_INVALID; private static final int BROKEN_AGE = 10; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_updatebrokerageactuator_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_NOTEXIST = Wallet.getAddressPreFixString() + "1234b9367799eaa3197fecb144eb71de1e049123"; @@ -52,34 +43,10 @@ public class UpdateBrokerageActuatorTest { Wallet.getAddressPreFixString() + "354394500882809695a8a687866e7"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - - @Before /** * set witness store, account store, dynamic store */ + @Before public void initDB() { // allow dynamic store dbManager.getDynamicPropertiesStore().saveChangeDelegation(1); diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateEnergyLimitContractActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateEnergyLimitContractActuatorTest.java index 9a662e15834..3703dc74e87 100644 --- a/framework/src/test/java/org/tron/core/actuator/UpdateEnergyLimitContractActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateEnergyLimitContractActuatorTest.java @@ -5,28 +5,23 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; -import java.io.File; import java.util.Arrays; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter.ForkBlockVersionConsts; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.TronException; @@ -37,10 +32,8 @@ @Slf4j -//@Ignore -public class UpdateEnergyLimitContractActuatorTest { +public class UpdateEnergyLimitContractActuatorTest extends BaseTest { - private static final String dbPath = "output_updateEnergyLimitContractActuator_test"; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "test_account"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String SMART_CONTRACT_NAME = "smart_contarct"; @@ -49,15 +42,13 @@ public class UpdateEnergyLimitContractActuatorTest { private static final long SOURCE_ENERGY_LIMIT = 10L; private static final long TARGET_ENERGY_LIMIT = 30L; private static final long INVALID_ENERGY_LIMIT = -200L; - private static TronApplicationContext context; - private static Manager dbManager; private static String OWNER_ADDRESS; private static String SECOND_ACCOUNT_ADDRESS; private static String OWNER_ADDRESS_NOTEXIST; static { + dbPath = "output_updateEnergyLimitContractActuator_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); } /** @@ -65,40 +56,24 @@ public class UpdateEnergyLimitContractActuatorTest { */ @BeforeClass public static void init() { - dbManager = context.getBean(Manager.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; SECOND_ACCOUNT_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d427122222"; OWNER_ADDRESS_NOTEXIST = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - - byte[] stats = new byte[27]; - Arrays.fill(stats, (byte) 1); - dbManager.getDynamicPropertiesStore() - .statsByVersion(ForkBlockVersionConsts.ENERGY_LIMIT, stats); CommonParameter.getInstance().setBlockNumForEnergyLimit(0); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createCapsule() { + byte[] stats = new byte[27]; + Arrays.fill(stats, (byte) 1); + dbManager.getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionConsts.ENERGY_LIMIT, stats); // address in accountStore and the owner of contract AccountCapsule accountCapsule = new AccountCapsule( diff --git a/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java index 1113b4b1689..0445f893983 100644 --- a/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/UpdateSettingContractActuatorTest.java @@ -4,25 +4,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol; @@ -32,9 +26,8 @@ @Slf4j -public class UpdateSettingContractActuatorTest { +public class UpdateSettingContractActuatorTest extends BaseTest { - private static final String dbPath = "output_updatesettingcontract_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "test_account"; private static final String SECOND_ACCOUNT_ADDRESS; @@ -46,12 +39,10 @@ public class UpdateSettingContractActuatorTest { private static final long SOURCE_PERCENT = 10L; private static final long TARGET_PERCENT = 30L; private static final long INVALID_PERCENT = 200L; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_updatesettingcontract_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_NOTEXIST = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -59,28 +50,6 @@ public class UpdateSettingContractActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d427122222"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java index ef075f02168..26e4e7364b9 100644 --- a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java @@ -4,16 +4,13 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.consensus.dpos.MaintenanceManager; import org.tron.core.Constant; @@ -22,10 +19,8 @@ import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.consensus.ConsensusService; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -37,9 +32,8 @@ import org.tron.protos.contract.WitnessContract.VoteWitnessContract.Vote; @Slf4j -public class VoteWitnessActuatorTest { +public class VoteWitnessActuatorTest extends BaseTest { - private static final String dbPath = "output_VoteWitness_test"; private static final String ACCOUNT_NAME = "account"; private static final String OWNER_ADDRESS; private static final String WITNESS_NAME = "witness"; @@ -49,14 +43,14 @@ public class VoteWitnessActuatorTest { private static final String WITNESS_ADDRESS_NOACCOUNT; private static final String OWNER_ADDRESS_NOACCOUNT; private static final String OWNER_ADDRESS_BALANCENOTSUFFICIENT; - private static TronApplicationContext context; - private static Manager dbManager; - private static MaintenanceManager maintenanceManager; - private static ConsensusService consensusService; + @Resource + private MaintenanceManager maintenanceManager; + @Resource + private ConsensusService consensusService; static { + dbPath = "output_VoteWitness_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; WITNESS_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; WITNESS_ADDRESS_NOACCOUNT = @@ -67,36 +61,13 @@ public class VoteWitnessActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e06d4271a1ced"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - maintenanceManager = context.getBean(MaintenanceManager.class); - consensusService = context.getBean(ConsensusService.class); - consensusService.start(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createCapsule() { + consensusService.start(); + WitnessCapsule ownerCapsule = new WitnessCapsule( StringUtil.hexString2ByteString(WITNESS_ADDRESS), diff --git a/framework/src/test/java/org/tron/core/actuator/WithdrawBalanceActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/WithdrawBalanceActuatorTest.java index ef979d8acb9..7010b10657a 100644 --- a/framework/src/test/java/org/tron/core/actuator/WithdrawBalanceActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/WithdrawBalanceActuatorTest.java @@ -4,26 +4,20 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.args.Witness; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -33,51 +27,22 @@ import org.tron.protos.contract.BalanceContract.WithdrawBalanceContract; @Slf4j -public class WithdrawBalanceActuatorTest { +public class WithdrawBalanceActuatorTest extends BaseTest { - private static final String dbPath = "output_withdraw_balance_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; private static final long allowance = 32_000_000L; - private static Manager dbManager; - private static TronApplicationContext context; static { + dbPath = "output_withdraw_balance_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - // Args.setParam(new String[]{"--output-directory", dbPath}, - // "config-junit.conf"); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuatorTest.java index d3ec771b5fa..1544e546854 100644 --- a/framework/src/test/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/WithdrawExpireUnfreezeActuatorTest.java @@ -7,25 +7,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.util.List; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -36,54 +30,30 @@ import org.tron.protos.contract.BalanceContract.WithdrawExpireUnfreezeContract; @Slf4j -public class WithdrawExpireUnfreezeActuatorTest { +public class WithdrawExpireUnfreezeActuatorTest extends BaseTest { - private static final String dbPath = "output_withdraw_expire_unfreeze_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_INVALID = "abc"; private static final String OWNER_ACCOUNT_INVALID; private static final long initBalance = 10_000_000_000L; private static final long allowance = 32_000_000L; - private static Manager dbManager; - private static final TronApplicationContext context; static { + dbPath = "output_withdraw_expire_unfreeze_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; OWNER_ACCOUNT_INVALID = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); - dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @Before public void createAccountCapsule() { + dbManager.getDynamicPropertiesStore().saveUnfreezeDelayDays(1L); + dbManager.getDynamicPropertiesStore().saveAllowNewResourceModel(1L); + AccountCapsule ownerCapsule = new AccountCapsule(ByteString.copyFromUtf8("owner"), ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), AccountType.Normal, initBalance); diff --git a/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java index 2c85ae00deb..721d88af2b6 100644 --- a/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/WitnessCreateActuatorTest.java @@ -4,24 +4,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol.AccountType; @@ -30,10 +24,8 @@ import org.tron.protos.contract.WitnessContract.WitnessCreateContract; @Slf4j +public class WitnessCreateActuatorTest extends BaseTest { -public class WitnessCreateActuatorTest { - - private static final String dbPath = "output_WitnessCreate_test"; private static final String ACCOUNT_NAME_FIRST = "ownerF"; private static final String OWNER_ADDRESS_FIRST; private static final String ACCOUNT_NAME_SECOND = "ownerS"; @@ -42,12 +34,10 @@ public class WitnessCreateActuatorTest { private static final String OWNER_ADDRESS_INVALID = "aaaa"; private static final String OWNER_ADDRESS_NOACCOUNT; private static final String OWNER_ADDRESS_BALANCENOTSUFFIENT; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_WitnessCreate_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS_FIRST = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_SECOND = @@ -58,29 +48,6 @@ public class WitnessCreateActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e06d4271a1ced"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/actuator/WitnessUpdateActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/WitnessUpdateActuatorTest.java index bad820cc7bb..31ac6a3cf88 100644 --- a/framework/src/test/java/org/tron/core/actuator/WitnessUpdateActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/WitnessUpdateActuatorTest.java @@ -4,24 +4,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.protos.Protocol; @@ -30,9 +24,8 @@ import org.tron.protos.contract.WitnessContract.WitnessUpdateContract; @Slf4j -public class WitnessUpdateActuatorTest { +public class WitnessUpdateActuatorTest extends BaseTest { - private static final String dbPath = "output_WitnessUpdate_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "test_account"; private static final String OWNER_ADDRESS_NOT_WITNESS; @@ -41,12 +34,10 @@ public class WitnessUpdateActuatorTest { private static final String URL = "https://tron.network"; private static final String NewURL = "https://tron.org"; private static final String OWNER_ADDRESS_INVALID = "aaaa"; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_WitnessUpdate_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ADDRESS_NOTEXIST = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; @@ -54,28 +45,6 @@ public class WitnessUpdateActuatorTest { Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d427122222"; } - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ diff --git a/framework/src/test/java/org/tron/core/db/AccountIdIndexStoreTest.java b/framework/src/test/java/org/tron/core/db/AccountIdIndexStoreTest.java index 6e50f3dfca7..fa31b2fd451 100644 --- a/framework/src/test/java/org/tron/core/db/AccountIdIndexStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/AccountIdIndexStoreTest.java @@ -1,23 +1,21 @@ package org.tron.core.db; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Random; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.store.AccountIdIndexStore; import org.tron.protos.Protocol.AccountType; -public class AccountIdIndexStoreTest { +public class AccountIdIndexStoreTest extends BaseTest { private static final byte[] ACCOUNT_ADDRESS_ONE = randomBytes(16); private static final byte[] ACCOUNT_ADDRESS_TWO = randomBytes(16); @@ -28,30 +26,21 @@ public class AccountIdIndexStoreTest { private static final byte[] ACCOUNT_NAME_THREE = randomBytes(6); private static final byte[] ACCOUNT_NAME_FOUR = randomBytes(6); private static final byte[] ACCOUNT_NAME_FIVE = randomBytes(6); - private static String dbPath = "output_AccountIndexStore_test"; - private static TronApplicationContext context; - private static AccountIdIndexStore accountIdIndexStore; + @Resource + private AccountIdIndexStore accountIdIndexStore; private static AccountCapsule accountCapsule1; private static AccountCapsule accountCapsule2; private static AccountCapsule accountCapsule3; private static AccountCapsule accountCapsule4; static { + dbPath = "output_AccountIndexStore_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @BeforeClass public static void init() { - accountIdIndexStore = context.getBean(AccountIdIndexStore.class); accountCapsule1 = new AccountCapsule(ByteString.copyFrom(ACCOUNT_ADDRESS_ONE), ByteString.copyFrom(ACCOUNT_NAME_ONE), AccountType.Normal); accountCapsule1.setAccountId(ByteString.copyFrom(ACCOUNT_NAME_ONE).toByteArray()); @@ -64,6 +53,11 @@ public static void init() { accountCapsule4 = new AccountCapsule(ByteString.copyFrom(ACCOUNT_ADDRESS_FOUR), ByteString.copyFrom(ACCOUNT_NAME_FOUR), AccountType.Normal); accountCapsule4.setAccountId(ByteString.copyFrom(ACCOUNT_NAME_FOUR).toByteArray()); + + } + + @Before + public void before() { accountIdIndexStore.put(accountCapsule1); accountIdIndexStore.put(accountCapsule2); accountIdIndexStore.put(accountCapsule3); diff --git a/framework/src/test/java/org/tron/core/db/AccountIndexStoreTest.java b/framework/src/test/java/org/tron/core/db/AccountIndexStoreTest.java index fd0474f4dee..0b449addc41 100755 --- a/framework/src/test/java/org/tron/core/db/AccountIndexStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/AccountIndexStoreTest.java @@ -1,32 +1,29 @@ package org.tron.core.db; import com.google.protobuf.ByteString; -import java.io.File; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.store.AccountIndexStore; import org.tron.protos.Protocol.AccountType; -public class AccountIndexStoreTest { +public class AccountIndexStoreTest extends BaseTest { - private static String dbPath = "output_AccountIndexStore_test"; private static String dbDirectory = "db_AccountIndexStore_test"; private static String indexDirectory = "index_AccountIndexStore_test"; - private static TronApplicationContext context; - private static AccountIndexStore accountIndexStore; + @Resource + private AccountIndexStore accountIndexStore; private static byte[] address = TransactionStoreTest.randomBytes(32); private static byte[] accountName = TransactionStoreTest.randomBytes(32); static { + dbPath = "output_AccountIndexStore_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -35,19 +32,10 @@ public class AccountIndexStoreTest { }, Constant.TEST_CONF ); - context = new TronApplicationContext(DefaultConfig.class); } - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - - @BeforeClass - public static void init() { - accountIndexStore = context.getBean(AccountIndexStore.class); + @Before + public void init() { AccountCapsule accountCapsule = new AccountCapsule(ByteString.copyFrom(address), ByteString.copyFrom(accountName), AccountType.forNumber(1)); diff --git a/framework/src/test/java/org/tron/core/db/AccountStoreTest.java b/framework/src/test/java/org/tron/core/db/AccountStoreTest.java index 44efc7f1e97..6c02b038f8e 100755 --- a/framework/src/test/java/org/tron/core/db/AccountStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/AccountStoreTest.java @@ -3,46 +3,39 @@ import static org.junit.Assert.assertEquals; import com.google.protobuf.ByteString; -import java.io.File; import java.util.HashMap; import java.util.Map; - -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.db2.ISession; -import org.tron.core.store.AccountAssetStore; import org.tron.core.store.AccountStore; import org.tron.core.store.AssetIssueStore; import org.tron.core.store.DynamicPropertiesStore; import org.tron.protos.Protocol.AccountType; -public class AccountStoreTest { +public class AccountStoreTest extends BaseTest { private static final byte[] data = TransactionStoreTest.randomBytes(32); - private static String dbPath = "output_AccountStore_test"; private static String dbDirectory = "db_AccountStore_test"; private static String indexDirectory = "index_AccountStore_test"; - private static TronApplicationContext context; - private static AccountStore accountStore; - private static AccountAssetStore accountAssetStore; - private static Manager manager; - private static DynamicPropertiesStore dynamicPropertiesStore; - private static AssetIssueStore assetIssueStore; - private static ChainBaseManager chainBaseManager; + @Resource + private AccountStore accountStore; + @Resource + private DynamicPropertiesStore dynamicPropertiesStore; + @Resource + private AssetIssueStore assetIssueStore; private static byte[] address = TransactionStoreTest.randomBytes(32); private static byte[] accountName = TransactionStoreTest.randomBytes(32); static { + dbPath = "output_AccountStore_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -51,23 +44,10 @@ public class AccountStoreTest { }, Constant.TEST_CONF ); - context = new TronApplicationContext(DefaultConfig.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } - @BeforeClass - public static void init() { - accountStore = context.getBean(AccountStore.class); - accountAssetStore = context.getBean(AccountAssetStore.class); - dynamicPropertiesStore = context.getBean(DynamicPropertiesStore.class); - manager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); + @Before + public void init() { assetIssueStore = chainBaseManager.getAssetIssueStore(); dynamicPropertiesStore.saveAllowBlackHoleOptimization(1); AccountCapsule accountCapsule = new AccountCapsule(ByteString.copyFrom(address), @@ -149,7 +129,7 @@ public void assetTest() { assertEquals(100, (long)assets.get("200")); accountCapsule.clearAsset(); - try (ISession tmpSession = manager.getRevokingStore().buildSession()) { + try (ISession tmpSession = dbManager.getRevokingStore().buildSession()) { accountCapsule.addAssetAmountV2("100".getBytes(), 1, dynamicPropertiesStore, assetIssueStore); accountCapsule.reduceAssetAmountV2("200".getBytes(), 1, @@ -160,11 +140,11 @@ public void assetTest() { assertEquals(101, accountCapsule.getAssetV2("100")); assertEquals(99, accountCapsule.getAssetV2("200")); - try (ISession tmpSession = manager.getRevokingStore().buildSession()) { + try (ISession tmpSession = dbManager.getRevokingStore().buildSession()) { tmpSession.commit(); } - try (ISession tmpSession = manager.getRevokingStore().buildSession()) { + try (ISession tmpSession = dbManager.getRevokingStore().buildSession()) { accountCapsule.reduceAssetAmountV2("200".getBytes(), 89, dynamicPropertiesStore, assetIssueStore); accountCapsule.addAssetAmountV2("300".getBytes(), 10, @@ -178,7 +158,7 @@ public void assetTest() { assertEquals(10, (long)assets.get("200")); assertEquals(10, (long)assets.get("300")); - try (ISession tmpSession = manager.getRevokingStore().buildSession()) { + try (ISession tmpSession = dbManager.getRevokingStore().buildSession()) { accountCapsule.reduceAssetAmountV2("100".getBytes(), 91, dynamicPropertiesStore, assetIssueStore); accountCapsule.addAssetAmountV2("200".getBytes(), 0, diff --git a/framework/src/test/java/org/tron/core/db/BlockGenerate.java b/framework/src/test/java/org/tron/core/db/BlockGenerate.java index d7a2d21e408..197dd562485 100644 --- a/framework/src/test/java/org/tron/core/db/BlockGenerate.java +++ b/framework/src/test/java/org/tron/core/db/BlockGenerate.java @@ -1,6 +1,7 @@ package org.tron.core.db; import com.google.protobuf.ByteString; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.crypto.ECKey.ECDSASignature; import org.tron.common.parameter.CommonParameter; diff --git a/framework/src/test/java/org/tron/core/db/BlockStoreTest.java b/framework/src/test/java/org/tron/core/db/BlockStoreTest.java index 0a5df8bf9bd..cdf8dbcc29c 100644 --- a/framework/src/test/java/org/tron/core/db/BlockStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/BlockStoreTest.java @@ -1,40 +1,19 @@ package org.tron.core.db; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.After; -import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; @Slf4j -public class BlockStoreTest { +public class BlockStoreTest extends BaseTest { - private static final String dbPath = "output-blockStore-test"; - private static TronApplicationContext context; static { + dbPath = "output-blockStore-test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - BlockStore blockStore; - - @Before - public void init() { - blockStore = context.getBean(BlockStore.class); - } - - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @Test diff --git a/framework/src/test/java/org/tron/core/db/CommonStoreTest.java b/framework/src/test/java/org/tron/core/db/CommonStoreTest.java index 9304be0665e..a745379ee94 100644 --- a/framework/src/test/java/org/tron/core/db/CommonStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/CommonStoreTest.java @@ -1,43 +1,26 @@ package org.tron.core.db; -import java.io.File; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -public class CommonStoreTest { - private static String dbPath = "output_CommonStore_test"; +public class CommonStoreTest extends BaseTest { private static String dbDirectory = "db_CommonStore_test"; private static String indexDirectory = "index_CommonStore_test"; - private static TronApplicationContext context; - private static CommonStore commonStore; + @Resource + private CommonStore commonStore; static { + dbPath = "output_CommonStore_test"; Args.setParam(new String[] { "--output-directory", dbPath, "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory}, Constant.TEST_CONF ); - context = new TronApplicationContext(DefaultConfig.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - - @BeforeClass - public static void init() { - commonStore = context.getBean(CommonStore.class); } @Test diff --git a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java index 13107480bf5..4e7efdd43f1 100644 --- a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java +++ b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java @@ -8,20 +8,14 @@ import static org.tron.core.utils.ProposalUtil.ProposalType.TRANSACTION_FEE; import static org.tron.core.utils.ProposalUtil.ProposalType.WITNESS_127_PAY_PER_BLOCK; -import java.io.File; import java.util.HashMap; import java.util.Map; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.capsule.ProposalCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.db.api.EnergyPriceHistoryLoader; import org.tron.core.store.ProposalStore; @@ -30,10 +24,8 @@ @Slf4j -public class EnergyPriceHistoryLoaderTest { +public class EnergyPriceHistoryLoaderTest extends BaseTest { - private static ChainBaseManager chainBaseManager; - private static TronApplicationContext context; private static String dbPath = "output-EnergyPriceHistoryLoaderTest-test"; private static long t1 = 1542607200000L; private static long price1 = 20; @@ -46,23 +38,6 @@ public class EnergyPriceHistoryLoaderTest { static { Args.setParam(new String[] {"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - @BeforeClass - public static void init() { - chainBaseManager = context.getBean(ChainBaseManager.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } public void initDB() { @@ -102,7 +77,7 @@ public void initDB() { initProposal(parameters, 1572609600000L, State.CANCELED); } - private static void initProposal(long code, long timestamp, long price, State state) { + private void initProposal(long code, long timestamp, long price, State state) { long id = chainBaseManager.getDynamicPropertiesStore().getLatestProposalNum() + 1; Proposal proposal = Proposal.newBuilder().putParameters(code, price) @@ -116,7 +91,7 @@ private static void initProposal(long code, long timestamp, long price, State st chainBaseManager.getDynamicPropertiesStore().saveLatestProposalNum(id); } - private static void initProposal(Map parameters, long timestamp, State state) { + private void initProposal(Map parameters, long timestamp, State state) { long id = chainBaseManager.getDynamicPropertiesStore().getLatestProposalNum() + 1; Proposal proposal = Proposal.newBuilder().putAllParameters(parameters) @@ -132,9 +107,6 @@ private static void initProposal(Map parameters, long timestamp, Sta @Test public void testLoader() { - if (chainBaseManager == null) { - init(); - } EnergyPriceHistoryLoader loader = new EnergyPriceHistoryLoader(chainBaseManager); initDB(); @@ -154,10 +126,6 @@ public void testLoader() { @Test public void testProposalEmpty() { - if (chainBaseManager == null) { - init(); - } - // clean DB firstly ProposalStore proposalStore = chainBaseManager.getProposalStore(); proposalStore.forEach( diff --git a/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java b/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java index 031bb47eba2..87a38927be1 100644 --- a/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java +++ b/framework/src/test/java/org/tron/core/db/KhaosDatabaseTest.java @@ -1,25 +1,22 @@ package org.tron.core.db; import com.google.protobuf.ByteString; -import java.io.File; import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.List; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.testng.collections.Lists; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Pair; import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.BadNumberBlockException; import org.tron.core.exception.NonCommonBlockException; @@ -29,28 +26,19 @@ import org.tron.protos.Protocol.BlockHeader.raw; @Slf4j -public class KhaosDatabaseTest { +public class KhaosDatabaseTest extends BaseTest { - private static final String dbPath = "output-khaosDatabase-test"; - private static KhaosDatabase khaosDatabase; - private static TronApplicationContext context; + @Resource + private KhaosDatabase khaosDatabase; static { + dbPath = "output-khaosDatabase-test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); } @BeforeClass public static void init() { Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - khaosDatabase = context.getBean(KhaosDatabase.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @Test diff --git a/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java b/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java index a264b33ee98..f90b5712c56 100755 --- a/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/MarketPairPriceToOrderStoreTest.java @@ -1,22 +1,17 @@ package org.tron.core.db; -import java.io.File; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.junit.After; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FileUtil; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.MarketOrderIdListCapsule; import org.tron.core.capsule.utils.MarketUtils; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.ItemNotFoundException; import org.tron.core.store.MarketPairPriceToOrderStore; @@ -25,34 +20,11 @@ import org.tron.protos.Protocol.MarketPrice; @Slf4j -public class MarketPairPriceToOrderStoreTest { - - private static final String dbPath = "output-MarketPairPriceToOrderStore-test"; - private static TronApplicationContext context; - private static Manager dbManager; +public class MarketPairPriceToOrderStoreTest extends BaseTest { static { + dbPath = "output-MarketPairPriceToOrderStore-test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } @After diff --git a/framework/src/test/java/org/tron/core/db/NullifierStoreTest.java b/framework/src/test/java/org/tron/core/db/NullifierStoreTest.java index 58de5f0747f..5ed2f967a15 100644 --- a/framework/src/test/java/org/tron/core/db/NullifierStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/NullifierStoreTest.java @@ -1,57 +1,48 @@ package org.tron.core.db; -import java.io.File; import java.util.Random; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; +import org.tron.common.BaseTest; import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.BytesCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.store.NullifierStore; -public class NullifierStoreTest { +public class NullifierStoreTest extends BaseTest { private static final byte[] NULLIFIER_ONE = randomBytes(32); private static final byte[] NULLIFIER_TWO = randomBytes(32); private static final byte[] TRX_TWO = randomBytes(32); private static final byte[] TRX_TWO_NEW = randomBytes(32); - public static Application AppT; - private static NullifierStore nullifierStore; - private static String dbPath = "output_NullifierStore_test"; - private static TronApplicationContext context; + @Resource + public Application AppT; + @Resource + private NullifierStore nullifierStore; private static BytesCapsule nullifier1; private static BytesCapsule nullifier2; private static BytesCapsule nullifier2New; static { + dbPath = "output_NullifierStore_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @BeforeClass public static void init() { - nullifierStore = context.getBean(NullifierStore.class); nullifier1 = new BytesCapsule(NULLIFIER_ONE); nullifier2 = new BytesCapsule(TRX_TWO); nullifier2New = new BytesCapsule(TRX_TWO_NEW); + } + @Before + public void before() { nullifierStore.put(nullifier1); nullifierStore.put(NULLIFIER_TWO, nullifier2); } diff --git a/framework/src/test/java/org/tron/core/db/TransactionHistoryTest.java b/framework/src/test/java/org/tron/core/db/TransactionHistoryTest.java index c7439d84d82..812f19922ca 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionHistoryTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionHistoryTest.java @@ -1,30 +1,30 @@ package org.tron.core.db; -import java.io.File; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.capsule.TransactionInfoCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.BadItemException; import org.tron.core.store.TransactionHistoryStore; -public class TransactionHistoryTest { +public class TransactionHistoryTest extends BaseTest { private static final byte[] transactionId = TransactionStoreTest.randomBytes(32); - private static String dbPath = "output_TransactionHistoryStore_test"; private static String dbDirectory = "db_TransactionHistoryStore_test"; private static String indexDirectory = "index_TransactionHistoryStore_test"; - private static TronApplicationContext context; - private static TransactionHistoryStore transactionHistoryStore; + @Resource + private TransactionHistoryStore transactionHistoryStore; + + private static TransactionInfoCapsule transactionInfoCapsule; static { + dbPath = "output_TransactionHistoryStore_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -33,25 +33,20 @@ public class TransactionHistoryTest { }, Constant.TEST_CONF ); - context = new TronApplicationContext(DefaultConfig.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @BeforeClass public static void init() { - transactionHistoryStore = context.getBean(TransactionHistoryStore.class); - TransactionInfoCapsule transactionInfoCapsule = new TransactionInfoCapsule(); - + transactionInfoCapsule = new TransactionInfoCapsule(); transactionInfoCapsule.setId(transactionId); transactionInfoCapsule.setFee(1000L); transactionInfoCapsule.setBlockNumber(100L); transactionInfoCapsule.setBlockTimeStamp(200L); + + } + + @Before + public void before() { transactionHistoryStore.put(transactionId, transactionInfoCapsule); } diff --git a/framework/src/test/java/org/tron/core/db/TransactionRetStoreTest.java b/framework/src/test/java/org/tron/core/db/TransactionRetStoreTest.java index c4a629b12bc..04478f2c261 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionRetStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionRetStoreTest.java @@ -1,52 +1,44 @@ package org.tron.core.db; -import java.io.File; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.TransactionInfoCapsule; import org.tron.core.capsule.TransactionRetCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.BadItemException; import org.tron.core.store.TransactionRetStore; import org.tron.protos.Protocol.Transaction; -public class TransactionRetStoreTest { +public class TransactionRetStoreTest extends BaseTest { private static final byte[] transactionId = TransactionStoreTest.randomBytes(32); private static final byte[] blockNum = ByteArray.fromLong(1); - private static String dbPath = "output_TransactionRetStore_test"; private static String dbDirectory = "db_TransactionRetStore_test"; private static String indexDirectory = "index_TransactionRetStore_test"; - private static TronApplicationContext context; - private static TransactionRetStore transactionRetStore; + @Resource + private TransactionRetStore transactionRetStore; private static Transaction transaction; - private static TransactionStore transactionStore; + @Resource + private TransactionStore transactionStore; + + private static TransactionCapsule transactionCapsule; + private static TransactionRetCapsule transactionRetCapsule; static { + dbPath = "output_TransactionRetStore_test"; Args.setParam(new String[]{"--output-directory", dbPath, "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @BeforeClass public static void init() { - transactionRetStore = context.getBean(TransactionRetStore.class); - transactionStore = context.getBean(TransactionStore.class); TransactionInfoCapsule transactionInfoCapsule = new TransactionInfoCapsule(); transactionInfoCapsule.setId(transactionId); @@ -54,12 +46,18 @@ public static void init() { transactionInfoCapsule.setBlockNumber(100L); transactionInfoCapsule.setBlockTimeStamp(200L); - TransactionRetCapsule transactionRetCapsule = new TransactionRetCapsule(); + transactionRetCapsule = new TransactionRetCapsule(); transactionRetCapsule.addTransactionInfo(transactionInfoCapsule.getInstance()); - transactionRetStore.put(blockNum, transactionRetCapsule); + transaction = Transaction.newBuilder().build(); - TransactionCapsule transactionCapsule = new TransactionCapsule(transaction); + transactionCapsule = new TransactionCapsule(transaction); transactionCapsule.setBlockNum(1); + + } + + @Before + public void before() { + transactionRetStore.put(blockNum, transactionRetCapsule); transactionStore.put(transactionId, transactionCapsule); } diff --git a/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java b/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java index 7993ee5b19c..471a994d4dd 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionStoreTest.java @@ -1,26 +1,21 @@ package org.tron.core.db; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Random; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; +import org.tron.common.BaseTest; import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; import org.tron.common.crypto.ECKey; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ItemNotFoundException; @@ -32,7 +27,7 @@ import org.tron.protos.contract.WitnessContract.VoteWitnessContract.Vote; import org.tron.protos.contract.WitnessContract.WitnessCreateContract; -public class TransactionStoreTest { +public class TransactionStoreTest extends BaseTest { private static final byte[] key1 = TransactionStoreTest.randomBytes(21); private static final byte[] key2 = TransactionStoreTest.randomBytes(21); @@ -45,35 +40,21 @@ public class TransactionStoreTest { private static final long AMOUNT = 100; private static final String WITNESS_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - private static String dbPath = "output_TransactionStore_test"; private static String dbDirectory = "db_TransactionStore_test"; private static String indexDirectory = "index_TransactionStore_test"; - private static TransactionStore transactionStore; - private static TronApplicationContext context; - private static Application AppT; - private static ChainBaseManager chainBaseManager; + @Resource + private TransactionStore transactionStore; + @Resource + private Application AppT; /** * Init data. */ @BeforeClass public static void init() { + dbPath = "output_TransactionStore_test"; Args.setParam(new String[]{"--output-directory", dbPath, "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, "-w"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - chainBaseManager = context.getBean(ChainBaseManager.class); - transactionStore = chainBaseManager.getTransactionStore(); - } - - /** - * release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } /** diff --git a/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java b/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java index cb47bce4df6..d37b3d3d3a9 100644 --- a/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java +++ b/framework/src/test/java/org/tron/core/db/TransactionTraceTest.java @@ -18,22 +18,17 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; -import java.io.File; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.BalanceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -53,58 +48,18 @@ import org.tron.protos.contract.SmartContractOuterClass.SmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; -public class TransactionTraceTest { +public class TransactionTraceTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; - private static String dbPath = "output_TransactionTrace_test"; private static String dbDirectory = "db_TransactionTrace_test"; private static String indexDirectory = "index_TransactionTrace_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; private static ByteString ownerAddress = ByteString.copyFrom(ByteArray.fromInt(1)); private static ByteString contractAddress = ByteString.copyFrom(ByteArray.fromInt(2)); - - /* - * DeployContract tracetestContract [{"constant":false,"inputs":[{"name":"accountId","type": - * "uint256"}],"name":"getVoters","outputs":[{"name":"","type":"uint256"}],"payable":false," - * stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type" - * :"uint256"}],"name":"voters","outputs":[{"name":"","type":"uint256"}],"payable":false, - * "stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"vote","type" - * :"uint256"}],"name":"addVoters","outputs":[],"payable":false,"stateMutability":"nonpayable", - * "type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type": - * "constructor"}] 608060405234801561001057600080fd5b5060015b620186a081101561003857600081815260 - * 2081905260409020819055600a01610014565b5061010b806100486000396000f300608060405260043610605257 - * 63ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166386b646f281 - * 146057578063da58c7d914607e578063eb91a5ff146093575b600080fd5b348015606257600080fd5b50606c6004 - * 3560aa565b60408051918252519081900360200190f35b348015608957600080fd5b50606c60043560bc565b3480 - * 15609e57600080fd5b5060a860043560ce565b005b60009081526020819052604090205490565b60006020819052 - * 908152604090205481565b6000818152602081905260409020555600a165627a7a72305820f9935f89890e51bcf3 - * ea98fa4841c91ac5957a197d99eeb7879a775b30ee9a2d0029 1000000000 100 - * */ - /* - * DeployContract tracetestContract [{"constant":false,"inputs":[{"name":"accountId","type": - * "uint256"}],"name":"getVoters","outputs":[{"name":"","type":"uint256"}],"payable":false, - * "stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"", - * "type":"uint256"}],"name":"voters","outputs":[{"name":"","type":"uint256"}],"payable":false, - * "stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"vote","type" - * :"uint256"}],"name":"addVoters","outputs":[],"payable":false,"stateMutability":"nonpayable", - * "type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type": - * "constructor"}] 608060405234801561001057600080fd5b5060015b620186a08110156100385760008181526020 - * 81905260409020819055600a01610014565b5061010b806100486000396000f30060806040526004361060525763ff - * ffffff7c010000000000000000000000000000000000000000000000000000000060003504166386b646f281146057 - * 578063da58c7d914607e578063eb91a5ff146093575b600080fd5b348015606257600080fd5b50606c60043560aa56 - * 5b60408051918252519081900360200190f35b348015608957600080fd5b50606c60043560bc565b348015609e576 - * 00080fd5b5060a860043560ce565b005b60009081526020819052604090205490565b6000602081905290815260409 - * 0205481565b6000818152602081905260409020555600a165627a7a72305820f9935f89890e51bcf3ea98fa4841c91 - * ac5957a197d99eeb7879a775b30ee9a2d0029 1000000000 40 - * */ private static String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; private static String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; - /* - * triggercontract TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj addVoters(uint256) 113 false 1000000000 0 - * */ static { + dbPath = "output_TransactionTrace_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -115,15 +70,13 @@ public class TransactionTraceTest { }, "config-test-mainnet.conf" ); - context = new TronApplicationContext(DefaultConfig.class); } /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void init() { //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(100_000L); @@ -132,16 +85,6 @@ public static void init() { } - /** - * destroy clear data of testing. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - @Test public void testUseFee() throws InvalidProtocolBufferException, VMIllegalException, BalanceInsufficientException, 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 7d9bbcd5ad2..8b1724248a0 100644 --- a/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java +++ b/framework/src/test/java/org/tron/core/db/TxCacheDBTest.java @@ -1,26 +1,20 @@ package org.tron.core.db; -import java.io.File; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; +import org.tron.common.BaseTest; import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.capsule.BytesCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.keystore.Wallet; -public class TxCacheDBTest { - private static final String dbPath = "output_TransactionCache_test"; - - private static TronApplicationContext context; - private static Manager dbManager; +public class TxCacheDBTest extends BaseTest { + @Resource + private Application appT; /** * Init data. @@ -29,21 +23,9 @@ public class TxCacheDBTest { public static void init() { String dbDirectory = "db_TransactionCache_test"; String indexDirectory = "index_TransactionCache_test"; + dbPath = "output_TransactionCache_test"; Args.setParam(new String[]{"--output-directory", dbPath, "--storage-db-directory", dbDirectory, "--storage-index-directory", indexDirectory, "-w"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - Application appT = ApplicationFactory.create(context); - dbManager = context.getBean(Manager.class); - } - - /** - * release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @Test diff --git a/framework/src/test/java/org/tron/core/db/VotesStoreTest.java b/framework/src/test/java/org/tron/core/db/VotesStoreTest.java index 55b0a4882e3..9e5cd7c0098 100755 --- a/framework/src/test/java/org/tron/core/db/VotesStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/VotesStoreTest.java @@ -1,47 +1,30 @@ package org.tron.core.db; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.List; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.capsule.VotesCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.store.VotesStore; import org.tron.protos.Protocol.Vote; @Slf4j -public class VotesStoreTest { +public class VotesStoreTest extends BaseTest { - private static final String dbPath = "output-votesStore-test"; - private static TronApplicationContext context; static { + dbPath = "output-votesStore-test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); } - VotesStore votesStore; - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - - @Before - public void initDb() { - this.votesStore = context.getBean(VotesStore.class); - } + @Resource + private VotesStore votesStore; @Test public void putAndGetVotes() { diff --git a/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java b/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java index 5ae37650b6a..fd91e7da72a 100755 --- a/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java +++ b/framework/src/test/java/org/tron/core/db/WitnessStoreTest.java @@ -1,44 +1,26 @@ package org.tron.core.db; import com.google.protobuf.ByteString; -import java.io.File; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.store.WitnessStore; @Slf4j -public class WitnessStoreTest { - - private static final String dbPath = "output-witnessStore-test"; - private static TronApplicationContext context; +public class WitnessStoreTest extends BaseTest { static { + dbPath = "output-witnessStore-test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); } - WitnessStore witnessStore; - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - - @Before - public void initDb() { - this.witnessStore = context.getBean(WitnessStore.class); - } + @Resource + private WitnessStore witnessStore; @Test public void putAndGetWitness() { From 39d2690990480770deed11b853051a64b0a41b50 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Sat, 28 Jan 2023 18:48:14 +0800 Subject: [PATCH 003/142] fix(unitTest): replace context with spring test config --- .../tron/core/db2/core/SnapshotManager.java | 2 + .../test/java/org/tron/common/BaseTest.java | 5 +- .../tron/common/runtime/InheritanceTest.java | 46 +----- .../InternalTransactionComplexTest.java | 42 +---- .../common/runtime/ProgramResultTest.java | 64 +++----- .../tron/common/runtime/RuntimeImplTest.java | 83 +++------- .../runtime/RuntimeTransferComplexTest.java | 59 +------ .../vm/BandWidthRuntimeOutOfTimeTest.java | 49 ++---- ...andWidthRuntimeOutOfTimeWithCheckTest.java | 51 ++---- .../runtime/vm/BandWidthRuntimeTest.java | 61 +++---- .../vm/BandWidthRuntimeWithCheckTest.java | 74 +++------ .../tron/common/runtime/vm/BatchSendTest.java | 69 ++------ .../tron/common/runtime/vm/ChargeTest.java | 98 +++-------- .../runtime/vm/EnergyWhenAssertStyleTest.java | 94 +++-------- .../vm/EnergyWhenRequireStyleTest.java | 111 ++++--------- .../vm/EnergyWhenSendAndTransferTest.java | 59 ++----- .../vm/EnergyWhenTimeoutStyleTest.java | 48 ++---- .../common/runtime/vm/OperationsTest.java | 46 ++---- .../runtime/vm/PrecompiledContractsTest.java | 53 +----- .../PrecompiledContractsVerifyProofTest.java | 37 +---- .../common/runtime/vm/RepositoryTest.java | 67 +++----- .../common/runtime/vm/TimeBenchmarkTest.java | 46 ++---- .../runtime/vm/TransferToAccountTest.java | 45 +---- .../common/runtime/vm/TransferTokenTest.java | 40 +---- .../vm/ValidateMultiSignContractTest.java | 43 ++--- .../test/java/org/tron/core/WalletTest.java | 6 +- .../actuator/VoteWitnessActuatorTest.java | 13 +- .../core/actuator/utils/ProposalUtilTest.java | 143 +++++++--------- .../actuator/utils/TransactionUtilTest.java | 104 +++++------- .../actuator/utils/ZenChainParamsTest.java | 80 +++------ .../tron/core/capsule/AccountCapsuleTest.java | 60 +++---- .../core/capsule/ExchangeCapsuleTest.java | 53 +----- .../core/capsule/TransactionCapsuleTest.java | 39 +---- .../core/capsule/utils/AssetUtilTest.java | 31 +--- .../capsule/utils/ExchangeProcessorTest.java | 38 +---- .../core/db/EnergyPriceHistoryLoaderTest.java | 2 +- .../core/db/api/AssetUpdateHelperTest.java | 42 ++--- .../tron/core/db/backup/BackupDbUtilTest.java | 79 +++------ .../core/jsonrpc/BuildTransactionTest.java | 38 +---- .../tron/core/jsonrpc/JsonrpcServiceTest.java | 45 ++--- .../core/jsonrpc/SectionBloomStoreTest.java | 32 +--- .../tron/core/jsonrpc/WalletCursorTest.java | 43 ++--- .../prometheus/PrometheusApiServiceTest.java | 82 +++------- .../messagehandler/BlockMsgHandlerTest.java | 37 ++--- .../core/net/services/AdvServiceTest.java | 37 +---- .../core/net/services/RelayServiceTest.java | 41 ++--- .../java/org/tron/core/pbft/PbftApiTest.java | 49 ++---- .../core/services/ProposalServiceTest.java | 55 +++---- .../filter/HttpApiAccessFilterTest.java | 75 +++------ .../LiteFnQueryGrpcInterceptorTest.java | 8 +- .../filter/LiteFnQueryHttpFilterTest.java | 68 +++----- .../filter/RpcApiAccessInterceptorTest.java | 8 +- .../org/tron/core/services/http/UtilTest.java | 33 +--- .../core/witness/ProposalControllerTest.java | 48 ++---- .../core/witness/WitnessControllerTest.java | 38 +---- .../tron/core/zksnark/LibrustzcashTest.java | 154 ++++++++---------- .../core/zksnark/MerkleContainerTest.java | 50 ++---- .../org/tron/core/zksnark/MerkleTreeTest.java | 40 +---- .../tron/core/zksnark/NoteEncDecryTest.java | 38 +---- .../tron/core/zksnark/SendCoinShieldTest.java | 49 ++---- .../core/zksnark/ShieldedReceiveTest.java | 63 ++----- .../tron/program/AccountVoteWitnessTest.java | 45 +---- .../tron/program/LiteFullNodeToolTest.java | 33 ++-- .../org/tron/program/SolidityNodeTest.java | 4 - 64 files changed, 913 insertions(+), 2382 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java index fe59a2737dd..97210e9ae07 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotManager.java @@ -16,6 +16,7 @@ import java.util.Map; import java.util.Objects; import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; @@ -122,6 +123,7 @@ public void close() { exitThread.interrupt(); // help GC exitThread = null; + flushServices.values().forEach(ExecutorService::shutdown); } catch (Exception e) { logger.warn("exitThread interrupt error", e); } diff --git a/framework/src/test/java/org/tron/common/BaseTest.java b/framework/src/test/java/org/tron/common/BaseTest.java index f7d453013b4..1826dddea64 100644 --- a/framework/src/test/java/org/tron/common/BaseTest.java +++ b/framework/src/test/java/org/tron/common/BaseTest.java @@ -4,6 +4,7 @@ import java.io.File; import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.junit.AfterClass; import org.junit.runner.RunWith; import org.springframework.test.annotation.DirtiesContext; @@ -28,7 +29,6 @@ public abstract class BaseTest { protected static String dbPath; - @Resource protected Manager dbManager; @Resource @@ -37,7 +37,7 @@ public abstract class BaseTest { @AfterClass public static void destroy() { Args.clearParam(); - if (FileUtil.deleteDir(new File(dbPath))) { + if (StringUtils.isNotEmpty(dbPath) && FileUtil.deleteDir(new File(dbPath))) { logger.info("Release resources successful."); } else { logger.info("Release resources failure."); @@ -81,5 +81,4 @@ public Protocol.Block getSignedBlock(ByteString witness, long time, byte[] priva return block.toBuilder().setBlockHeader(blockHeader).build(); } - } diff --git a/framework/src/test/java/org/tron/common/runtime/InheritanceTest.java b/framework/src/test/java/org/tron/common/runtime/InheritanceTest.java index f5101af19af..c3d00ecf2c4 100644 --- a/framework/src/test/java/org/tron/common/runtime/InheritanceTest.java +++ b/framework/src/test/java/org/tron/common/runtime/InheritanceTest.java @@ -1,21 +1,14 @@ package org.tron.common.runtime; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -25,54 +18,31 @@ import org.tron.protos.Protocol.AccountType; @Slf4j -public class InheritanceTest { +public class InheritanceTest extends BaseTest { - private static final String dbPath = "output_InheritanceTest"; private static final String OWNER_ADDRESS; - private static Runtime runtime; - private static Manager dbManager; - private static TronApplicationContext context; - private static Application appT; - private static RepositoryImpl repository; + private RepositoryImpl repository; static { + dbPath = "output_InheritanceTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; } /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void init() { repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), 100000000); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * pragma solidity ^0.4.19; - * * contract foo { uint256 public id=10; function getNumber() returns (uint256){return 100;} * function getName() returns (string){ return "foo"; } } - * * contract bar is foo { function getName() returns (string) { return "bar"; } function getId() * returns(uint256){return id;} } */ @@ -119,7 +89,7 @@ public void inheritanceTest() /* ========================== CALL getName() return child value ============================= */ byte[] triggerData1 = TvmTestUtils.parseAbi("getName()", ""); - runtime = TvmTestUtils + Runtime runtime = TvmTestUtils .triggerContractWholeProcessReturnContractAddress(callerAddress, contractAddress, triggerData1, 0, 1000000, repository, null); diff --git a/framework/src/test/java/org/tron/common/runtime/InternalTransactionComplexTest.java b/framework/src/test/java/org/tron/common/runtime/InternalTransactionComplexTest.java index 22fb44bfacf..ca05cb8d3ac 100644 --- a/framework/src/test/java/org/tron/common/runtime/InternalTransactionComplexTest.java +++ b/framework/src/test/java/org/tron/common/runtime/InternalTransactionComplexTest.java @@ -1,22 +1,15 @@ package org.tron.common.runtime; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.vm.DataWord; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -26,55 +19,33 @@ import org.tron.protos.Protocol.AccountType; @Slf4j -public class InternalTransactionComplexTest { +public class InternalTransactionComplexTest extends BaseTest { - private static final String dbPath = "output_InternalTransactionComplexTest"; private static final String OWNER_ADDRESS; private static Runtime runtime; - private static Manager dbManager; - private static TronApplicationContext context; - private static Application appT; private static RepositoryImpl repository; static { + dbPath = "output_InternalTransactionComplexTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug", "--support-constant"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; } /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void init() { repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), 100000000); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * pragma solidity 0.4.24; - * * // this is to test wither the TVM is returning vars from one contract calling another // * contract's functions. - * * contract callerContract { // lets set up our instance of the new contract calledContract * CALLED_INSTANCE; // lets set the contract instance address in the constructor * constructor(address _addr) public { CALLED_INSTANCE = calledContract(_addr); } // lets create a @@ -85,7 +56,6 @@ public static void destroy() { * in to temp vars (bool _bool, uint256 _uint, bytes32 _bytes32) = CALLED_INSTANCE.testReturns(); * // lets write those temp vars to state testCallbackReturns_.someBool = _bool; * testCallbackReturns_.someUint = _uint; testCallbackReturns_.someBytes32 = _bytes32; } } - * * contract calledContract { function testReturns() external pure returns(bool, uint256, bytes32) * { return(true, 314159, 0x123456); } } */ diff --git a/framework/src/test/java/org/tron/common/runtime/ProgramResultTest.java b/framework/src/test/java/org/tron/common/runtime/ProgramResultTest.java index 8fa590eb4d8..be54826cf5b 100644 --- a/framework/src/test/java/org/tron/common/runtime/ProgramResultTest.java +++ b/framework/src/test/java/org/tron/common/runtime/ProgramResultTest.java @@ -3,29 +3,23 @@ import static org.tron.core.capsule.utils.TransactionUtil.buildTransactionInfoInstance; import static org.tron.core.utils.TransactionUtil.generateContractAddress; -import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.vm.DataWord; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.TransactionInfoCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionTrace; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -41,22 +35,17 @@ @Slf4j -public class ProgramResultTest { +public class ProgramResultTest extends BaseTest { - private static final String dbPath = "output_InternalTransactionComplexTest"; private static final String OWNER_ADDRESS; private static final String TRANSFER_TO; private static Runtime runtime; - private static Manager dbManager; - private static TronApplicationContext context; - private static Application appT; private static RepositoryImpl repository; static { + dbPath = "output_InternalTransactionComplexTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug", "--support-constant"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; TRANSFER_TO = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; } @@ -64,9 +53,8 @@ public class ProgramResultTest { /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void init() { repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), 100000000); @@ -75,20 +63,6 @@ public static void init() { repository.commit(); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * pragma solidity ^0.4.8; contract B{ address public calledAddress; constructor (address d) * payable{calledAddress = d;} function setB() payable returns(address,address){ calledContract c1 @@ -127,8 +101,8 @@ public void uniqueInternalTransactionHashTest() internalTransaction -> hashList.add(Hex.toHexString(internalTransaction.getHash()))); // No dup List dupHash = hashList.stream() - .collect(Collectors.toMap(e -> e, e -> 1, (a, b) -> a + b)).entrySet().stream() - .filter(entry -> entry.getValue() > 1).map(entry -> entry.getKey()) + .collect(Collectors.toMap(e -> e, e -> 1, Integer::sum)).entrySet().stream() + .filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey) .collect(Collectors.toList()); Assert.assertEquals(dupHash.size(), 0); } @@ -307,27 +281,27 @@ public void successAndFailResultTest() new DataWord(internalTransactionsList.get(0).getTransferToAddress()).getLast20Bytes(), new DataWord(bContract).getLast20Bytes()); Assert.assertEquals(internalTransactionsList.get(0).getNote(), "create"); - Assert.assertEquals(internalTransactionsList.get(0).isRejected(), false); + Assert.assertFalse(internalTransactionsList.get(0).isRejected()); Assert.assertEquals(internalTransactionsList.get(1).getValue(), 5); Assert.assertEquals(internalTransactionsList.get(1).getSender(), aContract); Assert.assertEquals( new DataWord(internalTransactionsList.get(1).getTransferToAddress()).getLast20Bytes(), new DataWord(bContract).getLast20Bytes()); Assert.assertEquals(internalTransactionsList.get(1).getNote(), "call"); - Assert.assertEquals(internalTransactionsList.get(1).isRejected(), false); + Assert.assertFalse(internalTransactionsList.get(1).isRejected()); Assert.assertEquals(internalTransactionsList.get(2).getValue(), 0); Assert.assertEquals(internalTransactionsList.get(2).getSender(), aContract); Assert.assertEquals( new DataWord(internalTransactionsList.get(2).getTransferToAddress()).getLast20Bytes(), new DataWord(bContract).getLast20Bytes()); Assert.assertEquals(internalTransactionsList.get(2).getNote(), "call"); - Assert.assertEquals(internalTransactionsList.get(2).isRejected(), false); + Assert.assertFalse(internalTransactionsList.get(2).isRejected()); Assert.assertEquals(internalTransactionsList.get(3).getValue(), 1); Assert.assertEquals(new DataWord(internalTransactionsList.get(3).getSender()).getLast20Bytes(), new DataWord(bContract).getLast20Bytes()); Assert.assertEquals(internalTransactionsList.get(3).getTransferToAddress(), cContract); Assert.assertEquals(internalTransactionsList.get(3).getNote(), "call"); - Assert.assertEquals(internalTransactionsList.get(3).isRejected(), false); + Assert.assertFalse(internalTransactionsList.get(3).isRejected()); checkTransactionInfo(traceSuccess, trx1, null, internalTransactionsList); // ======================================= Test Fail ======================================= @@ -352,28 +326,28 @@ public void successAndFailResultTest() new DataWord(internalTransactionsListFail.get(0).getTransferToAddress()).getLast20Bytes(), new DataWord(bContract2).getLast20Bytes()); Assert.assertEquals(internalTransactionsListFail.get(0).getNote(), "create"); - Assert.assertEquals(internalTransactionsListFail.get(0).isRejected(), true); + Assert.assertTrue(internalTransactionsListFail.get(0).isRejected()); Assert.assertEquals(internalTransactionsListFail.get(1).getValue(), 5); Assert.assertEquals(internalTransactionsListFail.get(1).getSender(), aContract); Assert.assertEquals( new DataWord(internalTransactionsListFail.get(1).getTransferToAddress()).getLast20Bytes(), new DataWord(bContract2).getLast20Bytes()); Assert.assertEquals(internalTransactionsListFail.get(1).getNote(), "call"); - Assert.assertEquals(internalTransactionsListFail.get(1).isRejected(), true); + Assert.assertTrue(internalTransactionsListFail.get(1).isRejected()); Assert.assertEquals(internalTransactionsListFail.get(2).getValue(), 0); Assert.assertEquals(internalTransactionsListFail.get(2).getSender(), aContract); Assert.assertEquals( new DataWord(internalTransactionsListFail.get(2).getTransferToAddress()).getLast20Bytes(), new DataWord(bContract2).getLast20Bytes()); Assert.assertEquals(internalTransactionsListFail.get(2).getNote(), "call"); - Assert.assertEquals(internalTransactionsListFail.get(2).isRejected(), true); + Assert.assertTrue(internalTransactionsListFail.get(2).isRejected()); Assert.assertEquals(internalTransactionsListFail.get(3).getValue(), 1); Assert.assertEquals( new DataWord(internalTransactionsListFail.get(3).getSender()).getLast20Bytes(), new DataWord(bContract2).getLast20Bytes()); Assert.assertEquals(internalTransactionsListFail.get(3).getTransferToAddress(), cContract); Assert.assertEquals(internalTransactionsListFail.get(3).getNote(), "call"); - Assert.assertEquals(internalTransactionsListFail.get(3).isRejected(), true); + Assert.assertTrue(internalTransactionsListFail.get(3).isRejected()); checkTransactionInfo(traceFailed, trx2, null, internalTransactionsListFail); } @@ -520,14 +494,14 @@ public void suicideResultTest() .getInternalTransactions(); Assert .assertEquals(dbManager.getAccountStore().get(Hex.decode(TRANSFER_TO)).getBalance(), 1000); - Assert.assertEquals(dbManager.getAccountStore().get(suicideContract), null); + Assert.assertNull(dbManager.getAccountStore().get(suicideContract)); Assert.assertEquals(internalTransactionsList.get(0).getValue(), 1000); Assert.assertEquals(new DataWord(internalTransactionsList.get(0).getSender()).getLast20Bytes(), new DataWord(suicideContract).getLast20Bytes()); Assert.assertEquals(internalTransactionsList.get(0).getTransferToAddress(), Hex.decode(TRANSFER_TO)); Assert.assertEquals(internalTransactionsList.get(0).getNote(), "suicide"); - Assert.assertEquals(internalTransactionsList.get(0).isRejected(), false); + Assert.assertFalse(internalTransactionsList.get(0).isRejected()); checkTransactionInfo(trace, trx, null, internalTransactionsList); } diff --git a/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java b/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java index cd23edbcb5e..04b08d3a58d 100644 --- a/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java +++ b/framework/src/test/java/org/tron/common/runtime/RuntimeImplTest.java @@ -3,26 +3,19 @@ import static org.tron.common.runtime.TvmTestUtils.generateDeploySmartContractAndGetTransaction; import static org.tron.common.runtime.TvmTestUtils.generateTriggerSmartContractAndGetTransaction; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.actuator.VMActuator; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ContractCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionContext; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -38,31 +31,28 @@ @Slf4j -public class RuntimeImplTest { +public class RuntimeImplTest extends BaseTest { - private Manager dbManager; - private TronApplicationContext context; private Repository repository; - private String dbPath = "output_RuntimeImplTest"; - private Application AppT; - private byte[] callerAddress; - private long callerTotalBalance = 4_000_000_000L; - private byte[] creatorAddress; - private long creatorTotalBalance = 3_000_000_000L; + private static final byte[] callerAddress; + private final long callerTotalBalance = 4_000_000_000L; + private static final byte[] creatorAddress; + private final long creatorTotalBalance = 3_000_000_000L; - /** - * Init data. - */ - @Before - public void init() { + static { + dbPath = "output_RuntimeImplTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); callerAddress = Hex .decode(Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"); creatorAddress = Hex .decode(Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abd"); - dbManager = context.getBean(Manager.class); + } + + /** + * Init data. + */ + @Before + public void init() { dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(5_000_000_000L); // unit is trx repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); @@ -117,11 +107,10 @@ public void getCreatorEnergyLimit2Test() throws ContractValidateException, Contr + "060018201915060aa565b505050565b600080600091505b8282101560e1576001905060018201915060cc56" + "5b5050505600a165627a7a72305820267cf0ebf31051a92ff62bed7490045b8063be9f1e1a22d07dce25765" + "4c8c17b0029"; - String libraryAddressPair = null; Transaction trx = generateDeploySmartContractAndGetTransaction(contractName, creatorAddress, ABI, - code, value, feeLimit, consumeUserResourcePercent, libraryAddressPair); + code, value, feeLimit, consumeUserResourcePercent, null); RuntimeImpl runtimeImpl = new RuntimeImpl(); runtimeImpl.execute( @@ -167,7 +156,6 @@ public void getCreatorEnergyLimit2Test() throws ContractValidateException, Contr expectEnergyLimit4); feeLimit = 3_000_000_000L; - value = 10L; long expectEnergyLimit5 = 20_009_999L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -175,7 +163,6 @@ public void getCreatorEnergyLimit2Test() throws ContractValidateException, Contr expectEnergyLimit5); feeLimit = 3_000L; - value = 10L; long expectEnergyLimit6 = 30L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -207,11 +194,10 @@ public void getCallerAndCreatorEnergyLimit2With0PercentTest() + "060018201915060aa565b505050565b600080600091505b8282101560e1576001905060018201915060cc56" + "5b5050505600a165627a7a72305820267cf0ebf31051a92ff62bed7490045b8063be9f1e1a22d07dce25765" + "4c8c17b0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractWithCreatorEnergyLimitAndReturnTvmTestResult(contractName, creatorAddress, ABI, code, value, - feeLimit, consumeUserResourcePercent, libraryAddressPair, dbManager, null, + feeLimit, consumeUserResourcePercent, null, dbManager, null, creatorEnergyLimit); byte[] contractAddress = result.getContractAddress(); @@ -229,8 +215,6 @@ public void getCallerAndCreatorEnergyLimit2With0PercentTest() AccountCapsule callerAccount = repository.getAccount(callerAddress); TriggerSmartContract contract = ContractCapsule.getTriggerContractFromTransaction(trx); - feeLimit = 1_000_000_000L; - value = 0L; long expectEnergyLimit1 = 10_000_000L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -245,8 +229,6 @@ public void getCallerAndCreatorEnergyLimit2With0PercentTest() repository.putAccountValue(creatorAddress, creatorAccount); repository.commit(); - feeLimit = 1_000_000_000L; - value = 0L; long expectEnergyLimit2 = 10_005_000L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -277,8 +259,6 @@ public void getCallerAndCreatorEnergyLimit2With0PercentTest() repository.putAccountValue(callerAddress, callerAccount); repository.commit(); - value = 10L; - feeLimit = 5_000_000_000L; long expectEnergyLimit5 = 30_014_999L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -311,11 +291,10 @@ public void getCallerAndCreatorEnergyLimit2With40PercentTest() + "5060018201915060aa565b505050565b600080600091505b8282101560e1576001905060018201915060cc5" + "65b5050505600a165627a7a72305820267cf0ebf31051a92ff62bed7490045b8063be9f1e1a22d07dce2576" + "54c8c17b0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractWithCreatorEnergyLimitAndReturnTvmTestResult(contractName, creatorAddress, ABI, code, value, - feeLimit, consumeUserResourcePercent, libraryAddressPair, dbManager, null, + feeLimit, consumeUserResourcePercent, null, dbManager, null, creatorEnergyLimit); byte[] contractAddress = result.getContractAddress(); @@ -333,8 +312,6 @@ public void getCallerAndCreatorEnergyLimit2With40PercentTest() AccountCapsule callerAccount = repository.getAccount(callerAddress); TriggerSmartContract contract = ContractCapsule.getTriggerContractFromTransaction(trx); - feeLimit = 1_000_000_000L; - value = 0L; long expectEnergyLimit1 = 10_000_000L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -349,8 +326,6 @@ public void getCallerAndCreatorEnergyLimit2With40PercentTest() repository.putAccountValue(creatorAddress, creatorAccount); repository.commit(); - feeLimit = 1_000_000_000L; - value = 0L; long expectEnergyLimit2 = 10_005_000L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -391,11 +366,10 @@ public void getCallerAndCreatorEnergyLimit2With100PercentTest() + "060018201915060aa565b505050565b600080600091505b8282101560e1576001905060018201915060cc56" + "5b5050505600a165627a7a72305820267cf0ebf31051a92ff62bed7490045b8063be9f1e1a22d07dce25765" + "4c8c17b0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractWithCreatorEnergyLimitAndReturnTvmTestResult(contractName, creatorAddress, ABI, code, value, - feeLimit, consumeUserResourcePercent, libraryAddressPair, dbManager, null, + feeLimit, consumeUserResourcePercent, null, dbManager, null, creatorEnergyLimit); byte[] contractAddress = result.getContractAddress(); @@ -413,8 +387,6 @@ public void getCallerAndCreatorEnergyLimit2With100PercentTest() AccountCapsule callerAccount = repository.getAccount(callerAddress); TriggerSmartContract contract = ContractCapsule.getTriggerContractFromTransaction(trx); - feeLimit = 1_000_000_000L; - value = 0L; long expectEnergyLimit1 = 10_000_000L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -429,8 +401,6 @@ public void getCallerAndCreatorEnergyLimit2With100PercentTest() repository.putAccountValue(creatorAddress, creatorAccount); repository.commit(); - feeLimit = 1_000_000_000L; - value = 0L; long expectEnergyLimit2 = 10_000_000L; Assert.assertEquals( ((VMActuator) runtimeImpl.getActuator2()) @@ -445,21 +415,6 @@ public void getCallerAndCreatorEnergyLimit2With100PercentTest() .getTotalEnergyLimitWithFixRatio(creatorAccount, callerAccount, contract, feeLimit, value), expectEnergyLimit3); - - } - - /** - * Release resources. - */ - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } } diff --git a/framework/src/test/java/org/tron/common/runtime/RuntimeTransferComplexTest.java b/framework/src/test/java/org/tron/common/runtime/RuntimeTransferComplexTest.java index e983ce12647..ef85569e0e6 100644 --- a/framework/src/test/java/org/tron/common/runtime/RuntimeTransferComplexTest.java +++ b/framework/src/test/java/org/tron/common/runtime/RuntimeTransferComplexTest.java @@ -2,23 +2,16 @@ import static org.tron.core.db.TransactionTrace.convertToTronAddress; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.common.utils.WalletUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -30,21 +23,16 @@ import stest.tron.wallet.common.client.utils.DataWord; @Slf4j -public class RuntimeTransferComplexTest { +public class RuntimeTransferComplexTest extends BaseTest { - private static final String dbPath = "output_RuntimeTransferComplexTest"; private static final String OWNER_ADDRESS; private static final String TRANSFER_TO; private static Runtime runtime; - private static Manager dbManager; - private static TronApplicationContext context; - private static Application appT; private static RepositoryImpl repository; static { + dbPath = "output_RuntimeTransferComplexTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; TRANSFER_TO = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; } @@ -52,9 +40,8 @@ public class RuntimeTransferComplexTest { /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void init() { repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), 1000000000); @@ -63,20 +50,6 @@ public static void init() { repository.commit(); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * Test constructor Transfer pragma solidity ^0.4.16; contract transferWhenDeploy { constructor () * payable{} } @@ -132,7 +105,7 @@ public void TransferTrxToContractAccountFailIfNotPayable() consumeUserResourcePercent, null); byte[] contractAddress = WalletUtil.generateContractAddress(trx); runtime = TvmTestUtils.processTransactionAndReturnRuntime(trx, repository, null); - Assert.assertNotNull(runtime.getRuntimeError().contains("REVERT")); + Assert.assertTrue(runtime.getRuntimeError().contains("REVERT")); Assert.assertNull(dbManager.getAccountStore().get(contractAddress)); recoverDeposit(); } @@ -194,34 +167,25 @@ public void TransferTrxToContractAccountWhenTriggerAContract() * payable { CALLED_INSTANCE = calledContract(_addr); } // expect calledContract -5, toAddress +5 * function testCallTransferToInCalledContract(address toAddress) { * CALLED_INSTANCE.transferTo(toAddress); } - * * // expect calledContract -0, toAddress +0 function testRevertForCall(address toAddress){ * CALLED_INSTANCE.transferTo(toAddress); revert(); } function testExceptionForCall(address * toAddress){ CALLED_INSTANCE.transferTo(toAddress); assert(1==2); } // expect c +100 -5, * toAddress +0 function testTransferToInCreatedContract(address toAddress) payable * returns(address){ createdContract c = (new createdContract).value(100)(); * c.transferTo(toAddress); return address(c); } - * * // expect c +100 -5, toAddress not exist function testRevertForCreate(address toAddress) * payable returns(address){ createdContract c = (new createdContract).value(100)(); * c.transferTo(toAddress); revert(); return address(c); } - * * // expect c +100 -5, toAddress not exist function testExceptionForCreate(address toAddress) * payable returns(address){ createdContract c = (new createdContract).value(100)(); * c.transferTo(toAddress); assert(1==2); return address(c); } - * * function getBalance() public view returns(uint256){ return this.balance; } } - * * contract calledContract { constructor() payable {} function transferTo(address toAddress) * payable{ toAddress.transfer(5); } - * * function getBalance() public view returns(uint256){ return this.balance; } - * * } - * * contract createdContract { constructor() payable {} function transferTo(address toAddress){ * toAddress.transfer(5); } - * * function getBalance() public view returns(uint256){ return this.balance; } } */ @@ -352,8 +316,6 @@ public void TransferCallValueTestWhenUsingCallAndCreate() .generateTriggerSmartContractAndGetTransaction(msgSenderAddress, callerAddress, triggerData6, triggerCallValue, feeLimit); runtime = TvmTestUtils.processTransactionAndReturnRuntime(transaction6, repository, null); - byte[] createdAddress3 = convertToTronAddress( - new DataWord(runtime.getResult().getHReturn()).getLast20Bytes()); Assert.assertTrue(Hex.toHexString(new DataWord(createdAddress2).getLast20Bytes()) .equalsIgnoreCase("0000000000000000000000000000000000000000")); Assert.assertTrue(runtime.getRuntimeError().contains("Invalid operation code: opCode[fe];")); @@ -394,10 +356,9 @@ private byte[] deployCalledContract() long feeLimit = 100000000; long consumeUserResourcePercent = 0; - byte[] contractAddress = TvmTestUtils + return TvmTestUtils .deployContractWholeProcessReturnContractAddress(contractName, address, ABI, code, value, feeLimit, consumeUserResourcePercent, null, repository, null); - return contractAddress; } private byte[] deployCallerContract(byte[] calledAddress) @@ -475,14 +436,12 @@ private byte[] deployCallerContract(byte[] calledAddress) long value = 1000; long feeLimit = 100000000; long consumeUserResourcePercent = 0; - byte[] contractAddress = TvmTestUtils + return TvmTestUtils .deployContractWholeProcessReturnContractAddress(contractName, callerAddress, callerABI, callerCode, value, feeLimit, consumeUserResourcePercent, null, repository, null); - return contractAddress; } private void recoverDeposit() { - dbManager = context.getBean(Manager.class); repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java index f8a4f1ef0bb..9bfaebc0edf 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java @@ -17,24 +17,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionTrace; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -53,32 +47,26 @@ /** * pragma solidity ^0.4.2; - * * contract Fibonacci { - * * event Notify(uint input, uint result); - * * function fibonacci(uint number) constant returns(uint result) { if (number == 0) { return 0; } * else if (number == 1) { return 1; } else { uint256 first = 0; uint256 second = 1; uint256 ret = * 0; for(uint256 i = 2; i <= number; i++) { ret = first + second; first = second; second = ret; } * return ret; } } - * * function fibonacciNotify(uint number) returns(uint result) { result = fibonacci(number); * Notify(number, result); } } */ -public class BandWidthRuntimeOutOfTimeTest { +public class BandWidthRuntimeOutOfTimeTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; - private static String dbPath = "output_BandWidthRuntimeOutOfTimeTest_test"; - private static String dbDirectory = "db_BandWidthRuntimeOutOfTimeTest_test"; - private static String indexDirectory = "index_BandWidthRuntimeOutOfTimeTest_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; + private static final String dbDirectory = "db_BandWidthRuntimeOutOfTimeTest_test"; + private static final String indexDirectory = "index_BandWidthRuntimeOutOfTimeTest_test"; - private static String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; - private static String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; + private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; + private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; static { + dbPath = "output_BandWidthRuntimeOutOfTimeTest_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -89,17 +77,13 @@ public class BandWidthRuntimeOutOfTimeTest { }, "config-test-mainnet.conf" ); - context = new TronApplicationContext(DefaultConfig.class); } - private String trx2ContractAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; - /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void init() { //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647828000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -125,16 +109,6 @@ public static void init() { .saveLatestBlockHeaderTimestamp(System.currentTimeMillis() / 1000); } - /** - * destroy clear data of testing. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - @Test public void testSuccess() { try { @@ -216,8 +190,7 @@ private byte[] createContract() TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); dbManager.consumeBandwidth(trxCap, trace); - BlockCapsule blockCapsule = null; - trace.init(blockCapsule); + trace.init(null); trace.exec(); trace.finalization(); owner = dbManager.getAccountStore() diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java index 68fa9e12fa7..b39f4e56391 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java @@ -17,24 +17,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionTrace; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -55,32 +49,25 @@ /** * pragma solidity ^0.4.2; - * * contract Fibonacci { - * * event Notify(uint input, uint result); - * * function fibonacci(uint number) constant returns(uint result) { if (number == 0) { return 0; } * else if (number == 1) { return 1; } else { uint256 first = 0; uint256 second = 1; uint256 ret = * 0; for(uint256 i = 2; i <= number; i++) { ret = first + second; first = second; second = ret; } * return ret; } } - * * function fibonacciNotify(uint number) returns(uint result) { result = fibonacci(number); * Notify(number, result); } } */ -public class BandWidthRuntimeOutOfTimeWithCheckTest { +public class BandWidthRuntimeOutOfTimeWithCheckTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; - private static String dbPath = "output_BandWidthRuntimeOutOfTimeTest_test"; - private static String dbDirectory = "db_BandWidthRuntimeOutOfTimeTest_test"; - private static String indexDirectory = "index_BandWidthRuntimeOutOfTimeTest_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; - - private static String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; - private static String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; + private static final String dbDirectory = "db_BandWidthRuntimeOutOfTimeTest_test"; + private static final String indexDirectory = "index_BandWidthRuntimeOutOfTimeTest_test"; + private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; + private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; static { + dbPath = "output_BandWidthRuntimeOutOfTimeTest_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -91,17 +78,13 @@ public class BandWidthRuntimeOutOfTimeWithCheckTest { }, "config-test-mainnet.conf" ); - context = new TronApplicationContext(DefaultConfig.class); } - private String trx2ContractAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; - /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + @Before + public void init() { //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647837000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -127,16 +110,6 @@ public static void init() { .saveLatestBlockHeaderTimestamp(System.currentTimeMillis() / 1000); } - /** - * destroy clear data of testing. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - @Test public void testSuccess() { try { @@ -172,9 +145,7 @@ public void testSuccess() { Assert.assertEquals(990000000, balance); Assert.assertEquals(9950000 * Constant.SUN_PER_ENERGY, balance + energy * Constant.SUN_PER_ENERGY); - } catch (TronException e) { - Assert.assertNotNull(e); - } catch (ReceiptCheckErrException e) { + } catch (TronException | ReceiptCheckErrException e) { Assert.assertNotNull(e); } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java index 5e6663e8cfe..9309bc398bc 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java @@ -17,26 +17,19 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.ReceiptCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionTrace; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -53,21 +46,18 @@ import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; -public class BandWidthRuntimeTest { +public class BandWidthRuntimeTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; - private static String dbPath = "output_BandWidthRuntimeTest_test"; - private static String dbDirectory = "db_BandWidthRuntimeTest_test"; - private static String indexDirectory = "index_BandWidthRuntimeTest_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; - - private static String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; - private static String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; - private static String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; + private static final String dbDirectory = "db_BandWidthRuntimeTest_test"; + private static final String indexDirectory = "index_BandWidthRuntimeTest_test"; + private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; + private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; + private static final String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; + private static boolean init; static { + dbPath = "output_BandWidthRuntimeTest_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -77,16 +67,16 @@ public class BandWidthRuntimeTest { }, "config-test-mainnet.conf" ); - context = new TronApplicationContext(DefaultConfig.class); } /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); + @Before + public void init() { + if (init) { + return; + } //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526547838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -122,25 +112,13 @@ public static void init() { dbManager.getDynamicPropertiesStore() .saveLatestBlockHeaderTimestamp(System.currentTimeMillis() / 1000); - } - - /** - * destroy clear data of testing. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); + init = true; } @Test public void testSuccess() { try { byte[] contractAddress = createContract(); - AccountCapsule triggerOwner = dbManager.getAccountStore() - .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); - long energy = triggerOwner.getEnergyUsage(); TriggerSmartContract triggerContract = TvmTestUtils.createTriggerContract(contractAddress, "setCoin(uint256)", "3", false, 0, Commons.decodeFromBase58Check(TriggerOwnerAddress)); @@ -151,15 +129,14 @@ public void testSuccess() { TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); dbManager.consumeBandwidth(trxCap, trace); - BlockCapsule blockCapsule = null; - trace.init(blockCapsule); + trace.init(null); trace.exec(); trace.finalization(); - triggerOwner = dbManager.getAccountStore() + AccountCapsule triggerOwner = dbManager.getAccountStore() .get(Commons.decodeFromBase58Check(TriggerOwnerAddress)); - energy = triggerOwner.getEnergyUsage(); + long energy = triggerOwner.getEnergyUsage(); long balance = triggerOwner.getBalance(); Assert.assertEquals(45706, trace.getReceipt().getEnergyUsageTotal()); Assert.assertEquals(45706, energy); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java index 37e21b086ea..1f1efe6cc6b 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java @@ -17,26 +17,18 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.RuntimeImpl; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.ReceiptCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionTrace; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.ContractExeException; @@ -57,34 +49,28 @@ /** * pragma solidity ^0.4.2; - * * contract Fibonacci { - * * event Notify(uint input, uint result); - * * function fibonacci(uint number) constant returns(uint result) { if (number == 0) { return 0; } * else if (number == 1) { return 1; } else { uint256 first = 0; uint256 second = 1; uint256 ret = * 0; for(uint256 i = 2; i <= number; i++) { ret = first + second; first = second; second = ret; } * return ret; } } - * * function fibonacciNotify(uint number) returns(uint result) { result = fibonacci(number); * Notify(number, result); } } */ -public class BandWidthRuntimeWithCheckTest { +public class BandWidthRuntimeWithCheckTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; - private static String dbPath = "output_BandWidthRuntimeTest_test"; - private static String dbDirectory = "db_BandWidthRuntimeTest_test"; - private static String indexDirectory = "index_BandWidthRuntimeTest_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; + private static final String dbDirectory = "db_BandWidthRuntimeTest_test"; + private static final String indexDirectory = "index_BandWidthRuntimeTest_test"; + private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; + private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; + private static final String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; - private static String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; - private static String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; - private static String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; + private static boolean init; static { + dbPath = "output_BandWidthRuntimeTest_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -94,17 +80,16 @@ public class BandWidthRuntimeWithCheckTest { }, "config-test-mainnet.conf" ); - context = new TronApplicationContext(DefaultConfig.class); } /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - + @Before + public void init() { + if (init) { + return; + } //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(10_000_000L); @@ -134,17 +119,7 @@ public static void init() { accountCapsule3.setFrozenForEnergy(10_000_000L, 0L); dbManager.getAccountStore() .put(Commons.decodeFromBase58Check(TriggerOwnerTwoAddress), accountCapsule3); - - } - - /** - * destroy clear data of testing. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); + init = true; } @Test @@ -165,9 +140,8 @@ public void testSuccess() { TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); dbManager.consumeBandwidth(trxCap, trace); - BlockCapsule blockCapsule = null; - trace.init(blockCapsule); + trace.init(null); trace.exec(); trace.finalization(); @@ -180,9 +154,7 @@ public void testSuccess() { Assert.assertEquals(57466800, balance); Assert.assertEquals(624668 * Constant.SUN_PER_ENERGY, balance + energy * Constant.SUN_PER_ENERGY); - } catch (TronException e) { - Assert.assertNotNull(e); - } catch (ReceiptCheckErrException e) { + } catch (TronException | ReceiptCheckErrException e) { Assert.assertNotNull(e); } @@ -204,8 +176,7 @@ public void testSuccessNoBandWidth() { new RuntimeImpl()); dbManager.consumeBandwidth(trxCap, trace); long bandWidth = trxCap.getSerializedSize() + Constant.MAX_RESULT_SIZE_IN_TX; - BlockCapsule blockCapsule = null; - trace.init(blockCapsule); + trace.init(null); trace.exec(); trace.finalization(); trace.check(); @@ -220,9 +191,7 @@ public void testSuccessNoBandWidth() { Assert.assertEquals(0, receipt.getEnergyFee()); Assert.assertEquals(totalBalance, balance); - } catch (TronException e) { - Assert.assertNotNull(e); - } catch (ReceiptCheckErrException e) { + } catch (TronException | ReceiptCheckErrException e) { Assert.assertNotNull(e); } } @@ -270,9 +239,8 @@ private byte[] createContract() TransactionTrace trace = new TransactionTrace(trxCap, StoreFactory.getInstance(), new RuntimeImpl()); dbManager.consumeBandwidth(trxCap, trace); - BlockCapsule blockCapsule = null; - trace.init(blockCapsule); + trace.init(null); trace.exec(); trace.finalization(); trace.check(); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BatchSendTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BatchSendTest.java index 200df06f084..88067be30e9 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BatchSendTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BatchSendTest.java @@ -1,30 +1,24 @@ package org.tron.common.runtime.vm; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.runtime.Runtime; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.common.utils.Utils; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -36,37 +30,20 @@ import stest.tron.wallet.common.client.utils.AbiUtil; @Slf4j -public class BatchSendTest { +public class BatchSendTest extends BaseTest { - private static final String dbPath = "output_BatchSendTest"; private static final String OWNER_ADDRESS; private static final String TRANSFER_TO; - private static final long TOTAL_SUPPLY = 1000_000_000L; - private static final int TRX_NUM = 10; - private static final int NUM = 1; - private static final long START_TIME = 1; - private static final long END_TIME = 2; - private static final int VOTE_SCORE = 2; - private static final String DESCRIPTION = "TRX"; - private static final String URL = "https://tron.network"; private static Runtime runtime; - private static Manager dbManager; - private static TronApplicationContext context; - private static Application appT; private static RepositoryImpl repository; - private static AccountCapsule ownerCapsule; + private static final AccountCapsule ownerCapsule; static { + dbPath = "output_BatchSendTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; TRANSFER_TO = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - dbManager = context.getBean(Manager.class); - repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); - repository.createAccount(Hex.decode(TRANSFER_TO), AccountType.Normal); - repository.addBalance(Hex.decode(TRANSFER_TO), 10); - repository.commit(); + ownerCapsule = new AccountCapsule( ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), @@ -74,40 +51,31 @@ public class BatchSendTest { AccountType.AssetIssue); ownerCapsule.setBalance(1000_1000_1000L); + + + } + + @Before + public void before() { + repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); + repository.createAccount(Hex.decode(TRANSFER_TO), AccountType.Normal); + repository.addBalance(Hex.decode(TRANSFER_TO), 10); + repository.commit(); + dbManager.getAccountStore().put(ownerCapsule.getAddress().toByteArray(), ownerCapsule); dbManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); dbManager.getDynamicPropertiesStore().saveAllowMultiSign(1); dbManager.getDynamicPropertiesStore().saveAllowTvmTransferTrc10(1); dbManager.getDynamicPropertiesStore().saveAllowTvmConstantinople(1); dbManager.getDynamicPropertiesStore().saveAllowTvmSolidity059(1); - - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** * pragma solidity ^0.5.4; - * * contract TestBatchSendTo { constructor() public payable{} - * * function depositIn() public payable{} - * - * * function batchSendTo (address payable to1 ,address payable to2 ,address payable to3, uint256 * m1,uint256 m2,uint256 m3) public { to1.send(m1 ); to2.send(m2 ); to3.send(m3 ); } - * * } */ @Test @@ -181,10 +149,9 @@ private byte[] deployTransferContract() long tokenValue = 0; long tokenId = 0; - byte[] contractAddress = TvmTestUtils + return TvmTestUtils .deployContractWholeProcessReturnContractAddress(contractName, address, ABI, code, value, feeLimit, consumeUserResourcePercent, null, tokenValue, tokenId, repository, null); - return contractAddress; } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/ChargeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/ChargeTest.java index 91378fdcb64..600b81750da 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/ChargeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/ChargeTest.java @@ -1,24 +1,16 @@ package org.tron.common.runtime.vm; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -28,28 +20,24 @@ import org.tron.protos.Protocol.AccountType; @Slf4j +public class ChargeTest extends BaseTest { -public class ChargeTest { - - private Manager dbManager; - private TronApplicationContext context; private RepositoryImpl repository; - private String dbPath = "output_ChargeTest"; - private String OWNER_ADDRESS; - private Application AppT; + private static String OWNER_ADDRESS; private long totalBalance = 100_000_000_000_000L; + static { + dbPath = "output_ChargeTest"; + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + } + /** * Init data. */ @Before public void init() { - Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - dbManager = context.getBean(Manager.class); repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), totalBalance); @@ -88,11 +76,10 @@ public void testOverflow() + "3901905600608060405260358060116000396000f3006080604052600080fd00a165627a7a723058201738d" + "6aa899dc00d4e99de944eb74d30a9ba1fcae37b99dc6299d95e992ca8b40029a165627a7a72305820683901" + "37ba70dfc460810603eba8500b050ed3cd01e66f55ec07d387ec1cd2750029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 51293; // 200 * code.length() + 93 Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -108,7 +95,7 @@ public void testOverflow() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert .assertTrue(result.getRuntime().getResult().getException() instanceof ArithmeticException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -154,11 +141,10 @@ public void testNegative() + "5600608060405260358060116000396000f3006080604052600080fd00a165627a7a72305820ef54aac72ef" + "ff56dbe894e7218d009a87368bb70338bb385db5d3dec9927bc2c0029a165627a7a723058201620679ac2ae" + "640d0a6c26e9cb4523e98eb0de8fff26975c5bb4c7fda1c98d720029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 68111; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -174,7 +160,7 @@ public void testNegative() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert .assertTrue(result.getRuntime().getResult().getException() instanceof ArithmeticException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -189,7 +175,7 @@ public void testNegative() long expectEnergyUsageTotal3 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal3); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert .assertTrue(result.getRuntime().getResult().getException() instanceof ArithmeticException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance @@ -197,27 +183,6 @@ public void testNegative() } - @Test - @Ignore - public void testFallback() - throws ContractExeException, ContractValidateException, ReceiptCheckErrException { - // done in EnergyWhenSendAndTransferTest.java - - } - - // contract TestCallDepth { - // - // function CallstackExploit(int256 counter) external { - // if (counter > 0) { - // this.CallstackExploit.gas(msg.gas - 2000)(counter - 1); - // } else {} - // } - // - // function Call(int256 counter) { - // this.CallstackExploit(counter); - // } - // } - @Test public void testCallDepth() throws ContractExeException, ContractValidateException, @@ -243,11 +208,10 @@ public void testCallDepth() + "152602001915050600060405180830381600087803b15801561012d57600080fd5b505af115801561014157" + "3d6000803e3d6000fd5b50505050505600a165627a7a72305820510367f4437b1af16931cacc744eb6f3102" + "d72f0c369aa795a4dc49a7f90a3e90029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 74517; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -265,8 +229,8 @@ public void testCallDepth() long expectEnergyUsageTotal2 = 27743; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertEquals(result.getRuntime().getResult().getException(), null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -360,11 +324,10 @@ public void testCallDepthAndWidth() + "8e9050565b50505600a165627a7a72305820a9e7e1401001d6c131ebf4727fbcedede08d16416dc0447cef60" + "e0b9516c6a260029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 286450; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -382,8 +345,8 @@ public void testCallDepthAndWidth() long expectEnergyUsageTotal2 = 243698; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); - Assert.assertEquals(result.getRuntime().getResult().getException(), null); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -428,11 +391,9 @@ public void testCreateDepthAndWidth() + "029a165627a7a7230582071d51c39c93b0aba5baeacea0b2bd5ca5342d028bb834046eca92975a3517a4c0" + "029"; - String libraryAddressPair = null; - TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 201839; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -450,24 +411,11 @@ public void testCreateDepthAndWidth() long expectEnergyUsageTotal2 = 4481164; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); - Assert.assertEquals(result.getRuntime().getResult().getException(), null); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); } - /** - * Release resources. - */ - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java index 5fa63096b9f..aec3f2322a6 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenAssertStyleTest.java @@ -1,24 +1,16 @@ package org.tron.common.runtime.vm; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -33,15 +25,17 @@ @Slf4j -public class EnergyWhenAssertStyleTest { +public class EnergyWhenAssertStyleTest extends BaseTest { - private Manager dbManager; - private TronApplicationContext context; private RepositoryImpl repository; - private String dbPath = "output_EnergyWhenAssertStyleTest"; - private String OWNER_ADDRESS; - private Application AppT; + private static String OWNER_ADDRESS; private long totalBalance = 30_000_000_000_000L; + + static { + dbPath = "output_EnergyWhenAssertStyleTest"; + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + } /** @@ -49,11 +43,6 @@ public class EnergyWhenAssertStyleTest { */ @Before public void init() { - Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - dbManager = context.getBean(Manager.class); repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), totalBalance); @@ -104,11 +93,10 @@ public void outOfIndexTest() + "25261016082019092526060916020820161014080388339019050509050600a81600a815181101515608c57" + "fe5b60209081029091010152505600a165627a7a723058201aaf6626083e32afa834a13d3365784c509d10f" + "57ce1024f88c697cf0718795e0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 39487; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -123,7 +111,7 @@ public void outOfIndexTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof IllegalOperationException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -159,11 +147,10 @@ public void bytesNTest() + "1e76e10781146043575b600080fd5b348015604e57600080fd5b5060556057565b005b72012345000000000" + "00000000000000000000000601460008282fe00a165627a7a72305820a1c7c81d642cc0aa11c43d63614a5b" + "3c018e4af84700af4bfde5f2efb18b55130029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 31875; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -178,7 +165,7 @@ public void bytesNTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof IllegalOperationException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -212,11 +199,10 @@ public void divZeroTest() + "03e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663" + "b87d948d81146043575b600080fd5b348015604e57600080fd5b5060556057565b005b60008080600afe00a" + "165627a7a7230582084ed35f2e244d6721bb5f5fcaf53d237ea050b3de84d5cc7fee74584fd2ff31f0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 27875; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -231,7 +217,7 @@ public void divZeroTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof IllegalOperationException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -267,11 +253,10 @@ public void shiftByNegativeTest() + "e88e362a81146043575b600080fd5b348015604e57600080fd5b5060556057565b005b60091960008161040" + "0fe00a165627a7a7230582086c99cfe65e26909bb0fb3a2bdaf2385ad8dfff72680adab954063a4fe1d549b" + "0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 28475; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -286,7 +271,7 @@ public void shiftByNegativeTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof IllegalOperationException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -322,11 +307,10 @@ public void enumTypeTest() + "03e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663" + "5a43cddc81146043575b600080fd5b348015604e57600080fd5b5060556057565b005b6000600afe00a1656" + "27a7a72305820b24a4d459b753723d300f56c408c6120d5ef0c7ddb166d66ccf4277a76ad83ed0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 27475; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -341,7 +325,7 @@ public void enumTypeTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof IllegalOperationException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -376,11 +360,10 @@ public void functionPointerTest() + "e9ad8ee781146043575b600080fd5b348015604e57600080fd5b5060556057565b005b606a606660018263f" + "fffffff16565b5050565bfe00a165627a7a723058201c8982fa288ec7aad86b1d1992ecc5d08c4b22e4fe03" + "7981f91aff8bcbd900680029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 30475; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -395,7 +378,7 @@ public void functionPointerTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof IllegalOperationException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -429,11 +412,10 @@ public void assertTest() + "03e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663" + "2b813bc081146043575b600080fd5b348015604e57600080fd5b5060556057565b005bfe00a165627a7a723" + "058208ce7511bd3a946a22baaba2b4521cbf29d2481ad52887c5567e422cd89726eda0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 26675; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -448,7 +430,7 @@ public void assertTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof IllegalOperationException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -497,11 +479,10 @@ public void systemPrecompileTest() + "fffffff868116825260208201869052825193169381830193909290918290030181855af491505015156101" + "2957600080fd5b50505600a165627a7a723058206090aa7a8ac0e45fac642652417495e81dad6f1592343bf" + "f8cfe97f61cf74e880029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 89214; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -520,7 +501,7 @@ public void systemPrecompileTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertTrue( result.getRuntime().getResult().getException() instanceof PrecompiledContractException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -557,11 +538,10 @@ public void outOfMemTest() + "b82821015609957604080516230040080825263060080208201909252906020820163060080008038833901" + "9050506001909201919050605f565b5050505600a165627a7a723058209e5d294a7bf5133b304bc6851c749" + "cd5e1f4748230405755e6bd2e31549ae1d00029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 40487; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -576,32 +556,12 @@ public void outOfMemTest() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert .assertTrue(result.getRuntime().getResult().getException() instanceof OutOfMemoryException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); } - @Test - @Ignore - public void overflowTest() - throws ContractExeException, ReceiptCheckErrException, ContractValidateException { - // done in ChargeTest - } - - /** - * Release resources. - */ - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenRequireStyleTest.java b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenRequireStyleTest.java index 5ce9729393f..2356a649e82 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenRequireStyleTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenRequireStyleTest.java @@ -1,24 +1,16 @@ package org.tron.common.runtime.vm; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -29,16 +21,17 @@ import org.tron.protos.Protocol.AccountType; @Slf4j +public class EnergyWhenRequireStyleTest extends BaseTest { -public class EnergyWhenRequireStyleTest { - - private Manager dbManager; - private TronApplicationContext context; private RepositoryImpl repository; - private String dbPath = "output_EnergyWhenRequireStyleTest"; - private String OWNER_ADDRESS; - private Application AppT; + private static final String OWNER_ADDRESS; private long totalBalance = 30_000_000_000_000L; + + static { + dbPath = "output_EnergyWhenRequireStyleTest"; + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + } /** @@ -46,11 +39,6 @@ public class EnergyWhenRequireStyleTest { */ @Before public void init() { - Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - dbManager = context.getBean(Manager.class); repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), totalBalance); @@ -100,11 +88,10 @@ public void throwTest() + "03e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663" + "50bff6bf81146043575b600080fd5b348015604e57600080fd5b506055603e565b0000a165627a7a7230582" + "0f51282c5910e3ff1b5f2e9509f3cf23c7035027aae1947ab46e5a9252fb061eb0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 26275; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -120,8 +107,8 @@ public void throwTest() long expectEnergyUsageTotal2 = 124; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -153,11 +140,10 @@ public void requireTest() + "03e5763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663" + "357815c481146043575b600080fd5b348015604e57600080fd5b506055603e565b0000a165627a7a7230582" + "054141931bcc37d4f266815f02d2fb113f5af20825cbce45d3b0f2fe90ac0145d0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 26275; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -173,8 +159,8 @@ public void requireTest() long expectEnergyUsageTotal2 = 124; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -217,11 +203,10 @@ public void thisFunctionViaMessageCallTest() + "000000000000000028152600401600060405180830381600088803b15801560db57600080fd5b5087f11580" + "1560ee573d6000803e3d6000fd5b50505050505600a165627a7a7230582087d830c44fb566498789b212e3d" + "0374f7a7589a2efdda11b3a4c03051b57891a0029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 57905; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -237,8 +222,8 @@ public void thisFunctionViaMessageCallTest() long expectEnergyUsageTotal2 = 5339; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -294,11 +279,10 @@ public void thatFunctionViaMessageCallTest() + "0006000350416632b813bc081146043575b600080fd5b348015604e57600080fd5b5060556057565b005bfe" + "00a165627a7a72305820c02c76575c2a0ada80c3f6db47f885cece6c254d1e7c79eb6ddc1c1d4e70ebae002" + "9a165627a7a72305820cf879e62f738b44636adf61bd4b2fb38c10f027d2a4484d58baf44a06dc97bd90029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 97341; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -314,8 +298,8 @@ public void thatFunctionViaMessageCallTest() long expectEnergyUsageTotal2 = 64125; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -356,11 +340,10 @@ public void newContractTest1() + "10066610087565b604051809103906000f080158015610082573d6000803e3d6000fd5b505050565b604051" + "6013806100978339019056006080604052348015600f57600080fd5b50fe00a165627a7a72305820685ff8f" + "74890f671deb4d3881a4b72ab0daac2ab0d36112e1ebdf98a43ac4d940029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 42687; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -377,7 +360,7 @@ public void newContractTest1() long expectEnergyUsageTotal2 = feeLimit / 100; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); // todo: revert should be true!! see later - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert .assertTrue(result.getRuntime().getResult().getException() instanceof OutOfEnergyException); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), @@ -433,22 +416,21 @@ public void receiveTrxWithoutPayableTest() + "4052348015600f57600080fd5b500000a165627a7a72305820a82006ee5ac783bcea7085501eaed33360b31" + "20278f1f39e611afedc9f4a693b0029a165627a7a72305820a50d9536f182fb6aefc737fdc3a675630e75a0" + "8de88deb6b1bee6d4b6dff04730029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 42; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - expectEnergyUsageTotal * 100); result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, 0, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); byte[] contractAddress = result.getContractAddress(); long expectEnergyUsageTotal2 = 100341; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); @@ -462,21 +444,13 @@ public void receiveTrxWithoutPayableTest() long expectEnergyUsageTotal3 = 51833; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal3); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2 + expectEnergyUsageTotal3) * 100); } - @Test - @Ignore - public void transferTest() - throws ContractExeException, ReceiptCheckErrException, ContractValidateException { - // done in EnergyWhenSendAndTransferTest - - } - // pragma solidity ^0.4.16; // // contract TestRevertContract { @@ -512,11 +486,10 @@ public void revertTest() + "6312065fe08114604d578063a26388bb146071575b600080fd5b348015605857600080fd5b50605f6085565" + "b60408051918252519081900360200190f35b348015607c57600080fd5b5060836048565b005b3031905600" + "a165627a7a7230582059cab3a7a5851a7852c728ec8729456a04dc022674976f3f26bfd51491dbf1080029"; - String libraryAddressPair = null; TVMTestResult result = TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); long expectEnergyUsageTotal = 36481; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal); @@ -532,31 +505,11 @@ public void revertTest() long expectEnergyUsageTotal2 = 146; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); } - @Test - @Ignore - public void reach64CallDepth() { - // done in ChargeTest - } - - /** - * Release resources. - */ - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenSendAndTransferTest.java b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenSendAndTransferTest.java index b834f953eb4..40af27612df 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenSendAndTransferTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenSendAndTransferTest.java @@ -1,23 +1,16 @@ package org.tron.common.runtime.vm; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -27,26 +20,23 @@ import org.tron.protos.Protocol.AccountType; @Slf4j -public class EnergyWhenSendAndTransferTest { +public class EnergyWhenSendAndTransferTest extends BaseTest { - private Manager dbManager; - private TronApplicationContext context; private RepositoryImpl repository; - private String dbPath = "output_EnergyWhenSendAndTransferTest"; - private String OWNER_ADDRESS; - private Application AppT; + private static final String OWNER_ADDRESS; private long totalBalance = 30_000_000_000_000L; + static { + dbPath = "output_EnergyWhenSendAndTransferTest"; + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + } + /** * Init data. */ @Before public void init() { - Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - dbManager = context.getBean(Manager.class); repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), totalBalance); @@ -124,7 +114,7 @@ public void callValueTest() long expectEnergyUsageTotal3 = 9459; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal3); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - value - (expectEnergyUsageTotal + expectEnergyUsageTotal2 + expectEnergyUsageTotal3) * 100); } @@ -189,8 +179,8 @@ public void sendTest() long expectEnergyUsageTotal2 = 7025; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().getException(), null); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), false); + Assert.assertNull(result.getRuntime().getResult().getException()); + Assert.assertFalse(result.getRuntime().getResult().isRevert()); Assert.assertEquals(repository.getAccount(contractAddress).getBalance(), value); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - value - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -224,8 +214,8 @@ public void transferTest() long expectEnergyUsageTotal2 = 7030; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().getException(), null); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); + Assert.assertNull(result.getRuntime().getResult().getException()); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); Assert.assertEquals(repository.getAccount(contractAddress).getBalance(), value); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - value - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); @@ -260,11 +250,10 @@ public TVMTestResult deployCallValueTestContract(long value, long feeLimit, + "b602a90565b6000805b600a81101560945760008181526020819052604090208190556001016074565b5090" + "5600a165627a7a723058205ded543feb546472be4e116e713a2d46b8dafc823ca31256e67a1be92a6752730" + "029"; - String libraryAddressPair = null; return TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); } public TVMTestResult deploySendAndTransferTestContract(long value, long feeLimit, @@ -294,25 +283,9 @@ public TVMTestResult deploySendAndTransferTestContract(long value, long feeLimit + "2600160008181526020527fada5013122d395ba3c54772283fb069b10426056ef8ca54750cb9bb552a59e7d" + "550000a165627a7a7230582029b27c10c1568d590fa66bc0b7d42537a314c78d028f59a188fa411f7fc15c4" + "f0029"; - String libraryAddressPair = null; return TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, feeLimit, - consumeUserResourcePercent, libraryAddressPair, dbManager, null); + consumeUserResourcePercent, null, dbManager, null); } - - /** - * Release resources. - */ - @After - public void destroy() { - context.destroy(); - Args.clearParam(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.warn("Release resources failure."); - } - } - } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java index 73b51c803f8..c2dc1d524ad 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/EnergyWhenTimeoutStyleTest.java @@ -1,23 +1,16 @@ package org.tron.common.runtime.vm; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -29,28 +22,24 @@ import org.tron.protos.Protocol.AccountType; @Slf4j -public class EnergyWhenTimeoutStyleTest { +public class EnergyWhenTimeoutStyleTest extends BaseTest { - private Manager dbManager; - private TronApplicationContext context; private RepositoryImpl repository; - private String dbPath = "output_CPUTimeTest"; - private String OWNER_ADDRESS; - private Application AppT; + private static final String OWNER_ADDRESS; private long totalBalance = 30_000_000_000_000L; + static { + dbPath = "output_CPUTimeTest"; + Args.setParam(new String[]{"--output-directory", dbPath}, + Constant.TEST_CONF); + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + } /** * Init data. */ @Before public void init() { - Args.setParam(new String[]{"--output-directory", dbPath}, - Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - dbManager = context.getBean(Manager.class); repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), totalBalance); @@ -109,7 +98,6 @@ public void endlessLoopTest() /* =================================== CALL setVote(uint256) =============================== */ String params = "0000000000000000000000000000000000000000000000000000000000000003"; byte[] triggerData = TvmTestUtils.parseAbi("setVote(uint256)", params); - boolean haveException = false; result = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), contractAddress, triggerData, value, feeLimit, dbManager, null); @@ -144,27 +132,11 @@ public TVMTestResult deployEndlessLoopContract(long value, long feeLimit, + "60011560cb576001600080828254019250508190555060b1565b505600a165627a7a72305820290a38c9bbaf" + "ccaf6c7f752ab56d229e354da767efb72715ee9fdb653b9f4b6c0029"; - String libraryAddressPair = null; return TvmTestUtils .deployContractAndReturnTvmTestResult(contractName, address, ABI, code, value, - feeLimit, consumeUserResourcePercent, libraryAddressPair, + feeLimit, consumeUserResourcePercent, null, dbManager, null); } - - /** - * Release resources. - */ - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java index f9f586b87a6..ab34c29fefd 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/OperationsTest.java @@ -13,15 +13,12 @@ import org.junit.Ignore; import org.junit.Test; import org.springframework.util.StringUtils; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.InternalTransaction; import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; import org.tron.core.store.StoreFactory; import org.tron.core.vm.JumpTable; @@ -36,22 +33,16 @@ import org.tron.protos.Protocol; @Slf4j -public class OperationsTest { +public class OperationsTest extends BaseTest { private ProgramInvokeMockImpl invoke; private Program program; private final JumpTable jumpTable = OperationRegistry.newTronV10OperationSet(); - private static ChainBaseManager chainBaseManager; - private static String dbPath; - private static TronApplicationContext context; @BeforeClass public static void init() { - dbPath = "output_" + OperationsTest.class.getName(); + dbPath = "output_operations_test"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - Manager manager = context.getBean(Manager.class); - chainBaseManager = manager.getChainBaseManager(); CommonParameter.getInstance().setDebug(true); VMConfig.initAllowTvmTransferTrc10(1); VMConfig.initAllowTvmConstantinople(1); @@ -66,12 +57,7 @@ public static void destroy() { ConfigLoader.disable = false; VMConfig.initVmHardFork(false); Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.error("Release resources failure."); - } + FileUtil.deleteDir(new File(dbPath)); VMConfig.initAllowTvmTransferTrc10(0); VMConfig.initAllowTvmConstantinople(0); VMConfig.initAllowTvmSolidity059(0); @@ -196,7 +182,7 @@ public void testArithmeticOperations() throws ContractValidateException { // test MULMOD op = new byte[]{0x60, 0x02, 0x60, 0x01, 0x60, 0x01, 0x09}; - program = new Program(op, op, invoke, interTrx);; + program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(17, program.getResult().getEnergyUsed()); Assert.assertEquals(new DataWord(0x01), program.getStack().pop()); @@ -254,7 +240,7 @@ public void testLogicAndComparisonOperations() throws ContractValidateException // test EQ = 0X14 op = new byte[]{0x60, 0x01, 0x60, 0x02, 0X14}; - program = new Program(op, op, invoke, interTrx);; + program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(9, program.getResult().getEnergyUsed()); Assert.assertEquals(new DataWord(0x00), program.getStack().pop()); @@ -275,7 +261,7 @@ public void testLogicAndComparisonOperations() throws ContractValidateException // test OR = 0x17 op = new byte[]{0x60, 0x01, 0x60, 0x02, 0x17}; - program = new Program(op, op, invoke, interTrx);; + program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(9, program.getResult().getEnergyUsed()); Assert.assertEquals(new DataWord(0x03), program.getStack().pop()); @@ -303,7 +289,7 @@ public void testLogicAndComparisonOperations() throws ContractValidateException // test SHL = 0x1b op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x1b}; - program = new Program(op, op, invoke, interTrx);; + program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(9, program.getResult().getEnergyUsed()); Assert.assertEquals(new DataWord(0x02), program.getStack().pop()); @@ -342,7 +328,7 @@ public void testCryptographicAndEnvironmentalOperations() throws ContractValidat // test ADDRESS = 0x30 op = new byte[]{0x30}; - program = new Program(op, op, invoke, interTrx);; + program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(2, program.getResult().getEnergyUsed()); Assert.assertArrayEquals(invoke.getContractAddress().getLast20Bytes(), @@ -520,7 +506,7 @@ public void testMemoryStorageAndFlowOperations() throws ContractValidateExceptio // MSTORE8 = 0x53 op = new byte[]{0x60, 0x01, 0x60, 0x01, 0x53}; - program = new Program(op, op, invoke, interTrx);; + program = new Program(op, op, invoke, interTrx); testOperations(program); Assert.assertEquals(9, program.getResult().getEnergyUsed(), 41); Assert.assertEquals(32, program.getMemSize()); @@ -897,10 +883,10 @@ private void testOperations(Program program) { } catch (Program.JVMStackOverFlowException | Program.OutOfTimeException e) { throw e; } catch (RuntimeException e) { - if (StringUtils.isEmpty(e.getMessage())) { - program.setRuntimeFailure(new RuntimeException("Unknown Exception")); - } else { + if (StringUtils.hasLength(e.getMessage())) { program.setRuntimeFailure(e); + } else { + program.setRuntimeFailure(new RuntimeException("Unknown Exception")); } } catch (StackOverflowError soe) { logger.info("\n !!! StackOverflowError: update your java run command with -Xss !!!\n", soe); @@ -937,10 +923,10 @@ private void testSingleOperation(Program program) { } catch (Program.JVMStackOverFlowException | Program.OutOfTimeException e) { throw e; } catch (RuntimeException e) { - if (StringUtils.isEmpty(e.getMessage())) { - program.setRuntimeFailure(new RuntimeException("Unknown Exception")); - } else { + if (StringUtils.hasLength(e.getMessage())) { program.setRuntimeFailure(e); + } else { + program.setRuntimeFailure(new RuntimeException("Unknown Exception")); } } catch (StackOverflowError soe) { logger.info("\n !!! StackOverflowError: update your java run command with -Xss !!!\n", soe); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java index 492f9540df2..b4365f02338 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/PrecompiledContractsTest.java @@ -6,27 +6,20 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; - import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.ProgramResult; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; @@ -37,9 +30,7 @@ import org.tron.core.capsule.ProposalCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ItemNotFoundException; @@ -56,21 +47,17 @@ import org.tron.protos.contract.Common; @Slf4j -public class PrecompiledContractsTest { +public class PrecompiledContractsTest extends BaseTest { // common private static final DataWord voteContractAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000000010001"); - private static final DataWord withdrawBalanceAddr = new DataWord( - "0000000000000000000000000000000000000000000000000000000000010004"); private static final DataWord proposalApproveAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000000010005"); private static final DataWord proposalCreateAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000000010006"); private static final DataWord proposalDeleteAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000000010007"); - private static final DataWord convertFromTronBytesAddressAddr = new DataWord( - "0000000000000000000000000000000000000000000000000000000000010008"); private static final DataWord convertFromTronBase58AddressAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000000010009"); @@ -108,7 +95,6 @@ public class PrecompiledContractsTest { private static final DataWord totalAcquiredResourceAddr = new DataWord( "0000000000000000000000000000000000000000000000000000000001000015"); - private static final String dbPath = "output_PrecompiledContracts_test"; private static final String ACCOUNT_NAME = "account"; private static final String OWNER_ADDRESS; private static final String WITNESS_NAME = "witness"; @@ -117,44 +103,16 @@ public class PrecompiledContractsTest { private static final String URL = "https://tron.network"; // withdraw private static final long initBalance = 10_000_000_000L; - private static final long allowance = 32_000_000L; private static final long latestTimestamp = 1_000_000L; - private static TronApplicationContext context; - private static Application appT; - private static Manager dbManager; static { + dbPath = "output_PrecompiledContracts_test"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; WITNESS_ADDRESS = Wallet.getAddressPreFixString() + WITNESS_ADDRESS_BASE; } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ @@ -459,7 +417,6 @@ public void delegatableResourceTest() { // with usage. byte[] TOTAL_ENERGY_CURRENT_LIMIT = "TOTAL_ENERGY_CURRENT_LIMIT".getBytes(); - byte[] TOTAL_ENERGY_WEIGHT = "TOTAL_ENERGY_WEIGHT".getBytes(); long energyLimit = 1_000_000_000_000L; tempRepository.getDynamicPropertiesStore().put(TOTAL_ENERGY_CURRENT_LIMIT, @@ -1170,10 +1127,6 @@ public void totalAcquiredResourceTest() { Assert.assertEquals(0, ByteArray.toLong(res.getRight())); } - @Test - public void convertFromTronBytesAddressNativeTest() { - } - //@Test public void convertFromTronBase58AddressNative() { // 27WnTihwXsqCqpiNedWvtKCZHsLjDt4Hfmf TestNet address 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 8be1ebf88df..1053b759fe9 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 @@ -1,30 +1,24 @@ package org.tron.common.runtime.vm; import com.google.protobuf.ByteString; -import java.io.File; import java.math.BigInteger; import java.util.Arrays; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; import org.tron.api.GrpcAPI.ShieldedTRC20Parameters; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FileUtil; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; import org.tron.common.zksnark.IncrementalMerkleVoucherContainer; import org.tron.common.zksnark.JLibrustzcash; import org.tron.common.zksnark.LibrustzcashParam; import org.tron.core.capsule.IncrementalMerkleTreeCapsule; import org.tron.core.capsule.PedersenHashCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ZksnarkException; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.vm.PrecompiledContracts.MerkleHash; @@ -45,20 +39,17 @@ import stest.tron.wallet.common.client.WalletClient; @Slf4j -public class PrecompiledContractsVerifyProofTest { +public class PrecompiledContractsVerifyProofTest extends BaseTest { - private static final String dbPath = "output_PrecompiledContracts_VerifyProof_test"; private static final String SHIELDED_CONTRACT_ADDRESS_STR = "TGAmX5AqVUoXCf8MoHxbuhQPmhGfWTnEgA"; private static final byte[] SHIELDED_CONTRACT_ADDRESS; private static final String PUBLIC_TO_ADDRESS_STR = "TBaBXpRAeBhs75TZT751LwyhrcR25XeUot"; private static final byte[] PUBLIC_TO_ADDRESS; private static final byte[] DEFAULT_OVK; - private static TronApplicationContext context; - private static Manager dbManager; static { + dbPath = "output_PrecompiledContracts_VerifyProof_test"; Args.setParam(new String[]{"--output-directory", dbPath}, "config-test.conf"); - context = new TronApplicationContext(DefaultConfig.class); DEFAULT_OVK = ByteArray .fromHexString("030c8c2bc59fb3eb8afb047a8ea4b028743d23e7d38c6fa30908358431e2314d"); SHIELDED_CONTRACT_ADDRESS = WalletClient.decodeFromBase58Check(SHIELDED_CONTRACT_ADDRESS_STR); @@ -71,28 +62,6 @@ public class PrecompiledContractsVerifyProofTest { VerifyBurnProof burnContract = new VerifyBurnProof(); MerkleHash merkleHash = new MerkleHash(); - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void verifyMintProofCorrect() throws ZksnarkException { int totalCountNum = 2; diff --git a/framework/src/test/java/org/tron/common/runtime/vm/RepositoryTest.java b/framework/src/test/java/org/tron/common/runtime/vm/RepositoryTest.java index 6323ef4aa40..390b1396337 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/RepositoryTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/RepositoryTest.java @@ -1,27 +1,22 @@ package org.tron.common.runtime.vm; -import java.io.File; import java.util.Arrays; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; import org.tron.common.runtime.Runtime; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.WalletUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter.ForkBlockVersionConsts; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -33,20 +28,19 @@ import org.tron.protos.Protocol.Transaction; @Slf4j -public class RepositoryTest { +public class RepositoryTest extends BaseTest { - private Manager manager; - private TronApplicationContext context; - private String dbPath = "output_DepostitTest"; - private String OWNER_ADDRESS; + private static final String OWNER_ADDRESS; private Repository rootRepository; + + static { + dbPath = "output_DepostitTest"; + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + } @Before public void init() { - Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - manager = context.getBean(Manager.class); rootRepository = RepositoryImpl.createRoot(StoreFactory.getInstance()); rootRepository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); rootRepository.addBalance(Hex.decode(OWNER_ADDRESS), 30000000000000L); @@ -102,9 +96,9 @@ public void loopCallTest() VMIllegalException, ContractValidateException { byte[] stats = new byte[27]; Arrays.fill(stats, (byte) 1); - this.manager.getDynamicPropertiesStore() + this.dbManager.getDynamicPropertiesStore() .statsByVersion(ForkBlockVersionConsts.ENERGY_LIMIT, stats); - this.manager.getDynamicPropertiesStore() + this.dbManager.getDynamicPropertiesStore() .saveLatestBlockHeaderNumber(CommonParameter.getInstance() .getBlockNumForEnergyLimit() + 1); @@ -206,7 +200,7 @@ public void loopCallTest() .parseAbi("callBcallARevert(address,uint256,uint256)", params1); TVMTestResult result = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, triggerData, 0, fee, manager, null); + aAddress, triggerData, 0, fee, dbManager, null); Assert.assertNull(result.getRuntime().getRuntimeError()); // check result @@ -216,10 +210,10 @@ public void loopCallTest() TVMTestResult checkN1 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN1Data, 0, fee, manager, null); + aAddress, checkN1Data, 0, fee, dbManager, null); TVMTestResult checkN2 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN2Data, 0, fee, manager, null); + aAddress, checkN2Data, 0, fee, dbManager, null); System.out.println(Hex.toHexString(checkN1.getRuntime().getResult().getHReturn())); System.out.println(Hex.toHexString(checkN2.getRuntime().getResult().getHReturn())); @@ -238,14 +232,14 @@ public void loopCallTest() triggerData = TvmTestUtils.parseAbi("callBcallA(address,uint256,uint256)", params2); result = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, triggerData, 0, fee, manager, null); + aAddress, triggerData, 0, fee, dbManager, null); Assert.assertNull(result.getRuntime().getRuntimeError()); checkN1 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN1Data, 0, fee, manager, null); + aAddress, checkN1Data, 0, fee, dbManager, null); checkN2 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN2Data, 0, fee, manager, null); + aAddress, checkN2Data, 0, fee, dbManager, null); System.out.println(Hex.toHexString(checkN1.getRuntime().getResult().getHReturn())); System.out.println(Hex.toHexString(checkN2.getRuntime().getResult().getHReturn())); Assert.assertEquals(checkN1.getRuntime().getResult().getHReturn(), @@ -262,7 +256,7 @@ public void loopCallTestOldVersion() VMIllegalException, ContractValidateException { byte[] stats = new byte[27]; Arrays.fill(stats, (byte) 0); - this.manager.getDynamicPropertiesStore() + this.dbManager.getDynamicPropertiesStore() .statsByVersion(ForkBlockVersionConsts.ENERGY_LIMIT, stats); String contractA = "A"; @@ -360,7 +354,7 @@ public void loopCallTestOldVersion() .parseAbi("callBcallARevert(address,uint256,uint256)", params1); TVMTestResult result = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, triggerData, 0, fee, manager, null); + aAddress, triggerData, 0, fee, dbManager, null); Assert.assertNull(result.getRuntime().getRuntimeError()); // check result @@ -370,10 +364,10 @@ public void loopCallTestOldVersion() TVMTestResult checkN1 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN1Data, 0, fee, manager, null); + aAddress, checkN1Data, 0, fee, dbManager, null); TVMTestResult checkN2 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN2Data, 0, fee, manager, null); + aAddress, checkN2Data, 0, fee, dbManager, null); System.out.println(Hex.toHexString(checkN1.getRuntime().getResult().getHReturn())); System.out.println(Hex.toHexString(checkN2.getRuntime().getResult().getHReturn())); @@ -392,14 +386,14 @@ public void loopCallTestOldVersion() triggerData = TvmTestUtils.parseAbi("callBcallA(address,uint256,uint256)", params2); result = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, triggerData, 0, fee, manager, null); + aAddress, triggerData, 0, fee, dbManager, null); Assert.assertNull(result.getRuntime().getRuntimeError()); checkN1 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN1Data, 0, fee, manager, null); + aAddress, checkN1Data, 0, fee, dbManager, null); checkN2 = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), - aAddress, checkN2Data, 0, fee, manager, null); + aAddress, checkN2Data, 0, fee, dbManager, null); System.out.println(Hex.toHexString(checkN1.getRuntime().getResult().getHReturn())); System.out.println(Hex.toHexString(checkN2.getRuntime().getResult().getHReturn())); Assert.assertEquals(checkN1.getRuntime().getResult().getHReturn(), @@ -409,17 +403,4 @@ public void loopCallTestOldVersion() new DataWord(1000).getData()); CommonParameter.setENERGY_LIMIT_HARD_FORK(false); } - - - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.error("Release resources failure."); - } - } - } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/TimeBenchmarkTest.java b/framework/src/test/java/org/tron/common/runtime/vm/TimeBenchmarkTest.java index c5ac42e93ce..2c04b302c49 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/TimeBenchmarkTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/TimeBenchmarkTest.java @@ -1,24 +1,17 @@ package org.tron.common.runtime.vm; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -29,27 +22,24 @@ @Slf4j @Ignore -public class TimeBenchmarkTest { +public class TimeBenchmarkTest extends BaseTest { - private Manager dbManager; - private TronApplicationContext context; private RepositoryImpl repository; - private String dbPath = "output_TimeBenchmarkTest"; - private String OWNER_ADDRESS; - private Application AppT; + private static final String OWNER_ADDRESS; private long totalBalance = 30_000_000_000_000L; + static { + dbPath = "output_TimeBenchmarkTest"; + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); + OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + } + /** * Init data. */ @Before public void init() { - Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - dbManager = context.getBean(Manager.class); repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(OWNER_ADDRESS), AccountType.Normal); repository.addBalance(Hex.decode(OWNER_ADDRESS), totalBalance); @@ -137,23 +127,9 @@ public void timeBenchmark() long expectEnergyUsageTotal2 = 110; Assert.assertEquals(result.getReceipt().getEnergyUsageTotal(), expectEnergyUsageTotal2); - Assert.assertEquals(result.getRuntime().getResult().isRevert(), true); - Assert.assertTrue(result.getRuntime().getResult().getException() == null); + Assert.assertTrue(result.getRuntime().getResult().isRevert()); + Assert.assertNull(result.getRuntime().getResult().getException()); Assert.assertEquals(dbManager.getAccountStore().get(address).getBalance(), totalBalance - (expectEnergyUsageTotal + expectEnergyUsageTotal2) * 100); } - - /** - * Release resources. - */ - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java b/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java index aa6fccecc7a..cd79e00eb29 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/TransferToAccountTest.java @@ -1,24 +1,19 @@ package org.tron.common.runtime.vm; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.runtime.ProgramResult; import org.tron.common.runtime.Runtime; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.StringUtil; import org.tron.common.utils.Utils; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.actuator.VMActuator; @@ -26,9 +21,7 @@ import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db.TransactionContext; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; @@ -43,9 +36,8 @@ import stest.tron.wallet.common.client.utils.AbiUtil; @Slf4j -public class TransferToAccountTest { +public class TransferToAccountTest extends BaseTest { - private static final String dbPath = "output_TransferToAccountTest"; private static final String OWNER_ADDRESS; private static final String TRANSFER_TO; private static final long TOTAL_SUPPLY = 1000_000_000L; @@ -57,21 +49,18 @@ public class TransferToAccountTest { private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; private static Runtime runtime; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; - private static TronApplicationContext context; - private static Application appT; private static RepositoryImpl repository; private static AccountCapsule ownerCapsule; static { + dbPath = "output_TransferToAccountTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; TRANSFER_TO = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); + } + + @Before + public void before() { repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(TRANSFER_TO), AccountType.Normal); repository.addBalance(Hex.decode(TRANSFER_TO), 10); @@ -85,20 +74,6 @@ public class TransferToAccountTest { ownerCapsule.setBalance(1000_1000_1000L); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - private long createAsset(String tokenName) { chainBaseManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); chainBaseManager.getDynamicPropertiesStore().saveAllowTvmTransferTrc10(1); @@ -250,7 +225,6 @@ public void TransferTokenTest() // 9.Test transferToken Big Amount selectorStr = "transferTokenTo(address,trcToken,uint256)"; - ecKey = new ECKey(Utils.getRandom()); String params = "000000000000000000000000548794500882809695a8a687866e76d4271a1abc" + Hex.toHexString(new DataWord(id).getData()) + "0000000000000000000000000000000011111111111111111111111111111111"; @@ -318,10 +292,9 @@ private byte[] deployTransferContract(long id) long tokenValue = 100; long tokenId = id; - byte[] contractAddress = TvmTestUtils + return TvmTestUtils .deployContractWholeProcessReturnContractAddress(contractName, address, ABI, code, value, feeLimit, consumeUserResourcePercent, null, tokenValue, tokenId, repository, null); - return contractAddress; } } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/TransferTokenTest.java b/framework/src/test/java/org/tron/common/runtime/vm/TransferTokenTest.java index 754c03118a5..bc9a60a9704 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/TransferTokenTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/TransferTokenTest.java @@ -1,26 +1,20 @@ package org.tron.common.runtime.vm; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.Runtime; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; import org.tron.core.exception.ReceiptCheckErrException; @@ -32,9 +26,8 @@ import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; @Slf4j -public class TransferTokenTest { +public class TransferTokenTest extends BaseTest { - private static final String dbPath = "output_TransferTokenTest"; private static final String OWNER_ADDRESS; private static final String TRANSFER_TO; private static final long TOTAL_SUPPLY = 1000_000_000L; @@ -46,20 +39,19 @@ public class TransferTokenTest { private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; private static Runtime runtime; - private static Manager dbManager; - private static TronApplicationContext context; - private static Application appT; private static RepositoryImpl repository; private static AccountCapsule ownerCapsule; static { + dbPath = "output_TransferTokenTest"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; TRANSFER_TO = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - dbManager = context.getBean(Manager.class); + } + + @Before + public void before() { repository = RepositoryImpl.createRoot(StoreFactory.getInstance()); repository.createAccount(Hex.decode(TRANSFER_TO), AccountType.Normal); repository.addBalance(Hex.decode(TRANSFER_TO), 10); @@ -73,20 +65,6 @@ public class TransferTokenTest { ownerCapsule.setBalance(1000_1000_1000L); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - private long createAsset(String tokenName) { dbManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); dbManager.getDynamicPropertiesStore().saveAllowTvmTransferTrc10(1); @@ -116,13 +94,11 @@ private long createAsset(String tokenName) { /** * pragma solidity ^0.4.24; - * * contract tokenTest{ constructor() public payable{} // positive case function * TransferTokenTo(address toAddress, trcToken id,uint256 amount) public payable{ * toAddress.transferToken(amount,id); } function suicide(address toAddress) payable public{ * selfdestruct(toAddress); } function get(trcToken trc) public payable returns(uint256){ return * address(this).tokenBalance(trc); } } - * * 1. deploy 2. trigger and internal transaction 3. suicide (all token) */ @Test diff --git a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java index 4ce516cd11f..1ee561aa97d 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/ValidateMultiSignContractTest.java @@ -1,32 +1,27 @@ package org.tron.common.runtime.vm; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; +import org.junit.Before; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.crypto.Hash; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.store.StoreFactory; import org.tron.core.vm.PrecompiledContracts.ValidateMultiSign; import org.tron.core.vm.repository.Repository; @@ -35,41 +30,24 @@ import stest.tron.wallet.common.client.utils.AbiUtil; @Slf4j -public class ValidateMultiSignContractTest { +public class ValidateMultiSignContractTest extends BaseTest { - private static final String dbPath = "output_ValidateMultiSignContract_test"; private static final String METHOD_SIGN = "validatemultisign(address,uint256,bytes32,bytes[])"; private static final byte[] longData; - private static TronApplicationContext context; - private static Application appT; - private static Manager dbManager; static { + dbPath = "output_ValidateMultiSignContract_test"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); - dbManager = context.getBean(Manager.class); - dbManager.getDynamicPropertiesStore().saveAllowMultiSign(1); - dbManager.getDynamicPropertiesStore().saveTotalSignNum(5); - longData = new byte[1000000]; Arrays.fill(longData, (byte) 2); } ValidateMultiSign contract = new ValidateMultiSign(); - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } + @Before + public void before() { + dbManager.getDynamicPropertiesStore().saveAllowMultiSign(1); + dbManager.getDynamicPropertiesStore().saveTotalSignNum(5); } @Test @@ -116,7 +94,8 @@ public void testDifferentCase() { .build(); toAccount - .updatePermissions(toAccount.getPermissionById(0), null, Arrays.asList(activePermission)); + .updatePermissions(toAccount.getPermissionById(0), null, + Collections.singletonList(activePermission)); dbManager.getAccountStore().put(key.getAddress(), toAccount); //generate data diff --git a/framework/src/test/java/org/tron/core/WalletTest.java b/framework/src/test/java/org/tron/core/WalletTest.java index b353f665823..34b585b1252 100644 --- a/framework/src/test/java/org/tron/core/WalletTest.java +++ b/framework/src/test/java/org/tron/core/WalletTest.java @@ -346,7 +346,6 @@ public void testGetAddress() { @Test public void testGetEcKey() { ECKey ecKey = new ECKey(Utils.getRandom()); - ECKey ecKey2 = new ECKey(Utils.getRandom()); Wallet wallet1 = new Wallet(ecKey); logger.info("ecKey address = {}", ByteArray.toHexString(ecKey .getAddress())); @@ -477,8 +476,7 @@ public void getBlockByLatestNum() { public void getPaginatedAssetIssueList() { buildAssetIssue(); AssetIssueList assetList1 = wallet.getAssetIssueList(0, 100); - Assert.assertTrue("get Asset1", - assetList1.getAssetIssue(0).getName().equals(Asset1.getName())); + assertEquals("get Asset1", assetList1.getAssetIssue(0).getName(), Asset1.getName()); try { assetList1.getAssetIssue(1); } catch (Exception e) { @@ -581,7 +579,7 @@ public void testChainParameters() { }); - System.out.printf(builder.build().toString()); + System.out.print(builder.build()); } @Test diff --git a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java index 26e4e7364b9..cedd147dbaa 100644 --- a/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/VoteWitnessActuatorTest.java @@ -48,6 +48,8 @@ public class VoteWitnessActuatorTest extends BaseTest { @Resource private ConsensusService consensusService; + private static boolean consensusStart; + static { dbPath = "output_VoteWitness_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); @@ -66,8 +68,6 @@ public class VoteWitnessActuatorTest extends BaseTest { */ @Before public void createCapsule() { - consensusService.start(); - WitnessCapsule ownerCapsule = new WitnessCapsule( StringUtil.hexString2ByteString(WITNESS_ADDRESS), @@ -91,6 +91,12 @@ public void createCapsule() { dbManager.getAccountStore() .put(ownerAccountFirstCapsule.getAddress().toByteArray(), ownerAccountFirstCapsule); dbManager.getWitnessStore().put(ownerCapsule.getAddress().toByteArray(), ownerCapsule); + + if (consensusStart) { + return; + } + consensusService.start(); + consensusStart = true; } private Any getContract(String address, String voteaddress, Long value) { @@ -174,7 +180,6 @@ public void InvalidAddress() { actuator.execute(ret); fail("Invalid address"); } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); Assert.assertEquals("Invalid address", e.getMessage()); maintenanceManager.doMaintenance(); WitnessCapsule witnessCapsule = dbManager.getWitnessStore() @@ -271,7 +276,7 @@ public void invalideVoteAddress() { try { actuator.validate(); actuator.execute(ret); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(0, dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)).getVotesList().size()); diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index ed19516a608..f70884aa88c 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -1,82 +1,55 @@ package org.tron.core.actuator.utils; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.ForkController; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter; import org.tron.core.config.Parameter.ForkBlockVersionEnum; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ContractValidateException; import org.tron.core.store.DynamicPropertiesStore; import org.tron.core.utils.ProposalUtil; import org.tron.core.utils.ProposalUtil.ProposalType; @Slf4j(topic = "actuator") -public class ProposalUtilTest { +public class ProposalUtilTest extends BaseTest { - private static final String dbPath = "output_ProposalUtil_test"; private static final long LONG_VALUE = 100_000_000_000_000_000L; private static final String LONG_VALUE_ERROR = "Bad chain parameter value, valid range is [0," + LONG_VALUE + "]"; - public static Application AppT; - private static TronApplicationContext context; - private static Manager dbManager; /** * Init . */ @BeforeClass public static void init() { + dbPath = "output_ProposalUtil_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - dbManager = context.getBean(Manager.class); - AppT = ApplicationFactory.create(context); } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - + @Test public void validProposalTypeCheck() throws ContractValidateException { - Assert.assertEquals(false, ProposalType.contain(4000)); - Assert.assertEquals(false, ProposalType.contain(-1)); - Assert.assertEquals(true, ProposalType.contain(2)); + Assert.assertFalse(ProposalType.contain(4000)); + Assert.assertFalse(ProposalType.contain(-1)); + Assert.assertTrue(ProposalType.contain(2)); - Assert.assertEquals(null, ProposalType.getEnumOrNull(-2)); + Assert.assertNull(ProposalType.getEnumOrNull(-2)); Assert.assertEquals(ProposalType.ALLOW_TVM_SOLIDITY_059, ProposalType.getEnumOrNull(32)); long code = -1; try { ProposalType.getEnum(code); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("Does not support code : " + code, e.getMessage()); } @@ -88,128 +61,126 @@ public void validProposalTypeCheck() throws ContractValidateException { @Test public void validateCheck() { - ProposalUtil actuatorUtil = new ProposalUtil(); DynamicPropertiesStore dynamicPropertiesStore = null; ForkController forkUtils = ForkController.instance(); long invalidValue = -1; try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ACCOUNT_UPGRADE_COST.getCode(), invalidValue); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ACCOUNT_UPGRADE_COST.getCode(), LONG_VALUE + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.CREATE_ACCOUNT_FEE.getCode(), invalidValue); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.CREATE_ACCOUNT_FEE.getCode(), LONG_VALUE + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ASSET_ISSUE_FEE.getCode(), invalidValue); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ASSET_ISSUE_FEE.getCode(), LONG_VALUE + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.WITNESS_PAY_PER_BLOCK.getCode(), invalidValue); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.WITNESS_PAY_PER_BLOCK.getCode(), LONG_VALUE + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.WITNESS_STANDBY_ALLOWANCE.getCode(), invalidValue); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.WITNESS_STANDBY_ALLOWANCE.getCode(), LONG_VALUE + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.CREATE_NEW_ACCOUNT_FEE_IN_SYSTEM_CONTRACT.getCode(), invalidValue); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.CREATE_NEW_ACCOUNT_FEE_IN_SYSTEM_CONTRACT.getCode(), LONG_VALUE + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.CREATE_NEW_ACCOUNT_BANDWIDTH_RATE.getCode(), invalidValue); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.CREATE_NEW_ACCOUNT_BANDWIDTH_RATE.getCode(), LONG_VALUE + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals(LONG_VALUE_ERROR, e.getMessage()); } - long value = 32; try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.MAINTENANCE_TIME_INTERVAL.getCode(), 3 * 27 * 1000 - 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "Bad chain parameter value, valid range is [3 * 27 * 1000,24 * 3600 * 1000]", @@ -217,9 +188,9 @@ public void validateCheck() { } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.MAINTENANCE_TIME_INTERVAL.getCode(), 24 * 3600 * 1000 + 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "Bad chain parameter value, valid range is [3 * 27 * 1000,24 * 3600 * 1000]", @@ -227,9 +198,9 @@ public void validateCheck() { } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ALLOW_CREATION_OF_CONTRACTS.getCode(), 2); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "This value[ALLOW_CREATION_OF_CONTRACTS] is only allowed to be 1", @@ -239,9 +210,9 @@ public void validateCheck() { dynamicPropertiesStore = dbManager.getDynamicPropertiesStore(); dynamicPropertiesStore.saveRemoveThePowerOfTheGr(1); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.REMOVE_THE_POWER_OF_THE_GR.getCode(), 2); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "This value[REMOVE_THE_POWER_OF_THE_GR] is only allowed to be 1", @@ -250,9 +221,9 @@ public void validateCheck() { dynamicPropertiesStore.saveRemoveThePowerOfTheGr(-1); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.REMOVE_THE_POWER_OF_THE_GR.getCode(), 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "This proposal has been executed before and is only allowed to be executed once", @@ -260,27 +231,27 @@ public void validateCheck() { } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.MAX_CPU_TIME_OF_ONE_TX.getCode(), 9); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "Bad chain parameter value, valid range is [10,100]", e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.MAX_CPU_TIME_OF_ONE_TX.getCode(), 101); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "Bad chain parameter value, valid range is [10,100]", e.getMessage()); } try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ALLOW_DELEGATE_RESOURCE.getCode(), 2); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "This value[ALLOW_DELEGATE_RESOURCE] is only allowed to be 1", e.getMessage()); @@ -288,9 +259,9 @@ public void validateCheck() { dynamicPropertiesStore.saveAllowSameTokenName(1); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ALLOW_TVM_TRANSFER_TRC10.getCode(), 2); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals( "This value[ALLOW_TVM_TRANSFER_TRC10] is only allowed to be 1", e.getMessage()); @@ -298,9 +269,9 @@ public void validateCheck() { dynamicPropertiesStore.saveAllowSameTokenName(0); try { - actuatorUtil.validator(dynamicPropertiesStore, forkUtils, + ProposalUtil.validator(dynamicPropertiesStore, forkUtils, ProposalType.ALLOW_TVM_TRANSFER_TRC10.getCode(), 1); - Assert.assertTrue(false); + Assert.fail(); } catch (ContractValidateException e) { Assert.assertEquals("[ALLOW_SAME_TOKEN_NAME] proposal must be approved " + "before [ALLOW_TVM_TRANSFER_TRC10] can be proposed", e.getMessage()); diff --git a/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java index a46bf546821..ad8846743e5 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java @@ -1,147 +1,117 @@ package org.tron.core.actuator.utils; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.tron.core.capsule.utils.TransactionUtil.isNumber; -import java.io.File; -import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; -import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.utils.TransactionUtil; @Slf4j(topic = "capsule") -public class TransactionUtilTest { - - private static final String dbPath = "output_transactionUtil_test"; - public static Application AppT; - private static TronApplicationContext context; +public class TransactionUtilTest extends BaseTest { /** * Init . */ @BeforeClass public static void init() { + dbPath = "output_transactionUtil_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } @Test - public void validAccountNameCheck() throws UnsupportedEncodingException { - TransactionUtil actuatorUtil = new TransactionUtil(); + public void validAccountNameCheck() { String account = ""; - Assert.assertEquals(true, actuatorUtil.validAccountName(account.getBytes("utf-8"))); + assertTrue(TransactionUtil.validAccountName(account.getBytes(StandardCharsets.UTF_8))); for (int i = 0; i < 200; i++) { account += (char) ('a' + (i % 26)); } - Assert.assertEquals(true, actuatorUtil.validAccountName(account.getBytes("utf-8"))); + assertTrue(TransactionUtil.validAccountName(account.getBytes(StandardCharsets.UTF_8))); account += 'z'; - Assert.assertEquals(false, actuatorUtil.validAccountName(account.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAccountName(account.getBytes(StandardCharsets.UTF_8))); } @Test - public void validAccountIdCheck() throws UnsupportedEncodingException { - TransactionUtil actuatorUtil = new TransactionUtil(); + public void validAccountIdCheck() { String accountId = ""; - Assert.assertEquals(false, actuatorUtil.validAccountId(accountId.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAccountId(accountId.getBytes(StandardCharsets.UTF_8))); for (int i = 0; i < 7; i++) { accountId += (char) ('a' + (i % 26)); } - Assert.assertEquals(false, actuatorUtil.validAccountId(accountId.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAccountId(accountId.getBytes(StandardCharsets.UTF_8))); for (int i = 0; i < 26; i++) { accountId += (char) ('a' + (i % 26)); } - Assert.assertEquals(false, actuatorUtil.validAccountId(accountId.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAccountId(accountId.getBytes(StandardCharsets.UTF_8))); accountId = "ab cdefghij"; - Assert.assertEquals(false, actuatorUtil.validAccountId(accountId.getBytes("utf-8"))); - accountId = Character.toString((char) 128) + "abcdefjijk" + Character.toString((char) 129); - Assert.assertEquals(false, actuatorUtil.validAccountId(accountId.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAccountId(accountId.getBytes(StandardCharsets.UTF_8))); + accountId = (char) 128 + "abcdefjijk" + (char) 129; + assertFalse(TransactionUtil.validAccountId(accountId.getBytes(StandardCharsets.UTF_8))); accountId = ""; for (int i = 0; i < 30; i++) { accountId += (char) ('a' + (i % 26)); } - Assert.assertEquals(true, actuatorUtil.validAccountId(accountId.getBytes("utf-8"))); + assertTrue(TransactionUtil.validAccountId(accountId.getBytes(StandardCharsets.UTF_8))); } @Test - public void validAssetNameCheck() throws UnsupportedEncodingException { - TransactionUtil actuatorUtil = new TransactionUtil(); + public void validAssetNameCheck() { String assetName = ""; - Assert.assertEquals(false, actuatorUtil.validAssetName(assetName.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAssetName(assetName.getBytes(StandardCharsets.UTF_8))); for (int i = 0; i < 33; i++) { assetName += (char) ('a' + (i % 26)); } - Assert.assertEquals(false, actuatorUtil.validAssetName(assetName.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAssetName(assetName.getBytes(StandardCharsets.UTF_8))); assetName = "ab cdefghij"; - Assert.assertEquals(false, actuatorUtil.validAssetName(assetName.getBytes("utf-8"))); - assetName = Character.toString((char) 128) + "abcdefjijk" + Character.toString((char) 129); - Assert.assertEquals(false, actuatorUtil.validAssetName(assetName.getBytes("utf-8"))); + assertFalse(TransactionUtil.validAssetName(assetName.getBytes(StandardCharsets.UTF_8))); + assetName = (char) 128 + "abcdefjijk" + (char) 129; + assertFalse(TransactionUtil.validAssetName(assetName.getBytes(StandardCharsets.UTF_8))); assetName = ""; for (int i = 0; i < 20; i++) { assetName += (char) ('a' + (i % 26)); } - Assert.assertEquals(true, actuatorUtil.validAssetName(assetName.getBytes("utf-8"))); + assertTrue(TransactionUtil.validAssetName(assetName.getBytes(StandardCharsets.UTF_8))); } @Test - public void validTokenAbbrNameCheck() throws UnsupportedEncodingException { - - TransactionUtil actuatorUtil = new TransactionUtil(); + public void validTokenAbbrNameCheck() { String abbrName = ""; - Assert.assertEquals(false, actuatorUtil.validTokenAbbrName(abbrName.getBytes("utf-8"))); + assertFalse(TransactionUtil.validTokenAbbrName(abbrName.getBytes(StandardCharsets.UTF_8))); for (int i = 0; i < 6; i++) { abbrName += (char) ('a' + (i % 26)); } - Assert.assertEquals(false, actuatorUtil.validTokenAbbrName(abbrName.getBytes("utf-8"))); + assertFalse(TransactionUtil.validTokenAbbrName(abbrName.getBytes(StandardCharsets.UTF_8))); abbrName = "a bd"; - Assert.assertEquals(false, actuatorUtil.validTokenAbbrName(abbrName.getBytes("utf-8"))); - abbrName = "a" + Character.toString((char) 129) + 'f'; - Assert.assertEquals(false, actuatorUtil.validTokenAbbrName(abbrName.getBytes("utf-8"))); + assertFalse(TransactionUtil.validTokenAbbrName(abbrName.getBytes(StandardCharsets.UTF_8))); + abbrName = "a" + (char) 129 + 'f'; + assertFalse(TransactionUtil.validTokenAbbrName(abbrName.getBytes(StandardCharsets.UTF_8))); abbrName = ""; for (int i = 0; i < 5; i++) { abbrName += (char) ('a' + (i % 26)); } - Assert.assertEquals(true, actuatorUtil.validTokenAbbrName(abbrName.getBytes("utf-8"))); + assertTrue(TransactionUtil.validTokenAbbrName(abbrName.getBytes(StandardCharsets.UTF_8))); } @Test - public void isNumberCheck() throws UnsupportedEncodingException { - TransactionUtil actuatorUtil = new TransactionUtil(); + public void isNumberCheck() { String number = ""; - Assert.assertEquals(false, isNumber(number.getBytes("utf-8"))); + assertFalse(isNumber(number.getBytes(StandardCharsets.UTF_8))); number = "123df34"; - Assert.assertEquals(false, isNumber(number.getBytes("utf-8"))); + assertFalse(isNumber(number.getBytes(StandardCharsets.UTF_8))); number = "013"; - Assert.assertEquals(false, isNumber(number.getBytes("utf-8"))); + assertFalse(isNumber(number.getBytes(StandardCharsets.UTF_8))); number = "24"; - Assert.assertEquals(true, isNumber(number.getBytes("utf-8"))); + assertTrue(isNumber(number.getBytes(StandardCharsets.UTF_8))); } } diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ZenChainParamsTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ZenChainParamsTest.java index 3fd3a352a48..952aab1a91d 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ZenChainParamsTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ZenChainParamsTest.java @@ -1,74 +1,38 @@ package org.tron.core.actuator.utils; -import java.io.File; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; -import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; -import org.tron.core.config.args.Args; import org.tron.core.utils.ZenChainParams; @Slf4j(topic = "capsule") public class ZenChainParamsTest { - private static final String dbPath = "output_zenchainparams_test"; - public static Application AppT; - private static TronApplicationContext context; - - /** - * Init . - */ - @BeforeClass - public static void init() { - Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void variableCheck() { - ZenChainParams actuatorUtils = new ZenChainParams(); - Assert.assertEquals(16, actuatorUtils.NOTEENCRYPTION_AUTH_BYTES); - Assert.assertEquals(1, actuatorUtils.ZC_NOTEPLAINTEXT_LEADING); - Assert.assertEquals(8, actuatorUtils.ZC_V_SIZE); - Assert.assertEquals(32, actuatorUtils.ZC_R_SIZE); - Assert.assertEquals(512, actuatorUtils.ZC_MEMO_SIZE); - Assert.assertEquals(11, actuatorUtils.ZC_DIVERSIFIER_SIZE); - Assert.assertEquals(32, actuatorUtils.ZC_JUBJUB_POINT_SIZE); - Assert.assertEquals(32, actuatorUtils.ZC_JUBJUB_SCALAR_SIZE); + ZenChainParams zenChainParams = new ZenChainParams(); + assertNotNull(zenChainParams); + assertEquals(16, ZenChainParams.NOTEENCRYPTION_AUTH_BYTES); + assertEquals(1, ZenChainParams.ZC_NOTEPLAINTEXT_LEADING); + assertEquals(8, ZenChainParams.ZC_V_SIZE); + assertEquals(32, ZenChainParams.ZC_R_SIZE); + assertEquals(512, ZenChainParams.ZC_MEMO_SIZE); + assertEquals(11, ZenChainParams.ZC_DIVERSIFIER_SIZE); + assertEquals(32, ZenChainParams.ZC_JUBJUB_POINT_SIZE); + assertEquals(32, ZenChainParams.ZC_JUBJUB_SCALAR_SIZE); int ZC_ENCPLAINTEXT_SIZE = - actuatorUtils.ZC_NOTEPLAINTEXT_LEADING + actuatorUtils.ZC_DIVERSIFIER_SIZE - + actuatorUtils.ZC_V_SIZE + actuatorUtils.ZC_R_SIZE + actuatorUtils.ZC_MEMO_SIZE; - Assert.assertEquals(ZC_ENCPLAINTEXT_SIZE, actuatorUtils.ZC_ENCPLAINTEXT_SIZE); - int ZC_ENCCIPHERTEXT_SIZE = (actuatorUtils.ZC_ENCPLAINTEXT_SIZE - + actuatorUtils.NOTEENCRYPTION_AUTH_BYTES); - Assert.assertEquals(ZC_ENCCIPHERTEXT_SIZE, actuatorUtils.ZC_ENCCIPHERTEXT_SIZE); - int ZC_OUTCIPHERTEXT_SIZE = (actuatorUtils.ZC_OUTPLAINTEXT_SIZE - + actuatorUtils.NOTEENCRYPTION_AUTH_BYTES); - Assert.assertEquals(ZC_OUTCIPHERTEXT_SIZE, actuatorUtils.ZC_OUTCIPHERTEXT_SIZE); - Assert.assertTrue(actuatorUtils instanceof ZenChainParams); + ZenChainParams.ZC_NOTEPLAINTEXT_LEADING + ZenChainParams.ZC_DIVERSIFIER_SIZE + + ZenChainParams.ZC_V_SIZE + ZenChainParams.ZC_R_SIZE + ZenChainParams.ZC_MEMO_SIZE; + assertEquals(ZenChainParams.ZC_ENCPLAINTEXT_SIZE, ZC_ENCPLAINTEXT_SIZE); + int ZC_ENCCIPHERTEXT_SIZE = (ZenChainParams.ZC_ENCPLAINTEXT_SIZE + + ZenChainParams.NOTEENCRYPTION_AUTH_BYTES); + assertEquals(ZenChainParams.ZC_ENCCIPHERTEXT_SIZE, ZC_ENCCIPHERTEXT_SIZE); + int ZC_OUTCIPHERTEXT_SIZE = (ZenChainParams.ZC_OUTPLAINTEXT_SIZE + + ZenChainParams.NOTEENCRYPTION_AUTH_BYTES); + assertEquals(ZenChainParams.ZC_OUTCIPHERTEXT_SIZE, ZC_OUTCIPHERTEXT_SIZE); } } diff --git a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java index 6c97848cd70..65aab3e9e7a 100644 --- a/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/AccountCapsuleTest.java @@ -1,34 +1,25 @@ package org.tron.core.capsule; import com.google.protobuf.ByteString; -import java.io.File; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Random; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Key; import org.tron.protos.Protocol.Permission; import org.tron.protos.Protocol.Vote; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; -public class AccountCapsuleTest { +public class AccountCapsuleTest extends BaseTest { - private static final String dbPath = "output_accountCapsule_test"; - private static final Manager dbManager; - private static final TronApplicationContext context; private static final String OWNER_ADDRESS; private static final String ASSET_NAME = "trx"; private static final long TOTAL_SUPPLY = 10000L; @@ -45,10 +36,8 @@ public class AccountCapsuleTest { static AccountCapsule accountCapsule; static { + dbPath = "output_accountCapsule_test"; Args.setParam(new String[]{"-d", dbPath, "-w"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - dbManager = context.getBean(Manager.class); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "a06a17a49648a8ad32055c06f60fa14ae46df91234"; } @@ -64,13 +53,6 @@ public static void init() { accountCapsuleTest.setBalance(1111L); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - public static byte[] randomBytes(int length) { //generate the random number byte[] result = new byte[length]; @@ -129,9 +111,8 @@ public void AssetAmountTest() { Assert.assertEquals(nameAdd, entry.getKey()); Assert.assertEquals(amountAdd - amountReduce, entry.getValue().longValue()); } - String key = nameAdd; long value = 11L; - boolean addAsssetBoolean = accountCapsuleTest.addAsset(key.getBytes(), value); + boolean addAsssetBoolean = accountCapsuleTest.addAsset(nameAdd.getBytes(), value); Assert.assertFalse(addAsssetBoolean); String keyName = "TokenTest"; @@ -193,9 +174,9 @@ public void sameTokenNameCloseAssertAmountV2test() { dbManager.getAccountStore().put(accountCapsule.getAddress().toByteArray(), accountCapsule); accountCapsule.addAssetV2(ByteArray.fromString(String.valueOf(id)), 1000L); - Assert.assertEquals(accountCapsule.getAssetMapForTest().get(ASSET_NAME).longValue(), 1000L); - Assert.assertEquals(accountCapsule.getAssetV2MapForTest().get(String.valueOf(id)).longValue(), - 1000L); + Assert.assertEquals(1000L, accountCapsule.getAssetMapForTest().get(ASSET_NAME).longValue()); + Assert.assertEquals(1000L, + accountCapsule.getAssetV2MapForTest().get(String.valueOf(id)).longValue()); //assetBalanceEnoughV2 Assert.assertTrue(accountCapsule.assetBalanceEnoughV2(ByteArray.fromString(ASSET_NAME), @@ -217,10 +198,11 @@ public void sameTokenNameCloseAssertAmountV2test() { Assert.assertTrue(accountCapsule.addAssetAmountV2(ByteArray.fromString(ASSET_NAME), 500, dbManager.getDynamicPropertiesStore(), dbManager.getAssetIssueStore())); // 1000-999 +500 - Assert.assertEquals(accountCapsule.getAssetMapForTest().get(ASSET_NAME).longValue(), 501L); + Assert.assertEquals(501L, accountCapsule.getAssetMapForTest().get(ASSET_NAME).longValue()); Assert.assertTrue(accountCapsule.addAssetAmountV2(ByteArray.fromString("abc"), 500, dbManager.getDynamicPropertiesStore(), dbManager.getAssetIssueStore())); - Assert.assertEquals(accountCapsule.getAssetMapForTest().get("abc").longValue(), 500L); + Assert.assertEquals(500L, + accountCapsule.getAssetMapForTest().get("abc").longValue()); } /** @@ -274,8 +256,8 @@ public void sameTokenNameOpenAssertAmountV2test() { 10000); accountCapsule.addAssetV2(ByteArray.fromString(String.valueOf(id)), 1000L); dbManager.getAccountStore().put(accountCapsule.getAddress().toByteArray(), accountCapsule); - Assert.assertEquals(accountCapsule.getAssetV2MapForTest().get(String.valueOf(id)).longValue(), - 1000L); + Assert.assertEquals(1000L, + accountCapsule.getAssetV2MapForTest().get(String.valueOf(id)).longValue()); //assetBalanceEnoughV2 Assert.assertTrue(accountCapsule.assetBalanceEnoughV2(ByteArray.fromString(String.valueOf(id)), @@ -300,14 +282,14 @@ public void sameTokenNameOpenAssertAmountV2test() { Assert.assertTrue(accountCapsule.addAssetAmountV2(ByteArray.fromString(String.valueOf(id)), 500, dbManager.getDynamicPropertiesStore(), dbManager.getAssetIssueStore())); // 1000-999 +500 - Assert.assertEquals(accountCapsule.getAssetV2MapForTest().get(String.valueOf(id)).longValue(), - 501L); + Assert.assertEquals(501L, + accountCapsule.getAssetV2MapForTest().get(String.valueOf(id)).longValue()); //abc Assert.assertTrue(accountCapsule.addAssetAmountV2(ByteArray.fromString(String.valueOf(id + 1)), 500, dbManager.getDynamicPropertiesStore(), dbManager.getAssetIssueStore())); Assert - .assertEquals(accountCapsule.getAssetV2MapForTest().get(String.valueOf(id + 1)).longValue(), - 500L); + .assertEquals(500L, + accountCapsule.getAssetV2MapForTest().get(String.valueOf(id + 1)).longValue()); } @Test @@ -319,9 +301,8 @@ public void witnessPermissionTest() { AccountType.Normal, 10000); - Assert.assertTrue( - Arrays.equals(ByteArray.fromHexString(OWNER_ADDRESS), - accountCapsule.getWitnessPermissionAddress())); + Assert.assertArrayEquals(ByteArray.fromHexString(OWNER_ADDRESS), + accountCapsule.getWitnessPermissionAddress()); String witnessPermissionAddress = Wallet.getAddressPreFixString() + "cc6a17a49648a8ad32055c06f60fa14ae46df912cc"; @@ -330,8 +311,7 @@ public void witnessPermissionTest() { .setAddress(ByteString.copyFrom(ByteArray.fromHexString(witnessPermissionAddress))) .build()).build()).build()); - Assert.assertTrue( - Arrays.equals(ByteArray.fromHexString(witnessPermissionAddress), - accountCapsule.getWitnessPermissionAddress())); + Assert.assertArrayEquals(ByteArray.fromHexString(witnessPermissionAddress), + accountCapsule.getWitnessPermissionAddress()); } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/capsule/ExchangeCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/ExchangeCapsuleTest.java index d1a86f273db..48479287eab 100644 --- a/framework/src/test/java/org/tron/core/capsule/ExchangeCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/ExchangeCapsuleTest.java @@ -1,69 +1,22 @@ package org.tron.core.capsule; import com.google.protobuf.ByteString; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; -import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; -import org.tron.core.db.StorageMarket; import org.tron.core.exception.ItemNotFoundException; @Slf4j -public class ExchangeCapsuleTest { - - private static final String dbPath = "output_exchange_capsule_test_test"; - private static final String OWNER_ADDRESS; - private static final String OWNER_ADDRESS_INVALID = "aaaa"; - private static final String OWNER_ACCOUNT_INVALID; - private static final long initBalance = 10_000_000_000_000_000L; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; - private static StorageMarket storageMarket; - private static TronApplicationContext context; +public class ExchangeCapsuleTest extends BaseTest { static { + dbPath = "output_exchange_capsule_test_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - OWNER_ACCOUNT_INVALID = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; - } - - /** - * Init data. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - storageMarket = new StorageMarket(chainBaseManager.getAccountStore(), - chainBaseManager.getDynamicPropertiesStore()); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } /** diff --git a/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java b/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java index ed0a3bda670..c9d593daf66 100644 --- a/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java +++ b/framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java @@ -1,38 +1,26 @@ package org.tron.core.capsule; import com.google.protobuf.ByteString; -import java.io.File; -import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.common.utils.StringUtil; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Result; import org.tron.protos.Protocol.Transaction.Result.contractResult; @Slf4j -public class TransactionCapsuleTest { +public class TransactionCapsuleTest extends BaseTest { - private static Manager dbManager; - private static TronApplicationContext context; - private static Application AppT; - private static String dbPath = "output_transactioncapsule_test"; private static String OWNER_ADDRESS; - private static String OWNER_KEY = + /*private static String OWNER_KEY = "bfa67cb3dc6609b3a0c98e717d66f38ed1a159b5b3421678dfab85961c40de2f"; private static String TO_ADDRESS; private static String OWNER_ACCOUNT_NOT_Exist; @@ -54,16 +42,14 @@ public class TransactionCapsuleTest { private static String KEY_ADDRESS_23; private static String KEY_ADDRESS_31; private static String KEY_ADDRESS_32; - private static String KEY_ADDRESS_33; + private static String KEY_ADDRESS_33;*/ @BeforeClass public static void init() { + dbPath = "output_transactioncapsule_test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - dbManager = context.getBean(Manager.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "03702350064AD5C1A8AA6B4D74B051199CFF8EA7"; - TO_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; + /*TO_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; OWNER_ACCOUNT_NOT_Exist = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; KEY_ADDRESS_11 = Wallet.getAddressPreFixString() + "19E7E376E7C213B7E7E7E46CC70A5DD086DAFF2A"; @@ -76,16 +62,7 @@ public static void init() { KEY_ADDRESS_31 = Wallet.getAddressPreFixString() + "77952CE83CA3CAD9F7ADCFABEDA85BD2F1F52008"; KEY_ADDRESS_32 = Wallet.getAddressPreFixString() + "94622CC2A5B64A58C25A129D48A2BEEC4B65B779"; - KEY_ADDRESS_33 = Wallet.getAddressPreFixString() + "5CBDD86A2FA8DC4BDDD8A8F69DBA48572EEC07FB"; - } - - @AfterClass - public static void removeDb() { - Args.clearParam(); - AppT.shutdownServices(); - AppT.shutdown(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); + KEY_ADDRESS_33 = Wallet.getAddressPreFixString() + "5CBDD86A2FA8DC4BDDD8A8F69DBA48572EEC07FB";*/ } /** @@ -1086,6 +1063,6 @@ public void trxCapsuleClearTest() { Assert.assertEquals(trxCap.getInstance().getRetCount(), 0); trxCap.setResultCode(contractResult); Assert.assertEquals(trxCap.getInstance() - .getRet(0).getContractRet(), contractResult.OUT_OF_TIME); + .getRet(0).getContractRet(), Result.contractResult.OUT_OF_TIME); } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java index b07061dc696..8d56c1a5f21 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/AssetUtilTest.java @@ -2,49 +2,30 @@ import com.google.common.collect.Lists; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Random; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; import org.tron.api.GrpcAPI.AssetIssueList; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.db.BandwidthProcessor; -import org.tron.core.db.Manager; -import org.tron.core.store.AccountAssetStore; import org.tron.protos.Protocol; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; @Slf4j -public class AssetUtilTest { +public class AssetUtilTest extends BaseTest { - private static String dbPath = "output_AssetUtil_test"; - private static Manager dbManager; - private static TronApplicationContext context; - private static ChainBaseManager chainBaseManager; static { + dbPath = "output_AssetUtil_test"; Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - } - - @AfterClass - public static void removeDb() { - Args.clearParam(); - FileUtil.deleteDir(new File(dbPath)); } public static byte[] randomBytes(int length) { @@ -54,14 +35,12 @@ public static byte[] randomBytes(int length) { return result; } - private static AccountCapsule createAccount2() { - AccountAssetStore accountAssetStore = dbManager.getAccountAssetStore(); + private AccountCapsule createAccount2() { com.google.protobuf.ByteString accountName = com.google.protobuf.ByteString.copyFrom(randomBytes(16)); com.google.protobuf.ByteString address = ByteString.copyFrom(randomBytes(32)); Protocol.AccountType accountType = Protocol.AccountType.forNumber(1); - AccountCapsule accountCapsule = new AccountCapsule(accountName, address, accountType); - return accountCapsule; + return new AccountCapsule(accountName, address, accountType); } @Test diff --git a/framework/src/test/java/org/tron/core/capsule/utils/ExchangeProcessorTest.java b/framework/src/test/java/org/tron/core/capsule/utils/ExchangeProcessorTest.java index 50d01e2b982..3d30dabf031 100644 --- a/framework/src/test/java/org/tron/core/capsule/utils/ExchangeProcessorTest.java +++ b/framework/src/test/java/org/tron/core/capsule/utils/ExchangeProcessorTest.java @@ -1,36 +1,22 @@ package org.tron.core.capsule.utils; -import java.io.File; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; -import org.tron.core.Wallet; import org.tron.core.capsule.ExchangeProcessor; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; @Slf4j -public class ExchangeProcessorTest { +public class ExchangeProcessorTest extends BaseTest { - private static final String dbPath = "output_buy_exchange_processor_test"; - private static final String OWNER_ADDRESS; - private static final String OWNER_ADDRESS_INVALID = "aaaa"; - private static final String OWNER_ACCOUNT_INVALID; - private static final long initBalance = 10_000_000_000_000_000L; private static ExchangeProcessor processor; - private static TronApplicationContext context; static { + dbPath = "output_buy_exchange_processor_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - OWNER_ADDRESS = Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a1abc"; - OWNER_ACCOUNT_INVALID = - Wallet.getAddressPreFixString() + "548794500882809695a8a687866e76d4271a3456"; } /** @@ -40,24 +26,6 @@ public class ExchangeProcessorTest { public static void init() { long supply = 1_000_000_000_000_000_000L; processor = new ExchangeProcessor(supply); - // Args.setParam(new String[]{"--output-directory", dbPath}, - // "config-junit.conf"); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } @Test diff --git a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java index 4e7efdd43f1..ca115bed2bd 100644 --- a/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java +++ b/framework/src/test/java/org/tron/core/db/EnergyPriceHistoryLoaderTest.java @@ -26,7 +26,6 @@ @Slf4j public class EnergyPriceHistoryLoaderTest extends BaseTest { - private static String dbPath = "output-EnergyPriceHistoryLoaderTest-test"; private static long t1 = 1542607200000L; private static long price1 = 20; private static long t3 = 1544724000000L; @@ -37,6 +36,7 @@ public class EnergyPriceHistoryLoaderTest extends BaseTest { private static long price5 = 140L; static { + dbPath = "output-EnergyPriceHistoryLoaderTest-test"; Args.setParam(new String[] {"--output-directory", dbPath}, Constant.TEST_CONF); } diff --git a/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java b/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java index 34ce5d7d6ec..035a34ac414 100644 --- a/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java +++ b/framework/src/test/java/org/tron/core/db/api/AssetUpdateHelperTest.java @@ -3,50 +3,36 @@ import static org.tron.core.config.Parameter.ChainSymbol.TRX_SYMBOL_BYTES; import com.google.protobuf.ByteString; -import java.io.File; -import org.junit.AfterClass; +import java.util.Objects; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; -import org.tron.core.ChainBaseManager; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.AssetIssueCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.ExchangeCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.protos.Protocol.Account; import org.tron.protos.Protocol.Exchange; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; -public class AssetUpdateHelperTest { +public class AssetUpdateHelperTest extends BaseTest { - private static ChainBaseManager chainBaseManager; - private static TronApplicationContext context; - private static String dbPath = "output_AssetUpdateHelperTest_test"; - private static Application AppT; - - private static ByteString assetName = ByteString.copyFrom("assetIssueName".getBytes()); + private static final ByteString assetName = ByteString.copyFrom("assetIssueName".getBytes()); static { + dbPath = "output_AssetUpdateHelperTest_test"; Args.setParam(new String[]{"-d", dbPath, "-w"}, "config-test-index.conf"); Args.getInstance().setSolidityNode(true); - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); } - @BeforeClass - public static void init() { - - chainBaseManager = context.getBean(ChainBaseManager.class); + @Before + public void init() { AssetIssueContract contract = AssetIssueContract.newBuilder().setName(assetName).setNum(12581).setPrecision(5).build(); @@ -86,13 +72,6 @@ public static void init() { accountCapsule); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - @Test public void test() { @@ -112,7 +91,7 @@ public void test() { Assert.assertEquals(5L, assetIssueCapsule.getPrecision()); AssetIssueCapsule assetIssueCapsule2 = - chainBaseManager.getAssetIssueV2Store().get(ByteArray.fromString(String.valueOf(idNum))); + chainBaseManager.getAssetIssueV2Store().get(ByteArray.fromString(idNum)); Assert.assertEquals(idNum, assetIssueCapsule2.getId()); Assert.assertEquals(assetName, assetIssueCapsule2.getName()); @@ -139,7 +118,8 @@ public void test() { chainBaseManager.getAccountStore().get(ByteArray.fromHexString("121212abc")); Assert.assertEquals( - ByteString.copyFrom(ByteArray.fromString("1000001")), accountCapsule.getAssetIssuedID()); + ByteString.copyFrom(Objects.requireNonNull(ByteArray.fromString("1000001"))), + accountCapsule.getAssetIssuedID()); Assert.assertEquals(1, accountCapsule.getAssetV2MapForTest().size()); diff --git a/framework/src/test/java/org/tron/core/db/backup/BackupDbUtilTest.java b/framework/src/test/java/org/tron/core/db/backup/BackupDbUtilTest.java index f63fafe060e..4ddbd88d338 100644 --- a/framework/src/test/java/org/tron/core/db/backup/BackupDbUtilTest.java +++ b/framework/src/test/java/org/tron/core/db/backup/BackupDbUtilTest.java @@ -1,51 +1,41 @@ package org.tron.core.db.backup; import java.io.File; -import java.util.List; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.rocksdb.RocksDB; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.FileUtil; import org.tron.common.utils.PropUtil; import org.tron.consensus.dpos.DposSlot; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.consensus.ConsensusService; -import org.tron.core.db.Manager; import org.tron.core.db.ManagerForTest; -import org.tron.core.db2.core.Chainbase; -import org.tron.core.db2.core.SnapshotManager; @Slf4j -public class BackupDbUtilTest { +public class BackupDbUtilTest extends BaseTest { static { RocksDB.loadLibrary(); } - public TronApplicationContext context; - public Application AppT = null; - public BackupDbUtil dbBackupUtil; - public Manager dbManager; + @Resource public ConsensusService consensusService; + @Resource public DposSlot dposSlot; public ManagerForTest mngForTest; - public String dbPath = "output-BackupDbUtilTest"; String propPath; String bak1Path; String bak2Path; int frequency; - @Before - public void before() { + static { + dbPath = "output-BackupDbUtilTest"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -54,16 +44,12 @@ public void before() { }, "config-test-dbbackup.conf" ); + } - context = new TronApplicationContext(DefaultConfig.class); - AppT = ApplicationFactory.create(context); - dbManager = context.getBean(Manager.class); - dposSlot = context.getBean(DposSlot.class); - consensusService = context.getBean(ConsensusService.class); - dbBackupUtil = context.getBean(BackupDbUtil.class); + @Before + public void before() { consensusService.start(); mngForTest = new ManagerForTest(dbManager, dposSlot); - //prepare prop.properties propPath = dbPath + File.separator + "test_prop.properties"; bak1Path = dbPath + File.separator + "bak1/database"; @@ -75,49 +61,30 @@ public void before() { FileUtil.createFileIfNotExists(propPath); } - @After - public void after() { - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void testDoBackup() { - PropUtil.writeProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE(), - String.valueOf("11")); + PropUtil.writeProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE(), "11"); mngForTest.pushNTestBlock(50); - List alist = ((SnapshotManager) dbBackupUtil.getDb()).getDbs(); - Assert.assertTrue(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() == 50); - Assert.assertTrue("22".equals( - PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE()))); + Assert.assertEquals(50, dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber()); + Assert.assertEquals("22", PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE())); mngForTest.pushNTestBlock(50); - Assert.assertTrue(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() == 100); - Assert.assertTrue("11".equals( - PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE()))); + Assert.assertEquals(100, dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber()); + Assert.assertEquals("11", PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE())); mngForTest.pushNTestBlock(50); - Assert.assertTrue(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() == 150); - Assert.assertTrue("22".equals( - PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE()))); + Assert.assertEquals(150, dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber()); + Assert.assertEquals("22", PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE())); - PropUtil.writeProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE(), - String.valueOf("1")); + PropUtil.writeProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE(), "1"); mngForTest.pushNTestBlock(50); - Assert.assertTrue(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() == 200); - Assert.assertTrue("11".equals( - PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE()))); + Assert.assertEquals(200, dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber()); + Assert.assertEquals("11", PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE())); - PropUtil.writeProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE(), - String.valueOf("2")); + PropUtil.writeProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE(), "2"); mngForTest.pushNTestBlock(50); - Assert.assertTrue(dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() == 250); - Assert.assertTrue("22".equals( - PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE()))); + Assert.assertEquals(250, dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber()); + Assert.assertEquals("22", PropUtil.readProperty(propPath, BackupDbUtil.getDB_BACKUP_STATE())); } } diff --git a/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java b/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java index bbc49835bd5..55d7c106458 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/BuildTransactionTest.java @@ -1,31 +1,26 @@ package org.tron.core.jsonrpc; import com.google.protobuf.ByteString; -import java.io.File; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.ContractCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.services.jsonrpc.types.BuildArguments; import org.tron.protos.Protocol; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.contract.SmartContractOuterClass.SmartContract; @Slf4j -public class BuildTransactionTest { +public class BuildTransactionTest extends BaseTest { - private static String dbPath = "output_build_transaction_test"; private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "first"; @@ -33,24 +28,20 @@ public class BuildTransactionTest { private static final String CONTRACT_ADDRESS; private static final long SOURCE_PERCENT = 10L; - private static TronApplicationContext context; - private static Manager dbManager; - private static Wallet wallet; + @Resource + private Wallet wallet; static { + dbPath = "output_build_transaction_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; CONTRACT_ADDRESS = Wallet.getAddressPreFixString() + "f859b5c93f789f4bcffbe7cc95a71e28e5e6a5bd"; } - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - wallet = context.getBean(Wallet.class); - + @Before + public void init() { AccountCapsule accountCapsule = new AccountCapsule( ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), @@ -76,17 +67,6 @@ public static void init() { new ContractCapsule(builder.build())); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void testTransferContract() { BuildArguments buildArguments = new BuildArguments(); diff --git a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java index 143f257d85a..2b2d6f8b277 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/JsonrpcServiceTest.java @@ -1,25 +1,21 @@ package org.tron.core.jsonrpc; import com.google.protobuf.ByteString; -import java.io.File; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.util.encoders.Hex; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.services.NodeInfoService; import org.tron.core.services.jsonrpc.TronJsonRpcImpl; import org.tron.core.services.jsonrpc.types.BlockResult; @@ -30,33 +26,29 @@ @Slf4j -public class JsonrpcServiceTest { - private static String dbPath = "output_jsonrpc_service_test"; +public class JsonrpcServiceTest extends BaseTest { private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "first"; private static TronJsonRpcImpl tronJsonRpc; - private static TronApplicationContext context; - private static NodeInfoService nodeInfoService; + @Resource + private NodeInfoService nodeInfoService; private static BlockCapsule blockCapsule; private static TransactionCapsule transactionCapsule1; - private static TransactionCapsule transactionCapsule2; + @Resource + private Wallet wallet; static { + dbPath = "output_jsonrpc_service_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - nodeInfoService = context.getBean("nodeInfoService", NodeInfoService.class); } - @BeforeClass - public static void init() { - Manager dbManager = context.getBean(Manager.class); - Wallet wallet = context.getBean(Wallet.class); - + @Before + public void init() { AccountCapsule accountCapsule = new AccountCapsule( ByteString.copyFromUtf8(OWNER_ADDRESS_ACCOUNT_NAME), @@ -89,8 +81,8 @@ public static void init() { transactionCapsule1 = new TransactionCapsule(transferContract1, ContractType.TransferContract); transactionCapsule1.setBlockNum(blockCapsule.getNum()); - transactionCapsule2 = - new TransactionCapsule(transferContract2, ContractType.TransferContract); + TransactionCapsule transactionCapsule2 = new TransactionCapsule(transferContract2, + ContractType.TransferContract); transactionCapsule2.setBlockNum(2L); blockCapsule.addTransaction(transactionCapsule1); @@ -107,17 +99,6 @@ public static void init() { tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, dbManager); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void testWeb3Sha3() { String result = ""; diff --git a/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java b/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java index 4fa40e42807..fd2b7a66d31 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/SectionBloomStoreTest.java @@ -1,23 +1,19 @@ package org.tron.core.jsonrpc; -import java.io.File; import java.util.ArrayList; import java.util.BitSet; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import javax.annotation.Resource; import org.junit.Test; import org.testng.Assert; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.runtime.vm.DataWord; import org.tron.common.runtime.vm.LogInfo; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.capsule.TransactionRetCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.EventBloomException; import org.tron.core.services.jsonrpc.TronJsonRpc.FilterRequest; @@ -27,28 +23,14 @@ import org.tron.protos.Protocol.TransactionInfo; import org.tron.protos.Protocol.TransactionInfo.Log; -public class SectionBloomStoreTest { +public class SectionBloomStoreTest extends BaseTest { - private static final String dbPath = "output-sectionBloomStore-test"; - static SectionBloomStore sectionBloomStore; - private static TronApplicationContext context; + @Resource + SectionBloomStore sectionBloomStore; static { - Args.setParam(new String[] {"--output-directory", dbPath}, - Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - @BeforeClass - public static void init() { - sectionBloomStore = context.getBean(SectionBloomStore.class); - } - - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); + dbPath = "output-sectionBloomStore-test"; + Args.setParam(new String[] {"--output-directory", dbPath}, Constant.TEST_CONF); } @Test diff --git a/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java b/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java index 778860b8879..158f924c446 100644 --- a/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java +++ b/framework/src/test/java/org/tron/core/jsonrpc/WalletCursorTest.java @@ -1,21 +1,17 @@ package org.tron.core.jsonrpc; import com.google.protobuf.ByteString; -import java.io.File; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.db2.core.Chainbase.Cursor; import org.tron.core.services.NodeInfoService; import org.tron.core.services.jsonrpc.TronJsonRpcImpl; @@ -24,30 +20,24 @@ import org.tron.protos.Protocol; @Slf4j -public class WalletCursorTest { - private static String dbPath = "output_wallet_cursor_test"; +public class WalletCursorTest extends BaseTest { private static final String OWNER_ADDRESS; private static final String OWNER_ADDRESS_ACCOUNT_NAME = "first"; - - private static TronApplicationContext context; - private static Manager dbManager; - private static Wallet wallet; - private static NodeInfoService nodeInfoService; + @Resource + private Wallet wallet; + @Resource + private NodeInfoService nodeInfoService; static { + dbPath = "output_wallet_cursor_test"; Args.setParam(new String[]{"--output-directory", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); OWNER_ADDRESS = Wallet.getAddressPreFixString() + "abd4b9367799eaa3197fecb144eb71de1e049abc"; - nodeInfoService = context.getBean("nodeInfoService", NodeInfoService.class); } - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - wallet = context.getBean(Wallet.class); - + @Before + public void init() { AccountCapsule accountCapsule = new AccountCapsule( ByteString.copyFromUtf8(OWNER_ADDRESS_ACCOUNT_NAME), @@ -57,17 +47,6 @@ public static void init() { dbManager.getAccountStore().put(accountCapsule.getAddress().toByteArray(), accountCapsule); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void testSource() { TronJsonRpcImpl tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, dbManager); diff --git a/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java b/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java index dadc688e5bd..86fa45a3e59 100644 --- a/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java +++ b/framework/src/test/java/org/tron/core/metrics/prometheus/PrometheusApiServiceTest.java @@ -3,7 +3,6 @@ import com.google.common.collect.Maps; import com.google.protobuf.ByteString; import io.prometheus.client.CollectorRegistry; -import java.io.File; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; @@ -12,54 +11,54 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.IntStream; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.parameter.CommonParameter; import org.tron.common.prometheus.MetricLabels; import org.tron.common.prometheus.Metrics; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.Utils; import org.tron.consensus.dpos.DposSlot; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.consensus.ConsensusService; -import org.tron.core.db.BlockGenerate; -import org.tron.core.db.Manager; import org.tron.core.net.TronNetDelegate; import org.tron.protos.Protocol; @Slf4j(topic = "metric") -public class PrometheusApiServiceTest extends BlockGenerate { - - - static ChainBaseManager chainManager; +public class PrometheusApiServiceTest extends BaseTest { static LocalDateTime localDateTime = LocalDateTime.now(); - private static DposSlot dposSlot; + @Resource + private DposSlot dposSlot; final int blocks = 512; private final String key = "f31db24bfbd1a2ef19beddca0a0fa37632eded9ac666a05d3bd925f01dde1f62"; private final byte[] privateKey = ByteArray.fromHexString(key); - private final AtomicInteger port = new AtomicInteger(0); + private static final AtomicInteger port = new AtomicInteger(0); private final long time = ZonedDateTime.of(localDateTime, ZoneId.systemDefault()).toInstant().toEpochMilli(); - protected String dbPath; - protected String dbEngine; - protected Manager dbManager; + @Resource private TronNetDelegate tronNetDelegate; - private TronApplicationContext context; + @Resource + private ConsensusService consensusService; + + static { + dbPath = "output-prometheus-metric"; + Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); + Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); + initParameter(Args.getInstance()); + Metrics.init(); + } - protected void initParameter(CommonParameter parameter) { + protected static void initParameter(CommonParameter parameter) { parameter.setMetricsPrometheusEnable(true); } @@ -83,47 +82,20 @@ protected void check() throws Exception { Assert.assertNull(errorLogs); } - protected void initDb() { - dbPath = "output-prometheus-metric"; - dbEngine = "LEVELDB"; - } - @Before public void init() throws Exception { - - initDb(); - FileUtil.deleteDir(new File(dbPath)); logger.info("Full node running."); - Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); - Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); - initParameter(Args.getInstance()); - Metrics.init(); - context = new TronApplicationContext(DefaultConfig.class); - - dbManager = context.getBean(Manager.class); - setManager(dbManager); - dposSlot = context.getBean(DposSlot.class); - ConsensusService consensusService = context.getBean(ConsensusService.class); consensusService.start(); - chainManager = dbManager.getChainBaseManager(); - tronNetDelegate = context.getBean(TronNetDelegate.class); - } - - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } private void generateBlock(Map witnessAndAccount) throws Exception { BlockCapsule block = createTestBlockCapsule( - chainManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp() + 3000, - chainManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1, - chainManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(), + chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp() + 3000, + chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber() + 1, + chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(), witnessAndAccount); tronNetDelegate.processBlock(block, false); @@ -136,8 +108,8 @@ public void testMetric() throws Exception { Assert.assertNotNull(ecKey); byte[] address = ecKey.getAddress(); WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address)); - chainManager.getWitnessScheduleStore().saveActiveWitnesses(new ArrayList<>()); - chainManager.addWitness(ByteString.copyFrom(address)); + chainBaseManager.getWitnessScheduleStore().saveActiveWitnesses(new ArrayList<>()); + chainBaseManager.addWitness(ByteString.copyFrom(address)); Protocol.Block block = getSignedBlock(witnessCapsule.getAddress(), time, privateKey); @@ -152,7 +124,7 @@ public void testMetric() throws Exception { } private Map addTestWitnessAndAccount() { - chainManager.getWitnesses().clear(); + chainBaseManager.getWitnesses().clear(); return IntStream.range(0, 2) .mapToObj( i -> { @@ -161,12 +133,12 @@ private Map addTestWitnessAndAccount() { ByteString address = ByteString.copyFrom(ecKey.getAddress()); WitnessCapsule witnessCapsule = new WitnessCapsule(address); - chainManager.getWitnessStore().put(address.toByteArray(), witnessCapsule); - chainManager.addWitness(address); + chainBaseManager.getWitnessStore().put(address.toByteArray(), witnessCapsule); + chainBaseManager.addWitness(address); AccountCapsule accountCapsule = new AccountCapsule(Protocol.Account.newBuilder().setAddress(address).build()); - chainManager.getAccountStore().put(address.toByteArray(), accountCapsule); + chainBaseManager.getAccountStore().put(address.toByteArray(), accountCapsule); return Maps.immutableEntry(address, privateKey); }) diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java index 5b2abfd0705..b8b00e30523 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java @@ -1,17 +1,17 @@ package org.tron.core.net.messagehandler; +import static org.junit.Assert.assertEquals; + import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; import java.util.List; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; +import javax.annotation.Resource; +import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.Parameter; import org.tron.core.config.args.Args; import org.tron.core.exception.P2pException; @@ -21,22 +21,21 @@ import org.tron.protos.Protocol.Inventory.InventoryType; import org.tron.protos.Protocol.Transaction; -public class BlockMsgHandlerTest { +public class BlockMsgHandlerTest extends BaseTest { - protected TronApplicationContext context; + @Resource private BlockMsgHandler handler; + @Resource private PeerConnection peer; /** * init context. */ - @Before - public void init() { - Args.setParam(new String[]{"--output-directory", "output-directory", "--debug"}, + @BeforeClass + public static void init() { + dbPath = "output_blockmsghandler_test"; + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - handler = context.getBean(BlockMsgHandler.class); - peer = context.getBean(PeerConnection.class); } @Test @@ -49,7 +48,7 @@ public void testProcessMessage() { msg = new BlockMessage(blockCapsule); handler.processMessage(peer, msg); } catch (P2pException e) { - Assert.assertTrue(e.getMessage().equals("no request")); + assertEquals("no request", e.getMessage()); } try { @@ -69,7 +68,7 @@ public void testProcessMessage() { handler.processMessage(peer, msg); } catch (P2pException e) { //System.out.println(e); - Assert.assertTrue(e.getMessage().equals("block size over limit")); + assertEquals("block size over limit", e.getMessage()); } try { @@ -81,7 +80,7 @@ public void testProcessMessage() { handler.processMessage(peer, msg); } catch (P2pException e) { //System.out.println(e); - Assert.assertTrue(e.getMessage().equals("block time error")); + assertEquals("block time error", e.getMessage()); } try { @@ -106,10 +105,4 @@ public void testProcessMessage() { System.out.println(e); } } - - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - } } diff --git a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java index a6189346ae5..86e7f662b38 100644 --- a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java @@ -1,23 +1,18 @@ package org.tron.core.net.services; import com.google.common.collect.Lists; - -import java.io.File; import java.util.List; -import org.junit.After; +import javax.annotation.Resource; import org.junit.Assert; -import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.ReflectUtils; import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.net.P2pEventHandlerImpl; import org.tron.core.net.message.adv.BlockMessage; import org.tron.core.net.message.adv.TransactionMessage; import org.tron.core.net.peer.Item; @@ -27,32 +22,21 @@ import org.tron.protos.Protocol; import org.tron.protos.Protocol.Inventory.InventoryType; -public class AdvServiceTest { +public class AdvServiceTest extends BaseTest { - protected TronApplicationContext context; + @Resource private AdvService service; + @Resource private PeerConnection peer; - private P2pEventHandlerImpl p2pEventHandler; - private String dbPath = "output-adv-service-test"; /** * init context. */ - @Before - public void init() { + @BeforeClass + public static void init() { + dbPath = "output-adv-service-test"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - service = context.getBean(AdvService.class); - } - - /** - * destroy. - */ - @After - public void destroy() { - Args.clearParam(); - FileUtil.deleteDir(new File(dbPath)); } @Test @@ -84,9 +68,6 @@ private void testAddInv() { private void testBroadcast() { try { - peer = context.getBean(PeerConnection.class); - p2pEventHandler = context.getBean(P2pEventHandlerImpl.class); - List peers = Lists.newArrayList(); peers.add(peer); ReflectUtils.setFieldValue(P2pEventHandler.class, "peers", peers); diff --git a/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java b/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java index b4deb6aff4b..a5b676d0144 100644 --- a/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/RelayServiceTest.java @@ -2,25 +2,22 @@ import com.google.common.collect.Lists; import com.google.protobuf.ByteString; -import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Set; +import javax.annotation.Resource; import org.bouncycastle.util.encoders.Hex; -import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.common.utils.ReflectUtils; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.net.P2pEventHandlerImpl; import org.tron.core.net.message.adv.BlockMessage; @@ -29,33 +26,23 @@ import org.tron.core.net.service.relay.RelayService; import org.tron.protos.Protocol; -public class RelayServiceTest { +public class RelayServiceTest extends BaseTest { - protected TronApplicationContext context; + @Resource private RelayService service; - private ChainBaseManager chainBaseManager; + @Resource private PeerConnection peer; + @Resource private P2pEventHandlerImpl p2pEventHandler; - private String dbPath = "output-relay-service-test"; /** * init context. */ - @Before - public void init() { + @BeforeClass + public static void init() { + dbPath = "output-relay-service-test"; Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - service = context.getBean(RelayService.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - p2pEventHandler = context.getBean(P2pEventHandlerImpl.class); - } - - @After - public void destroy() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @Test @@ -83,31 +70,29 @@ public void testGetNextWitnesses() throws Exception { method.setAccessible(true); Set s1 = (Set) method.invoke( service, getFromHexString("A04711BF7AFBDF44557DEFBDF4C4E7AA6138C6331F"), 3); - Assert.assertEquals(s1.size(), 3); + Assert.assertEquals(3, s1.size()); assertContains(s1, "A0299F3DB80A24B20A254B89CE639D59132F157F13"); assertContains(s1, "A0807337F180B62A77576377C1D0C9C24DF5C0DD62"); assertContains(s1, "A05430A3F089154E9E182DDD6FE136A62321AF22A7"); Set s2 = (Set) method.invoke( service, getFromHexString("A0FAB5FBF6AFB681E4E37E9D33BDDB7E923D6132E5"), 3); - Assert.assertEquals(s2.size(), 3); + Assert.assertEquals(3, s2.size()); assertContains(s2, "A014EEBE4D30A6ACB505C8B00B218BDC4733433C68"); assertContains(s2, "A04711BF7AFBDF44557DEFBDF4C4E7AA6138C6331F"); assertContains(s2, "A0299F3DB80A24B20A254B89CE639D59132F157F13"); Set s3 = (Set) method.invoke( service, getFromHexString("A04711BF7AFBDF44557DEFBDF4C4E7AA6138C6331F"), 1); - Assert.assertEquals(s3.size(), 1); + Assert.assertEquals(1, s3.size()); assertContains(s3, "A0299F3DB80A24B20A254B89CE639D59132F157F13"); } private void testBroadcast() { try { - peer = context.getBean(PeerConnection.class); peer.setAddress(getFromHexString("A0299F3DB80A24B20A254B89CE639D59132F157F13")); peer.setNeedSyncFromPeer(false); peer.setNeedSyncFromUs(false); - p2pEventHandler = context.getBean(P2pEventHandlerImpl.class); List peers = Lists.newArrayList(); peers.add(peer); diff --git a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java index 16c1205a818..61ce5ec3625 100755 --- a/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java +++ b/framework/src/test/java/org/tron/core/pbft/PbftApiTest.java @@ -3,60 +3,44 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.protobuf.ByteString; -import java.io.File; import java.io.IOException; +import java.util.Objects; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; -import org.junit.After; import org.junit.Assert; -import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.Utils; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.BlockGenerate; import org.tron.core.db.CommonDataBase; -import org.tron.core.db.Manager; import org.tron.core.db2.ISession; -import org.tron.core.exception.HeaderNotFound; import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.store.DynamicPropertiesStore; @Slf4j -public class PbftApiTest extends BlockGenerate { +public class PbftApiTest extends BaseTest { + @Resource + private HttpApiOnPBFTService httpApiOnPBFTService; - private static Manager dbManager; - private static TronApplicationContext context; - private static String dbPath = "output_pbftAPI_test"; - - @Before - public void init() { + @BeforeClass + public static void init() { + dbPath = "output_pbftAPI_test"; Args.setParam(new String[]{"-d", dbPath, "-w"}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - dbManager = context.getBean(Manager.class); - setManager(dbManager); - } - - @After - public void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @Test - public void pbftapi() throws IOException, InterruptedException, HeaderNotFound { + public void pbftapi() throws IOException { ChainBaseManager chainBaseManager = dbManager.getChainBaseManager(); DynamicPropertiesStore dynamicPropertiesStore = chainBaseManager.getDynamicPropertiesStore(); CommonDataBase commonDataBase = chainBaseManager.getCommonDataBase(); @@ -75,17 +59,18 @@ public void pbftapi() throws IOException, InterruptedException, HeaderNotFound { Assert.assertTrue(dynamicPropertiesStore.getLatestBlockHeaderNumber() >= 10); commonDataBase.saveLatestPbftBlockNum(6); - HttpApiOnPBFTService httpApiOnPBFTService = context.getBean(HttpApiOnPBFTService.class); httpApiOnPBFTService.start(); - CloseableHttpResponse response = null; + CloseableHttpResponse response; try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpGet httpGet = new HttpGet("http://127.0.0.1:8092/walletpbft/getnowblock"); response = httpClient.execute(httpGet); String responseString = EntityUtils.toString(response.getEntity()); JSONObject jsonObject = JSON.parseObject(responseString); - long num = jsonObject.getJSONObject("block_header").getJSONObject("raw_data") - .getLongValue("number"); - Assert.assertEquals(commonDataBase.getLatestPbftBlockNum(), num); + if (Objects.nonNull(jsonObject)) { + long num = jsonObject.getJSONObject("block_header").getJSONObject("raw_data") + .getLongValue("number"); + Assert.assertEquals(commonDataBase.getLatestPbftBlockNum(), num); + } response.close(); } httpApiOnPBFTService.stop(); diff --git a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java index 7978d98a9fe..59c4691f50b 100644 --- a/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java +++ b/framework/src/test/java/org/tron/core/services/ProposalServiceTest.java @@ -4,38 +4,35 @@ import static org.tron.core.utils.ProposalUtil.ProposalType.TRANSACTION_FEE; import static org.tron.core.utils.ProposalUtil.ProposalType.WITNESS_127_PAY_PER_BLOCK; -import java.io.File; import java.util.HashSet; import java.util.Set; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.capsule.ProposalCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.consensus.ProposalService; -import org.tron.core.db.Manager; import org.tron.core.utils.ProposalUtil.ProposalType; import org.tron.protos.Protocol.Proposal; @Slf4j -public class ProposalServiceTest { +public class ProposalServiceTest extends BaseTest { - private static TronApplicationContext context; - private static Manager manager; - private static String dbPath = "output_proposal_test"; @BeforeClass public static void init() { + dbPath = "output_proposal_test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - manager = context.getBean(Manager.class); - manager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(5); + + } + + @Before + public void before() { + dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(5); } @Test @@ -47,12 +44,12 @@ public void test() { Proposal proposal = Proposal.newBuilder().putParameters(1, 1).build(); ProposalCapsule proposalCapsule = new ProposalCapsule(proposal); - boolean result = ProposalService.process(manager, proposalCapsule); + boolean result = ProposalService.process(dbManager, proposalCapsule); Assert.assertTrue(result); // proposal = Proposal.newBuilder().putParameters(1000, 1).build(); proposalCapsule = new ProposalCapsule(proposal); - result = ProposalService.process(manager, proposalCapsule); + result = ProposalService.process(dbManager, proposalCapsule); Assert.assertFalse(result); // for (ProposalType proposalType : ProposalType.values()) { @@ -62,57 +59,47 @@ public void test() { proposal = Proposal.newBuilder().putParameters(proposalType.getCode(), 1).build(); } proposalCapsule = new ProposalCapsule(proposal); - result = ProposalService.process(manager, proposalCapsule); + result = ProposalService.process(dbManager, proposalCapsule); Assert.assertTrue(result); } } @Test public void testUpdateEnergyFee() { - String preHistory = manager.getDynamicPropertiesStore().getEnergyPriceHistory(); + String preHistory = dbManager.getDynamicPropertiesStore().getEnergyPriceHistory(); long newPrice = 500; Proposal proposal = Proposal.newBuilder().putParameters(ENERGY_FEE.getCode(), newPrice).build(); ProposalCapsule proposalCapsule = new ProposalCapsule(proposal); - boolean result = ProposalService.process(manager, proposalCapsule); + boolean result = ProposalService.process(dbManager, proposalCapsule); Assert.assertTrue(result); - long currentPrice = manager.getDynamicPropertiesStore().getEnergyFee(); + long currentPrice = dbManager.getDynamicPropertiesStore().getEnergyFee(); Assert.assertEquals(currentPrice, newPrice); - String currentHistory = manager.getDynamicPropertiesStore().getEnergyPriceHistory(); + String currentHistory = dbManager.getDynamicPropertiesStore().getEnergyPriceHistory(); Assert.assertEquals(preHistory + "," + proposalCapsule.getExpirationTime() + ":" + newPrice, currentHistory); } @Test public void testUpdateTransactionFee() { - String preHistory = manager.getDynamicPropertiesStore().getBandwidthPriceHistory(); + String preHistory = dbManager.getDynamicPropertiesStore().getBandwidthPriceHistory(); long newPrice = 1500; Proposal proposal = Proposal.newBuilder().putParameters(TRANSACTION_FEE.getCode(), newPrice).build(); ProposalCapsule proposalCapsule = new ProposalCapsule(proposal); proposalCapsule.setExpirationTime(1627279200000L); - boolean result = ProposalService.process(manager, proposalCapsule); + boolean result = ProposalService.process(dbManager, proposalCapsule); Assert.assertTrue(result); - long currentPrice = manager.getDynamicPropertiesStore().getTransactionFee(); + long currentPrice = dbManager.getDynamicPropertiesStore().getTransactionFee(); Assert.assertEquals(currentPrice, newPrice); String expResult = preHistory + "," + proposalCapsule.getExpirationTime() + ":" + newPrice; - String currentHistory = manager.getDynamicPropertiesStore().getBandwidthPriceHistory(); + String currentHistory = dbManager.getDynamicPropertiesStore().getBandwidthPriceHistory(); Assert.assertEquals(expResult, currentHistory); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java index 4a288b4402c..cbb6c739c9b 100644 --- a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java @@ -1,60 +1,51 @@ package org.tron.core.services.filter; import java.io.BufferedReader; -import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.annotation.Resource; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.tron.common.BaseTest; import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; -public class HttpApiAccessFilterTest { +public class HttpApiAccessFilterTest extends BaseTest { - private static final Logger logger = LoggerFactory.getLogger("Test"); + @Resource + private Application appTest; + @Resource + private FullNodeHttpApiService httpApiService; + @Resource + private HttpApiOnSolidityService httpApiOnSolidityService; + @Resource + private HttpApiOnPBFTService httpApiOnPBFTService; + private static final CloseableHttpClient httpClient = HttpClients.createDefault(); - private static TronApplicationContext context; - private static Application appTest; - private static CloseableHttpClient httpClient = HttpClients.createDefault(); - private static String dbPath = "output_http_api_access_filter_test"; + static { + dbPath = "output_http_api_access_filter_test"; + Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); + Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); + } /** * init dependencies. */ - @BeforeClass - public static void init() { - Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); - context = new TronApplicationContext(DefaultConfig.class); - appTest = ApplicationFactory.create(context); - - FullNodeHttpApiService httpApiService = context - .getBean(FullNodeHttpApiService.class); - HttpApiOnSolidityService httpApiOnSolidityService = context - .getBean(HttpApiOnSolidityService.class); - HttpApiOnPBFTService httpApiOnPBFTService = context - .getBean(HttpApiOnPBFTService.class); - + @Before + public void init() { appTest.addService(httpApiService); appTest.addService(httpApiOnSolidityService); appTest.addService(httpApiOnPBFTService); @@ -63,22 +54,6 @@ public static void init() { appTest.startup(); } - /** - * destroy the context. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - appTest.shutdownServices(); - appTest.shutdown(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void testHttpFilter() { List disabledApiList = new ArrayList<>(); @@ -113,7 +88,7 @@ public void testHttpFilter() { response); Args.getInstance().setDisabledApiList(emptyList); - int statusCode = getReuqestCode(url); + int statusCode = getRequestCode(url); Assert.assertEquals(HttpStatus.SC_OK, statusCode); } } @@ -122,12 +97,12 @@ public void testHttpFilter() { private String sendGetRequest(String url) { HttpGet request = new HttpGet(url); request.setHeader("User-Agent", "Java client"); - HttpResponse response = null; + HttpResponse response; try { response = httpClient.execute(request); BufferedReader rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); String line; while ((line = rd.readLine()) != null) { result.append(line); @@ -139,10 +114,10 @@ private String sendGetRequest(String url) { return null; } - private int getReuqestCode(String url) { + private int getRequestCode(String url) { HttpGet request = new HttpGet(url); request.setHeader("User-Agent", "Java client"); - HttpResponse response = null; + HttpResponse response; try { response = httpClient.execute(request); diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java index 472096cf24b..243a76108c9 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java @@ -4,14 +4,13 @@ import io.grpc.ManagedChannelBuilder; import io.grpc.StatusRuntimeException; import java.io.File; +import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.tron.api.DatabaseGrpc; import org.tron.api.GrpcAPI; import org.tron.api.WalletGrpc; @@ -27,10 +26,9 @@ import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; +@Slf4j public class LiteFnQueryGrpcInterceptorTest { - private static final Logger logger = LoggerFactory.getLogger("Test"); - private TronApplicationContext context; private ManagedChannel channelFull = null; private ManagedChannel channelpBFT = null; @@ -43,7 +41,7 @@ public class LiteFnQueryGrpcInterceptorTest { private RpcApiServiceOnPBFT rpcApiServiceOnPBFT; private Application appTest; - private String dbPath = "output_grpc_filter_test"; + private String dbPath = "output_grpc_interceptor_test"; @Rule public ExpectedException thrown = ExpectedException.none(); diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java index d1d294475c9..370c780a192 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java @@ -1,62 +1,54 @@ package org.tron.core.services.filter; import java.io.BufferedReader; -import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.Set; +import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; -import org.junit.After; import org.junit.Assert; import org.junit.Before; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.tron.common.BaseTest; import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; -public class LiteFnQueryHttpFilterTest { +@Slf4j +public class LiteFnQueryHttpFilterTest extends BaseTest { - private static final Logger logger = LoggerFactory.getLogger("Test"); - - private TronApplicationContext context; - private String ip = "127.0.0.1"; + private final String ip = "127.0.0.1"; private int fullHttpPort; + @Resource private Application appTest; - private CloseableHttpClient httpClient = HttpClients.createDefault(); + @Resource + private FullNodeHttpApiService httpApiService; + @Resource + private HttpApiOnSolidityService httpApiOnSolidityService; + @Resource + private HttpApiOnPBFTService httpApiOnPBFTService; + private final CloseableHttpClient httpClient = HttpClients.createDefault(); - private String dbPath = "output_grpc_filter_test"; + static { + dbPath = "output_http_filter_test"; + Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); + Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); + } /** * init dependencies. */ @Before public void init() { - Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); - context = new TronApplicationContext(DefaultConfig.class); - appTest = ApplicationFactory.create(context); - FullNodeHttpApiService httpApiService = context - .getBean(FullNodeHttpApiService.class); - HttpApiOnSolidityService httpApiOnSolidityService = context - .getBean(HttpApiOnSolidityService.class); - HttpApiOnPBFTService httpApiOnPBFTService = context - .getBean(HttpApiOnPBFTService.class); appTest.addService(httpApiService); appTest.addService(httpApiOnSolidityService); appTest.addService(httpApiOnPBFTService); @@ -65,22 +57,6 @@ public void init() { appTest.startup(); } - /** - * destroy the context. - */ - @After - public void destroy() { - Args.clearParam(); - appTest.shutdownServices(); - appTest.shutdown(); - context.destroy(); - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - @Test public void testHttpFilter() { Set urlPathSets = LiteFnQueryHttpFilter.getFilterPaths(); @@ -120,12 +96,12 @@ public void testHttpFilter() { private String sendGetRequest(String url) { HttpGet request = new HttpGet(url); request.setHeader("User-Agent", "Java client"); - HttpResponse response = null; + HttpResponse response; try { response = httpClient.execute(request); BufferedReader rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); String line; while ((line = rd.readLine()) != null) { result.append(line); @@ -145,7 +121,7 @@ private String sendPostRequest(String url, String body) throws IOException { HttpResponse response = httpClient.execute(request); BufferedReader rd = new BufferedReader( new InputStreamReader(response.getEntity().getContent())); - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); String line; while ((line = rd.readLine()) != null) { result.append(line); diff --git a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java index c3ef7265f65..f31e96d42dd 100644 --- a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java @@ -7,14 +7,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import lombok.extern.slf4j.Slf4j; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.tron.api.GrpcAPI; import org.tron.api.WalletGrpc; import org.tron.api.WalletSolidityGrpc; @@ -29,10 +28,9 @@ import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; +@Slf4j public class RpcApiAccessInterceptorTest { - private static final Logger logger = LoggerFactory.getLogger("Test"); - private static TronApplicationContext context; private static WalletGrpc.WalletBlockingStub blockingStubFull = null; @@ -40,7 +38,7 @@ public class RpcApiAccessInterceptorTest { private static WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubPBFT = null; private static Application appTest; - private static String dbPath = "output_rpc_api_access_filter_test"; + private static String dbPath = "output_rpc_api_access_interceptor_test"; @Rule public ExpectedException thrown = ExpectedException.none(); diff --git a/framework/src/test/java/org/tron/core/services/http/UtilTest.java b/framework/src/test/java/org/tron/core/services/http/UtilTest.java index fed314ba44e..1f698796ba7 100644 --- a/framework/src/test/java/org/tron/core/services/http/UtilTest.java +++ b/framework/src/test/java/org/tron/core/services/http/UtilTest.java @@ -1,44 +1,27 @@ package org.tron.core.services.http; -import java.io.File; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; import org.tron.api.GrpcAPI.TransactionApprovedList; import org.tron.api.GrpcAPI.TransactionSignWeight; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.utils.FileUtil; +import org.tron.common.BaseTest; import org.tron.core.Constant; import org.tron.core.Wallet; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.utils.TransactionUtil; import org.tron.protos.Protocol.Transaction; -public class UtilTest { +public class UtilTest extends BaseTest { - private static Wallet wallet; - private static String dbPath = "output_util_test"; - private static TronApplicationContext context; - private static TransactionUtil transactionUtil; + @Resource + private Wallet wallet; + @Resource + private TransactionUtil transactionUtil; static { + dbPath = "output_util_test"; Args.setParam(new String[] {"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - @BeforeClass - public static void init() { - wallet = context.getBean(Wallet.class); - transactionUtil = context.getBean(TransactionUtil.class); - } - - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @Test diff --git a/framework/src/test/java/org/tron/core/witness/ProposalControllerTest.java b/framework/src/test/java/org/tron/core/witness/ProposalControllerTest.java index 56e115aa325..cb502008bfc 100644 --- a/framework/src/test/java/org/tron/core/witness/ProposalControllerTest.java +++ b/framework/src/test/java/org/tron/core/witness/ProposalControllerTest.java @@ -1,57 +1,46 @@ package org.tron.core.witness; import com.google.protobuf.ByteString; -import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; import org.testng.collections.Lists; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.ProposalCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.consensus.ConsensusService; import org.tron.core.consensus.ProposalController; -import org.tron.core.db.Manager; import org.tron.core.store.DynamicPropertiesStore; import org.tron.protos.Protocol.Proposal; import org.tron.protos.Protocol.Proposal.State; -public class ProposalControllerTest { +public class ProposalControllerTest extends BaseTest { - private static Manager dbManager; - private static ConsensusService consensusService; - private static TronApplicationContext context; - private static String dbPath = "output_proposal_controller_test"; + @Resource + private ConsensusService consensusService; private static ProposalController proposalController; + private static boolean init; static { + dbPath = "output_proposal_controller_test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); } - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - consensusService = context.getBean(ConsensusService.class); + @Before + public void init() { + if (init) { + return; + } consensusService.start(); - proposalController = ProposalController - .createInstance(dbManager); - } - - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); + proposalController = ProposalController.createInstance(dbManager); + init = true; } @Test @@ -199,7 +188,7 @@ public void testHasMostApprovals() { proposalCapsule.addApproval(ByteString.copyFrom(new byte[]{(byte) i})); } - Assert.assertEquals(true, proposalCapsule.hasMostApprovals(activeWitnesses)); + Assert.assertTrue(proposalCapsule.hasMostApprovals(activeWitnesses)); proposalCapsule.clearApproval(); for (int i = 1; i < 18; i++) { @@ -214,10 +203,7 @@ public void testHasMostApprovals() { for (int i = 0; i < 3; i++) { proposalCapsule.addApproval(ByteString.copyFrom(new byte[]{(byte) i})); } - Assert.assertEquals(true, proposalCapsule.hasMostApprovals(activeWitnesses)); - - + Assert.assertTrue(proposalCapsule.hasMostApprovals(activeWitnesses)); } - } diff --git a/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java b/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java index 665b5049bfc..dcca6e4bc65 100644 --- a/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java +++ b/framework/src/test/java/org/tron/core/witness/WitnessControllerTest.java @@ -3,51 +3,25 @@ import static org.junit.Assert.assertEquals; import com.google.protobuf.ByteString; -import java.io.File; import java.util.ArrayList; import java.util.List; -import org.junit.AfterClass; -import org.junit.BeforeClass; +import javax.annotation.Resource; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.consensus.dpos.DposSlot; -import org.tron.core.ChainBaseManager; import org.tron.core.Constant; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; -public class WitnessControllerTest { +public class WitnessControllerTest extends BaseTest { - private static Manager dbManager = new Manager(); - private static DposSlot dposSlot; - private static ChainBaseManager chainBaseManager; + @Resource + private DposSlot dposSlot; - private static TronApplicationContext context; - private static String dbPath = "output_witness_controller_test"; static { + dbPath = "output_witness_controller_test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - ByteString blank = ByteString.copyFrom(new byte[1]); - - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - - dposSlot = context.getBean(DposSlot.class); - } - - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); } @Test diff --git a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java index 2556b1b3005..55223bccb0c 100644 --- a/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/LibrustzcashTest.java @@ -1,5 +1,9 @@ package org.tron.core.zksnark; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import static org.tron.common.zksnark.JLibrustzcash.librustzcashCheckDiversifier; import static org.tron.common.zksnark.JLibrustzcash.librustzcashComputeCm; import static org.tron.common.zksnark.JLibrustzcash.librustzcashIvkToPkd; @@ -11,23 +15,20 @@ import static org.tron.common.zksnark.JLibsodium.CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES; import com.google.protobuf.ByteString; -import java.io.File; +import java.util.Arrays; import java.util.Optional; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; import java.util.stream.LongStream; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; -import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FileUtil; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; import org.tron.common.zksnark.IncrementalMerkleVoucherContainer; import org.tron.common.zksnark.JLibrustzcash; @@ -46,7 +47,6 @@ import org.tron.core.capsule.IncrementalMerkleTreeCapsule; import org.tron.core.capsule.PedersenHashCapsule; import org.tron.core.capsule.SpendDescriptionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ZksnarkException; @@ -65,15 +65,15 @@ import org.tron.protos.contract.ShieldContract.PedersenHash; @Slf4j -public class LibrustzcashTest { +public class LibrustzcashTest extends BaseTest { + private static final String dbDirectory = "db_Librustzcash_test"; + private static final String indexDirectory = "index_Librustzcash_test"; + @Resource + private Wallet wallet; - private static String dbPath = "output_Librustzcash_test"; - private static String dbDirectory = "db_Librustzcash_test"; - private static String indexDirectory = "index_Librustzcash_test"; - private static AnnotationConfigApplicationContext context; - private static Wallet wallet; - - static { + @BeforeClass + public static void init() { + dbPath = "output_Librustzcash_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -84,23 +84,9 @@ public class LibrustzcashTest { }, "config-test-mainnet.conf" ); - - context = new TronApplicationContext(DefaultConfig.class); - } - - @BeforeClass - public static void init() { - wallet = context.getBean(Wallet.class); Args.setFullNodeAllowShieldedTransaction(true); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - private static int randomInt(int minInt, int maxInt) { return (int) Math.round(Math.random() * (maxInt - minInt) + minInt); } @@ -117,21 +103,19 @@ public static void test(byte[] K, byte[] ovk, byte[] cv, byte[] cm, byte[] epk) byte[] personalization = new byte[16]; byte[] aa = "Zcash_Derive_ock".getBytes(); System.arraycopy(aa, 0, personalization, 0, aa.length); - Assert.assertTrue( - JLibsodium.cryptoGenerichashBlack2bSaltPersonal( - new Black2bSaltPersonalParams(K, 32, block, 128, null, 0, // No key. - null, // No salt. - personalization)) == 0); + assertEquals(0, JLibsodium.cryptoGenerichashBlack2bSaltPersonal( + new Black2bSaltPersonalParams(K, 32, block, 128, null, 0, // No key. + null, // No salt. + personalization))); byte[] cipher_nonce = new byte[CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES]; - Assert.assertTrue(JLibsodium + assertNotEquals(0, JLibsodium .cryptoAeadChacha20poly1305IetfDecrypt(new Chacha20poly1305IetfDecryptParams( new byte[1024], null, null, new byte[1024], 1024, - null, 0, cipher_nonce, K)) != 0); + null, 0, cipher_nonce, K))); } public static void librustzcashInitZksnarkParams() { - FullNodeHttpApiService.librustzcashInitZksnarkParams(); } @@ -148,8 +132,6 @@ public void testLibsodium() throws ZksnarkException { @Test public void testZcashParam() throws ZksnarkException { byte[] d = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - //byte[] d ={}; - //byte[] pkD = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; byte[] ivk = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; @@ -161,7 +143,7 @@ public void testZcashParam() throws ZksnarkException { (byte) 0xb4, 0x7d, 0x0e}; byte[] cm = new byte[32]; boolean check_d = librustzcashCheckDiversifier(d); - Assert.assertTrue(check_d); + assertTrue(check_d); //Most significant five bits of ivk must be 0. ivk[31] = (byte) 0x07; @@ -173,10 +155,10 @@ public void testZcashParam() throws ZksnarkException { System.out.printf("\n"); } } - Assert.assertTrue(check_pkd); + assertTrue(check_pkd); boolean res = librustzcashComputeCm(new ComputeCmParams(d, pkD, value, r, cm)); - Assert.assertFalse(res); + assertFalse(res); //check range of alpha byte[] ask = {(byte) 0xb7, 0x2c, (byte) 0xf7, (byte) 0xd6, 0x5e, 0x0e, (byte) 0x97, (byte) 0xd0, @@ -196,14 +178,14 @@ public void testZcashParam() throws ZksnarkException { boolean boolSigRes = librustzcashSaplingSpendSig( new SpendSigParams(ask, alpha, sighash, sigRes)); - Assert.assertFalse(boolSigRes); + assertFalse(boolSigRes); byte[] nsk = {(byte) 0xb6, 0x2c, (byte) 0xf7, (byte) 0xd6, 0x5e, 0x0e, (byte) 0x97, (byte) 0xd0, (byte) 0x82, 0x10, (byte) 0xc8, (byte) 0xcc, (byte) 0x93, 0x20, 0x68, (byte) 0xa6, 0x00, 0x3b, 0x34, 0x01, 0x01, 0x3b, 0x67, 0x06, (byte) 0xa9, (byte) 0xaf, 0x33, 0x65, (byte) 0xea, (byte) 0xb4, 0x7d, 0x0e}; - byte[] nk = new byte[32]; + byte[] nk; nk = librustzcashNskToNk(nsk); for (int j = 0; j < 32; j++) { @@ -217,7 +199,7 @@ public void testZcashParam() throws ZksnarkException { byte[] resbindSig = new byte[64]; boolean boolBindSig = librustzcashSaplingBindingSig( new BindingSigParams(ctx, value, sighash, resbindSig)); - Assert.assertFalse(boolBindSig); + assertFalse(boolBindSig); JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); } @@ -284,15 +266,14 @@ public long benchmarkCreateSpend() throws ZksnarkException { zkproof)); JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertTrue(ret); - long time = (System.currentTimeMillis() - start); - System.out.println("--- time is: " + time + ", result is " + ret); + assertTrue(ret); return time; } - // @Test + @Ignore + @Test public void calBenchmarkSpendConcurrent() throws Exception { librustzcashInitZksnarkParams(); System.out.println("--- load ok ---"); @@ -307,24 +288,17 @@ public void calBenchmarkSpendConcurrent() throws Exception { ExecutorService generatePool = Executors.newFixedThreadPool( availableProcessors, - new ThreadFactory() { - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "generate-transaction"); - } - }); + r -> new Thread(r, "generate-transaction")); long startGenerate = System.currentTimeMillis(); - LongStream.range(0L, count).forEach(l -> { - generatePool.execute(() -> { - try { - benchmarkCreateSpend(); - } catch (Exception ex) { - ex.printStackTrace(); - logger.error("", ex); - } - }); - }); + LongStream.range(0L, count).forEach(l -> generatePool.execute(() -> { + try { + benchmarkCreateSpend(); + } catch (Exception ex) { + ex.printStackTrace(); + logger.error("", ex); + } + })); countDownLatch.await(); @@ -466,7 +440,7 @@ public long benchmarkCreateSaplingOutput() throws BadItemException, ZksnarkExcep JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertTrue(result); + assertTrue(result); long endTime = System.currentTimeMillis(); long time = endTime - startTime; @@ -526,7 +500,7 @@ public void checkVerifyOutErr() throws ZksnarkException { JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertFalse(result); + assertFalse(result); } @Test @@ -550,19 +524,20 @@ public void testGenerateNote() throws Exception { try { Optional op = incomingViewingKey.address(diversifierT); // PaymentAddress op = spendingKey.defaultAddress(); - - Note note = new Note(op.get(), 100); - note.setRcm(ByteArray - .fromHexString( - "bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02")); - - byte[] cm = note.cm(); - if (cm != null) { - success++; - } else { - fail++; + if (op.isPresent()) { + Note note = new Note(op.get(), 100); + note.setRcm(ByteArray + .fromHexString( + "bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02")); + + byte[] cm = note.cm(); + if (cm != null) { + success++; + } else { + fail++; + } + System.out.println("note is " + Arrays.toString(cm)); } - System.out.println("note is " + note.cm()); } catch (ZksnarkException e) { System.out.println("failed: " + e.getMessage()); fail++; @@ -573,7 +548,7 @@ public void testGenerateNote() throws Exception { System.out.println("success is: " + success); System.out.println("fail is: " + fail); - Assert.assertEquals(0, fail); + assertEquals(0, fail); } @Test @@ -615,7 +590,7 @@ public void testGenerateNoteWithDefault() throws Exception { System.out.println("success is: " + success); System.out.println("fail is: " + fail); - Assert.assertEquals(0, fail); + assertEquals(0, fail); } @Test @@ -635,13 +610,14 @@ public void testGenerateNoteWithConstant() throws Exception { try { Optional op = incomingViewingKey.address(diversifierT); // PaymentAddress op = spendingKey.defaultAddress(); + if (op.isPresent()) { + Note note = new Note(op.get(), randomInt(100, 100000)); + note.setRcm(ByteArray + .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02")); - Note note = new Note(op.get(), randomInt(100, 100000)); - note.setRcm(ByteArray - .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02")); - - byte[] cm = note.cm(); - System.out.println("note is " + note.cm()); + byte[] cm = note.cm(); + System.out.println("note is " + Arrays.toString(cm)); + } } catch (ZksnarkException e) { System.out.println("failed: " + e.getMessage()); } @@ -659,7 +635,7 @@ public void testPedersenHash() throws Exception { byte[] res = new byte[32]; JLibrustzcash.librustzcashMerkleHash(new MerkleHashParams(25, a, b, res)); - Assert.assertEquals("61a50a5540b4944da27cbd9b3d6ec39234ba229d2c461f4d719bc136573bf45b", + assertEquals("61a50a5540b4944da27cbd9b3d6ec39234ba229d2c461f4d719bc136573bf45b", ByteArray.toHexString(res)); } } diff --git a/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java b/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java index 60c5dd43eac..678eb137df0 100644 --- a/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/MerkleContainerTest.java @@ -2,19 +2,14 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; -import java.io.File; -import java.util.Arrays; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.zksnark.IncrementalMerkleVoucherContainer; -import org.tron.common.zksnark.MerkleContainer; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.capsule.BlockCapsule; @@ -23,9 +18,7 @@ import org.tron.core.capsule.IncrementalMerkleVoucherCapsule; import org.tron.core.capsule.PedersenHashCapsule; import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ZksnarkException; import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; @@ -37,38 +30,29 @@ import org.tron.protos.contract.ShieldContract.ReceiveDescription; import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; -public class MerkleContainerTest { +public class MerkleContainerTest extends BaseTest { - private static Manager dbManager = new Manager(); - private static TronApplicationContext context; - private static String dbPath = "MerkleContainerTest"; - private static MerkleContainer merkleContainer; + @Resource + private Wallet wallet; + // private static MerkleContainer merkleContainer; static { + dbPath = "MerkleContainerTest"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); } - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); + /*@Before + public void init() { merkleContainer = MerkleContainer .createInstance(dbManager.getMerkleTreeStore(), dbManager.getChainBaseManager() .getMerkleTreeIndexStore()); - } - - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } + }*/ - @Test + /*@Test public void test() { //add - /*IncrementalMerkleTreeContainer tree = new IncrementalMerkleTreeContainer( + IncrementalMerkleTreeContainer tree = new IncrementalMerkleTreeContainer( new IncrementalMerkleTreeCapsule()); String s1 = "2ec45f5ae2d1bc7a80df02abfb2814a1239f956c6fb3ac0e112c008ba2c1ab91"; PedersenHashCapsule compressCapsule1 = new PedersenHashCapsule(); @@ -164,9 +148,9 @@ public void test() { .putMerkleVoucherIntoStore(witness.getMerkleVoucherKey(), witness.getVoucherCapsule()); IncrementalMerkleTreeContainer bestMerkleRoot = merkleContainer.getBestMerkle(); - Assert.assertEquals(1, bestMerkleRoot.size());*/ + Assert.assertEquals(1, bestMerkleRoot.size()); - } + }*/ private Transaction createTransaction(String strCm1, String strCm2) { ByteString cm1 = ByteString.copyFrom(ByteArray.fromHexString(strCm1)); @@ -182,9 +166,8 @@ private Transaction createTransaction(String strCm1, String strCm2) { Transaction.Contract.newBuilder().setType(ContractType.ShieldedTransferContract) .setParameter( Any.pack(contract)).build()); - Transaction transaction = Transaction.newBuilder().setRawData(transactionBuilder.build()) + return Transaction.newBuilder().setRawData(transactionBuilder.build()) .build(); - return transaction; } private void initMerkleTreeWitnessInfo() throws ZksnarkException { @@ -361,7 +344,6 @@ public void getMerkleTreeWitnessInfoTest() throws Exception { OutputPointInfo outputPointInfo = OutputPointInfo.newBuilder().addOutPoints(outputPoint1) .addOutPoints(outputPoint2).setBlockNum(number).build(); // Args.getInstance().setAllowShieldedTransaction(1); - Wallet wallet = context.getBean(Wallet.class); IncrementalMerkleVoucherInfo merkleTreeWitnessInfo = wallet .getMerkleTreeVoucherInfo(outputPointInfo); @@ -426,7 +408,7 @@ public void append() throws ZksnarkException { byte[] roota = witnessa.root().getContent().toByteArray(); byte[] rootb = witnessb.root().getContent().toByteArray(); - Assert.assertTrue(Arrays.equals(roota, rootb)); + Assert.assertArrayEquals(roota, rootb); } } diff --git a/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java b/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java index 155d5aee11a..512b2f99228 100644 --- a/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/MerkleTreeTest.java @@ -6,40 +6,31 @@ import com.google.protobuf.ByteString; import java.io.File; import java.util.List; -import org.junit.AfterClass; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Before; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.testng.collections.Lists; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FileUtil; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; import org.tron.common.zksnark.IncrementalMerkleTreeContainer.EmptyMerkleRoots; import org.tron.common.zksnark.IncrementalMerkleVoucherContainer; import org.tron.common.zksnark.MerklePath; -import org.tron.core.Wallet; import org.tron.core.capsule.IncrementalMerkleTreeCapsule; import org.tron.core.capsule.IncrementalMerkleVoucherCapsule; import org.tron.core.capsule.PedersenHashCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.protos.contract.ShieldContract.PedersenHash; -public class MerkleTreeTest { +public class MerkleTreeTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; - private static String dbPath = "output_ShieldedTransaction_test"; - private static String dbDirectory = "db_ShieldedTransaction_test"; - private static String indexDirectory = "index_ShieldedTransaction_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; - private static Wallet wallet; + private static final String dbDirectory = "db_ShieldedTransaction_test"; + private static final String indexDirectory = "index_ShieldedTransaction_test"; static { + dbPath = "output_ShieldedTransaction_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -50,40 +41,27 @@ public class MerkleTreeTest { }, "config-test-mainnet.conf" ); - context = new TronApplicationContext(DefaultConfig.class); } /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - wallet = context.getBean(Wallet.class); + @Before + public void init() { //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(100_000L); - dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(0); } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - private JSONArray readFile(String fileName) throws Exception { String file1 = SendCoinShieldTest.class.getClassLoader() .getResource("json" + File.separator + fileName).getFile(); List readLines = Files.readLines(new File(file1), Charsets.UTF_8); - JSONArray array = JSONArray + return JSONArray .parseArray(readLines.stream().reduce((s, s2) -> s + s2).get()); - - return array; } private String PedersenHash2String(PedersenHash hash) { diff --git a/framework/src/test/java/org/tron/core/zksnark/NoteEncDecryTest.java b/framework/src/test/java/org/tron/core/zksnark/NoteEncDecryTest.java index f77a85b5bc1..1fc31c293e8 100644 --- a/framework/src/test/java/org/tron/core/zksnark/NoteEncDecryTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/NoteEncDecryTest.java @@ -1,22 +1,17 @@ package org.tron.core.zksnark; import com.google.protobuf.ByteString; -import java.io.File; import java.util.Optional; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.core.Wallet; import org.tron.core.capsule.AssetIssueCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.ZksnarkException; import org.tron.core.zen.note.Note; import org.tron.core.zen.note.NoteEncryption.Encryption; @@ -25,7 +20,7 @@ import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; @Slf4j -public class NoteEncDecryTest { +public class NoteEncDecryTest extends BaseTest { private static final String dbPath = "note_encdec_test"; private static final String FROM_ADDRESS; @@ -41,13 +36,11 @@ public class NoteEncDecryTest { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; - private static Manager dbManager; - private static TronApplicationContext context; - private static Wallet wallet; + @Resource + private Wallet wallet; static { Args.setParam(new String[]{"--output-directory", dbPath}, "config-localtest.conf"); - context = new TronApplicationContext(DefaultConfig.class); FROM_ADDRESS = Wallet.getAddressPreFixString() + "a7d8a35b260395c14aa456297662092ba3b76fc0"; ADDRESS_ONE_PRIVATE_KEY = "7f7f701e94d4f1dd60ee5205e7ea8ee31121427210417b608a6b2e96433549a7"; } @@ -55,30 +48,13 @@ public class NoteEncDecryTest { /** * Init data. */ - @BeforeClass - public static void init() { - wallet = context.getBean(Wallet.class); - dbManager = context.getBean(Manager.class); + @Before + public void init() { //give a big value for pool, avoid for dbManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(10_000_000_000L); // Args.getInstance().setAllowShieldedTransaction(1); } - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } - } - /** * create temp Capsule test need. */ 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 1eb5becffb6..cbc657e02c9 100644 --- a/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java @@ -11,19 +11,16 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; -import org.junit.AfterClass; +import javax.annotation.Resource; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.testng.collections.Lists; import org.tron.api.GrpcAPI; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.ByteUtil; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; import org.tron.common.zksnark.IncrementalMerkleTreeContainer.EmptyMerkleRoots; @@ -50,9 +47,7 @@ import org.tron.core.capsule.SpendDescriptionCapsule; import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.TransactionResultCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ContractExeException; @@ -90,7 +85,7 @@ import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; import org.tron.protos.contract.ShieldContract.SpendDescription; -public class SendCoinShieldTest { +public class SendCoinShieldTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; private static final byte[] DEFAULT_OVK; @@ -105,16 +100,15 @@ public class SendCoinShieldTest { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; - private static String dbPath = "output_ShieldedTransaction_test"; - private static String dbDirectory = "db_ShieldedTransaction_test"; - private static String indexDirectory = "index_ShieldedTransaction_test"; - private static AnnotationConfigApplicationContext context; - private static Manager dbManager; - private static Wallet wallet; + @Resource + private Wallet wallet; + + private static boolean init; static { + dbPath = "output_ShieldedTransaction_test"; Args.setParam(new String[]{"--output-directory", dbPath}, "config-test-mainnet.conf"); - context = new TronApplicationContext(DefaultConfig.class); + Args.getInstance().setZenTokenId(String.valueOf(tokenId)); PUBLIC_ADDRESS_ONE = Wallet.getAddressPreFixString() + "a7d8a35b260395c14aa456297662092ba3b76fc0"; DEFAULT_OVK = ByteArray @@ -124,29 +118,16 @@ public class SendCoinShieldTest { /** * Init data. */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - wallet = context.getBean(Wallet.class); + @Before + public void init() { + if (init) { + return; + } //init energy dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(1526647838000L); dbManager.getDynamicPropertiesStore().saveTotalEnergyWeight(100_000L); dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderTimestamp(0); - } - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - - /** - * create temp Capsule test need. - */ - @Before - public void createCapsule() { - Args.getInstance().setZenTokenId(String.valueOf(tokenId)); dbManager.getDynamicPropertiesStore().saveAllowSameTokenName(1); dbManager.getDynamicPropertiesStore().saveTokenIdNum(tokenId); @@ -159,6 +140,8 @@ public void createCapsule() { .setUrl(ByteString.copyFrom(ByteArray.fromString(URL))).build(); AssetIssueCapsule assetIssueCapsule = new AssetIssueCapsule(assetIssueContract); dbManager.getAssetIssueV2Store().put(assetIssueCapsule.createDbV2Key(), assetIssueCapsule); + + init = true; } private void addZeroValueOutputNote(ZenTransactionBuilder builder) throws ZksnarkException { 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 d3cbdb71e95..d549d306cb1 100755 --- a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java @@ -4,29 +4,26 @@ import com.google.protobuf.Any; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; -import java.io.File; import java.security.SignatureException; import java.util.List; import java.util.Optional; +import javax.annotation.Resource; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; -import org.junit.BeforeClass; import org.junit.Test; import org.tron.api.GrpcAPI.BytesMessage; import org.tron.api.GrpcAPI.DecryptNotes; import org.tron.api.GrpcAPI.ReceiveNote; import org.tron.api.GrpcAPI.SpendAuthSigParameters; import org.tron.api.GrpcAPI.TransactionExtention; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.common.crypto.ECKey; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; import org.tron.common.zksnark.IncrementalMerkleVoucherContainer; @@ -37,7 +34,6 @@ import org.tron.common.zksnark.LibrustzcashParam.IvkToPkdParams; import org.tron.common.zksnark.LibrustzcashParam.OutputProofParams; import org.tron.common.zksnark.LibrustzcashParam.SpendSigParams; -import org.tron.core.ChainBaseManager; import org.tron.core.Wallet; import org.tron.core.actuator.Actuator; import org.tron.core.actuator.ActuatorCreator; @@ -52,11 +48,8 @@ import org.tron.core.capsule.TransactionCapsule; import org.tron.core.capsule.TransactionResultCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.consensus.ConsensusService; -import org.tron.core.db.BlockGenerate; -import org.tron.core.db.Manager; import org.tron.core.exception.AccountResourceInsufficientException; import org.tron.core.exception.BadItemException; import org.tron.core.exception.ContractExeException; @@ -104,9 +97,8 @@ import org.tron.protos.contract.ShieldContract.SpendDescription; @Slf4j -public class ShieldedReceiveTest extends BlockGenerate { +public class ShieldedReceiveTest extends BaseTest { - private static final String dbPath = "receive_description_test"; private static final String FROM_ADDRESS; private static final String ADDRESS_ONE_PRIVATE_KEY; private static final long OWNER_BALANCE = 100_000_000; @@ -120,16 +112,18 @@ public class ShieldedReceiveTest extends BlockGenerate { private static final int VOTE_SCORE = 2; private static final String DESCRIPTION = "TRX"; private static final String URL = "https://tron.network"; - private static Manager dbManager; - private static ChainBaseManager chainBaseManager; - private static ConsensusService consensusService; - private static TronApplicationContext context; - private static Wallet wallet; - private static TransactionUtil transactionUtil; + @Resource + private ConsensusService consensusService; + @Resource + private Wallet wallet; + @Resource + private TransactionUtil transactionUtil; + + private static boolean init; static { + dbPath = "receive_description_test"; Args.setParam(new String[]{"--output-directory", dbPath}, "config-localtest.conf"); - context = new TronApplicationContext(DefaultConfig.class); FROM_ADDRESS = Wallet.getAddressPreFixString() + "a7d8a35b260395c14aa456297662092ba3b76fc0"; ADDRESS_ONE_PRIVATE_KEY = "7f7f701e94d4f1dd60ee5205e7ea8ee31121427210417b608a6b2e96433549a7"; } @@ -137,35 +131,14 @@ public class ShieldedReceiveTest extends BlockGenerate { /** * Init data. */ - @BeforeClass - public static void init() { - FileUtil.deleteDir(new File(dbPath)); - - wallet = context.getBean(Wallet.class); - transactionUtil = context.getBean(TransactionUtil.class); - dbManager = context.getBean(Manager.class); - chainBaseManager = context.getBean(ChainBaseManager.class); - setManager(dbManager); - consensusService = context.getBean(ConsensusService.class); + @Before + public void init() { + if (init) { + return; + } consensusService.start(); - //give a big value for pool, avoid for chainBaseManager.getDynamicPropertiesStore().saveTotalShieldedPoolValue(10_000_000_000L); - // Args.getInstance().setAllowShieldedTransaction(1); - } - - /** - * Release resources. - */ - @AfterClass - public static void destroy() { - Args.clearParam(); - context.destroy(); - - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } + init = true; } private static void librustzcashInitZksnarkParams() { diff --git a/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java b/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java index f87b0f81730..9f61d91a938 100755 --- a/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java +++ b/framework/src/test/java/org/tron/program/AccountVoteWitnessTest.java @@ -4,59 +4,26 @@ import com.google.protobuf.ByteString; import java.io.File; import java.util.List; +import javax.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.AfterClass; -import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.TronApplicationContext; +import org.tron.common.BaseTest; import org.tron.consensus.dpos.MaintenanceManager; import org.tron.core.Constant; import org.tron.core.capsule.AccountCapsule; import org.tron.core.capsule.WitnessCapsule; -import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; -import org.tron.core.db.Manager; import org.tron.protos.Protocol.AccountType; @Slf4j -public class AccountVoteWitnessTest { +public class AccountVoteWitnessTest extends BaseTest { - private static TronApplicationContext context; - - private static Manager dbManager; - private static MaintenanceManager maintenanceManager; - private static String dbPath = "output_witness_test"; + @Resource + private MaintenanceManager maintenanceManager; static { + dbPath = "output_witness_test"; Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - context = new TronApplicationContext(DefaultConfig.class); - } - - /** - * init db. - */ - @BeforeClass - public static void init() { - dbManager = context.getBean(Manager.class); - maintenanceManager = context.getBean(MaintenanceManager.class); - // Args.setParam(new String[]{}, Constant.TEST_CONF); - // dbManager = new Manager(); - // dbManager.init(); - } - - /** - * remo db when after test. - */ - @AfterClass - public static void removeDb() { - Args.clearParam(); - context.destroy(); - File dbFolder = new File(dbPath); - if (deleteFolder(dbFolder)) { - logger.info("Release resources successful."); - } else { - logger.info("Release resources failure."); - } } private static Boolean deleteFolder(File index) { diff --git a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java index 4549b2cde4d..ed268ec882a 100644 --- a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java +++ b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java @@ -1,19 +1,15 @@ package org.tron.program; -import com.google.protobuf.ByteString; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import java.io.File; -import java.math.BigInteger; import java.nio.file.Paths; +import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.tron.api.GrpcAPI; import org.tron.api.WalletGrpc; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; @@ -23,30 +19,23 @@ import org.tron.common.utils.FileUtil; import org.tron.common.utils.PublicMethod; import org.tron.common.utils.Utils; -import org.tron.core.Wallet; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; -import org.tron.protos.Protocol; -import org.tron.protos.contract.BalanceContract; import org.tron.tool.litefullnode.LiteFullNodeTool; -import stest.tron.wallet.common.client.utils.TransactionUtils; +@Slf4j public class LiteFullNodeToolTest { - private static final Logger logger = LoggerFactory.getLogger("Test"); - private TronApplicationContext context; private WalletGrpc.WalletBlockingStub blockingStubFull = null; private Application appTest; - private String databaseDir; @Rule public ExpectedException thrown = ExpectedException.none(); - private static final String DB_PATH = "output_lite_fn"; /** @@ -61,16 +50,16 @@ public void startApp() { appTest.startServices(); appTest.startup(); - String fullnode = String.format("%s:%d", "127.0.0.1", + String fullNode = String.format("%s:%d", "127.0.0.1", Args.getInstance().getRpcPort()); - ManagedChannel channelFull = ManagedChannelBuilder.forTarget(fullnode) - .usePlaintext(true) + ManagedChannel channelFull = ManagedChannelBuilder.forTarget(fullNode) + .usePlaintext() .build(); blockingStubFull = WalletGrpc.newBlockingStub(channelFull); } /** - * Delete the database when exit. + * Delete the database when exited. */ public static void destroy(String dbPath) { File f = new File(dbPath); @@ -84,7 +73,7 @@ public static void destroy(String dbPath) { } /** - * shutdown the fullnode. + * shutdown the fullNode. */ public void shutdown() { appTest.shutdownServices(); @@ -142,7 +131,7 @@ private void testTools(String dbType, int checkpointVersion) { Args.getInstance().getStorage().setDbEngine(dbType); Args.getInstance().getStorage().setCheckpointVersion(checkpointVersion); LiteFullNodeTool.setRecentBlks(3); - // start fullnode + // start fullNode startApp(); // produce transactions for 18 seconds generateSomeTransactions(18); @@ -152,7 +141,7 @@ private void testTools(String dbType, int checkpointVersion) { FileUtil.deleteDir(Paths.get(DB_PATH, databaseDir, "trans-cache").toFile()); // generate snapshot LiteFullNodeTool.main(argsForSnapshot); - // start fullnode + // start fullNode startApp(); // produce transactions for 6 seconds generateSomeTransactions(6); @@ -165,14 +154,14 @@ private void testTools(String dbType, int checkpointVersion) { if (!database.renameTo(new File(Paths.get(DB_PATH, databaseDir + "_bak").toString()))) { throw new RuntimeException( String.format("rename %s to %s failed", database.getPath(), - Paths.get(DB_PATH, databaseDir).toString())); + Paths.get(DB_PATH, databaseDir))); } // change snapshot to the new database File snapshot = new File(Paths.get(DB_PATH, "snapshot").toString()); if (!snapshot.renameTo(new File(Paths.get(DB_PATH, databaseDir).toString()))) { throw new RuntimeException( String.format("rename snapshot to %s failed", - Paths.get(DB_PATH, databaseDir).toString())); + Paths.get(DB_PATH, databaseDir))); } // start and validate the snapshot startApp(); diff --git a/framework/src/test/java/org/tron/program/SolidityNodeTest.java b/framework/src/test/java/org/tron/program/SolidityNodeTest.java index 0bd2dccfe85..b9989f9c002 100755 --- a/framework/src/test/java/org/tron/program/SolidityNodeTest.java +++ b/framework/src/test/java/org/tron/program/SolidityNodeTest.java @@ -6,8 +6,6 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.tron.common.application.Application; -import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.client.DatabaseGrpcClient; import org.tron.core.Constant; @@ -23,14 +21,12 @@ public class SolidityNodeTest { private static TronApplicationContext context; private static RpcApiService rpcApiService; - private static Application appT; private static String dbPath = "output_witness_test"; static { Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); context = new TronApplicationContext(DefaultConfig.class); Args.getInstance().setSolidityNode(true); - appT = ApplicationFactory.create(context); rpcApiService = context.getBean(RpcApiService.class); } From 06bd0107953d7c77304d43c0b2366de6c8ad13ad Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Thu, 2 Feb 2023 15:05:50 +0800 Subject: [PATCH 004/142] fix(unitTest): shutdown thread pools and timers --- framework/src/main/java/org/tron/core/db/Manager.java | 1 + .../tron/core/net/messagehandler/TransactionsMsgHandler.java | 1 + .../tron/core/net/service/nodepersist/NodePersistService.java | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index b43387ec4f6..feac88a9a1f 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1907,6 +1907,7 @@ public NullifierStore getNullifierStore() { public void closeAllStore() { logger.info("******** Begin to close db. ********"); chainBaseManager.closeAllStore(); + validateSignService.shutdown(); logger.info("******** End to close db. ********"); } diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java index df46c448e4d..5f8b3fcef16 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/TransactionsMsgHandler.java @@ -53,6 +53,7 @@ public void init() { } public void close() { + trxHandlePool.shutdown(); smartContractExecutor.shutdown(); } diff --git a/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java b/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java index 02ff1e7a1aa..e2e5bc4dc08 100644 --- a/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java +++ b/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java @@ -27,9 +27,10 @@ public class NodePersistService { private ChainBaseManager chainBaseManager = ChainBaseManager.getInstance(); - private Timer nodePersistTaskTimer = new Timer("NodePersistTaskTimer"); + private Timer nodePersistTaskTimer; public void init() { + nodePersistTaskTimer = new Timer("NodePersistTaskTimer"); if (isNodePersist) { nodePersistTaskTimer.scheduleAtFixedRate(new TimerTask() { @Override From 3664fff3837c1cb651e1793f7f33f876ef767468 Mon Sep 17 00:00:00 2001 From: zhang0125 Date: Thu, 2 Feb 2023 15:07:13 +0800 Subject: [PATCH 005/142] fix(unitTest): ignore LiteFullNodeToolTest --- .../tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java | 4 ++-- .../src/test/java/org/tron/program/LiteFullNodeToolTest.java | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java index 1f1efe6cc6b..d1f19fc4d2a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java @@ -61,8 +61,8 @@ public class BandWidthRuntimeWithCheckTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; - private static final String dbDirectory = "db_BandWidthRuntimeTest_test"; - private static final String indexDirectory = "index_BandWidthRuntimeTest_test"; + private static final String dbDirectory = "db_BandWidthRuntimeWithCheckTest_test"; + private static final String indexDirectory = "index_BandWidthRuntimeWithCheckTest_test"; private static final String OwnerAddress = "TCWHANtDDdkZCTo2T2peyEq3Eg9c2XB7ut"; private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; private static final String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; diff --git a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java index ed268ec882a..d0a3d153d7d 100644 --- a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java +++ b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -25,6 +26,7 @@ import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; import org.tron.tool.litefullnode.LiteFullNodeTool; +@Ignore @Slf4j public class LiteFullNodeToolTest { From d513fd203cc72bda22d6eff87e7571ef2a74c68b Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 13 Feb 2023 15:37:18 +0800 Subject: [PATCH 006/142] support libp2p v0.2 --- build.gradle | 2 + common/build.gradle | 2 + .../common/parameter/CommonParameter.java | 8 ++ .../src/main/java/org/tron/core/Constant.java | 13 +++ framework/build.gradle | 2 +- .../tron/common/backup/message/Message.java | 3 +- .../src/main/java/org/tron/core/Wallet.java | 9 +- .../java/org/tron/core/config/args/Args.java | 87 +++++++++++++++++++ .../org/tron/core/net/TronNetService.java | 8 +- .../net/message/handshake/HelloMessage.java | 29 +++++-- .../tron/core/net/peer/PeerConnection.java | 2 +- .../org/tron/core/net/peer/PeerManager.java | 2 +- .../service/handshake/HandshakeService.java | 7 +- .../service/keepalive/KeepAliveService.java | 2 +- .../nodepersist/NodePersistService.java | 3 +- .../tron/core/services/NodeInfoService.java | 2 +- .../org/tron/core/services/RpcApiService.java | 7 +- framework/src/main/resources/logback.xml | 2 +- protocol/src/main/protos/core/Discover.proto | 1 + 19 files changed, 165 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 8ff739a1e4c..39313270417 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,7 @@ subprojects { buildscript { repositories { mavenCentral() + maven { url 'https://jitpack.io' } maven { url "https://plugins.gradle.org/m2/" } @@ -29,6 +30,7 @@ subprojects { repositories { mavenLocal() + maven { url 'https://jitpack.io' } mavenCentral() maven { url 'https://repo.spring.io/plugins-release' } } diff --git a/common/build.gradle b/common/build.gradle index fc17f99cd84..99610cc0f20 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,6 +53,8 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' + //compile group: 'io.github.tronprotocol', name: 'libp2p', version: '0.1.2' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.1.6' compile project(":protocol") } 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 571ab968671..876add633c7 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -20,6 +20,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.dns.update.PublishConfig; public class CommonParameter { @@ -186,6 +187,13 @@ public class CommonParameter { @Getter @Setter public String p2pNodeId; + @Getter + @Setter + public List dnsTreeUrls; + @Getter + @Setter + public PublishConfig dnsPublishConfig; + //If you are running a solidity node for java tron, this flag is set to true @Getter @Setter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 408782752f2..51e5a553bde 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -103,6 +103,19 @@ public class Constant { public static final String NODE_P2P_PING_INTERVAL = "node.p2p.pingInterval"; public static final String NODE_P2P_VERSION = "node.p2p.version"; + + public static final String NODE_DNS_TREE_URLS = "node.dns.treeUrls"; + public static final String NODE_DNS_PUBLISH = "node.dns.publish"; + public static final String NODE_DNS_DOMAIN = "node.dns.dnsDomain"; + public static final String NODE_DNS_PRIVATE = "node.dns.dnsPrivate"; + public static final String NODE_DNS_KNOWN_URLS = "node.dns.knownUrls"; + public static final String NODE_DNS_SERVER_TYPE = "node.dns.serverType"; + public static final String NODE_DNS_ACCESS_KEY_ID = "node.dns.accessKeyId"; + public static final String NODE_DNS_ACCESS_KEY_SECRET = "node.dns.accessKeySecret"; + public static final String NODE_DNS_ALIYUN_ENDPOINT = "node.dns.aliyunDnsEndpoint"; + public static final String NODE_DNS_AWS_REGION = "node.dns.awsRegion"; + public static final String NODE_DNS_AWS_HOST_ZONE_ID = "node.dns.awsHostZoneId"; + public static final String NODE_RPC_PORT = "node.rpc.port"; public static final String NODE_RPC_SOLIDITY_PORT = "node.rpc.solidityPort"; public static final String NODE_RPC_PBFT_PORT = "node.rpc.PBFTPort"; diff --git a/framework/build.gradle b/framework/build.gradle index 93757755446..676088868be 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -48,7 +48,7 @@ dependencies { compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.69' - compile group: 'io.github.tronprotocol', name: 'libp2p', version: '0.1.2' + compile group: 'software.amazon.awssdk', name: 'regions', version: '2.18.41' compile group: 'com.typesafe', name: 'config', version: '1.3.2' diff --git a/framework/src/main/java/org/tron/common/backup/message/Message.java b/framework/src/main/java/org/tron/common/backup/message/Message.java index 8f09a452877..cd1a2669427 100644 --- a/framework/src/main/java/org/tron/common/backup/message/Message.java +++ b/framework/src/main/java/org/tron/common/backup/message/Message.java @@ -20,7 +20,8 @@ public Message(UdpMessageTypeEnum type, byte[] data) { public static Node getNode(Endpoint endpoint) { Node node = new Node(endpoint.getNodeId().toByteArray(), - ByteArray.toStr(endpoint.getAddress().toByteArray()), endpoint.getPort()); + ByteArray.toStr(endpoint.getAddress().toByteArray()), + ByteArray.toStr(endpoint.getAddressIpv6().toByteArray()), endpoint.getPort()); return node; } diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index bcefbb9b2f1..197a8a4a904 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -2635,10 +2635,11 @@ public NodeList listNodes() { NodeList.Builder nodeListBuilder = NodeList.newBuilder(); TronNetService.getP2pService().getConnectableNodes().forEach(node -> { nodeListBuilder.addNodes(Node.newBuilder().setAddress( - Address.newBuilder() - .setHost(ByteString - .copyFrom(ByteArray.fromString(node.getHost()))) - .setPort(node.getPort()))); + Address.newBuilder() + .setHost(ByteString + .copyFrom(ByteArray.fromString( + node.getPreferInetSocketAddress().getAddress().getHostAddress()))) + .setPort(node.getPort()))); }); return nodeListBuilder.build(); } 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 f27ff3c2385..d0ca057c7e0 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 @@ -76,8 +76,12 @@ import org.tron.core.store.AccountStore; import org.tron.keystore.Credentials; import org.tron.keystore.WalletUtils; +import org.tron.p2p.dns.update.DnsType; +import org.tron.p2p.dns.update.PublishConfig; import org.tron.program.Version; +import software.amazon.awssdk.regions.Region; + @Slf4j(topic = "app") @NoArgsConstructor @Component @@ -142,6 +146,8 @@ public static void clearParam() { PARAMETER.nodeDiscoveryPingTimeout = 15000; PARAMETER.nodeP2pPingInterval = 0L; PARAMETER.nodeP2pVersion = 0; + PARAMETER.dnsTreeUrls = new ArrayList<>(); + PARAMETER.dnsPublishConfig = null; PARAMETER.rpcPort = 0; PARAMETER.rpcOnSolidityPort = 0; PARAMETER.rpcOnPBFTPort = 0; @@ -637,6 +643,11 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_P2P_VERSION) ? config.getInt(Constant.NODE_P2P_VERSION) : 0; + PARAMETER.dnsTreeUrls = config.hasPath(Constant.NODE_DNS_TREE_URLS) ? config.getStringList( + Constant.NODE_DNS_TREE_URLS) : new ArrayList<>(); + + PARAMETER.dnsPublishConfig = loadDnsPublishConfig(config); + PARAMETER.rpcPort = config.hasPath(Constant.NODE_RPC_PORT) ? config.getInt(Constant.NODE_RPC_PORT) : 50051; @@ -1274,6 +1285,82 @@ private static EventPluginConfig getEventPluginConfig( return eventPluginConfig; } + public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Config config) { + PublishConfig publishConfig = new PublishConfig(); + if (config.hasPath(Constant.NODE_DNS_PUBLISH)) { + publishConfig.setDnsPublishEnable(config.getBoolean(Constant.NODE_DNS_PUBLISH)); + } + + if (publishConfig.isDnsPublishEnable()) { + if (config.hasPath(Constant.NODE_DNS_DOMAIN)) { + publishConfig.setDnsDomain(config.getString(Constant.NODE_DNS_DOMAIN)); + } else { + logger.error("Check {}, must not be null", Constant.NODE_DNS_DOMAIN); + return null; + } + + if (config.hasPath(Constant.NODE_DNS_PRIVATE)) { + publishConfig.setDnsPrivate(config.getString(Constant.NODE_DNS_PRIVATE)); + } else { + logger.error("Check {}, must not be null", Constant.NODE_DNS_PRIVATE); + return null; + } + + if (config.hasPath(Constant.NODE_DNS_KNOWN_URLS)) { + publishConfig.setKnownTreeUrls(config.getStringList(Constant.NODE_DNS_KNOWN_URLS)); + } + + if (config.hasPath(Constant.NODE_DNS_SERVER_TYPE)) { + String serverType = config.getString(Constant.NODE_DNS_SERVER_TYPE); + if (!serverType.equalsIgnoreCase("aws") && !serverType.equalsIgnoreCase("aliyun")) { + logger.error("Check {}, must be aws or aliyun", Constant.NODE_DNS_SERVER_TYPE); + return null; + } + if (serverType.equalsIgnoreCase("aws")) { + publishConfig.setDnsType(DnsType.AwsRoute53); + } else { + publishConfig.setDnsType(DnsType.AliYun); + } + } else { + logger.error("Check {}, must not be null", Constant.NODE_DNS_SERVER_TYPE); + return null; + } + + if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_ID)) { + publishConfig.setAccessKeyId(config.getString(Constant.NODE_DNS_ACCESS_KEY_ID)); + } else { + logger.error("Check {}, must not be null", Constant.NODE_DNS_ACCESS_KEY_ID); + return null; + } + if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_SECRET)) { + publishConfig.setAccessKeySecret(config.getString(Constant.NODE_DNS_ACCESS_KEY_SECRET)); + } else { + logger.error("Check {}, must not be null", Constant.NODE_DNS_ACCESS_KEY_SECRET); + return null; + } + + if (publishConfig.getDnsType() == DnsType.AwsRoute53) { + if (!config.hasPath(Constant.NODE_DNS_AWS_REGION)) { + logger.error("Check {}, must not be null", Constant.NODE_DNS_AWS_REGION); + return null; + } else { + publishConfig.setAwsRegion(Region.of(config.getString(Constant.NODE_DNS_AWS_REGION))); + } + if (config.hasPath(Constant.NODE_DNS_AWS_HOST_ZONE_ID)) { + publishConfig.setAwsHostZoneId(config.getString(Constant.NODE_DNS_AWS_HOST_ZONE_ID)); + } + } else { + if (!config.hasPath(Constant.NODE_DNS_ALIYUN_ENDPOINT)) { + logger.error("Check {}, must not be null", Constant.NODE_DNS_ALIYUN_ENDPOINT); + return null; + } else { + publishConfig.setAliDnsEndpoint(config.getString(Constant.NODE_DNS_ALIYUN_ENDPOINT)); + } + } + } + return publishConfig; + } + private static TriggerConfig createTriggerConfig(ConfigObject triggerObject) { if (Objects.isNull(triggerObject)) { return null; diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index fc4a3e8eee2..7b33736f5fa 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -4,6 +4,7 @@ import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -139,6 +140,7 @@ private P2pConfig getConfig() { config.setActiveNodes(parameter.getActiveNodes()); config.setTrustNodes(parameter.getPassiveNodes()); config.getActiveNodes().forEach(n -> config.getTrustNodes().add(n.getAddress())); + parameter.getFastForwardNodes().forEach(f -> config.getTrustNodes().add(f.getAddress())); int maxConnections = parameter.getMaxConnections(); int minConnections = parameter.getMinConnections(); int minActiveConnections = parameter.getMinActiveConnections(); @@ -154,12 +156,16 @@ private P2pConfig getConfig() { config.setMaxConnectionsWithSameIp(parameter.getMaxConnectionsWithSameIp()); config.setPort(parameter.getNodeListenPort()); - config.setVersion(parameter.getNodeP2pVersion()); + config.setNetworkId(parameter.getNodeP2pVersion()); config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); if (StringUtil.isNullOrEmpty(config.getIp())) { config.setIp(parameter.getNodeExternalIp()); } + config.setTreeUrls(parameter.getDnsTreeUrls()); + if (Objects.nonNull(parameter.getDnsPublishConfig())) { + config.setPublishConfig(parameter.getDnsPublishConfig()); + } return config; } } \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java b/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java index d4ed7282386..dfef5d6b9f6 100755 --- a/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java +++ b/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java @@ -2,6 +2,7 @@ import com.google.protobuf.ByteString; import lombok.Getter; +import org.apache.commons.lang3.StringUtils; import org.tron.common.utils.ByteArray; import org.tron.common.utils.StringUtil; import org.tron.core.ChainBaseManager; @@ -33,11 +34,7 @@ public HelloMessage(byte[] data) throws Exception { public HelloMessage(Node from, long timestamp, ChainBaseManager chainBaseManager) { - Endpoint fromEndpoint = Endpoint.newBuilder() - .setNodeId(ByteString.copyFrom(from.getId())) - .setPort(from.getPort()) - .setAddress(ByteString.copyFrom(ByteArray.fromString(from.getHost()))) - .build(); + Endpoint fromEndpoint = getEndpointFromNode(from); BlockCapsule.BlockId gid = chainBaseManager.getGenesisBlockId(); Protocol.HelloMessage.BlockId gBlockId = Protocol.HelloMessage.BlockId.newBuilder() @@ -104,7 +101,8 @@ public long getTimestamp() { public Node getFrom() { Endpoint from = this.helloMessage.getFrom(); return new Node(from.getNodeId().toByteArray(), - ByteArray.toStr(from.getAddress().toByteArray()), from.getPort()); + ByteArray.toStr(from.getAddress().toByteArray()), + ByteArray.toStr(from.getAddressIpv6().toByteArray()), from.getPort()); } public BlockCapsule.BlockId getGenesisBlockId() { @@ -132,7 +130,7 @@ public String toString() { StringBuilder builder = new StringBuilder(); builder.append(super.toString()) - .append("from: ").append(getFrom().getInetSocketAddress()).append("\n") + .append("from: ").append(getFrom().getPreferInetSocketAddress()).append("\n") .append("timestamp: ").append(getTimestamp()).append("\n") .append("headBlockId: ").append(getHeadBlockId().getString()).append("\n") .append("nodeType: ").append(helloMessage.getNodeType()).append("\n") @@ -175,4 +173,21 @@ public boolean valid() { return true; } + + public static Endpoint getEndpointFromNode(Node node) { + Endpoint.Builder builder = Endpoint.newBuilder() + .setPort(node.getPort()); + if (node.getId() != null) { + builder.setNodeId(ByteString.copyFrom(node.getId())); + } + if (StringUtils.isNotEmpty(node.getHostV4())) { + builder.setAddress( + ByteString.copyFrom(org.tron.p2p.utils.ByteArray.fromString(node.getHostV4()))); + } + if (StringUtils.isNotEmpty(node.getHostV6())) { + builder.setAddressIpv6( + ByteString.copyFrom(org.tron.p2p.utils.ByteArray.fromString(node.getHostV6()))); + } + return builder.build(); + } } diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index 5626c072864..d15725ebf3f 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -217,7 +217,7 @@ public String log() { + "blockInProcess:%d\n", channel.getInetSocketAddress(), (now - channel.getStartTime()) / Constant.ONE_THOUSAND, - channel.getLatency(), + channel.getAvgLatency(), fastForwardBlock != null ? fastForwardBlock.getNum() : blockBothHave.getNum(), isNeedSyncFromPeer(), isNeedSyncFromUs(), diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerManager.java b/framework/src/main/java/org/tron/core/net/peer/PeerManager.java index 8a402438c86..6817720dff5 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerManager.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerManager.java @@ -89,7 +89,7 @@ private static void remove(PeerConnection peerConnection) { } public static synchronized void sortPeers() { - peers.sort(Comparator.comparingDouble(c -> c.getChannel().getLatency())); + peers.sort(Comparator.comparingDouble(c -> c.getChannel().getAvgLatency())); } public static PeerConnection getPeerConnection(Channel channel) { diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 7b19c9dd3d5..6c9e53c3a98 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -100,7 +100,7 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { peer.setHelloMessageReceive(msg); - peer.getChannel().updateLatency( + peer.getChannel().updateAvgLatency( System.currentTimeMillis() - peer.getChannel().getStartTime()); PeerManager.sortPeers(); peer.onConnect(); @@ -108,8 +108,9 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { private void sendHelloMessage(PeerConnection peer, long time) { Node node = new Node(TronNetService.getP2pConfig().getNodeID(), - TronNetService.getP2pConfig().getIp(), - TronNetService.getP2pConfig().getPort()); + TronNetService.getP2pConfig().getIp(), + TronNetService.getP2pConfig().getIpv6(), + TronNetService.getP2pConfig().getPort()); HelloMessage message = new HelloMessage(node, time, ChainBaseManager.getChainBaseManager()); relayService.fillHelloMessage(message, peer.getChannel()); peer.sendMessage(message); diff --git a/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java b/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java index 49ae692b6f1..50b7be9dcbf 100644 --- a/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java +++ b/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java @@ -59,7 +59,7 @@ public void processMessage(PeerConnection peer, TronMessage message) { if (message.getType().equals(MessageTypes.P2P_PING)) { peer.sendMessage(new PongMessage()); } else { - peer.getChannel().updateLatency(System.currentTimeMillis() - peer.getChannel().pingSent); + peer.getChannel().updateAvgLatency(System.currentTimeMillis() - peer.getChannel().pingSent); peer.getChannel().waitForPong = false; } } diff --git a/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java b/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java index 02ff1e7a1aa..8d07df0d7a4 100644 --- a/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java +++ b/framework/src/main/java/org/tron/core/net/service/nodepersist/NodePersistService.java @@ -70,7 +70,8 @@ private void dbWrite() { List tableNodes = TronNetService.getP2pService().getTableNodes(); tableNodes.sort(Comparator.comparingLong(value -> -value.getUpdateTime())); for (Node n : tableNodes) { - batch.add(new DBNode(n.getHost(), n.getPort())); + batch.add( + new DBNode(n.getPreferInetSocketAddress().getAddress().getHostAddress(), n.getPort())); } if (batch.size() > MAX_NODES_WRITE_TO_DB) { diff --git a/framework/src/main/java/org/tron/core/services/NodeInfoService.java b/framework/src/main/java/org/tron/core/services/NodeInfoService.java index cd73a010258..b08f0107760 100644 --- a/framework/src/main/java/org/tron/core/services/NodeInfoService.java +++ b/framework/src/main/java/org/tron/core/services/NodeInfoService.java @@ -140,7 +140,7 @@ private void setConnectInfo(NodeInfo nodeInfo) { PeerInfo peerInfo = new PeerInfo(); peerInfo.setHeadBlockWeBothHave(peerConnection.getBlockBothHave().getString()); peerInfo.setActive(peerConnection.getChannel().isActive()); - peerInfo.setAvgLatency(peerConnection.getChannel().getLatency()); + peerInfo.setAvgLatency(peerConnection.getChannel().getAvgLatency()); peerInfo.setBlockInPorcSize(peerConnection.getSyncBlockInProcess().size()); peerInfo.setConnectTime(channel.getStartTime()); peerInfo.setDisconnectTimes(nodeStatistics.getDisconnectTimes()); diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index a6e1c5181ad..e16f5ff9565 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -1739,9 +1739,10 @@ public void listNodes(EmptyMessage request, StreamObserver responseObs NodeList.Builder nodeListBuilder = NodeList.newBuilder(); TronNetService.getP2pService().getConnectableNodes().forEach(node -> { nodeListBuilder.addNodes(Node.newBuilder().setAddress( - Address.newBuilder() - .setHost(ByteString.copyFrom(ByteArray.fromString(node.getHost()))) - .setPort(node.getPort()))); + Address.newBuilder() + .setHost(ByteString.copyFrom(ByteArray.fromString( + node.getPreferInetSocketAddress().getAddress().getHostAddress()))) + .setPort(node.getPort()))); }); responseObserver.onNext(nodeListBuilder.build()); responseObserver.onCompleted(); diff --git a/framework/src/main/resources/logback.xml b/framework/src/main/resources/logback.xml index 136d6342f9f..c97c9f8d3b4 100644 --- a/framework/src/main/resources/logback.xml +++ b/framework/src/main/resources/logback.xml @@ -66,7 +66,7 @@ - + diff --git a/protocol/src/main/protos/core/Discover.proto b/protocol/src/main/protos/core/Discover.proto index 4cc0d83b02a..fadb819e92d 100644 --- a/protocol/src/main/protos/core/Discover.proto +++ b/protocol/src/main/protos/core/Discover.proto @@ -11,6 +11,7 @@ message Endpoint { bytes address = 1; int32 port = 2; bytes nodeId = 3; + bytes addressIpv6 = 4; } message PingMessage { From e236398df8b6be9ebae459e6cdd7e5758fdbf6da Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 13 Feb 2023 18:28:00 +0800 Subject: [PATCH 007/142] remove ping in KeepAliveService because it exist in libp2p --- .../service/keepalive/KeepAliveService.java | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java b/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java index 50b7be9dcbf..0387dd88c8e 100644 --- a/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java +++ b/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java @@ -1,66 +1,25 @@ package org.tron.core.net.service.keepalive; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import org.tron.core.net.TronNetService; import org.tron.core.net.message.MessageTypes; import org.tron.core.net.message.TronMessage; -import org.tron.core.net.message.keepalive.PingMessage; import org.tron.core.net.message.keepalive.PongMessage; import org.tron.core.net.peer.PeerConnection; -import org.tron.protos.Protocol; @Slf4j(topic = "net") @Component public class KeepAliveService { - private long KEEP_ALIVE_TIMEOUT = 10_000; - - private long PING_TIMEOUT = 20_000; - - private long PING_PERIOD = 60_000; - - private final ScheduledExecutorService executor = - Executors.newSingleThreadScheduledExecutor(r -> new Thread(r, "KeepAlive")); - public void init() { - executor.scheduleWithFixedDelay(() -> { - try { - long now = System.currentTimeMillis(); - TronNetService.getPeers().forEach(p -> { - long pingSent = p.getChannel().pingSent; - long lastSendTime = p.getChannel().getLastSendTime(); - if (p.getChannel().waitForPong) { - if (now - pingSent > PING_TIMEOUT) { - p.disconnect(Protocol.ReasonCode.TIME_OUT); - } - } else { - if (now - lastSendTime > KEEP_ALIVE_TIMEOUT || now - pingSent > PING_PERIOD) { - p.sendMessage(new PingMessage()); - p.getChannel().waitForPong = true; - p.getChannel().pingSent = now; - } - } - }); - } catch (Throwable t) { - logger.error("Exception in keep alive task.", t); - } - }, 2, 2, TimeUnit.SECONDS); } public void close() { - executor.shutdown(); } public void processMessage(PeerConnection peer, TronMessage message) { if (message.getType().equals(MessageTypes.P2P_PING)) { peer.sendMessage(new PongMessage()); - } else { - peer.getChannel().updateAvgLatency(System.currentTimeMillis() - peer.getChannel().pingSent); - peer.getChannel().waitForPong = false; } } } From 38f6eb000037db46b57438de99dad134e1909543 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 14 Feb 2023 16:24:14 +0800 Subject: [PATCH 008/142] use libp2p test-v0.2.0; don't add fastForwardNode to activeNodes if already exist; if ipv4 and ipv6 not exist, use local ipv4 --- common/build.gradle | 2 +- .../src/main/java/org/tron/core/net/TronNetService.java | 2 +- .../org/tron/core/net/service/relay/RelayService.java | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 99610cc0f20..21212d42e19 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -54,7 +54,7 @@ dependencies { compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' //compile group: 'io.github.tronprotocol', name: 'libp2p', version: '0.1.2' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.1.6' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.0' compile project(":protocol") } diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 7b33736f5fa..0e3fc21efb6 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -159,7 +159,7 @@ private P2pConfig getConfig() { config.setNetworkId(parameter.getNodeP2pVersion()); config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); - if (StringUtil.isNullOrEmpty(config.getIp())) { + if (StringUtil.isNullOrEmpty(config.getIp()) && StringUtil.isNullOrEmpty(config.getIpv6())) { config.setIp(parameter.getNodeExternalIp()); } config.setTreeUrls(parameter.getDnsTreeUrls()); diff --git a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java index 478f0714875..665255a6594 100644 --- a/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java +++ b/framework/src/main/java/org/tron/core/net/service/relay/RelayService.java @@ -32,7 +32,6 @@ import org.tron.core.net.peer.Item; import org.tron.core.net.peer.PeerConnection; import org.tron.core.store.WitnessScheduleStore; -import org.tron.p2p.P2pConfig; import org.tron.p2p.connection.Channel; import org.tron.protos.Protocol; @@ -171,8 +170,11 @@ private boolean isActiveWitness() { } private void connect() { - fastForwardNodes.forEach(address -> - TronNetService.getP2pConfig().getActiveNodes().add(address)); + for (InetSocketAddress fastForwardNode : fastForwardNodes) { + if (!TronNetService.getP2pConfig().getActiveNodes().contains(fastForwardNode)) { + TronNetService.getP2pConfig().getActiveNodes().add(fastForwardNode); + } + } } private void disconnect() { From 80e700fe7b0f57468b86d34a9fc761ac85d1e012 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Wed, 8 Feb 2023 11:55:33 +0800 Subject: [PATCH 009/142] fix(test): add some test cases of utils --- .../java/org/tron/core/capsule/utils/RLP.java | 6 +- .../vm/BandWidthRuntimeOutOfTimeTest.java | 2 +- ...andWidthRuntimeOutOfTimeWithCheckTest.java | 2 +- .../runtime/vm/BandWidthRuntimeTest.java | 8 +- .../vm/BandWidthRuntimeWithCheckTest.java | 2 +- .../PrecompiledContractsVerifyProofTest.java | 374 ++++++++++-------- .../java/org/tron/core/tire/TrieTest.java | 2 +- .../tron/program/LiteFullNodeToolTest.java | 5 - .../org/tron/program/SolidityNodeTest.java | 2 +- .../java/org/tron/program/SupplementTest.java | 137 +++++++ 10 files changed, 352 insertions(+), 188 deletions(-) create mode 100644 framework/src/test/java/org/tron/program/SupplementTest.java diff --git a/framework/src/main/java/org/tron/core/capsule/utils/RLP.java b/framework/src/main/java/org/tron/core/capsule/utils/RLP.java index 54e7d044346..60a84cfd3d3 100644 --- a/framework/src/main/java/org/tron/core/capsule/utils/RLP.java +++ b/framework/src/main/java/org/tron/core/capsule/utils/RLP.java @@ -204,7 +204,7 @@ public static long decodeLong(byte[] data, int index) { return value; } - private static String decodeStringItem(byte[] data, int index) { + public static String decodeStringItem(byte[] data, int index) { final byte[] valueBytes = decodeItemBytes(data, index); @@ -229,12 +229,12 @@ public static BigInteger decodeBigInteger(byte[] data, int index) { } } - private static byte[] decodeByteArray(byte[] data, int index) { + public static byte[] decodeByteArray(byte[] data, int index) { return decodeItemBytes(data, index); } - private static int nextItemLength(byte[] data, int index) { + public static int nextItemLength(byte[] data, int index) { if (index >= data.length) { return -1; diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java index 9bfaebc0edf..f2cd7ae28ce 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java @@ -66,7 +66,7 @@ public class BandWidthRuntimeOutOfTimeTest extends BaseTest { private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; static { - dbPath = "output_BandWidthRuntimeOutOfTimeTest_test"; + dbPath = "output_bandwidth_runtime_out_of_time_test"; Args.setParam( new String[]{ "--output-directory", dbPath, diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java index b39f4e56391..0b9cdc9018a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java @@ -67,7 +67,7 @@ public class BandWidthRuntimeOutOfTimeWithCheckTest extends BaseTest { private static final String TriggerOwnerAddress = "TCSgeWapPJhCqgWRxXCKb6jJ5AgNWSGjPA"; static { - dbPath = "output_BandWidthRuntimeOutOfTimeTest_test"; + dbPath = "output_bandwidth_runtime_out_of_time_with_check_test"; Args.setParam( new String[]{ "--output-directory", dbPath, diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java index 9309bc398bc..20e8e11535a 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeTest.java @@ -19,6 +19,7 @@ import com.google.protobuf.ByteString; import org.junit.Assert; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.tron.common.BaseTest; import org.tron.common.runtime.RuntimeImpl; @@ -56,8 +57,9 @@ public class BandWidthRuntimeTest extends BaseTest { private static final String TriggerOwnerTwoAddress = "TPMBUANrTwwQAPwShn7ZZjTJz1f3F8jknj"; private static boolean init; - static { - dbPath = "output_BandWidthRuntimeTest_test"; + @BeforeClass + public static void init() { + dbPath = "output_bandwidth_runtime_test"; Args.setParam( new String[]{ "--output-directory", dbPath, @@ -73,7 +75,7 @@ public class BandWidthRuntimeTest extends BaseTest { * Init data. */ @Before - public void init() { + public void before() { if (init) { return; } diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java index d1f19fc4d2a..0e7f79eb42f 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeWithCheckTest.java @@ -70,7 +70,7 @@ public class BandWidthRuntimeWithCheckTest extends BaseTest { private static boolean init; static { - dbPath = "output_BandWidthRuntimeTest_test"; + dbPath = "output_bandwidth_runtime_with_check_test"; Args.setParam( new String[]{ "--output-directory", dbPath, 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 1053b759fe9..4779c90205d 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 @@ -1,5 +1,7 @@ package org.tron.common.runtime.vm; +import static org.junit.Assert.assertNotNull; + import com.google.protobuf.ByteString; import java.math.BigInteger; import java.util.Arrays; @@ -7,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; import org.tron.api.GrpcAPI.ShieldedTRC20Parameters; import org.tron.common.BaseTest; @@ -42,12 +45,18 @@ public class PrecompiledContractsVerifyProofTest extends BaseTest { private static final String SHIELDED_CONTRACT_ADDRESS_STR = "TGAmX5AqVUoXCf8MoHxbuhQPmhGfWTnEgA"; - private static final byte[] SHIELDED_CONTRACT_ADDRESS; + private static byte[] SHIELDED_CONTRACT_ADDRESS; private static final String PUBLIC_TO_ADDRESS_STR = "TBaBXpRAeBhs75TZT751LwyhrcR25XeUot"; - private static final byte[] PUBLIC_TO_ADDRESS; - private static final byte[] DEFAULT_OVK; + private static byte[] PUBLIC_TO_ADDRESS; + private static byte[] DEFAULT_OVK; - static { + VerifyMintProof mintContract = new VerifyMintProof(); + VerifyTransferProof transferContract = new VerifyTransferProof(); + VerifyBurnProof burnContract = new VerifyBurnProof(); + MerkleHash merkleHash = new MerkleHash(); + + @BeforeClass + public static void init() { dbPath = "output_PrecompiledContracts_VerifyProof_test"; Args.setParam(new String[]{"--output-directory", dbPath}, "config-test.conf"); DEFAULT_OVK = ByteArray @@ -57,11 +66,6 @@ public class PrecompiledContractsVerifyProofTest extends BaseTest { FullNodeHttpApiService.librustzcashInitZksnarkParams(); } - VerifyMintProof mintContract = new VerifyMintProof(); - VerifyTransferProof transferContract = new VerifyTransferProof(); - VerifyBurnProof burnContract = new VerifyBurnProof(); - MerkleHash merkleHash = new MerkleHash(); - @Test public void verifyMintProofCorrect() throws ZksnarkException { int totalCountNum = 2; @@ -79,7 +83,8 @@ public void verifyMintProofCorrect() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -121,9 +126,10 @@ public void verifyTransferProofCorrect() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -211,14 +217,16 @@ public void verifyTransferProofCorrect() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -277,8 +285,8 @@ public void verifyTransfer1v1ProofCorrect() throws ZksnarkException { IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm1 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm1); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(100)); @@ -327,7 +335,8 @@ public void verifyTransfer1v1ProofCorrect() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 100, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -382,8 +391,8 @@ public void verifyBurnWithCmCorrect() throws ZksnarkException { IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm1 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm1); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(100)); @@ -433,7 +442,8 @@ public void verifyBurnWithCmCorrect() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 50, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -488,8 +498,8 @@ public void verifyTransfer1v2ProofCorrect() throws ZksnarkException { IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm1 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm1); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(100)); @@ -538,14 +548,16 @@ public void verifyTransfer1v2ProofCorrect() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -606,9 +618,10 @@ public void verifyTransfer2v1ProofCorrect() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -696,7 +709,8 @@ public void verifyTransfer2v1ProofCorrect() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 100, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -749,12 +763,11 @@ public void verifyBurnProofCorrect() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -830,7 +843,8 @@ public void merkleHashCorrectTest() throws ZksnarkException { IncomingViewingKey ivk = fvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress paymentAddress = ivk.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = ivk.address(DiversifierT.random()).orElse(null); + assertNotNull(paymentAddress); Note note = new Note(paymentAddress.getD(), paymentAddress.getPkD(), randomLong(), rcm, new byte[512]); byte[] node = note.cm(); @@ -867,8 +881,8 @@ public void verifyBurnWithCmWrong() throws ZksnarkException { IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm1 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm1); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(100)); @@ -918,7 +932,7 @@ public void verifyBurnWithCmWrong() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 50, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -988,7 +1002,7 @@ public void verifyMintWrongDataLength() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1014,9 +1028,10 @@ public void verifyTransferWrongDataLength() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder(); builder.setShieldedTRC20ParametersType(ShieldedTRC20ParametersType.TRANSFER); builder.setShieldedTRC20Address(SHIELDED_CONTRACT_ADDRESS); @@ -1051,14 +1066,14 @@ public void verifyTransferWrongDataLength() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -1079,8 +1094,8 @@ public void verifyBurnWrongDataLength() throws ZksnarkException { IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder(); builder.setShieldedTRC20ParametersType(ShieldedTRC20ParametersType.BURN); builder.setShieldedTRC20Address(SHIELDED_CONTRACT_ADDRESS); @@ -1124,7 +1139,8 @@ public void verifyMintWrongLeafcount() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1150,9 +1166,10 @@ public void verifyTransferWrongLeafcount() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); for (long leafCount : leafCountList) { ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder(); builder.setShieldedTRC20ParametersType(ShieldedTRC20ParametersType.TRANSFER); @@ -1187,14 +1204,14 @@ public void verifyTransferWrongLeafcount() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -1218,8 +1235,8 @@ public void verifyTransferDuplicateNf() throws ZksnarkException { IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder(); builder.setShieldedTRC20ParametersType(ShieldedTRC20ParametersType.TRANSFER); builder.setShieldedTRC20Address(SHIELDED_CONTRACT_ADDRESS); @@ -1244,14 +1261,14 @@ public void verifyTransferDuplicateNf() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -1276,9 +1293,10 @@ public void verifyTransferDuplicateReceiveNotes() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder(); builder.setShieldedTRC20ParametersType(ShieldedTRC20ParametersType.TRANSFER); builder.setShieldedTRC20Address(SHIELDED_CONTRACT_ADDRESS); @@ -1313,7 +1331,8 @@ public void verifyTransferDuplicateReceiveNotes() throws ZksnarkException { SpendingKey receiveSk = SpendingKey.random(); FullViewingKey receiveFvk = receiveSk.fullViewingKey(); IncomingViewingKey receiveIvk = receiveFvk.inViewingKey(); - PaymentAddress receivePaymentAddress = receiveIvk.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress = receiveIvk.address(new DiversifierT()).orElse(null); + assertNotNull(receivePaymentAddress); byte[] r = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(r); builder.addOutput(senderOvk, receivePaymentAddress.getD(), receivePaymentAddress.getPkD(), @@ -1345,7 +1364,8 @@ public void verifyMintWrongValue() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, 50, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1363,12 +1383,11 @@ public void verifyBurnWrongValue() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); ShieldedTRC20ParametersBuilder builder = new ShieldedTRC20ParametersBuilder(); builder.setShieldedTRC20ParametersType(ShieldedTRC20ParametersType.BURN); builder.setShieldedTRC20Address(SHIELDED_CONTRACT_ADDRESS); @@ -1412,7 +1431,8 @@ public void verifyMintProofWrongCM() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1442,7 +1462,8 @@ public void verifyMintProofWrongCV() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1471,7 +1492,8 @@ public void verifyMintProofWrongEpk() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1500,7 +1522,8 @@ public void verifyMintProofWrongProof() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1529,7 +1552,8 @@ public void verifyMintProofWrongBindingSignature() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1558,7 +1582,8 @@ public void verifyMintProofWrongHash() throws ZksnarkException { SpendingKey recvSk = SpendingKey.random(); FullViewingKey fullViewingKey = recvSk.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); + PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()) + .orElse(null); builder.addOutput(DEFAULT_OVK, paymentAddress, value, new byte[512]); ShieldedTRC20Parameters params = builder.build(false); @@ -1588,9 +1613,10 @@ public void verifyTransferProofWrongNf() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -1676,14 +1702,16 @@ public void verifyTransferProofWrongNf() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -1714,9 +1742,10 @@ public void verifyTransferProofWrongRoot() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -1802,14 +1831,16 @@ public void verifyTransferProofWrongRoot() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -1841,9 +1872,10 @@ public void verifyTransferProofWrongSpendCV() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -1929,14 +1961,16 @@ public void verifyTransferProofWrongSpendCV() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -1967,9 +2001,10 @@ public void verifyTransferProofWrongRk() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2055,14 +2090,16 @@ public void verifyTransferProofWrongRk() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2093,9 +2130,10 @@ public void verifyTransferProofWrongSpendProof() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2181,14 +2219,16 @@ public void verifyTransferProofWrongSpendProof() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2219,9 +2259,10 @@ public void verifyTransferProofWrongCm() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2307,14 +2348,16 @@ public void verifyTransferProofWrongCm() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2345,9 +2388,10 @@ public void verifyTransferProofWrongReceiveCV() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2433,14 +2477,16 @@ public void verifyTransferProofWrongReceiveCV() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2471,9 +2517,10 @@ public void verifyTransferProofWrongEpk() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2559,14 +2606,16 @@ public void verifyTransferProofWrongEpk() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2597,9 +2646,10 @@ public void verifyTransferProofWrongReceiveProof() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2685,14 +2735,16 @@ public void verifyTransferProofWrongReceiveProof() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2723,9 +2775,10 @@ public void verifyTransferProofWrongBindingSignature() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2811,14 +2864,16 @@ public void verifyTransferProofWrongBindingSignature() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2849,9 +2904,10 @@ public void verifyTransferProofWrongHash() throws ZksnarkException { JLibrustzcash.librustzcashSaplingGenerateR(rcm1); byte[] rcm2 = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm2); - PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).get(); - PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress1 = senderIvk.address(DiversifierT.random()).orElse(null); + PaymentAddress senderPaymentAddress2 = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress1); + assertNotNull(senderPaymentAddress2); { //for mint1 ShieldedTRC20ParametersBuilder mintBuilder1 = new ShieldedTRC20ParametersBuilder(); mintBuilder1.setTransparentFromAmount(BigInteger.valueOf(30)); @@ -2937,14 +2993,16 @@ public void verifyTransferProofWrongHash() throws ZksnarkException { SpendingKey receiveSk1 = SpendingKey.random(); FullViewingKey receiveFvk1 = receiveSk1.fullViewingKey(); IncomingViewingKey receiveIvk1 = receiveFvk1.inViewingKey(); - PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress1 = receiveIvk1.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress1, 40, new byte[512]); //receiveNote2 SpendingKey receiveSk2 = SpendingKey.random(); FullViewingKey receiveFvk2 = receiveSk2.fullViewingKey(); IncomingViewingKey receiveIvk2 = receiveFvk2.inViewingKey(); - PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()).get(); + PaymentAddress receivePaymentAddress2 = receiveIvk2.address(new DiversifierT()) + .orElse(null); builder.addOutput(senderOvk, receivePaymentAddress2, 60, new byte[512]); ShieldedTRC20Parameters params = builder.build(true); @@ -2970,12 +3028,11 @@ public void verifyBurnWrongNF() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3041,12 +3098,11 @@ public void verifyBurnWrongRoot() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3113,12 +3169,11 @@ public void verifyBurnWrongCV() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3184,12 +3239,11 @@ public void verifyBurnWrongRk() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3255,12 +3309,11 @@ public void verifyBurnWrongProof() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3326,12 +3379,11 @@ public void verifyBurnWrongAuthoritySingature() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3397,12 +3449,11 @@ public void verifyBurnWrongBindingSingature() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3468,12 +3519,11 @@ public void verifyBurnWrongHash() throws ZksnarkException { SpendingKey senderSk = SpendingKey.random(); ExpandedSpendingKey senderExpsk = senderSk.expandedSpendingKey(); FullViewingKey senderFvk = senderSk.fullViewingKey(); - byte[] senderOvk = senderFvk.getOvk(); IncomingViewingKey senderIvk = senderFvk.inViewingKey(); byte[] rcm = new byte[32]; JLibrustzcash.librustzcashSaplingGenerateR(rcm); - PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).get(); - + PaymentAddress senderPaymentAddress = senderIvk.address(DiversifierT.random()).orElse(null); + assertNotNull(senderPaymentAddress); { //for mint ShieldedTRC20ParametersBuilder mintBuilder = new ShieldedTRC20ParametersBuilder(); mintBuilder.setTransparentFromAmount(BigInteger.valueOf(value)); @@ -3529,21 +3579,19 @@ public void verifyBurnWrongHash() throws ZksnarkException { private Pair verifyTransfer(byte[] input) { transferContract.getEnergyForData(input); transferContract.setVmShouldEndInUs(System.nanoTime() / 1000 + 50 * 1000); - Pair ret = transferContract.execute(input); - return ret; + return transferContract.execute(input); } private IncrementalMerkleVoucherContainer addSimpleMerkleVoucherContainer( IncrementalMerkleTreeContainer tree, byte[][] cm) throws ZksnarkException { - for (int i = 0; i < cm.length; i++) { + for (byte[] bytes : cm) { PedersenHashCapsule compressCapsule = new PedersenHashCapsule(); - compressCapsule.setContent(ByteString.copyFrom(cm[i])); + compressCapsule.setContent(ByteString.copyFrom(bytes)); ShieldContract.PedersenHash a = compressCapsule.getInstance(); tree.append(a); } - IncrementalMerkleVoucherContainer voucher = tree.toVoucher(); - return voucher; + return tree.toVoucher(); } private byte[] decodePath(byte[] encodedPath) { @@ -3646,24 +3694,6 @@ private byte[] abiEncodeForMintWrongProof(ShieldedTRC20Parameters params, long v return mergedBytes; } - private byte[] abiEncodeForMintWrongBindingSignature(ShieldedTRC20Parameters params, long value, - byte[] frontier, long leafCount) { - byte[] mergedBytes; - ShieldContract.ReceiveDescription revDesc = params.getReceiveDescription(0); - mergedBytes = ByteUtil.merge( - revDesc.getNoteCommitment().toByteArray(), - revDesc.getValueCommitment().toByteArray(), - revDesc.getEpk().toByteArray(), - revDesc.getZkproof().toByteArray(), - Wallet.generateRandomBytes(64), - longTo32Bytes(value), - params.getMessageHash().toByteArray(), - frontier, - longTo32Bytes(leafCount) - ); - return mergedBytes; - } - private byte[] abiEncodeForMintWrongHash(ShieldedTRC20Parameters params, long value, byte[] frontier, long leafCount) { byte[] mergedBytes; @@ -4474,7 +4504,7 @@ private byte[] longTo32Bytes(long value) { } private long randomLong() { - return (long) Math.round(Math.random() * Long.MAX_VALUE / 2); + return Math.round(Math.random() * Long.MAX_VALUE / 2); } } diff --git a/framework/src/test/java/org/tron/core/tire/TrieTest.java b/framework/src/test/java/org/tron/core/tire/TrieTest.java index 103972b2e91..ba5c536c987 100644 --- a/framework/src/test/java/org/tron/core/tire/TrieTest.java +++ b/framework/src/test/java/org/tron/core/tire/TrieTest.java @@ -136,7 +136,7 @@ public void testOrder() { trie2.put(RLP.encodeInt(i), String.valueOf(i).getBytes()); } byte[] rootHash2 = trie2.getRootHash(); - Assert.assertTrue(java.util.Arrays.equals(rootHash1, rootHash2)); + Assert.assertArrayEquals(rootHash1, rootHash2); } private void assertTrue(byte[] key, TrieImpl trieCopy) { diff --git a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java index d0a3d153d7d..aa2400a2a25 100644 --- a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java +++ b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java @@ -8,9 +8,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Ignore; -import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.tron.api.WalletGrpc; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; @@ -35,9 +33,6 @@ public class LiteFullNodeToolTest { private Application appTest; private String databaseDir; - @Rule - public ExpectedException thrown = ExpectedException.none(); - private static final String DB_PATH = "output_lite_fn"; /** diff --git a/framework/src/test/java/org/tron/program/SolidityNodeTest.java b/framework/src/test/java/org/tron/program/SolidityNodeTest.java index b9989f9c002..7cb3ac9823f 100755 --- a/framework/src/test/java/org/tron/program/SolidityNodeTest.java +++ b/framework/src/test/java/org/tron/program/SolidityNodeTest.java @@ -21,7 +21,7 @@ public class SolidityNodeTest { private static TronApplicationContext context; private static RpcApiService rpcApiService; - private static String dbPath = "output_witness_test"; + private static String dbPath = "output_sn_test"; static { Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); diff --git a/framework/src/test/java/org/tron/program/SupplementTest.java b/framework/src/test/java/org/tron/program/SupplementTest.java new file mode 100644 index 00000000000..5655ee4a098 --- /dev/null +++ b/framework/src/test/java/org/tron/program/SupplementTest.java @@ -0,0 +1,137 @@ +package org.tron.program; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; +import java.math.BigInteger; +import javax.annotation.Resource; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.tron.common.config.DbBackupConfig; +import org.tron.common.entity.PeerInfo; +import org.tron.common.utils.CompactEncoder; +import org.tron.common.utils.JsonUtil; +import org.tron.common.utils.Value; +import org.tron.core.Constant; +import org.tron.core.capsule.StorageRowCapsule; +import org.tron.core.capsule.utils.RLP; +import org.tron.core.config.DefaultConfig; +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; + +@RunWith(SpringJUnit4ClassRunner.class) +@DirtiesContext +@ContextConfiguration(classes = {DefaultConfig.class}) +public class SupplementTest { + + private static final String dbPath = "output_coverage_test"; + + @Resource + private StorageRowStore storageRowStore; + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @BeforeClass + public static void init() { + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); + } + + @Test + public void testGet() throws Exception { + StorageRowCapsule storageRowCapsule = storageRowStore.get(new byte[]{}); + assertNotNull(storageRowCapsule); + + DbBackupConfig dbBackupConfig = new DbBackupConfig(); + dbBackupConfig.initArgs(true, "propPath", "bak1path/", "bak2path/", 1); + + WalletUtils.generateFullNewWalletFile("123456", new File(dbPath)); + WalletUtils.generateLightNewWalletFile("123456", new File(dbPath)); + WalletUtils.getDefaultKeyDirectory(); + WalletUtils.getTestnetKeyDirectory(); + WalletUtils.getMainnetKeyDirectory(); + + Value value = new Value(new byte[]{1}); + value.asBytes(); + value = new Value(1); + value.asInt(); + value = new Value(100L); + value.asLong(); + value = new Value(new BigInteger("1000")); + value.asBigInt(); + value = new Value("1000"); + value.asString(); + value.isEmpty(); + value = new Value(new byte[]{1, 2, 3}); + value.isList(); + value.isReadableString(); + value.isHexString(); + value.isHashCode(); + value.isNull(); + value.length(); + assertNotNull(value.toString()); + value.countBranchNodes(); + + PeerInfo peerInfo = new PeerInfo(); + peerInfo.setAvgLatency(peerInfo.getAvgLatency()); + peerInfo.setBlockInPorcSize(peerInfo.getBlockInPorcSize()); + peerInfo.setConnectTime(peerInfo.getConnectTime()); + peerInfo.setDisconnectTimes(peerInfo.getDisconnectTimes()); + peerInfo.setHeadBlockTimeWeBothHave(peerInfo.getHeadBlockTimeWeBothHave()); + peerInfo.setHeadBlockWeBothHave(peerInfo.getHeadBlockWeBothHave()); + peerInfo.setHost(peerInfo.getHost()); + peerInfo.setInFlow(peerInfo.getInFlow()); + peerInfo.setLastBlockUpdateTime(peerInfo.getLastBlockUpdateTime()); + peerInfo.setLastSyncBlock(peerInfo.getLastSyncBlock()); + peerInfo.setLocalDisconnectReason(peerInfo.getLocalDisconnectReason()); + peerInfo.setNodeCount(peerInfo.getNodeCount()); + peerInfo.setNodeId(peerInfo.getNodeId()); + peerInfo.setRemainNum(peerInfo.getRemainNum()); + peerInfo.setRemoteDisconnectReason(peerInfo.getRemoteDisconnectReason()); + peerInfo.setScore(peerInfo.getScore()); + peerInfo.setPort(peerInfo.getPort()); + peerInfo.setSyncFlag(peerInfo.isSyncFlag()); + peerInfo.setNeedSyncFromPeer(peerInfo.isNeedSyncFromPeer()); + peerInfo.setNeedSyncFromUs(peerInfo.isNeedSyncFromUs()); + peerInfo.setSyncToFetchSize(peerInfo.getSyncToFetchSize()); + peerInfo.setSyncToFetchSizePeekNum(peerInfo.getSyncToFetchSizePeekNum()); + peerInfo.setSyncBlockRequestedSize(peerInfo.getSyncBlockRequestedSize()); + peerInfo.setUnFetchSynNum(peerInfo.getUnFetchSynNum()); + peerInfo.setActive(peerInfo.isActive()); + + assertNotNull(JsonUtil.json2Obj("{}", PeerInfo.class)); + assertNotNull(JsonUtil.obj2Json(peerInfo)); + + assertTrue(HttpSelfFormatFieldName.isAddressFormat( + "protocol.DelegatedResourceMessage.fromAddress")); + assertTrue(HttpSelfFormatFieldName.isNameStringFormat( + "protocol.MarketPriceList.buy_token_id")); + + CompactEncoder.packNibbles(new byte[] {1,2,3,4,5,6,7}); + assertFalse(CompactEncoder.hasTerminator(new byte[] {1,2,3,4,5,6,7})); + CompactEncoder.unpackToNibbles(new byte[] {1,2,3,4,5,6,7}); + CompactEncoder.binToNibblesNoTerminator(new byte[] {1,2,3,4,5,6,7}); + + assertNotNull(RLP.decodeIP4Bytes(new byte[] {1,2,3,4,5,6,7}, 0)); + RLP.decodeByteArray(new byte[] {1,2,3,4,5,6,7}, 0); + RLP.nextItemLength(new byte[] {1,2,3,4,5,6,7}, 0); + RLP.decodeStringItem(new byte[] {1,2,3,4,5,6,7}, 0); + RLP.decodeInt(new byte[] {1,2,3,4,5,6,7}, 0); + RLP.decode2OneItem(new byte[] {1,2,3,4,5,6,7}, 0); + RLP.decode2(new byte[] {1,2,3,4,5,6,7}, 1); + RLP.decode2(new byte[] {1,2,3,4,5,6,7}); + thrown.expect(ClassCastException.class); + RLP.unwrapList(new byte[] {1,2,3,4,5,6,7}); + } + +} From ced6fce5cec162672531160590b86094f290f229 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 15 Feb 2023 14:58:07 +0800 Subject: [PATCH 010/142] update PeerConnection --- .../src/main/java/org/tron/core/net/peer/PeerConnection.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index d15725ebf3f..ba972ed7b7c 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -147,7 +147,7 @@ public class PeerConnection { public void setChannel(Channel channel) { this.channel = channel; - if (relayNodes.contains(channel.getInetSocketAddress())) { + if (relayNodes.stream().anyMatch(n -> n.getAddress().equals(channel.getInetAddress()))) { this.isRelayPeer = true; } this.nodeStatistics = TronStatsManager.getNodeStatistics(channel.getInetAddress()); From 4413df5814d88dfc7444950f5ead6d7244aa9606 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 15 Feb 2023 17:36:16 +0800 Subject: [PATCH 011/142] support to read ipv6 address from config file --- .../java/org/tron/core/config/args/Args.java | 24 +++++++++++++++---- .../org/tron/core/net/TronNetService.java | 6 +++-- 2 files changed, 23 insertions(+), 7 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 9678001d02b..f6ff13f01c4 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 @@ -1186,21 +1186,24 @@ private static RateLimiterInitialization getRateLimiterFromConfig( } private static List getInetSocketAddress( - final com.typesafe.config.Config config, String path) { + final com.typesafe.config.Config config, String path) { List ret = new ArrayList<>(); if (!config.hasPath(path)) { return ret; } List list = config.getStringList(path); for (String configString : list) { - String[] sz = configString.split(":"); - String ip = sz[0]; - int port = Integer.parseInt(sz[1]); + InetSocketAddress inetSocketAddress = parseInetSocketAddress(configString); + if (inetSocketAddress == null) { + continue; + } + String ip = inetSocketAddress.getAddress().getHostAddress(); + int port = inetSocketAddress.getPort(); if (!(PARAMETER.nodeDiscoveryBindIp.equals(ip) || PARAMETER.nodeExternalIp.equals(ip) || Constant.LOCAL_HOST.equals(ip)) || PARAMETER.nodeListenPort != port) { - ret.add(new InetSocketAddress(ip, port)); + ret.add(inetSocketAddress); } } return ret; @@ -1612,5 +1615,16 @@ public String getOutputDirectory() { } return this.outputDirectory; } + + public static InetSocketAddress parseInetSocketAddress(String para) { + InetSocketAddress address = null; + int index = para.lastIndexOf(":"); + if (index > 0) { + String host = para.substring(0, index); + int port = Integer.parseInt(para.substring(index + 1)); + address = new InetSocketAddress(host, port); + } + return address; + } } diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 0e3fc21efb6..78de59a0619 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -131,8 +131,10 @@ private P2pConfig getConfig() { List seeds = new ArrayList<>(); seeds.addAll(nodePersistService.dbRead()); for (String s : parameter.getSeedNode().getIpList()) { - String[] sz = s.split(":"); - seeds.add(new InetSocketAddress(sz[0], Integer.parseInt(sz[1]))); + InetSocketAddress inetSocketAddress = Args.parseInetSocketAddress(s); + if (inetSocketAddress != null) { + seeds.add(inetSocketAddress); + } } P2pConfig config = new P2pConfig(); From c2b6b8062edecd25512df074820b8953f40d4f8a Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 15 Feb 2023 18:52:51 +0800 Subject: [PATCH 012/142] add some log --- .../src/main/java/org/tron/core/net/TronNetService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 78de59a0619..f5e14c5e545 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -74,7 +74,7 @@ public class TronNetService { private static void setP2pConfig(P2pConfig config) { TronNetService.p2pConfig = config; } - + public void start() { try { init = true; @@ -136,7 +136,9 @@ private P2pConfig getConfig() { seeds.add(inetSocketAddress); } } - + for (InetSocketAddress inetSocketAddress : seeds) { + logger.debug("Seed InetSocketAddress: {}", inetSocketAddress); + } P2pConfig config = new P2pConfig(); config.setSeedNodes(seeds); config.setActiveNodes(parameter.getActiveNodes()); From e3995bf6282068c8f0f3ffce66064a1f65ea8895 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 15 Feb 2023 20:16:11 +0800 Subject: [PATCH 013/142] add some log --- framework/src/main/java/org/tron/core/net/TronNetService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index f5e14c5e545..40f101f5b5a 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -166,6 +166,8 @@ private P2pConfig getConfig() { if (StringUtil.isNullOrEmpty(config.getIp()) && StringUtil.isNullOrEmpty(config.getIpv6())) { config.setIp(parameter.getNodeExternalIp()); } + logger.debug("Local ipv4: {}", config.getIp()); + logger.debug("Local ipv6: {}", config.getIpv6()); config.setTreeUrls(parameter.getDnsTreeUrls()); if (Objects.nonNull(parameter.getDnsPublishConfig())) { config.setPublishConfig(parameter.getDnsPublishConfig()); From e71b33b6210ae702d99c8c14d4746a8abdb8f32c Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 22 Feb 2023 12:24:48 +0800 Subject: [PATCH 014/142] feat(net): remove redundant logic after libp2p upgrade --- .../java/org/tron/core/net/TronNetService.java | 5 ----- .../net/service/handshake/HandshakeService.java | 15 --------------- .../net/service/keepalive/KeepAliveService.java | 6 ------ 3 files changed, 26 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 40f101f5b5a..5eea2e5a45f 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -52,9 +52,6 @@ public class TronNetService { @Autowired private FetchBlockService fetchBlockService; - @Autowired - private KeepAliveService keepAliveService; - private CommonParameter parameter = Args.getInstance(); @Autowired @@ -86,7 +83,6 @@ public void start() { peerStatusCheck.init(); transactionsMsgHandler.init(); fetchBlockService.init(); - keepAliveService.init(); nodePersistService.init(); tronStatsManager.init(); PeerManager.init(); @@ -104,7 +100,6 @@ public void close() { PeerManager.close(); tronStatsManager.close(); nodePersistService.close(); - keepAliveService.close(); advService.close(); syncService.close(); peerStatusCheck.close(); diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 6c9e53c3a98..04ef5d1d5c5 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -36,13 +36,6 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } - TronNetService.getP2pService().updateNodeId(peer.getChannel(), msg.getFrom().getHexId()); - if (peer.isDisconnect()) { - logger.info("Duplicate Peer {}", peer.getInetSocketAddress()); - peer.disconnect(ReasonCode.DUPLICATE_PEER); - return; - } - if (!msg.valid()) { logger.warn("Peer {} invalid hello message parameters, " + "GenesisBlockId: {}, SolidBlockId: {}, HeadBlockId: {}", @@ -70,14 +63,6 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } - if (msg.getVersion() != Args.getInstance().getNodeP2pVersion()) { - logger.info("Peer {} different p2p version, peer->{}, me->{}", - peer.getInetSocketAddress(), msg.getVersion(), - Args.getInstance().getNodeP2pVersion()); - peer.disconnect(ReasonCode.INCOMPATIBLE_VERSION); - return; - } - if (!Arrays.equals(chainBaseManager.getGenesisBlockId().getBytes(), msg.getGenesisBlockId().getBytes())) { logger.info("Peer {} different genesis block, peer->{}, me->{}", diff --git a/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java b/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java index 0387dd88c8e..cb5260a880c 100644 --- a/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java +++ b/framework/src/main/java/org/tron/core/net/service/keepalive/KeepAliveService.java @@ -11,12 +11,6 @@ @Component public class KeepAliveService { - public void init() { - } - - public void close() { - } - public void processMessage(PeerConnection peer, TronMessage message) { if (message.getType().equals(MessageTypes.P2P_PING)) { peer.sendMessage(new PongMessage()); From cd4ff2ce189fe42fc56d24d1cd624deed1d2511f Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 22 Feb 2023 19:08:38 +0800 Subject: [PATCH 015/142] fix(net): use libp2p test-v0.2.1 --- common/build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 21212d42e19..526b04d933e 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,8 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - //compile group: 'io.github.tronprotocol', name: 'libp2p', version: '0.1.2' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.0' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.1' compile project(":protocol") } From 6d0fa0ee7cfc0e8e646b8e295e7f9d6303ded0e9 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Fri, 24 Feb 2023 18:44:23 +0800 Subject: [PATCH 016/142] feat(net): make the node detect function configurable --- .../java/org/tron/common/parameter/CommonParameter.java | 3 +++ common/src/main/java/org/tron/core/Constant.java | 2 ++ .../src/main/java/org/tron/core/config/args/Args.java | 8 ++++++++ .../src/main/java/org/tron/core/net/TronNetService.java | 1 + .../test/java/org/tron/common/config/args/ArgsTest.java | 1 + 5 files changed, 15 insertions(+) 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 067abf000aa..c1eb8d0e489 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -330,6 +330,9 @@ public class CommonParameter { public boolean isOpenFullTcpDisconnect; @Getter @Setter + public boolean nodeDetectEnable; + @Getter + @Setter public int allowMultiSign; @Getter @Setter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 51e5a553bde..7da1f9fb537 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -188,6 +188,8 @@ public class Constant { public static final String NODE_IS_OPEN_FULL_TCP_DISCONNECT = "node.isOpenFullTcpDisconnect"; + public static final String NODE_DETECT_ENABLE = "node.nodeDetectEnable"; + public static final String NODE_MAX_TRANSACTION_PENDING_SIZE = "node.maxTransactionPendingSize"; public static final String NODE_PENDING_TRANSACTION_TIMEOUT = "node.pendingTransactionTimeout"; 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 f6ff13f01c4..e42c96281cf 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 @@ -178,6 +178,7 @@ public static void clearParam() { PARAMETER.estimateEnergyMaxRetry = 3; PARAMETER.receiveTcpMinDataLength = 2048; PARAMETER.isOpenFullTcpDisconnect = false; + PARAMETER.nodeDetectEnable = false; PARAMETER.supportConstant = false; PARAMETER.debug = false; PARAMETER.minTimeRatio = 0.0; @@ -819,8 +820,13 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.receiveTcpMinDataLength = config.hasPath(Constant.NODE_RECEIVE_TCP_MIN_DATA_LENGTH) ? config.getLong(Constant.NODE_RECEIVE_TCP_MIN_DATA_LENGTH) : 2048; + PARAMETER.isOpenFullTcpDisconnect = config.hasPath(Constant.NODE_IS_OPEN_FULL_TCP_DISCONNECT) && config.getBoolean(Constant.NODE_IS_OPEN_FULL_TCP_DISCONNECT); + + PARAMETER.nodeDetectEnable = config.hasPath(Constant.NODE_DETECT_ENABLE) + && config.getBoolean(Constant.NODE_DETECT_ENABLE); + PARAMETER.maxTransactionPendingSize = config.hasPath(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE) ? config.getInt(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE) : 2000; @@ -1569,6 +1575,8 @@ public static void logConfig() { logger.info("Max connection with same IP: {}", parameter.getMaxConnectionsWithSameIp()); logger.info("Solidity threads: {}", parameter.getSolidityThreads()); logger.info("Trx reference block: {}", parameter.getTrxReferenceBlock()); + logger.info("Open full tcp disconnect: {}", parameter.isOpenFullTcpDisconnect()); + logger.info("Node detect enable: {}", parameter.isNodeDetectEnable()); logger.info("************************ Backup config ************************"); logger.info("Backup priority: {}", parameter.getBackupPriority()); logger.info("Backup listen port: {}", parameter.getBackupPort()); diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 5eea2e5a45f..fe1347a8ebc 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -157,6 +157,7 @@ private P2pConfig getConfig() { config.setPort(parameter.getNodeListenPort()); config.setNetworkId(parameter.getNodeP2pVersion()); config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); + config.setNodeDetectEnable(parameter.isNodeDetectEnable()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); if (StringUtil.isNullOrEmpty(config.getIp()) && StringUtil.isNullOrEmpty(config.getIpv6())) { config.setIp(parameter.getNodeExternalIp()); diff --git a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java index 5b391f0d38d..cbacb5f6246 100644 --- a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java @@ -30,5 +30,6 @@ public void testConfig() { Assert.assertEquals(Args.getInstance().getNodeDiscoveryPingTimeout(), 15_000); Assert.assertEquals(Args.getInstance().getMaxFastForwardNum(), 3); Assert.assertEquals(Args.getInstance().getBlockCacheTimeout(), 60); + Assert.assertEquals(Args.getInstance().isNodeDetectEnable(), false); } } \ No newline at end of file From 17bf1a45d3b8c37db498f7f8030019551e4664c6 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 24 Feb 2023 21:50:40 +0800 Subject: [PATCH 017/142] update libp2p version to test-v0.2.2 --- common/build.gradle | 2 +- framework/build.gradle | 2 -- framework/src/main/java/org/tron/core/config/args/Args.java | 4 +--- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 526b04d933e..58476ea8ae5 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.1' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.2' compile project(":protocol") } diff --git a/framework/build.gradle b/framework/build.gradle index 676088868be..f4f5134bf6e 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -48,8 +48,6 @@ dependencies { compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.69' - compile group: 'software.amazon.awssdk', name: 'regions', version: '2.18.41' - compile group: 'com.typesafe', name: 'config', version: '1.3.2' compile "com.cedarsoftware:java-util:1.8.0" 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 e42c96281cf..667686b8096 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 @@ -80,8 +80,6 @@ import org.tron.p2p.dns.update.PublishConfig; import org.tron.program.Version; -import software.amazon.awssdk.regions.Region; - @Slf4j(topic = "app") @NoArgsConstructor @Component @@ -1350,7 +1348,7 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi logger.error("Check {}, must not be null", Constant.NODE_DNS_AWS_REGION); return null; } else { - publishConfig.setAwsRegion(Region.of(config.getString(Constant.NODE_DNS_AWS_REGION))); + publishConfig.setAwsRegion(config.getString(Constant.NODE_DNS_AWS_REGION)); } if (config.hasPath(Constant.NODE_DNS_AWS_HOST_ZONE_ID)) { publishConfig.setAwsHostZoneId(config.getString(Constant.NODE_DNS_AWS_HOST_ZONE_ID)); From 543fbb1ef9331fa6480986d5d20f9afdc7cbf9e0 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 28 Feb 2023 19:57:38 +0800 Subject: [PATCH 018/142] fix(net): fix the bug of missing data in mongo --- .../main/java/org/tron/core/db/Manager.java | 107 ++++++++++-------- 1 file changed, 59 insertions(+), 48 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index b43387ec4f6..9cceda9d462 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -241,6 +241,9 @@ public class Manager { @Getter private volatile long latestSolidityNumShutDown; @Getter + private long lastUsedSolidityNum = -1; + private boolean useSolidity = false; + @Getter private int maxFlushCount; @Getter @@ -525,12 +528,18 @@ public void init() { Thread triggerCapsuleProcessThread = new Thread(triggerCapsuleProcessLoop); triggerCapsuleProcessThread.setDaemon(true); triggerCapsuleProcessThread.start(); + if (eventPluginLoaded) { + useSolidity = EventPluginLoader.getInstance().isBlockLogTriggerSolidified() + | EventPluginLoader.getInstance().isTransactionLogTriggerEnable() + | EventPluginLoader.getInstance().isTransactionLogTriggerSolidified(); + } } // start json rpc filter process if (CommonParameter.getInstance().isJsonRpcFilterEnabled()) { Thread filterProcessThread = new Thread(filterProcessLoop); filterProcessThread.start(); + useSolidity |= CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable(); } //initStoreFactory @@ -2027,17 +2036,11 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif return; } - BlockCapsule blockCapsule; - try { - blockCapsule = chainBaseManager.getBlockByNum(latestSolidifiedBlockNumber); - } catch (Exception e) { - logger.error("PostSolidityFilter getBlockByNum = {} except, {}.", - latestSolidifiedBlockNumber, e.getMessage()); - return; + List capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber); + for (BlockCapsule blockCapsule : capsuleList) { + postBlockFilter(blockCapsule, true); + postLogsFilter(blockCapsule, true, false); } - - postBlockFilter(blockCapsule, true); - postLogsFilter(blockCapsule, true, false); } private void postSolidityTrigger(final long oldSolidNum, final long latestSolidifiedBlockNumber) { @@ -2054,28 +2057,27 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi } if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { - SolidityTriggerCapsule solidityTriggerCapsule - = new SolidityTriggerCapsule(latestSolidifiedBlockNumber); - - BlockCapsule blockCapsule; - try { - blockCapsule = chainBaseManager.getBlockByNum(latestSolidifiedBlockNumber); + List capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber); + for(BlockCapsule blockCapsule : capsuleList){ + SolidityTriggerCapsule solidityTriggerCapsule + = new SolidityTriggerCapsule(latestSolidifiedBlockNumber); solidityTriggerCapsule.setTimeStamp(blockCapsule.getTimeStamp()); - } catch (Exception e) { - logger.error("PostSolidityTrigger getBlockByNum = {} except, {}.", - latestSolidifiedBlockNumber, e.getMessage()); - } - boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); - if (!result) { - logger.info("Too many trigger, lost solidified trigger, block number: {}.", - latestSolidifiedBlockNumber); + boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); + if (!result) { + logger.info("Too many trigger, lost solidified trigger, block number: {}.", + latestSolidifiedBlockNumber); + } } } if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) { postSolidityFilter(oldSolidNum, latestSolidifiedBlockNumber); } + + if (useSolidity) { + lastUsedSolidityNum = latestSolidifiedBlockNumber; + } } private void processTransactionTrigger(BlockCapsule newBlock) { @@ -2184,7 +2186,6 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified, } private void postBlockTrigger(final BlockCapsule blockCapsule) { - BlockCapsule newBlock = blockCapsule; // post block and logs for jsonrpc if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) { @@ -2193,44 +2194,54 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { } // process block trigger + long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) { + List capsuleList = new ArrayList<>(); if (EventPluginLoader.getInstance().isBlockLogTriggerSolidified()) { - long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); - try { - newBlock = chainBaseManager - .getBlockByNum(solidityBlkNum); - } catch (Exception e) { - logger.error("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}.", - solidityBlkNum, e.getMessage()); - } + capsuleList = getCrossBlockCapsule(solidityBlkNum); + } else { + capsuleList.add(blockCapsule); } - BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule(newBlock); - blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() - .getLatestSolidifiedBlockNum()); - if (!triggerCapsuleQueue.offer(blockLogTriggerCapsule)) { - logger.info("Too many triggers, block trigger lost: {}.", newBlock.getBlockId()); + for (BlockCapsule capsule : capsuleList) { + BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule(capsule); + blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() + .getLatestSolidifiedBlockNum()); + if (!triggerCapsuleQueue.offer(blockLogTriggerCapsule)) { + logger.info("Too many triggers, block trigger lost: {}.", capsule.getBlockId()); + } } } // process transaction trigger if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { - // set newBlock + List capsuleList = new ArrayList<>(); if (EventPluginLoader.getInstance().isTransactionLogTriggerSolidified()) { - long solidityBlkNum = getDynamicPropertiesStore().getLatestSolidifiedBlockNum(); - try { - newBlock = chainBaseManager.getBlockByNum(solidityBlkNum); - } catch (Exception e) { - logger.error("PostBlockTrigger getBlockByNum blkNum = {} except, error is {}.", - solidityBlkNum, e.getMessage()); - } + capsuleList = getCrossBlockCapsule(solidityBlkNum); } else { // need to reset block - newBlock = blockCapsule; + capsuleList.add(blockCapsule); } - processTransactionTrigger(newBlock); + for (BlockCapsule capsule : capsuleList) { + processTransactionTrigger(capsule); + } + } + } + + private List getCrossBlockCapsule(long solidityBlkNum) { + List capsuleList = new ArrayList<>(); + long start = lastUsedSolidityNum < 0 ? (solidityBlkNum - 1) : lastUsedSolidityNum; + for (long i = start + 1; i <= solidityBlkNum; i++) { + try { + BlockCapsule capsule = chainBaseManager.getBlockByNum(solidityBlkNum); + capsuleList.add(capsule); + } catch (Exception e) { + logger.error("GetCrossBlockCapsule getBlockByNum blkNum = {} except, error is {}.", + solidityBlkNum, e.getMessage()); + } } + return capsuleList; } // return energyUsageTotal of the current transaction From 50ceff55e74d61c12b957dc8f621028e3c823334 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 1 Mar 2023 11:09:55 +0800 Subject: [PATCH 019/142] fix(net): use blockNum instead of i --- framework/src/main/java/org/tron/core/db/Manager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 9cceda9d462..0acc2595e4d 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -2232,9 +2232,9 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { private List getCrossBlockCapsule(long solidityBlkNum) { List capsuleList = new ArrayList<>(); long start = lastUsedSolidityNum < 0 ? (solidityBlkNum - 1) : lastUsedSolidityNum; - for (long i = start + 1; i <= solidityBlkNum; i++) { + for (long blockNum = start + 1; blockNum <= solidityBlkNum; blockNum++) { try { - BlockCapsule capsule = chainBaseManager.getBlockByNum(solidityBlkNum); + BlockCapsule capsule = chainBaseManager.getBlockByNum(blockNum); capsuleList.add(capsule); } catch (Exception e) { logger.error("GetCrossBlockCapsule getBlockByNum blkNum = {} except, error is {}.", From 833eb0c80677efe94ab1da1edeeba5d383d53f93 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 1 Mar 2023 16:06:41 +0800 Subject: [PATCH 020/142] update libp2p from test-v0.2.2 to test-v0.2.3 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 58476ea8ae5..1217302c6ac 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.2' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.3' compile project(":protocol") } From b33c660eceb55a04c60e06145630a487d43f6a60 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 1 Mar 2023 18:26:50 +0800 Subject: [PATCH 021/142] fix(db): update postSolidityTrigger --- .../src/main/java/org/tron/core/db/Manager.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 4b04292d517..fde976b2c7f 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -2061,11 +2061,16 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { List capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber); - for(BlockCapsule blockCapsule : capsuleList){ + long solidifiedTime = -1; + if (!capsuleList.isEmpty()) { + solidifiedTime = capsuleList.get(capsuleList.size() - 1).getTimeStamp(); + } + for (BlockCapsule blockCapsule : capsuleList) { SolidityTriggerCapsule solidityTriggerCapsule - = new SolidityTriggerCapsule(latestSolidifiedBlockNumber); - solidityTriggerCapsule.setTimeStamp(blockCapsule.getTimeStamp()); - + = new SolidityTriggerCapsule(blockCapsule.getNum());//unique key + if (solidifiedTime >= 0) { + solidityTriggerCapsule.setTimeStamp(solidifiedTime); + } boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); if (!result) { logger.info("Too many trigger, lost solidified trigger, block number: {}.", From d24d6404220fd74434311a89ec43bd982c5695c5 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 1 Mar 2023 18:34:00 +0800 Subject: [PATCH 022/142] fix(db): update postSolidityTrigger --- framework/src/main/java/org/tron/core/db/Manager.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index fde976b2c7f..fdacb9d1b6b 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -2063,7 +2063,10 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi List capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber); long solidifiedTime = -1; if (!capsuleList.isEmpty()) { - solidifiedTime = capsuleList.get(capsuleList.size() - 1).getTimeStamp(); + BlockCapsule blockCapsule = capsuleList.get(capsuleList.size() - 1); + if (blockCapsule.getNum() == latestSolidifiedBlockNumber) { + solidifiedTime = blockCapsule.getTimeStamp(); + } } for (BlockCapsule blockCapsule : capsuleList) { SolidityTriggerCapsule solidityTriggerCapsule @@ -2074,7 +2077,7 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); if (!result) { logger.info("Too many trigger, lost solidified trigger, block number: {}.", - latestSolidifiedBlockNumber); + blockCapsule.getNum()); } } } From 8c72efc04b9e2493f8ebf402e89b83862237e135 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 2 Mar 2023 20:14:11 +0800 Subject: [PATCH 023/142] fix(net): add paramater node.dns.staticNodes --- common/build.gradle | 2 +- .../src/main/java/org/tron/core/Constant.java | 1 + .../java/org/tron/core/config/args/Args.java | 35 ++++++++++------ .../test/java/org/tron/core/net/NodeTest.java | 40 +++++++++++++++++++ 4 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 framework/src/test/java/org/tron/core/net/NodeTest.java diff --git a/common/build.gradle b/common/build.gradle index 1217302c6ac..530515f065a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.3' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.4' compile project(":protocol") } diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 7da1f9fb537..7c0f0c40ee2 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -109,6 +109,7 @@ public class Constant { public static final String NODE_DNS_DOMAIN = "node.dns.dnsDomain"; public static final String NODE_DNS_PRIVATE = "node.dns.dnsPrivate"; public static final String NODE_DNS_KNOWN_URLS = "node.dns.knownUrls"; + public static final String NODE_DNS_STATIC_NODES = "node.dns.staticNodes"; public static final String NODE_DNS_SERVER_TYPE = "node.dns.serverType"; public static final String NODE_DNS_ACCESS_KEY_ID = "node.dns.accessKeyId"; public static final String NODE_DNS_ACCESS_KEY_SECRET = "node.dns.accessKeySecret"; 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 667686b8096..58fd764b18f 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 @@ -24,7 +24,6 @@ import java.net.InetSocketAddress; import java.net.Socket; import java.net.URL; -import java.nio.file.Paths; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; @@ -64,9 +63,7 @@ import org.tron.common.setting.RocksDbSettings; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Commons; -import org.tron.common.utils.FileUtil; import org.tron.common.utils.LocalWitnesses; -import org.tron.common.utils.PropUtil; import org.tron.core.Constant; import org.tron.core.Wallet; import org.tron.core.config.Configuration; @@ -1289,7 +1286,7 @@ private static EventPluginConfig getEventPluginConfig( return eventPluginConfig; } - public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Config config) { + private static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Config config) { PublishConfig publishConfig = new PublishConfig(); if (config.hasPath(Constant.NODE_DNS_PUBLISH)) { publishConfig.setDnsPublishEnable(config.getBoolean(Constant.NODE_DNS_PUBLISH)); @@ -1299,14 +1296,14 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi if (config.hasPath(Constant.NODE_DNS_DOMAIN)) { publishConfig.setDnsDomain(config.getString(Constant.NODE_DNS_DOMAIN)); } else { - logger.error("Check {}, must not be null", Constant.NODE_DNS_DOMAIN); + logEmptyError(Constant.NODE_DNS_DOMAIN); return null; } if (config.hasPath(Constant.NODE_DNS_PRIVATE)) { publishConfig.setDnsPrivate(config.getString(Constant.NODE_DNS_PRIVATE)); } else { - logger.error("Check {}, must not be null", Constant.NODE_DNS_PRIVATE); + logEmptyError(Constant.NODE_DNS_PRIVATE); return null; } @@ -1314,6 +1311,10 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi publishConfig.setKnownTreeUrls(config.getStringList(Constant.NODE_DNS_KNOWN_URLS)); } + if (config.hasPath(Constant.NODE_DNS_STATIC_NODES)) { + publishConfig.setStaticNodes(getInetSocketAddress(config, Constant.NODE_DNS_STATIC_NODES)); + } + if (config.hasPath(Constant.NODE_DNS_SERVER_TYPE)) { String serverType = config.getString(Constant.NODE_DNS_SERVER_TYPE); if (!serverType.equalsIgnoreCase("aws") && !serverType.equalsIgnoreCase("aliyun")) { @@ -1326,26 +1327,26 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi publishConfig.setDnsType(DnsType.AliYun); } } else { - logger.error("Check {}, must not be null", Constant.NODE_DNS_SERVER_TYPE); + logEmptyError(Constant.NODE_DNS_SERVER_TYPE); return null; } if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_ID)) { publishConfig.setAccessKeyId(config.getString(Constant.NODE_DNS_ACCESS_KEY_ID)); } else { - logger.error("Check {}, must not be null", Constant.NODE_DNS_ACCESS_KEY_ID); + logEmptyError(Constant.NODE_DNS_ACCESS_KEY_ID); return null; } if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_SECRET)) { publishConfig.setAccessKeySecret(config.getString(Constant.NODE_DNS_ACCESS_KEY_SECRET)); } else { - logger.error("Check {}, must not be null", Constant.NODE_DNS_ACCESS_KEY_SECRET); + logEmptyError(Constant.NODE_DNS_ACCESS_KEY_SECRET); return null; } if (publishConfig.getDnsType() == DnsType.AwsRoute53) { if (!config.hasPath(Constant.NODE_DNS_AWS_REGION)) { - logger.error("Check {}, must not be null", Constant.NODE_DNS_AWS_REGION); + logEmptyError(Constant.NODE_DNS_AWS_REGION); return null; } else { publishConfig.setAwsRegion(config.getString(Constant.NODE_DNS_AWS_REGION)); @@ -1355,7 +1356,7 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi } } else { if (!config.hasPath(Constant.NODE_DNS_ALIYUN_ENDPOINT)) { - logger.error("Check {}, must not be null", Constant.NODE_DNS_ALIYUN_ENDPOINT); + logEmptyError(Constant.NODE_DNS_ALIYUN_ENDPOINT); return null; } else { publishConfig.setAliDnsEndpoint(config.getString(Constant.NODE_DNS_ALIYUN_ENDPOINT)); @@ -1365,6 +1366,10 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi return publishConfig; } + private static void logEmptyError(String arg) { + logger.error("Check {}, must not be null", arg); + } + private static TriggerConfig createTriggerConfig(ConfigObject triggerObject) { if (Objects.isNull(triggerObject)) { return null; @@ -1627,8 +1632,12 @@ public static InetSocketAddress parseInetSocketAddress(String para) { int index = para.lastIndexOf(":"); if (index > 0) { String host = para.substring(0, index); - int port = Integer.parseInt(para.substring(index + 1)); - address = new InetSocketAddress(host, port); + try { + int port = Integer.parseInt(para.substring(index + 1)); + address = new InetSocketAddress(host, port); + } catch (RuntimeException e) { + logger.error("Invalid inetSocketAddress: {}", para); + } } return address; } diff --git a/framework/src/test/java/org/tron/core/net/NodeTest.java b/framework/src/test/java/org/tron/core/net/NodeTest.java new file mode 100644 index 00000000000..f97f147193b --- /dev/null +++ b/framework/src/test/java/org/tron/core/net/NodeTest.java @@ -0,0 +1,40 @@ +package org.tron.core.net; + +import static org.tron.core.net.message.handshake.HelloMessage.getEndpointFromNode; + +import java.net.InetSocketAddress; +import lombok.extern.slf4j.Slf4j; +import org.junit.Assert; +import org.junit.Test; +import org.tron.core.config.args.Args; +import org.tron.p2p.discover.Node; +import org.tron.protos.Discover.Endpoint; + +@Slf4j +public class NodeTest { + + @Test + public void testIpV4() { + InetSocketAddress address1 = Args.parseInetSocketAddress("192.168.0.1:18888"); + Assert.assertNotNull(address1); + InetSocketAddress address2 = Args.parseInetSocketAddress("192.168.0.1"); + Assert.assertNull(address2); + } + + @Test + public void testIpV6() { + InetSocketAddress address1 = Args.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb:18888"); + Assert.assertNotNull(address1); + InetSocketAddress address2 = Args.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb"); + Assert.assertNull(address2); + } + + @Test + public void testEndpointFromNode() { + Node node = new Node(null, null, null, 18888); + Endpoint endpoint = getEndpointFromNode(node); + Assert.assertTrue(endpoint.getNodeId().isEmpty()); + Assert.assertTrue(endpoint.getAddress().isEmpty()); + Assert.assertTrue(endpoint.getAddressIpv6().isEmpty()); + } +} From 7b0032597fb08994875b685eefc1bc6311214a7d Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 2 Mar 2023 20:40:35 +0800 Subject: [PATCH 024/142] style(net): fix checkstyle warning --- framework/src/main/java/org/tron/core/config/args/Args.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 58fd764b18f..7aa107cdc71 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 @@ -1317,11 +1317,11 @@ private static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Conf if (config.hasPath(Constant.NODE_DNS_SERVER_TYPE)) { String serverType = config.getString(Constant.NODE_DNS_SERVER_TYPE); - if (!serverType.equalsIgnoreCase("aws") && !serverType.equalsIgnoreCase("aliyun")) { + if (!"aws".equalsIgnoreCase(serverType) && !"aliyun".equalsIgnoreCase(serverType)) { logger.error("Check {}, must be aws or aliyun", Constant.NODE_DNS_SERVER_TYPE); return null; } - if (serverType.equalsIgnoreCase("aws")) { + if ("aws".equalsIgnoreCase(serverType)) { publishConfig.setDnsType(DnsType.AwsRoute53); } else { publishConfig.setDnsType(DnsType.AliYun); From 2709f2a8ca992f85c3f36c4b227cc789213782ce Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 3 Mar 2023 16:25:22 +0800 Subject: [PATCH 025/142] fix(db): rename geContinuousBlockCapsule --- .../src/main/java/org/tron/core/db/Manager.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index fdacb9d1b6b..918eb0044b6 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -2039,7 +2039,7 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif return; } - List capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber); + List capsuleList = geContinuousBlockCapsule(latestSolidifiedBlockNumber); for (BlockCapsule blockCapsule : capsuleList) { postBlockFilter(blockCapsule, true); postLogsFilter(blockCapsule, true, false); @@ -2060,7 +2060,7 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi } if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { - List capsuleList = getCrossBlockCapsule(latestSolidifiedBlockNumber); + List capsuleList = geContinuousBlockCapsule(latestSolidifiedBlockNumber); long solidifiedTime = -1; if (!capsuleList.isEmpty()) { BlockCapsule blockCapsule = capsuleList.get(capsuleList.size() - 1); @@ -2211,15 +2211,14 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) { List capsuleList = new ArrayList<>(); if (EventPluginLoader.getInstance().isBlockLogTriggerSolidified()) { - capsuleList = getCrossBlockCapsule(solidityBlkNum); + capsuleList = geContinuousBlockCapsule(solidityBlkNum); } else { capsuleList.add(blockCapsule); } for (BlockCapsule capsule : capsuleList) { BlockLogTriggerCapsule blockLogTriggerCapsule = new BlockLogTriggerCapsule(capsule); - blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(getDynamicPropertiesStore() - .getLatestSolidifiedBlockNum()); + blockLogTriggerCapsule.setLatestSolidifiedBlockNumber(solidityBlkNum); if (!triggerCapsuleQueue.offer(blockLogTriggerCapsule)) { logger.info("Too many triggers, block trigger lost: {}.", capsule.getBlockId()); } @@ -2230,7 +2229,7 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { List capsuleList = new ArrayList<>(); if (EventPluginLoader.getInstance().isTransactionLogTriggerSolidified()) { - capsuleList = getCrossBlockCapsule(solidityBlkNum); + capsuleList = geContinuousBlockCapsule(solidityBlkNum); } else { // need to reset block capsuleList.add(blockCapsule); @@ -2242,9 +2241,10 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { } } - private List getCrossBlockCapsule(long solidityBlkNum) { + private List geContinuousBlockCapsule(long solidityBlkNum) { List capsuleList = new ArrayList<>(); long start = lastUsedSolidityNum < 0 ? (solidityBlkNum - 1) : lastUsedSolidityNum; + logger.info("Continuous block start:{}, end:{}", start +1, solidityBlkNum); for (long blockNum = start + 1; blockNum <= solidityBlkNum; blockNum++) { try { BlockCapsule capsule = chainBaseManager.getBlockByNum(blockNum); From bec6bc23580d71a19790033cb67aab22554a159c Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 3 Mar 2023 16:31:01 +0800 Subject: [PATCH 026/142] fix(db): add some log in geContinuousBlockCapsule --- framework/src/main/java/org/tron/core/db/Manager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 918eb0044b6..13764016a75 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -2244,7 +2244,9 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { private List geContinuousBlockCapsule(long solidityBlkNum) { List capsuleList = new ArrayList<>(); long start = lastUsedSolidityNum < 0 ? (solidityBlkNum - 1) : lastUsedSolidityNum; - logger.info("Continuous block start:{}, end:{}", start +1, solidityBlkNum); + if (solidityBlkNum - start > 1) { + logger.info("Continuous block start:{}, end:{}", start + 1, solidityBlkNum); + } for (long blockNum = start + 1; blockNum <= solidityBlkNum; blockNum++) { try { BlockCapsule capsule = chainBaseManager.getBlockByNum(blockNum); From 2016860056d94ceae502cdc291ecb4f733102de3 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Mon, 6 Mar 2023 15:34:15 +0800 Subject: [PATCH 027/142] feat(net): recover handshake check logic --- .../net/service/handshake/HandshakeService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 04ef5d1d5c5..6c9e53c3a98 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -36,6 +36,13 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } + TronNetService.getP2pService().updateNodeId(peer.getChannel(), msg.getFrom().getHexId()); + if (peer.isDisconnect()) { + logger.info("Duplicate Peer {}", peer.getInetSocketAddress()); + peer.disconnect(ReasonCode.DUPLICATE_PEER); + return; + } + if (!msg.valid()) { logger.warn("Peer {} invalid hello message parameters, " + "GenesisBlockId: {}, SolidBlockId: {}, HeadBlockId: {}", @@ -63,6 +70,14 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } + if (msg.getVersion() != Args.getInstance().getNodeP2pVersion()) { + logger.info("Peer {} different p2p version, peer->{}, me->{}", + peer.getInetSocketAddress(), msg.getVersion(), + Args.getInstance().getNodeP2pVersion()); + peer.disconnect(ReasonCode.INCOMPATIBLE_VERSION); + return; + } + if (!Arrays.equals(chainBaseManager.getGenesisBlockId().getBytes(), msg.getGenesisBlockId().getBytes())) { logger.info("Peer {} different genesis block, peer->{}, me->{}", From 5f66f93266b75513bf6ec050198bae37a5fe249e Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 6 Mar 2023 16:02:36 +0800 Subject: [PATCH 028/142] fix(net): update libp2p from test-v0.2.4 to test-v0.2.5 --- common/build.gradle | 2 +- .../tron/core/net/messagehandler/FetchInvDataMsgHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 530515f065a..644cb2536f2 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.4' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.5' compile project(":protocol") } diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java index 6b5b68b1d11..5e797c084b3 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/FetchInvDataMsgHandler.java @@ -133,7 +133,7 @@ private void check(PeerConnection peer, FetchInvDataMessage fetchInvDataMsg) thr if (type == MessageTypes.TRX) { for (Sha256Hash hash : fetchInvDataMsg.getHashList()) { if (peer.getAdvInvSpread().getIfPresent(new Item(hash, InventoryType.TRX)) == null) { - throw new P2pException(TypeEnum.BAD_MESSAGE, "not spread inv: {}" + hash); + throw new P2pException(TypeEnum.BAD_MESSAGE, "not spread inv: " + hash); } } int fetchCount = peer.getPeerStatistics().messageStatistics.tronInTrxFetchInvDataElement From 0f82f22e0807706aed213ac1676d4dd718ab2cf8 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 6 Mar 2023 17:16:38 +0800 Subject: [PATCH 029/142] fix(net): update libp2p from test-v0.2.5 to test-v0.2.6 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 644cb2536f2..0c10faff4bd 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.5' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.6' compile project(":protocol") } From f39f279442e8952cce374ceb6667e73d674fb89c Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 6 Mar 2023 18:21:38 +0800 Subject: [PATCH 030/142] update libp2p from test-v0.2.6 to test-v0.2.7 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 0c10faff4bd..f119fb5c5ea 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.6' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.7' compile project(":protocol") } From 7b4c8f3d5a149b57d442a200f2b421dd15dee258 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 6 Mar 2023 19:40:14 +0800 Subject: [PATCH 031/142] update libp2p from test-v0.2.7 to test-v0.2.8 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index f119fb5c5ea..69ba3c4efbb 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.7' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.8' compile project(":protocol") } From a21d46d944ecfaeefa8f3a83c5fea42f1acde577 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 7 Mar 2023 16:46:08 +0800 Subject: [PATCH 032/142] add two parametres in dns section of config.conf --- common/build.gradle | 2 +- .../src/main/java/org/tron/core/Constant.java | 2 ++ .../java/org/tron/core/config/args/Args.java | 22 +++++++++++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 69ba3c4efbb..1aa9aed7861 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.8' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.10' compile project(":protocol") } diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 7c0f0c40ee2..c8875c5fa56 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -107,6 +107,8 @@ public class Constant { public static final String NODE_DNS_TREE_URLS = "node.dns.treeUrls"; public static final String NODE_DNS_PUBLISH = "node.dns.publish"; public static final String NODE_DNS_DOMAIN = "node.dns.dnsDomain"; + public static final String NODE_DNS_CHANGE_THRESHOLD = "node.dns.changeThreshold"; + public static final String NODE_DNS_MAX_MERGE_SIZE = "node.dns.maxMergeSize"; public static final String NODE_DNS_PRIVATE = "node.dns.dnsPrivate"; public static final String NODE_DNS_KNOWN_URLS = "node.dns.knownUrls"; public static final String NODE_DNS_STATIC_NODES = "node.dns.staticNodes"; 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 7aa107cdc71..6cd5f04c524 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 @@ -820,7 +820,7 @@ public static void setParam(final String[] args, final String confFileName) { && config.getBoolean(Constant.NODE_IS_OPEN_FULL_TCP_DISCONNECT); PARAMETER.nodeDetectEnable = config.hasPath(Constant.NODE_DETECT_ENABLE) - && config.getBoolean(Constant.NODE_DETECT_ENABLE); + && config.getBoolean(Constant.NODE_DETECT_ENABLE); PARAMETER.maxTransactionPendingSize = config.hasPath(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE) ? config.getInt(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE) : 2000; @@ -872,7 +872,6 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.COMMITTEE_ALLOW_MARKET_TRANSACTION) ? config .getInt(Constant.COMMITTEE_ALLOW_MARKET_TRANSACTION) : 0; - PARAMETER.allowTransactionFeePool = config.hasPath(Constant.COMMITTEE_ALLOW_TRANSACTION_FEE_POOL) ? config .getInt(Constant.COMMITTEE_ALLOW_TRANSACTION_FEE_POOL) : 0; @@ -1300,6 +1299,25 @@ private static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Conf return null; } + if (config.hasPath(Constant.NODE_DNS_CHANGE_THRESHOLD)) { + double changeThreshold = config.getDouble(Constant.NODE_DNS_CHANGE_THRESHOLD); + if (changeThreshold > 0) { + publishConfig.setChangeThreshold(changeThreshold); + } else { + logger.error("Check {}, should be bigger than 0, default 0.1", + Constant.NODE_DNS_CHANGE_THRESHOLD); + } + } + + if (config.hasPath(Constant.NODE_DNS_MAX_MERGE_SIZE)) { + int maxMergeSize = config.getInt(Constant.NODE_DNS_MAX_MERGE_SIZE); + if (maxMergeSize >= 1 && maxMergeSize <= 5) { + publishConfig.setChangeThreshold(maxMergeSize); + } else { + logger.error("Check {}, should be [1~5], default 5", Constant.NODE_DNS_MAX_MERGE_SIZE); + } + } + if (config.hasPath(Constant.NODE_DNS_PRIVATE)) { publishConfig.setDnsPrivate(config.getString(Constant.NODE_DNS_PRIVATE)); } else { From 24f6c28d6b03157d8baec6e2b211ac34875fe261 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 8 Mar 2023 00:36:29 +0800 Subject: [PATCH 033/142] update libp2p from test-v0.2.10 to test-v0.2.11 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 1aa9aed7861..f2391f248e7 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.10' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.11' compile project(":protocol") } From bd8e07e15fb5803a22b8e91c2a3ab9bf87e59fce Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 8 Mar 2023 11:58:26 +0800 Subject: [PATCH 034/142] fix(net): don't filter address in static nodes --- .../java/org/tron/core/config/args/Args.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 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 6cd5f04c524..b2ec5b33dd1 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 @@ -915,11 +915,11 @@ public static void setParam(final String[] args, final String confFileName) { .getInt(Constant.NODE_VALID_CONTRACT_PROTO_THREADS) : Runtime.getRuntime().availableProcessors(); - PARAMETER.activeNodes = getInetSocketAddress(config, Constant.NODE_ACTIVE); + PARAMETER.activeNodes = getInetSocketAddress(config, Constant.NODE_ACTIVE, true); PARAMETER.passiveNodes = getInetAddress(config, Constant.NODE_PASSIVE); - PARAMETER.fastForwardNodes = getInetSocketAddress(config, Constant.NODE_FAST_FORWARD); + PARAMETER.fastForwardNodes = getInetSocketAddress(config, Constant.NODE_FAST_FORWARD, true); PARAMETER.maxFastForwardNum = config.hasPath(Constant.NODE_MAX_FAST_FORWARD_NUM) ? config .getInt(Constant.NODE_MAX_FAST_FORWARD_NUM) : 3; @@ -1186,7 +1186,7 @@ private static RateLimiterInitialization getRateLimiterFromConfig( } private static List getInetSocketAddress( - final com.typesafe.config.Config config, String path) { + final com.typesafe.config.Config config, String path, boolean filter) { List ret = new ArrayList<>(); if (!config.hasPath(path)) { return ret; @@ -1199,10 +1199,14 @@ private static List getInetSocketAddress( } String ip = inetSocketAddress.getAddress().getHostAddress(); int port = inetSocketAddress.getPort(); - if (!(PARAMETER.nodeDiscoveryBindIp.equals(ip) - || PARAMETER.nodeExternalIp.equals(ip) - || Constant.LOCAL_HOST.equals(ip)) - || PARAMETER.nodeListenPort != port) { + if (filter) { + if (!(PARAMETER.nodeDiscoveryBindIp.equals(ip) + || PARAMETER.nodeExternalIp.equals(ip) + || Constant.LOCAL_HOST.equals(ip)) + || PARAMETER.nodeListenPort != port) { + ret.add(inetSocketAddress); + } + } else { ret.add(inetSocketAddress); } } @@ -1330,7 +1334,8 @@ private static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Conf } if (config.hasPath(Constant.NODE_DNS_STATIC_NODES)) { - publishConfig.setStaticNodes(getInetSocketAddress(config, Constant.NODE_DNS_STATIC_NODES)); + publishConfig.setStaticNodes( + getInetSocketAddress(config, Constant.NODE_DNS_STATIC_NODES, false)); } if (config.hasPath(Constant.NODE_DNS_SERVER_TYPE)) { From 36e9ee281d171982e1ae317249a491f95a039201 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 8 Mar 2023 19:24:54 +0800 Subject: [PATCH 035/142] fix(db): remove variable useSolidity --- .../main/java/org/tron/core/db/Manager.java | 42 +++++-------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 13764016a75..3e665a924e4 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -242,7 +242,6 @@ public class Manager { private volatile long latestSolidityNumShutDown; @Getter private long lastUsedSolidityNum = -1; - private boolean useSolidity = false; @Getter private int maxFlushCount; @@ -531,18 +530,12 @@ public void init() { Thread triggerCapsuleProcessThread = new Thread(triggerCapsuleProcessLoop); triggerCapsuleProcessThread.setDaemon(true); triggerCapsuleProcessThread.start(); - if (eventPluginLoaded) { - useSolidity = EventPluginLoader.getInstance().isBlockLogTriggerSolidified() - | EventPluginLoader.getInstance().isTransactionLogTriggerEnable() - | EventPluginLoader.getInstance().isTransactionLogTriggerSolidified(); - } } // start json rpc filter process if (CommonParameter.getInstance().isJsonRpcFilterEnabled()) { Thread filterProcessThread = new Thread(filterProcessLoop); filterProcessThread.start(); - useSolidity |= CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable(); } //initStoreFactory @@ -2039,7 +2032,7 @@ private void postSolidityFilter(final long oldSolidNum, final long latestSolidif return; } - List capsuleList = geContinuousBlockCapsule(latestSolidifiedBlockNumber); + List capsuleList = getContinuousBlockCapsule(latestSolidifiedBlockNumber); for (BlockCapsule blockCapsule : capsuleList) { postBlockFilter(blockCapsule, true); postLogsFilter(blockCapsule, true, false); @@ -2060,20 +2053,11 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi } if (eventPluginLoaded && EventPluginLoader.getInstance().isSolidityTriggerEnable()) { - List capsuleList = geContinuousBlockCapsule(latestSolidifiedBlockNumber); - long solidifiedTime = -1; - if (!capsuleList.isEmpty()) { - BlockCapsule blockCapsule = capsuleList.get(capsuleList.size() - 1); - if (blockCapsule.getNum() == latestSolidifiedBlockNumber) { - solidifiedTime = blockCapsule.getTimeStamp(); - } - } + List capsuleList = getContinuousBlockCapsule(latestSolidifiedBlockNumber); for (BlockCapsule blockCapsule : capsuleList) { SolidityTriggerCapsule solidityTriggerCapsule = new SolidityTriggerCapsule(blockCapsule.getNum());//unique key - if (solidifiedTime >= 0) { - solidityTriggerCapsule.setTimeStamp(solidifiedTime); - } + solidityTriggerCapsule.setTimeStamp(blockCapsule.getTimeStamp()); boolean result = triggerCapsuleQueue.offer(solidityTriggerCapsule); if (!result) { logger.info("Too many trigger, lost solidified trigger, block number: {}.", @@ -2085,10 +2069,7 @@ private void postSolidityTrigger(final long oldSolidNum, final long latestSolidi if (CommonParameter.getInstance().isJsonRpcHttpSolidityNodeEnable()) { postSolidityFilter(oldSolidNum, latestSolidifiedBlockNumber); } - - if (useSolidity) { - lastUsedSolidityNum = latestSolidifiedBlockNumber; - } + lastUsedSolidityNum = latestSolidifiedBlockNumber; } private void processTransactionTrigger(BlockCapsule newBlock) { @@ -2199,7 +2180,6 @@ private void postLogsFilter(final BlockCapsule blockCapsule, boolean solidified, } private void postBlockTrigger(final BlockCapsule blockCapsule) { - // post block and logs for jsonrpc if (CommonParameter.getInstance().isJsonRpcHttpFullNodeEnable()) { postBlockFilter(blockCapsule, false); @@ -2211,7 +2191,7 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { if (eventPluginLoaded && EventPluginLoader.getInstance().isBlockLogTriggerEnable()) { List capsuleList = new ArrayList<>(); if (EventPluginLoader.getInstance().isBlockLogTriggerSolidified()) { - capsuleList = geContinuousBlockCapsule(solidityBlkNum); + capsuleList = getContinuousBlockCapsule(solidityBlkNum); } else { capsuleList.add(blockCapsule); } @@ -2229,7 +2209,7 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { if (eventPluginLoaded && EventPluginLoader.getInstance().isTransactionLogTriggerEnable()) { List capsuleList = new ArrayList<>(); if (EventPluginLoader.getInstance().isTransactionLogTriggerSolidified()) { - capsuleList = geContinuousBlockCapsule(solidityBlkNum); + capsuleList = getContinuousBlockCapsule(solidityBlkNum); } else { // need to reset block capsuleList.add(blockCapsule); @@ -2241,13 +2221,13 @@ private void postBlockTrigger(final BlockCapsule blockCapsule) { } } - private List geContinuousBlockCapsule(long solidityBlkNum) { + private List getContinuousBlockCapsule(long solidityBlkNum) { List capsuleList = new ArrayList<>(); - long start = lastUsedSolidityNum < 0 ? (solidityBlkNum - 1) : lastUsedSolidityNum; - if (solidityBlkNum - start > 1) { - logger.info("Continuous block start:{}, end:{}", start + 1, solidityBlkNum); + long start = lastUsedSolidityNum < 0 ? solidityBlkNum : (lastUsedSolidityNum + 1); + if (solidityBlkNum > start) { + logger.info("Continuous block start:{}, end:{}", start, solidityBlkNum); } - for (long blockNum = start + 1; blockNum <= solidityBlkNum; blockNum++) { + for (long blockNum = start; blockNum <= solidityBlkNum; blockNum++) { try { BlockCapsule capsule = chainBaseManager.getBlockByNum(blockNum); capsuleList.add(capsule); From daa656d595db1503e384b180be2bdcd89a6d9783 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 8 Mar 2023 19:28:01 +0800 Subject: [PATCH 036/142] fix(db): update log of getContinuousBlockCapsule --- framework/src/main/java/org/tron/core/db/Manager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 3e665a924e4..4e277e9c00b 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -2232,7 +2232,7 @@ private List getContinuousBlockCapsule(long solidityBlkNum) { BlockCapsule capsule = chainBaseManager.getBlockByNum(blockNum); capsuleList.add(capsule); } catch (Exception e) { - logger.error("GetCrossBlockCapsule getBlockByNum blkNum = {} except, error is {}.", + logger.error("GetContinuousBlockCapsule getBlockByNum blkNum = {} except, error is {}.", solidityBlkNum, e.getMessage()); } } From c104e6a63efd61f288457ecc8159a7cf4e300a5c Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 9 Mar 2023 16:15:02 +0800 Subject: [PATCH 037/142] update libp2p from test-v0.2.11 to test-v0.2.12 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index f2391f248e7..b31c841bb99 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.11' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.12' compile project(":protocol") } From 4bb4f248501974b78bd51b3563170d32c84354d2 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 9 Mar 2023 20:42:53 +0800 Subject: [PATCH 038/142] fix(db): add a config item: node.enableIpv6 --- common/build.gradle | 2 +- .../java/org/tron/common/parameter/CommonParameter.java | 3 +++ common/src/main/java/org/tron/core/Constant.java | 2 +- .../src/main/java/org/tron/core/config/args/Args.java | 4 ++++ .../src/main/java/org/tron/core/net/TronNetService.java | 9 ++++++--- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index b31c841bb99..07f9483d8e6 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.12' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.13' compile project(":protocol") } 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 c1eb8d0e489..ad956895bc1 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -191,6 +191,9 @@ public class CommonParameter { public String p2pNodeId; @Getter @Setter + public boolean nodeEnableIpv6 = false; + @Getter + @Setter public List dnsTreeUrls; @Getter @Setter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index c8875c5fa56..ec921f1a858 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -103,7 +103,7 @@ public class Constant { public static final String NODE_P2P_PING_INTERVAL = "node.p2p.pingInterval"; public static final String NODE_P2P_VERSION = "node.p2p.version"; - + public static final String NODE_ENABLE_IPV6 = "node.enableIpv6"; public static final String NODE_DNS_TREE_URLS = "node.dns.treeUrls"; public static final String NODE_DNS_PUBLISH = "node.dns.publish"; public static final String NODE_DNS_DOMAIN = "node.dns.dnsDomain"; 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 b2ec5b33dd1..7a497bddfc9 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 @@ -141,6 +141,7 @@ public static void clearParam() { PARAMETER.nodeDiscoveryPingTimeout = 15000; PARAMETER.nodeP2pPingInterval = 0L; PARAMETER.nodeP2pVersion = 0; + PARAMETER.nodeEnableIpv6 = false; PARAMETER.dnsTreeUrls = new ArrayList<>(); PARAMETER.dnsPublishConfig = null; PARAMETER.rpcPort = 0; @@ -639,6 +640,9 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_P2P_VERSION) ? config.getInt(Constant.NODE_P2P_VERSION) : 0; + PARAMETER.nodeEnableIpv6 = + config.hasPath(Constant.NODE_ENABLE_IPV6) && config.getBoolean(Constant.NODE_ENABLE_IPV6); + PARAMETER.dnsTreeUrls = config.hasPath(Constant.NODE_DNS_TREE_URLS) ? config.getStringList( Constant.NODE_DNS_TREE_URLS) : new ArrayList<>(); diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index fe1347a8ebc..912b73bd273 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -159,11 +159,14 @@ private P2pConfig getConfig() { config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); config.setNodeDetectEnable(parameter.isNodeDetectEnable()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); - if (StringUtil.isNullOrEmpty(config.getIp()) && StringUtil.isNullOrEmpty(config.getIpv6())) { + if (StringUtil.isNullOrEmpty(config.getIp())) { config.setIp(parameter.getNodeExternalIp()); } - logger.debug("Local ipv4: {}", config.getIp()); - logger.debug("Local ipv6: {}", config.getIpv6()); + if (!parameter.nodeEnableIpv6) { + config.setIpv6(null); + } + logger.info("Local ipv4: {}", config.getIp()); + logger.info("Local ipv6: {}", config.getIpv6()); config.setTreeUrls(parameter.getDnsTreeUrls()); if (Objects.nonNull(parameter.getDnsPublishConfig())) { config.setPublishConfig(parameter.getDnsPublishConfig()); From 6f27050a7ea4d73049ba36053b3790a8a411193c Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 10 Mar 2023 11:01:58 +0800 Subject: [PATCH 039/142] remove local ipv6 from active nodes --- .../src/main/java/org/tron/core/config/args/Args.java | 2 +- .../src/main/java/org/tron/core/net/TronNetService.java | 8 +++++--- 2 files changed, 6 insertions(+), 4 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 7a497bddfc9..308f1071619 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 @@ -1320,7 +1320,7 @@ private static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Conf if (config.hasPath(Constant.NODE_DNS_MAX_MERGE_SIZE)) { int maxMergeSize = config.getInt(Constant.NODE_DNS_MAX_MERGE_SIZE); if (maxMergeSize >= 1 && maxMergeSize <= 5) { - publishConfig.setChangeThreshold(maxMergeSize); + publishConfig.setMaxMergeSize(maxMergeSize); } else { logger.error("Check {}, should be [1~5], default 5", Constant.NODE_DNS_MAX_MERGE_SIZE); } diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 912b73bd273..687c2595735 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -1,12 +1,12 @@ package org.tron.core.net; -import io.netty.util.internal.StringUtil; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; import java.util.Objects; import lombok.Getter; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.common.overlay.message.Message; @@ -19,7 +19,6 @@ import org.tron.core.net.peer.PeerStatusCheck; import org.tron.core.net.service.adv.AdvService; import org.tron.core.net.service.fetchblock.FetchBlockService; -import org.tron.core.net.service.keepalive.KeepAliveService; import org.tron.core.net.service.nodepersist.NodePersistService; import org.tron.core.net.service.relay.RelayService; import org.tron.core.net.service.statistics.TronStatsManager; @@ -159,9 +158,12 @@ private P2pConfig getConfig() { config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); config.setNodeDetectEnable(parameter.isNodeDetectEnable()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); - if (StringUtil.isNullOrEmpty(config.getIp())) { + if (StringUtils.isEmpty(config.getIp())) { config.setIp(parameter.getNodeExternalIp()); } + if (StringUtils.isNotEmpty(config.getIpv6())) { + config.getActiveNodes().remove(new InetSocketAddress(config.getIpv6(), config.getPort())); + } if (!parameter.nodeEnableIpv6) { config.setIpv6(null); } From b909e3bd99180c0e15d2f34b14403180df6189d8 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 13 Mar 2023 17:47:18 +0800 Subject: [PATCH 040/142] update libp2p from test-v0.2.13 to test-v0.2.14 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 07f9483d8e6..ad58e68ac31 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.13' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.14' compile project(":protocol") } From 53b6d6bd26446359123098da4bca77c3eb11ee72 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 13 Mar 2023 20:05:59 +0800 Subject: [PATCH 041/142] fix(net): set ip to null if node doesn't has ipv4 stack --- .../java/org/tron/core/net/TronNetService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 687c2595735..2bcb42f6133 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -1,9 +1,11 @@ package org.tron.core.net; +import java.net.Inet4Address; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Set; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -25,6 +27,7 @@ import org.tron.core.net.service.sync.SyncService; import org.tron.p2p.P2pConfig; import org.tron.p2p.P2pService; +import org.tron.p2p.utils.NetUtil; @Slf4j(topic = "net") @Component @@ -121,6 +124,17 @@ public int fastBroadcastTransaction(TransactionMessage msg) { return advService.fastBroadcastTransaction(msg); } + private boolean hasIpv4Stack() { + Set ipSet = NetUtil.getAllLocalAddress(); + for (String ip : ipSet) { + InetSocketAddress inetSocketAddress = new InetSocketAddress(ip, 10000); + if (inetSocketAddress.getAddress() instanceof Inet4Address) { + return true; + } + } + return false; + } + private P2pConfig getConfig() { List seeds = new ArrayList<>(); seeds.addAll(nodePersistService.dbRead()); @@ -158,7 +172,7 @@ private P2pConfig getConfig() { config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); config.setNodeDetectEnable(parameter.isNodeDetectEnable()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); - if (StringUtils.isEmpty(config.getIp())) { + if (StringUtils.isEmpty(config.getIp()) && hasIpv4Stack()) { config.setIp(parameter.getNodeExternalIp()); } if (StringUtils.isNotEmpty(config.getIpv6())) { From cebdb364b51fa408c2a8e330b90d6364826b7cc8 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 14 Mar 2023 12:53:54 +0800 Subject: [PATCH 042/142] fix(net): use [ipv6]:port instead of ipv6:port --- common/build.gradle | 2 +- .../java/org/tron/core/config/args/Args.java | 27 +++++-------------- .../org/tron/core/net/TronNetService.java | 14 +++++++--- .../test/java/org/tron/core/net/NodeTest.java | 16 ++++++----- 4 files changed, 27 insertions(+), 32 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index ad58e68ac31..14a6f8fdc16 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.14' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.15' compile project(":protocol") } 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 308f1071619..702ef3d5e0d 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 @@ -75,6 +75,7 @@ import org.tron.keystore.WalletUtils; import org.tron.p2p.dns.update.DnsType; import org.tron.p2p.dns.update.PublishConfig; +import org.tron.p2p.utils.NetUtil; import org.tron.program.Version; @Slf4j(topic = "app") @@ -1197,7 +1198,7 @@ private static List getInetSocketAddress( } List list = config.getStringList(path); for (String configString : list) { - InetSocketAddress inetSocketAddress = parseInetSocketAddress(configString); + InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(configString); if (inetSocketAddress == null) { continue; } @@ -1218,17 +1219,16 @@ private static List getInetSocketAddress( } private static List getInetAddress( - final com.typesafe.config.Config config, String path) { + final com.typesafe.config.Config config, String path) { List ret = new ArrayList<>(); if (!config.hasPath(path)) { return ret; } List list = config.getStringList(path); for (String configString : list) { - try { - ret.add(InetAddress.getByName(configString.split(":")[0])); - } catch (Exception e) { - logger.warn("Get inet address failed, {}", e.getMessage()); + InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(configString); + if (inetSocketAddress != null) { + ret.add(inetSocketAddress.getAddress()); } } return ret; @@ -1653,20 +1653,5 @@ public String getOutputDirectory() { } return this.outputDirectory; } - - public static InetSocketAddress parseInetSocketAddress(String para) { - InetSocketAddress address = null; - int index = para.lastIndexOf(":"); - if (index > 0) { - String host = para.substring(0, index); - try { - int port = Integer.parseInt(para.substring(index + 1)); - address = new InetSocketAddress(host, port); - } catch (RuntimeException e) { - logger.error("Invalid inetSocketAddress: {}", para); - } - } - return address; - } } diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 2bcb42f6133..d9bc96c5918 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -1,7 +1,9 @@ package org.tron.core.net; import java.net.Inet4Address; +import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -127,8 +129,14 @@ public int fastBroadcastTransaction(TransactionMessage msg) { private boolean hasIpv4Stack() { Set ipSet = NetUtil.getAllLocalAddress(); for (String ip : ipSet) { - InetSocketAddress inetSocketAddress = new InetSocketAddress(ip, 10000); - if (inetSocketAddress.getAddress() instanceof Inet4Address) { + InetAddress inetAddress; + try { + inetAddress = InetAddress.getByName(ip); + } catch (UnknownHostException e) { + logger.warn("Get inet address failed, {}", e.getMessage()); + continue; + } + if (inetAddress instanceof Inet4Address) { return true; } } @@ -139,7 +147,7 @@ private P2pConfig getConfig() { List seeds = new ArrayList<>(); seeds.addAll(nodePersistService.dbRead()); for (String s : parameter.getSeedNode().getIpList()) { - InetSocketAddress inetSocketAddress = Args.parseInetSocketAddress(s); + InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(s); if (inetSocketAddress != null) { seeds.add(inetSocketAddress); } diff --git a/framework/src/test/java/org/tron/core/net/NodeTest.java b/framework/src/test/java/org/tron/core/net/NodeTest.java index f97f147193b..90f441c42bf 100644 --- a/framework/src/test/java/org/tron/core/net/NodeTest.java +++ b/framework/src/test/java/org/tron/core/net/NodeTest.java @@ -6,8 +6,8 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Test; -import org.tron.core.config.args.Args; import org.tron.p2p.discover.Node; +import org.tron.p2p.utils.NetUtil; import org.tron.protos.Discover.Endpoint; @Slf4j @@ -15,18 +15,20 @@ public class NodeTest { @Test public void testIpV4() { - InetSocketAddress address1 = Args.parseInetSocketAddress("192.168.0.1:18888"); + InetSocketAddress address1 = NetUtil.parseInetSocketAddress("192.168.0.1:18888"); Assert.assertNotNull(address1); - InetSocketAddress address2 = Args.parseInetSocketAddress("192.168.0.1"); + InetSocketAddress address2 = NetUtil.parseInetSocketAddress("192.168.0.1"); Assert.assertNull(address2); } @Test public void testIpV6() { - InetSocketAddress address1 = Args.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb:18888"); - Assert.assertNotNull(address1); - InetSocketAddress address2 = Args.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb"); - Assert.assertNull(address2); + InetSocketAddress address1 = NetUtil.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb:18888"); + Assert.assertNull(address1); + InetSocketAddress address2 = NetUtil.parseInetSocketAddress("[fe80::216:3eff:fe0e:23bb]:18888"); + Assert.assertNotNull(address2); + InetSocketAddress address3 = NetUtil.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb"); + Assert.assertNull(address3); } @Test From fcf3366a47479d1f2fb530ce9123a9901cc5e875 Mon Sep 17 00:00:00 2001 From: guoquanwu Date: Mon, 13 Mar 2023 19:15:52 +0800 Subject: [PATCH 043/142] fix(json-rpc): fix address generation of contract which created by `create2` --- .../services/jsonrpc/TronJsonRpcImpl.java | 1 + .../tron/common/runtime/vm/Create2Test.java | 24 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java index 453710b931b..9b9dbbdfe70 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/TronJsonRpcImpl.java @@ -496,6 +496,7 @@ public String getStorageAt(String address, String storageIdx, String blockNumOrT StorageRowStore store = manager.getStorageRowStore(); Storage storage = new Storage(addressByte, store); storage.setContractVersion(smartContract.getVersion()); + storage.generateAddrHash(smartContract.getTrxHash().toByteArray()); DataWord value = storage.getValue(new DataWord(ByteArray.fromHexString(storageIdx))); return ByteArray.toJsonHex(value == null ? new byte[32] : value.getData()); diff --git a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java index 137bb180dc0..074b157f115 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/Create2Test.java @@ -11,11 +11,16 @@ import org.testng.Assert; import org.tron.common.runtime.TVMTestResult; import org.tron.common.runtime.TvmTestUtils; +import org.tron.common.utils.ByteArray; import org.tron.common.utils.WalletUtil; +import org.tron.core.Wallet; import org.tron.core.exception.ContractExeException; import org.tron.core.exception.ContractValidateException; +import org.tron.core.exception.JsonRpcInvalidParamsException; import org.tron.core.exception.ReceiptCheckErrException; import org.tron.core.exception.VMIllegalException; +import org.tron.core.services.NodeInfoService; +import org.tron.core.services.jsonrpc.TronJsonRpcImpl; import org.tron.protos.Protocol.Transaction; import stest.tron.wallet.common.client.utils.AbiUtil; import stest.tron.wallet.common.client.utils.DataWord; @@ -171,7 +176,8 @@ public void testCreate2() // trigger deployed contract String methodToTrigger = "plusOne()"; - for (int i = 1; i < 3; i++) { + long loop = 2; + for (int i = 1; i <= loop; i++) { hexInput = AbiUtil.parseMethod(methodToTrigger, Collections.emptyList()); result = TvmTestUtils .triggerContractAndReturnTvmTestResult(Hex.decode(OWNER_ADDRESS), @@ -179,6 +185,22 @@ public void testCreate2() Assert.assertNull(result.getRuntime().getRuntimeError()); Assert.assertEquals(result.getRuntime().getResult().getHReturn(), new DataWord(i).getData()); } + testJsonRpc(actualContract, loop); + } + + private void testJsonRpc(byte[] actualContract, long loop) { + TronJsonRpcImpl tronJsonRpc; + NodeInfoService nodeInfoService; + nodeInfoService = context.getBean(NodeInfoService.class); + Wallet wallet = context.getBean(Wallet.class); + tronJsonRpc = new TronJsonRpcImpl(nodeInfoService, wallet, manager); + try { + String res = + tronJsonRpc.getStorageAt(ByteArray.toHexString(actualContract), "0", "latest"); + Assert.assertEquals(loop, ByteArray.jsonHexToLong(res)); + } catch (JsonRpcInvalidParamsException e) { + Assert.fail(); + } } /* From 72fde485616b0f4c40e3b06c26abe98a5c25379b Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 14 Mar 2023 14:08:28 +0800 Subject: [PATCH 044/142] fix(net): update libp2p from test-v0.2.15 to test-v0.2.16 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 14a6f8fdc16..e229ef2119b 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.15' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.16' compile project(":protocol") } From 9b233e3a70b605b4b51aff44ca90ed00333a9052 Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 14 Mar 2023 15:52:04 +0800 Subject: [PATCH 045/142] feat(interface): optimize TriggerSmartContract and TriggerConstantContract - support call_data parameter - support deploying contract for TriggerConstantContract --- .../http/TriggerConstantContractServlet.java | 38 +++++++++++-------- .../http/TriggerSmartContractServlet.java | 30 ++++++++------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java b/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java index 4c4b6908a6e..1baed135039 100644 --- a/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java @@ -27,7 +27,11 @@ @Slf4j(topic = "API") public class TriggerConstantContractServlet extends RateLimiterServlet { - private final String functionSelector = "function_selector"; + private final String OWNER_ADDRESS = "owner_address"; + private final String CONTRACT_ADDRESS = "contract_address"; + private final String FUNCTION_SELECTOR = "function_selector"; + private final String FUNCTION_PARAMETER = "parameter"; + private final String CALL_DATA = "data"; @Autowired private Wallet wallet; @@ -37,13 +41,19 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) { protected void validateParameter(String contract) { JSONObject jsonObject = JSONObject.parseObject(contract); - if (!jsonObject.containsKey("owner_address") - || StringUtil.isNullOrEmpty(jsonObject.getString("owner_address"))) { - throw new InvalidParameterException("owner_address isn't set."); + if (StringUtil.isNullOrEmpty(jsonObject.getString(OWNER_ADDRESS))) { + throw new InvalidParameterException(OWNER_ADDRESS + " isn't set."); } - if (!jsonObject.containsKey("contract_address") - || StringUtil.isNullOrEmpty(jsonObject.getString("contract_address"))) { - throw new InvalidParameterException("contract_address isn't set."); + if (StringUtil.isNullOrEmpty(jsonObject.getString(CONTRACT_ADDRESS))) { + if (StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { + throw new InvalidParameterException("At least one of " + + CONTRACT_ADDRESS + " and " + CALL_DATA + " must be set."); + } + } + if (!StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)) + && !StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { + throw new InvalidParameterException("Only one of " + + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); } } @@ -62,17 +72,15 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) JsonFormat.merge(contract, build, visible); JSONObject jsonObject = JSONObject.parseObject(contract); - boolean isFunctionSelectorSet = jsonObject.containsKey(functionSelector) - && !StringUtil.isNullOrEmpty(jsonObject.getString(functionSelector)); - String data; + boolean isFunctionSelectorSet = + !StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)); if (isFunctionSelectorSet) { - String selector = jsonObject.getString(functionSelector); - String parameter = jsonObject.getString("parameter"); - data = Util.parseMethod(selector, parameter); + String selector = jsonObject.getString(FUNCTION_SELECTOR); + String parameter = jsonObject.getString(FUNCTION_PARAMETER); + String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); - } else { - build.setData(ByteString.copyFrom(new byte[0])); } + TransactionCapsule trxCap = wallet .createTransactionCapsule(build.build(), ContractType.TriggerSmartContract); diff --git a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java index 345475cbec5..23481fff8e8 100644 --- a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java @@ -27,7 +27,11 @@ @Slf4j(topic = "API") public class TriggerSmartContractServlet extends RateLimiterServlet { - private final String functionSelector = "function_selector"; + private final String OWNER_ADDRESS = "owner_address"; + private final String CONTRACT_ADDRESS = "contract_address"; + private final String FUNCTION_SELECTOR = "function_selector"; + private final String FUNCTION_PARAMETER = "parameter"; + private final String CALL_DATA = "data"; @Autowired private Wallet wallet; @@ -37,14 +41,17 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) { protected void validateParameter(String contract) { JSONObject jsonObject = JSONObject.parseObject(contract); - if (!jsonObject.containsKey("owner_address") - || StringUtil.isNullOrEmpty(jsonObject.getString("owner_address"))) { + if (StringUtil.isNullOrEmpty(jsonObject.getString(OWNER_ADDRESS))) { throw new InvalidParameterException("owner_address isn't set."); } - if (!jsonObject.containsKey("contract_address") - || StringUtil.isNullOrEmpty(jsonObject.getString("contract_address"))) { + if (StringUtil.isNullOrEmpty(jsonObject.getString(CONTRACT_ADDRESS))) { throw new InvalidParameterException("contract_address isn't set."); } + if (!StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)) + && !StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { + throw new InvalidParameterException("Only one of " + + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); + } } protected void doPost(HttpServletRequest request, HttpServletResponse response) @@ -62,16 +69,13 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) JsonFormat.merge(contract, build, visible); JSONObject jsonObject = JSONObject.parseObject(contract); - boolean isFunctionSelectorSet = jsonObject.containsKey(functionSelector) - && !StringUtil.isNullOrEmpty(jsonObject.getString(functionSelector)); - String data; + boolean isFunctionSelectorSet = + !StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)); if (isFunctionSelectorSet) { - String selector = jsonObject.getString(functionSelector); - String parameter = jsonObject.getString("parameter"); - data = Util.parseMethod(selector, parameter); + String selector = jsonObject.getString(FUNCTION_SELECTOR); + String parameter = jsonObject.getString(FUNCTION_PARAMETER); + String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); - } else { - build.setData(ByteString.copyFrom(new byte[0])); } build.setCallTokenValue(Util.getJsonLongValue(jsonObject, "call_token_value")); From 46ea86631264e93881f8708d8b3a5a93abdf155a Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 14 Mar 2023 17:52:10 +0800 Subject: [PATCH 046/142] fix(net):update libp2p from test-v0.2.16 to test-v0.2.17 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index e229ef2119b..329676bf560 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.16' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.17' compile project(":protocol") } From 437ebb1e273a9d8f5f01b4664d942b02483ddcae Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 14 Mar 2023 19:34:48 +0800 Subject: [PATCH 047/142] fix(net): check seed ip's format in class Args --- .../org/tron/core/config/args/SeedNode.java | 3 ++- .../java/org/tron/core/config/args/Args.java | 26 ++++++++++++++----- .../org/tron/core/net/TronNetService.java | 9 +------ .../tron/core/services/NodeInfoService.java | 4 +-- .../org/tron/core/config/args/ArgsTest.java | 2 +- .../core/metrics/MetricsApiServiceTest.java | 2 +- .../test/java/org/tron/core/net/BaseNet.java | 2 +- 7 files changed, 27 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/org/tron/core/config/args/SeedNode.java b/common/src/main/java/org/tron/core/config/args/SeedNode.java index 6597110074d..9420d969789 100644 --- a/common/src/main/java/org/tron/core/config/args/SeedNode.java +++ b/common/src/main/java/org/tron/core/config/args/SeedNode.java @@ -1,5 +1,6 @@ package org.tron.core.config.args; +import java.net.InetSocketAddress; import java.util.List; import lombok.Getter; import lombok.Setter; @@ -8,5 +9,5 @@ public class SeedNode { @Getter @Setter - private List ipList; + private List addressList; } 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 702ef3d5e0d..5c887ec37d2 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 @@ -523,9 +523,7 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.storage.setCacheStrategies(config); PARAMETER.seedNode = new SeedNode(); - PARAMETER.seedNode.setIpList(Optional.ofNullable(PARAMETER.seedNodes) - .filter(seedNode -> 0 != seedNode.size()) - .orElse(config.getStringList(Constant.SEED_NODE_IP_LIST))); + PARAMETER.seedNode.setAddressList(loadSeeds(config)); if (config.hasPath(Constant.GENESIS_BLOCK)) { PARAMETER.genesisBlock = new GenesisBlock(); @@ -1202,9 +1200,9 @@ private static List getInetSocketAddress( if (inetSocketAddress == null) { continue; } - String ip = inetSocketAddress.getAddress().getHostAddress(); - int port = inetSocketAddress.getPort(); if (filter) { + String ip = inetSocketAddress.getAddress().getHostAddress(); + int port = inetSocketAddress.getPort(); if (!(PARAMETER.nodeDiscoveryBindIp.equals(ip) || PARAMETER.nodeExternalIp.equals(ip) || Constant.LOCAL_HOST.equals(ip)) @@ -1293,6 +1291,22 @@ private static EventPluginConfig getEventPluginConfig( return eventPluginConfig; } + private static List loadSeeds(final com.typesafe.config.Config config) { + List inetSocketAddressList = new ArrayList<>(); + if (PARAMETER.seedNodes != null && !PARAMETER.seedNodes.isEmpty()) { + for (String s : PARAMETER.seedNodes) { + InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(s); + if (inetSocketAddress != null) { + inetSocketAddressList.add(inetSocketAddress); + } + } + } else { + inetSocketAddressList = getInetSocketAddress(config, Constant.SEED_NODE_IP_LIST, false); + } + + return inetSocketAddressList; + } + private static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Config config) { PublishConfig publishConfig = new PublishConfig(); if (config.hasPath(Constant.NODE_DNS_PUBLISH)) { @@ -1598,7 +1612,7 @@ public static void logConfig() { logger.info("Passive node size: {}", parameter.getPassiveNodes().size()); logger.info("FastForward node size: {}", parameter.getFastForwardNodes().size()); logger.info("FastForward node number: {}", parameter.getMaxFastForwardNum()); - logger.info("Seed node size: {}", parameter.getSeedNode().getIpList().size()); + logger.info("Seed node size: {}", parameter.getSeedNode().getAddressList().size()); logger.info("Max connection: {}", parameter.getMaxConnections()); logger.info("Min connection: {}", parameter.getMinConnections()); logger.info("Min active connection: {}", parameter.getMinActiveConnections()); diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index d9bc96c5918..f886b06bfab 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -4,7 +4,6 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; -import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Set; @@ -144,14 +143,8 @@ private boolean hasIpv4Stack() { } private P2pConfig getConfig() { - List seeds = new ArrayList<>(); + List seeds = parameter.getSeedNode().getAddressList(); seeds.addAll(nodePersistService.dbRead()); - for (String s : parameter.getSeedNode().getIpList()) { - InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(s); - if (inetSocketAddress != null) { - seeds.add(inetSocketAddress); - } - } for (InetSocketAddress inetSocketAddress : seeds) { logger.debug("Seed InetSocketAddress: {}", inetSocketAddress); } diff --git a/framework/src/main/java/org/tron/core/services/NodeInfoService.java b/framework/src/main/java/org/tron/core/services/NodeInfoService.java index b08f0107760..ddf72c64410 100644 --- a/framework/src/main/java/org/tron/core/services/NodeInfoService.java +++ b/framework/src/main/java/org/tron/core/services/NodeInfoService.java @@ -27,12 +27,10 @@ import org.tron.common.prometheus.MetricTime; import org.tron.core.ChainBaseManager; import org.tron.core.db.Manager; -import org.tron.core.net.P2pEventHandlerImpl; import org.tron.core.net.TronNetService; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.peer.PeerManager; import org.tron.core.net.service.statistics.NodeStatistics; -import org.tron.core.net.service.statistics.PeerStatistics; import org.tron.core.services.WitnessProductBlockService.CheatWitnessInfo; import org.tron.p2p.P2pConfig; import org.tron.p2p.P2pService; @@ -180,7 +178,7 @@ private void setConfigNodeInfo(NodeInfo nodeInfo) { configNodeInfo.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); configNodeInfo.setActiveNodeSize(parameter.getActiveNodes().size()); configNodeInfo.setPassiveNodeSize(parameter.getPassiveNodes().size()); - configNodeInfo.setSendNodeSize(parameter.getSeedNode().getIpList().size()); + configNodeInfo.setSendNodeSize(parameter.getSeedNode().getAddressList().size()); configNodeInfo.setMaxConnectCount(parameter.getMaxConnections()); configNodeInfo.setSameIpMaxConnectCount(parameter.getMaxConnectionsWithSameIp()); configNodeInfo.setBackupListenPort(parameter.getBackupPort()); 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 5768fc0b1d8..20d9e979fee 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 @@ -51,7 +51,7 @@ public void get() { Assert.assertEquals("database", parameter.getStorage().getDbDirectory()); - Assert.assertEquals(11, parameter.getSeedNode().getIpList().size()); + Assert.assertEquals(11, parameter.getSeedNode().getAddressList().size()); GenesisBlock genesisBlock = parameter.getGenesisBlock(); diff --git a/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java b/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java index dfe658080fc..714faea05d9 100644 --- a/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java +++ b/framework/src/test/java/org/tron/core/metrics/MetricsApiServiceTest.java @@ -45,7 +45,7 @@ public void init() { ); CommonParameter parameter = Args.getInstance(); parameter.setNodeListenPort(port); - parameter.getSeedNode().getIpList().clear(); + parameter.getSeedNode().getAddressList().clear(); parameter.setNodeExternalIp("127.0.0.1"); context = new TronApplicationContext(DefaultConfig.class); appT = ApplicationFactory.create(context); diff --git a/framework/src/test/java/org/tron/core/net/BaseNet.java b/framework/src/test/java/org/tron/core/net/BaseNet.java index bb7ca85ef7f..ca42dc2a65e 100644 --- a/framework/src/test/java/org/tron/core/net/BaseNet.java +++ b/framework/src/test/java/org/tron/core/net/BaseNet.java @@ -89,7 +89,7 @@ public void run() { ); CommonParameter parameter = Args.getInstance(); parameter.setNodeListenPort(port); - parameter.getSeedNode().getIpList().clear(); + parameter.getSeedNode().getAddressList().clear(); parameter.setNodeExternalIp(Constant.LOCAL_HOST); context = new TronApplicationContext(DefaultConfig.class); appT = ApplicationFactory.create(context); From 50082a1eba1b6b7046d856fa452f0638e71f7e7b Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 16 Mar 2023 15:29:57 +0800 Subject: [PATCH 048/142] feat(net): add global rate limiter function --- .../common/parameter/CommonParameter.java | 6 ++++ .../src/main/java/org/tron/core/Constant.java | 4 +++ .../java/org/tron/core/config/args/Args.java | 10 ++++++ .../services/http/RateLimiterServlet.java | 7 +++- .../ratelimiter/GlobalRateLimiter.java | 35 +++++++++++++++++++ .../ratelimiter/RateLimiterInterceptor.java | 5 ++- .../org/tron/common/config/args/ArgsTest.java | 2 ++ 7 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/services/ratelimiter/GlobalRateLimiter.java 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 ab04ca3e7a4..0c05733fec1 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -398,6 +398,12 @@ public class CommonParameter { @Setter public RateLimiterInitialization rateLimiterInitialization; @Getter + @Setter + public int rateLimiterGlobalQps; + @Getter + @Setter + public int rateLimiterGlobalIpQps; + @Getter public DbBackupConfig dbBackupConfig; @Getter public RocksDbSettings rocksDBCustomSettings; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 408782752f2..cd0de4d478d 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -235,6 +235,10 @@ public class Constant { public static final String RATE_LIMITER = "rate.limiter"; + public static final String RATE_LIMITER_GLOBAL_QPS = "rate.limiter.global.qps"; + + public static final String RATE_LIMITER_GLOBAL_IP_QPS = "rate.limiter.global.ip.qps"; + public static final String COMMITTEE_CHANGED_DELEGATION = "committee.changedDelegation"; public static final String CRYPTO_ENGINE = "crypto.engine"; 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 8e6a7526362..3d2c2e8a66a 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 @@ -221,6 +221,8 @@ public static void clearParam() { PARAMETER.allowNewRewardAlgorithm = 0; PARAMETER.allowNewReward = 0; PARAMETER.memoFee = 0; + PARAMETER.rateLimiterGlobalQps = 3000; + PARAMETER.rateLimiterGlobalIpQps = 30; } /** @@ -927,6 +929,14 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.fullNodeAllowShieldedTransactionArgs = true; } + PARAMETER.rateLimiterGlobalQps = + config.hasPath(Constant.RATE_LIMITER_GLOBAL_QPS) ? config + .getInt(Constant.RATE_LIMITER_GLOBAL_QPS) : 3000; + + PARAMETER.rateLimiterGlobalIpQps = + config.hasPath(Constant.RATE_LIMITER_GLOBAL_IP_QPS) ? config + .getInt(Constant.RATE_LIMITER_GLOBAL_IP_QPS) : 30; + PARAMETER.rateLimiterInitialization = config.hasPath(Constant.RATE_LIMITER) ? getRateLimiterFromConfig(config) : new RateLimiterInitialization(); diff --git a/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java b/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java index 53eb1067fd3..eb8b7b86257 100644 --- a/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/RateLimiterServlet.java @@ -16,6 +16,7 @@ import org.tron.common.prometheus.MetricLabels; import org.tron.common.prometheus.Metrics; import org.tron.core.config.args.Args; +import org.tron.core.services.ratelimiter.GlobalRateLimiter; import org.tron.core.services.ratelimiter.RateLimiterContainer; import org.tron.core.services.ratelimiter.RuntimeData; import org.tron.core.services.ratelimiter.adapter.DefaultBaseQqsAdapter; @@ -91,12 +92,16 @@ private void addRateContainer() { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + RuntimeData runtimeData = new RuntimeData(req); + GlobalRateLimiter.acquire(runtimeData); + IRateLimiter rateLimiter = container.get(KEY_PREFIX_HTTP, getClass().getSimpleName()); boolean acquireResource = true; if (rateLimiter != null) { - acquireResource = rateLimiter.acquire(new RuntimeData(req)); + acquireResource = rateLimiter.acquire(runtimeData); } String url = Strings.isNullOrEmpty(req.getRequestURI()) ? MetricLabels.UNDEFINED : req.getRequestURI(); diff --git a/framework/src/main/java/org/tron/core/services/ratelimiter/GlobalRateLimiter.java b/framework/src/main/java/org/tron/core/services/ratelimiter/GlobalRateLimiter.java new file mode 100644 index 00000000000..a3b1638ac95 --- /dev/null +++ b/framework/src/main/java/org/tron/core/services/ratelimiter/GlobalRateLimiter.java @@ -0,0 +1,35 @@ +package org.tron.core.services.ratelimiter; + +import com.google.common.base.Strings; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.util.concurrent.RateLimiter; +import java.util.concurrent.TimeUnit; +import org.tron.core.config.args.Args; + +public class GlobalRateLimiter { + + private static double QPS = Args.getInstance().getRateLimiterGlobalQps(); + + private static double IP_QPS = Args.getInstance().getRateLimiterGlobalIpQps(); + + private static Cache cache = CacheBuilder.newBuilder() + .maximumSize(10000).expireAfterWrite(1, TimeUnit.HOURS).build(); + + private static RateLimiter rateLimiter = RateLimiter.create(QPS); + + public static void acquire(RuntimeData runtimeData) { + rateLimiter.acquire(); + String ip = runtimeData.getRemoteAddr(); + if (Strings.isNullOrEmpty(ip)) { + return; + } + RateLimiter r = cache.getIfPresent(ip); + if (r == null) { + r = RateLimiter.create(IP_QPS); + cache.put(ip, r); + } + r.acquire(); + } + +} diff --git a/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java b/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java index a74f89df517..d629ae05abd 100644 --- a/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java +++ b/framework/src/main/java/org/tron/core/services/ratelimiter/RateLimiterInterceptor.java @@ -107,10 +107,13 @@ public Listener interceptCall(ServerCall call, IRateLimiter rateLimiter = container .get(KEY_PREFIX_RPC, call.getMethodDescriptor().getFullMethodName()); + RuntimeData runtimeData = new RuntimeData(call); + GlobalRateLimiter.acquire(runtimeData); + boolean acquireResource = true; if (rateLimiter != null) { - acquireResource = rateLimiter.acquire(new RuntimeData(call)); + acquireResource = rateLimiter.acquire(runtimeData); } Listener listener = new ServerCall.Listener() { diff --git a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java index 5b391f0d38d..feeb628e035 100644 --- a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java @@ -30,5 +30,7 @@ public void testConfig() { Assert.assertEquals(Args.getInstance().getNodeDiscoveryPingTimeout(), 15_000); Assert.assertEquals(Args.getInstance().getMaxFastForwardNum(), 3); Assert.assertEquals(Args.getInstance().getBlockCacheTimeout(), 60); + Assert.assertEquals(Args.getInstance().getRateLimiterGlobalQps(), 3000); + Assert.assertEquals(Args.getInstance().getRateLimiterGlobalIpQps(), 30); } } \ No newline at end of file From dac20fc92112f57d6d944c28ba905f23025efa59 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 16 Mar 2023 17:51:50 +0800 Subject: [PATCH 049/142] fix(net): add some test case --- .../java/org/tron/core/config/args/Args.java | 2 +- .../org/tron/core/net/TronNetService.java | 5 +- .../test/java/org/tron/core/net/NodeTest.java | 55 +++++++++++++++++-- 3 files changed, 52 insertions(+), 10 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 5c887ec37d2..70a3174748e 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 @@ -1307,7 +1307,7 @@ private static List loadSeeds(final com.typesafe.config.Confi return inetSocketAddressList; } - private static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Config config) { + public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Config config) { PublishConfig publishConfig = new PublishConfig(); if (config.hasPath(Constant.NODE_DNS_PUBLISH)) { publishConfig.setDnsPublishEnable(config.getBoolean(Constant.NODE_DNS_PUBLISH)); diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index f886b06bfab..561c3cbae9e 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -125,8 +125,7 @@ public int fastBroadcastTransaction(TransactionMessage msg) { return advService.fastBroadcastTransaction(msg); } - private boolean hasIpv4Stack() { - Set ipSet = NetUtil.getAllLocalAddress(); + public static boolean hasIpv4Stack(Set ipSet) { for (String ip : ipSet) { InetAddress inetAddress; try { @@ -173,7 +172,7 @@ private P2pConfig getConfig() { config.setDisconnectionPolicyEnable(parameter.isOpenFullTcpDisconnect()); config.setNodeDetectEnable(parameter.isNodeDetectEnable()); config.setDiscoverEnable(parameter.isNodeDiscoveryEnable()); - if (StringUtils.isEmpty(config.getIp()) && hasIpv4Stack()) { + if (StringUtils.isEmpty(config.getIp()) && hasIpv4Stack(NetUtil.getAllLocalAddress())) { config.setIp(parameter.getNodeExternalIp()); } if (StringUtils.isNotEmpty(config.getIpv6())) { diff --git a/framework/src/test/java/org/tron/core/net/NodeTest.java b/framework/src/test/java/org/tron/core/net/NodeTest.java index 90f441c42bf..ac01a46dbc8 100644 --- a/framework/src/test/java/org/tron/core/net/NodeTest.java +++ b/framework/src/test/java/org/tron/core/net/NodeTest.java @@ -2,11 +2,20 @@ import static org.tron.core.net.message.handshake.HelloMessage.getEndpointFromNode; +import com.typesafe.config.Config; import java.net.InetSocketAddress; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Test; +import org.tron.core.Constant; +import org.tron.core.config.Configuration; +import org.tron.core.config.args.Args; import org.tron.p2p.discover.Node; +import org.tron.p2p.dns.update.PublishConfig; import org.tron.p2p.utils.NetUtil; import org.tron.protos.Discover.Endpoint; @@ -17,18 +26,44 @@ public class NodeTest { public void testIpV4() { InetSocketAddress address1 = NetUtil.parseInetSocketAddress("192.168.0.1:18888"); Assert.assertNotNull(address1); - InetSocketAddress address2 = NetUtil.parseInetSocketAddress("192.168.0.1"); - Assert.assertNull(address2); + try { + NetUtil.parseInetSocketAddress("192.168.0.1"); + Assert.fail(); + } catch (RuntimeException e) { + Assert.assertTrue(true); + } } @Test public void testIpV6() { - InetSocketAddress address1 = NetUtil.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb:18888"); - Assert.assertNull(address1); + try { + NetUtil.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb:18888"); + Assert.fail(); + } catch (RuntimeException e) { + Assert.assertTrue(true); + } InetSocketAddress address2 = NetUtil.parseInetSocketAddress("[fe80::216:3eff:fe0e:23bb]:18888"); Assert.assertNotNull(address2); - InetSocketAddress address3 = NetUtil.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb"); - Assert.assertNull(address3); + try { + NetUtil.parseInetSocketAddress("fe80::216:3eff:fe0e:23bb"); + Assert.fail(); + } catch (RuntimeException e) { + Assert.assertTrue(true); + } + } + + @Test + public void testIpStack() { + Set ipSet = new HashSet<>(Collections.singletonList("192.168.0.1")); + Assert.assertTrue(TronNetService.hasIpv4Stack(ipSet)); + ipSet = new HashSet<>(Collections.singletonList("127.0.0.1")); + Assert.assertTrue(TronNetService.hasIpv4Stack(ipSet)); + ipSet = new HashSet<>(Collections.singletonList("fe80:0:0:0:0:0:0:1")); + Assert.assertFalse(TronNetService.hasIpv4Stack(ipSet)); + ipSet = new HashSet<>(Arrays.asList("127.0.0.1", "fe80:0:0:0:0:0:0:1")); + Assert.assertTrue(TronNetService.hasIpv4Stack(ipSet)); + ipSet = new HashSet<>(Collections.emptyList()); + Assert.assertFalse(TronNetService.hasIpv4Stack(ipSet)); } @Test @@ -39,4 +74,12 @@ public void testEndpointFromNode() { Assert.assertTrue(endpoint.getAddress().isEmpty()); Assert.assertTrue(endpoint.getAddressIpv6().isEmpty()); } + + @Test + public void testPublishConfig() { + Config config = Configuration.getByFileName(Constant.TEST_CONF, Constant.TEST_CONF); + PublishConfig publishConfig = Args.loadDnsPublishConfig(config); + assert publishConfig != null; + Assert.assertFalse(publishConfig.isDnsPublishEnable()); + } } From 248496ec9005b3f05392e0fe2803901c36974e89 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 16 Mar 2023 18:09:05 +0800 Subject: [PATCH 050/142] feat(net): add EffectiveService to get effective connection --- common/build.gradle | 2 +- .../org/tron/core/net/TronNetService.java | 6 + .../service/effective/EffectiveService.java | 156 ++++++++++++++++++ .../service/handshake/HandshakeService.java | 21 +++ 4 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java diff --git a/common/build.gradle b/common/build.gradle index 329676bf560..bd5b400ae38 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.17' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v1' compile project(":protocol") } diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index f886b06bfab..ec082ae38cf 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -21,6 +21,7 @@ import org.tron.core.net.peer.PeerManager; import org.tron.core.net.peer.PeerStatusCheck; import org.tron.core.net.service.adv.AdvService; +import org.tron.core.net.service.effective.EffectiveService; import org.tron.core.net.service.fetchblock.FetchBlockService; import org.tron.core.net.service.nodepersist.NodePersistService; import org.tron.core.net.service.relay.RelayService; @@ -69,6 +70,9 @@ public class TronNetService { @Autowired private RelayService relayService; + @Autowired + private EffectiveService effectiveService; + private volatile boolean init; private static void setP2pConfig(P2pConfig config) { @@ -90,6 +94,7 @@ public void start() { tronStatsManager.init(); PeerManager.init(); relayService.init(); + effectiveService.init(); logger.info("Net service start successfully"); } catch (Exception e) { logger.error("Net service start failed", e); @@ -110,6 +115,7 @@ public void close() { fetchBlockService.close(); p2pService.close(); relayService.close(); + effectiveService.close(); logger.info("Net service closed successfully"); } diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java new file mode 100644 index 00000000000..78c33d7af21 --- /dev/null +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java @@ -0,0 +1,156 @@ +package org.tron.core.net.service.effective; + + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import io.netty.channel.ChannelFutureListener; +import java.net.InetSocketAddress; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import lombok.Getter; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.core.net.TronNetDelegate; +import org.tron.core.net.TronNetService; +import org.tron.core.net.peer.PeerConnection; +import org.tron.p2p.discover.Node; +import org.tron.p2p.utils.NetUtil; +import org.tron.protos.Protocol.ReasonCode; + +@Slf4j(topic = "net") +@Component +public class EffectiveService { + + @Autowired + private TronNetDelegate tronNetDelegate; + + private final Cache nodesCache = CacheBuilder.newBuilder() + .initialCapacity(100) + .maximumSize(1000) + .expireAfterWrite(10, TimeUnit.MINUTES).build(); + @Getter + private InetSocketAddress cur = null; + private final AtomicInteger tryCount = new AtomicInteger(0); + @Setter + private boolean found = false; + + private final ScheduledExecutorService executor = Executors + .newSingleThreadScheduledExecutor( + new ThreadFactoryBuilder().setNameFormat("effective-thread-%d").build()); + + public void init() { + executor.scheduleWithFixedDelay(() -> { + try { + findEffectiveNode(); + } catch (Exception e) { + logger.error("Check effective connection processing failed", e); + } + }, 1 * 60, 5, TimeUnit.SECONDS); + } + + public void close() { + try { + executor.shutdownNow(); + } catch (Exception e) { + logger.error("Exception in shutdown effective service worker, {}", e.getMessage()); + } + } + + public boolean isIsolateLand() { + int count = (int) tronNetDelegate.getActivePeer().stream() + .filter(PeerConnection::isNeedSyncFromUs) + .count(); + return count == tronNetDelegate.getActivePeer().size(); + } + + private synchronized void findEffectiveNode() throws InterruptedException { + if (!isIsolateLand()) { + resetCount(); + return; + } + if (found) { + Thread.sleep(10_000);//wait found node to sync + if (isIsolateLand()) { + found = false; + disconnect(); + } + return; + } + + //hashcode of PeerConnection = hashcode of InetSocketAddress + if (cur != null && tronNetDelegate.getActivePeer().contains(cur)) { + // we encounter no effective connection again, so we disconnect with last used node + disconnect(); + return; + } + + List tableNodes = TronNetService.getP2pService().getAllNodes(); + for (Node node : tableNodes) { + if (node.getId() == null) { + node.setId(NetUtil.getNodeId()); + } + } + + Optional chosenNode = tableNodes.stream() + .filter(node -> nodesCache.getIfPresent(node.getPreferInetSocketAddress()) == null) + .filter(node -> !TronNetService.getP2pConfig().getActiveNodes() + .contains(node.getPreferInetSocketAddress())) + .findFirst(); + if (!chosenNode.isPresent()) { + logger.warn("Failed to find effective node, have tried {} times", tryCount.get()); + resetCount(); + return; + } + + tryCount.incrementAndGet(); + nodesCache.put(chosenNode.get().getPreferInetSocketAddress(), true); + cur = new InetSocketAddress(chosenNode.get().getPreferInetSocketAddress().getAddress(), + chosenNode.get().getPreferInetSocketAddress().getPort()); + + logger.info("Try to get effective connection by using {} at times {}", cur, + tryCount.get()); + TronNetService.getP2pService().connect(chosenNode.get(), future -> { + if (future.isCancelled()) { + // Connection attempt cancelled by user + } else if (!future.isSuccess()) { + // You might get a NullPointerException here because the future might not be completed yet. + logger.warn("Connect to chosen peer {} fail, cause:{}", + chosenNode.get().getPreferInetSocketAddress(), future.cause().getMessage()); + future.channel().close(); + + findEffectiveNode(); + } else { + // Connection established successfully + future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { + logger.info("Close chosen channel:{}", chosenNode.get().getPreferInetSocketAddress()); + if (isIsolateLand()) { + findEffectiveNode(); + } + }); + } + }); + } + + public void resetCount() { + tryCount.set(0); + } + + public int getCount() { + return tryCount.get(); + } + + private void disconnect() { + tronNetDelegate.getActivePeer().forEach(p -> { + if (p.getInetSocketAddress().equals(cur)) { + p.disconnect(ReasonCode.UNKNOWN); + } + }); + } +} diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 6c9e53c3a98..e269ea67734 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -11,6 +11,7 @@ import org.tron.core.net.message.handshake.HelloMessage; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.peer.PeerManager; +import org.tron.core.net.service.effective.EffectiveService; import org.tron.core.net.service.relay.RelayService; import org.tron.p2p.discover.Node; import org.tron.protos.Protocol.ReasonCode; @@ -22,6 +23,9 @@ public class HandshakeService { @Autowired private RelayService relayService; + @Autowired + private EffectiveService effectiveService; + @Autowired private ChainBaseManager chainBaseManager; @@ -98,6 +102,23 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } + if (peer.getInetSocketAddress().equals(effectiveService.getCur())) { + if (effectiveService.isIsolateLand() + && msg.getSolidBlockId().getNum() <= chainBaseManager.getSolidBlockId().getNum()) { + logger.info("Peer's solid block {} is below than we, peer->{}, me->{}", + peer.getInetSocketAddress(), + msg.getSolidBlockId().getNum(), + chainBaseManager.getSolidBlockId().getNum()); + peer.disconnect(ReasonCode.UNKNOWN); + return; + } else { + logger.info("Success to find effective node {} at times {}", + peer.getInetSocketAddress(), effectiveService.getCount()); + effectiveService.setFound(true); + effectiveService.resetCount(); + } + } + peer.setHelloMessageReceive(msg); peer.getChannel().updateAvgLatency( From 05e4232dbf09bec0e35ec564f69f8e2c37b17a9e Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 17 Mar 2023 13:09:29 +0800 Subject: [PATCH 051/142] fix(net): add ReasonCode BELOW_THAN_ME --- .../service/effective/EffectiveService.java | 33 +++++++++---------- .../service/handshake/HandshakeService.java | 2 +- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java index 78c33d7af21..43686fa505f 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java @@ -1,6 +1,5 @@ package org.tron.core.net.service.effective; - import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder; @@ -36,8 +35,8 @@ public class EffectiveService { .maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES).build(); @Getter - private InetSocketAddress cur = null; - private final AtomicInteger tryCount = new AtomicInteger(0); + private InetSocketAddress cur; + private final AtomicInteger count = new AtomicInteger(0); @Setter private boolean found = false; @@ -64,10 +63,9 @@ public void close() { } public boolean isIsolateLand() { - int count = (int) tronNetDelegate.getActivePeer().stream() + return (int) tronNetDelegate.getActivePeer().stream() .filter(PeerConnection::isNeedSyncFromUs) - .count(); - return count == tronNetDelegate.getActivePeer().size(); + .count() == tronNetDelegate.getActivePeer().size(); } private synchronized void findEffectiveNode() throws InterruptedException { @@ -84,8 +82,8 @@ private synchronized void findEffectiveNode() throws InterruptedException { return; } - //hashcode of PeerConnection = hashcode of InetSocketAddress - if (cur != null && tronNetDelegate.getActivePeer().contains(cur)) { + if (cur != null && tronNetDelegate.getActivePeer().stream() + .anyMatch(p -> p.getInetSocketAddress().equals(cur))) { // we encounter no effective connection again, so we disconnect with last used node disconnect(); return; @@ -104,32 +102,31 @@ private synchronized void findEffectiveNode() throws InterruptedException { .contains(node.getPreferInetSocketAddress())) .findFirst(); if (!chosenNode.isPresent()) { - logger.warn("Failed to find effective node, have tried {} times", tryCount.get()); + logger.warn("Failed to find effective node, have tried {} times", count.get()); resetCount(); return; } - tryCount.incrementAndGet(); + count.incrementAndGet(); nodesCache.put(chosenNode.get().getPreferInetSocketAddress(), true); cur = new InetSocketAddress(chosenNode.get().getPreferInetSocketAddress().getAddress(), chosenNode.get().getPreferInetSocketAddress().getPort()); - logger.info("Try to get effective connection by using {} at times {}", cur, - tryCount.get()); + logger.info("Try to get effective connection by using {} at times {}", cur, count.get()); TronNetService.getP2pService().connect(chosenNode.get(), future -> { if (future.isCancelled()) { // Connection attempt cancelled by user + logger.warn("Channel {} has been cancelled by user", cur); } else if (!future.isSuccess()) { // You might get a NullPointerException here because the future might not be completed yet. - logger.warn("Connect to chosen peer {} fail, cause:{}", - chosenNode.get().getPreferInetSocketAddress(), future.cause().getMessage()); + logger.warn("Connect to chosen peer {} fail, cause:{}", cur, future.cause().getMessage()); future.channel().close(); findEffectiveNode(); } else { // Connection established successfully future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { - logger.info("Close chosen channel:{}", chosenNode.get().getPreferInetSocketAddress()); + logger.info("Close chosen channel:{}", cur); if (isIsolateLand()) { findEffectiveNode(); } @@ -139,17 +136,17 @@ private synchronized void findEffectiveNode() throws InterruptedException { } public void resetCount() { - tryCount.set(0); + count.set(0); } public int getCount() { - return tryCount.get(); + return count.get(); } private void disconnect() { tronNetDelegate.getActivePeer().forEach(p -> { if (p.getInetSocketAddress().equals(cur)) { - p.disconnect(ReasonCode.UNKNOWN); + p.disconnect(ReasonCode.BELOW_THAN_ME); } }); } diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index e269ea67734..a3bc241f9a9 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -109,7 +109,7 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { peer.getInetSocketAddress(), msg.getSolidBlockId().getNum(), chainBaseManager.getSolidBlockId().getNum()); - peer.disconnect(ReasonCode.UNKNOWN); + peer.disconnect(ReasonCode.BELOW_THAN_ME); return; } else { logger.info("Success to find effective node {} at times {}", From 4e3814af23762a7887e2498aa2efadd9b70aa8f8 Mon Sep 17 00:00:00 2001 From: Asuka Date: Fri, 17 Mar 2023 15:36:10 +0800 Subject: [PATCH 052/142] feat(interface): add block number and block hash to the result of call constant contract --- framework/src/main/java/org/tron/core/Wallet.java | 6 +++++- protocol/src/main/protos/api/api.proto | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 6d9b12608c5..d834d4ae661 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3011,7 +3011,8 @@ public Transaction callConstantContract(TransactionCapsule trxCap, headBlock = blockCapsuleList.get(0).getInstance(); } - TransactionContext context = new TransactionContext(new BlockCapsule(headBlock), trxCap, + BlockCapsule headBlockCapsule = new BlockCapsule(headBlock); + TransactionContext context = new TransactionContext(headBlockCapsule, trxCap, StoreFactory.getInstance(), true, false); VMActuator vmActuator = new VMActuator(true); @@ -3028,6 +3029,9 @@ public Transaction callConstantContract(TransactionCapsule trxCap, TransactionResultCapsule ret = new TransactionResultCapsule(); builder.setEnergyUsed(result.getEnergyUsed()); builder.setEnergyPenalty(result.getEnergyPenaltyTotal()); + builder.setBlockNumber(headBlockCapsule.getNum()); + builder.setBlockHash(ByteString.copyFrom(headBlockCapsule.getBlockId().getBytes())); + builder.setEnergyPenalty(result.getEnergyPenaltyTotal()); builder.addConstantResult(ByteString.copyFrom(result.getHReturn())); result.getLogInfoList().forEach(logInfo -> builder.addLogs(LogInfo.buildLog(logInfo))); diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index 48cd64acc5b..13dbeee4389 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -1315,6 +1315,8 @@ message TransactionExtention { repeated TransactionInfo.Log logs = 6; repeated InternalTransaction internal_transactions = 7; int64 energy_penalty = 8; + int64 block_number = 9; + bytes block_hash = 10; } message EstimateEnergyMessage { From ba8331bddf230d17cb90d066d2400fdae4a815b6 Mon Sep 17 00:00:00 2001 From: guoquanwu Date: Fri, 17 Mar 2023 13:15:41 +0800 Subject: [PATCH 053/142] fix(test): fix port unavaliable when running unit test --- .../org/tron/common/utils/PublicMethod.java | 10 +++ .../LiteFnQueryGrpcInterceptorTest.java | 16 ++++- .../filter/RpcApiAccessInterceptorTest.java | 4 ++ .../tron/program/LiteFullNodeToolTest.java | 65 ++++++++++--------- 4 files changed, 61 insertions(+), 34 deletions(-) diff --git a/framework/src/test/java/org/tron/common/utils/PublicMethod.java b/framework/src/test/java/org/tron/common/utils/PublicMethod.java index b61ea6c8c4d..3c945b47530 100644 --- a/framework/src/test/java/org/tron/common/utils/PublicMethod.java +++ b/framework/src/test/java/org/tron/common/utils/PublicMethod.java @@ -2,6 +2,8 @@ import com.google.protobuf.ByteString; import java.math.BigInteger; +import java.util.Random; + import org.tron.api.GrpcAPI; import org.tron.api.WalletGrpc; import org.tron.common.crypto.ECKey; @@ -102,4 +104,12 @@ public static GrpcAPI.Return broadcastTransaction( } return response; } + + public static int chooseRandomPort(int min, int max) { + return new Random().nextInt(max - min + 1) + min; + } + + public static int chooseRandomPort() { + return new Random().nextInt(65530 - 1024) + 1024; + } } diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java index 5e5d7d807ae..77eb9a00cab 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryGrpcInterceptorTest.java @@ -4,6 +4,8 @@ import io.grpc.ManagedChannelBuilder; import io.grpc.StatusRuntimeException; import java.io.File; +import java.util.concurrent.TimeUnit; + import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -20,6 +22,7 @@ import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.PublicMethod; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; @@ -38,7 +41,6 @@ public class LiteFnQueryGrpcInterceptorTest { private WalletGrpc.WalletBlockingStub blockingStubFull = null; private WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubSolidity = null; private WalletSolidityGrpc.WalletSolidityBlockingStub blockingStubpBFT = null; - private DatabaseGrpc.DatabaseBlockingStub databaseBlockingStub = null; private RpcApiService rpcApiService; private RpcApiServiceOnSolidity rpcApiServiceOnSolidity; private RpcApiServiceOnPBFT rpcApiServiceOnPBFT; @@ -56,6 +58,9 @@ public class LiteFnQueryGrpcInterceptorTest { @Before public void init() { Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); + Args.getInstance().setRpcPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); String fullnode = String.format("%s:%d", Args.getInstance().getNodeDiscoveryBindIp(), Args.getInstance().getRpcPort()); String pBFTNode = String.format("%s:%d", Args.getInstance().getNodeDiscoveryBindIp(), @@ -71,7 +76,6 @@ public void init() { blockingStubSolidity = WalletSolidityGrpc.newBlockingStub(channelFull); blockingStubpBFT = WalletSolidityGrpc.newBlockingStub(channelpBFT); blockingStubSolidity = WalletSolidityGrpc.newBlockingStub(channelFull); - databaseBlockingStub = DatabaseGrpc.newBlockingStub(channelFull); rpcApiService = context.getBean(RpcApiService.class); rpcApiServiceOnSolidity = context.getBean(RpcApiServiceOnSolidity.class); rpcApiServiceOnPBFT = context.getBean(RpcApiServiceOnPBFT.class); @@ -89,7 +93,13 @@ public void init() { * destroy the context. */ @After - public void destroy() { + public void destroy() throws InterruptedException { + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } + if (channelpBFT != null) { + channelpBFT.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } Args.clearParam(); appTest.shutdownServices(); appTest.shutdown(); diff --git a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java index c3ef7265f65..5560d9b9397 100644 --- a/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/RpcApiAccessInterceptorTest.java @@ -22,6 +22,7 @@ import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.PublicMethod; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; @@ -51,6 +52,9 @@ public class RpcApiAccessInterceptorTest { @BeforeClass public static void init() { Args.setParam(new String[] {"-d", dbPath}, Constant.TEST_CONF); + Args.getInstance().setRpcPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcOnSolidityPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setRpcOnPBFTPort(PublicMethod.chooseRandomPort()); String fullNode = String.format("%s:%d", Args.getInstance().getNodeDiscoveryBindIp(), Args.getInstance().getRpcPort()); String solidityNode = String.format("%s:%d", Args.getInstance().getNodeDiscoveryBindIp(), diff --git a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java index 4549b2cde4d..2c91c2f8b9a 100644 --- a/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java +++ b/framework/src/test/java/org/tron/program/LiteFullNodeToolTest.java @@ -1,11 +1,11 @@ package org.tron.program; -import com.google.protobuf.ByteString; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import java.io.File; -import java.math.BigInteger; import java.nio.file.Paths; +import java.util.concurrent.TimeUnit; + import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -13,7 +13,6 @@ import org.junit.rules.ExpectedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.tron.api.GrpcAPI; import org.tron.api.WalletGrpc; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; @@ -23,15 +22,11 @@ import org.tron.common.utils.FileUtil; import org.tron.common.utils.PublicMethod; import org.tron.common.utils.Utils; -import org.tron.core.Wallet; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; import org.tron.core.services.RpcApiService; import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity; -import org.tron.protos.Protocol; -import org.tron.protos.contract.BalanceContract; import org.tron.tool.litefullnode.LiteFullNodeTool; -import stest.tron.wallet.common.client.utils.TransactionUtils; public class LiteFullNodeToolTest { @@ -39,6 +34,7 @@ public class LiteFullNodeToolTest { private TronApplicationContext context; private WalletGrpc.WalletBlockingStub blockingStubFull = null; + private ManagedChannel channelFull; private Application appTest; private String databaseDir; @@ -47,7 +43,7 @@ public class LiteFullNodeToolTest { public ExpectedException thrown = ExpectedException.none(); - private static final String DB_PATH = "output_lite_fn"; + private static String dbPath = "output_lite_fn"; /** * init logic. @@ -63,7 +59,7 @@ public void startApp() { String fullnode = String.format("%s:%d", "127.0.0.1", Args.getInstance().getRpcPort()); - ManagedChannel channelFull = ManagedChannelBuilder.forTarget(fullnode) + channelFull = ManagedChannelBuilder.forTarget(fullnode) .usePlaintext(true) .build(); blockingStubFull = WalletGrpc.newBlockingStub(channelFull); @@ -86,18 +82,21 @@ public static void destroy(String dbPath) { /** * shutdown the fullnode. */ - public void shutdown() { + public void shutdown() throws InterruptedException { + if (channelFull != null) { + channelFull.shutdown().awaitTermination(5, TimeUnit.SECONDS); + } appTest.shutdownServices(); appTest.shutdown(); context.destroy(); } - @Before public void init() { - destroy(DB_PATH); // delete if prev failed - Args.setParam(new String[]{"-d", DB_PATH, "-w"}, "config-localtest.conf"); + destroy(dbPath); // delete if prev failed + Args.setParam(new String[]{"-d", dbPath, "-w"}, "config-localtest.conf"); // allow account root Args.getInstance().setAllowAccountStateRoot(1); + Args.getInstance().setRpcPort(PublicMethod.chooseRandomPort()); databaseDir = Args.getInstance().getStorage().getDbDirectory(); // init dbBackupConfig to avoid NPE Args.getInstance().dbBackupConfig = DbBackupConfig.getInstance(); @@ -105,40 +104,44 @@ public void init() { @After public void clear() { - destroy(DB_PATH); + destroy(dbPath); Args.clearParam(); + dbPath = "output_lite_fn"; } @Test - public void testToolsWithLevelDB() { + public void testToolsWithLevelDB() throws InterruptedException { logger.info("testToolsWithLevelDB start"); testTools("LEVELDB", 1); } @Test - public void testToolsWithLevelDBV2() { + public void testToolsWithLevelDBV2() throws InterruptedException { logger.info("testToolsWithLevelDB start"); testTools("LEVELDB", 2); } @Test - public void testToolsWithRocksDB() { + public void testToolsWithRocksDB() throws InterruptedException { logger.info("testToolsWithRocksDB start"); testTools("ROCKSDB", 1); } - private void testTools(String dbType, int checkpointVersion) { + private void testTools(String dbType, int checkpointVersion) + throws InterruptedException { + dbPath = String.format("%s_%s_%d", dbPath, dbType, System.currentTimeMillis()); + init(); final String[] argsForSnapshot = new String[]{"-o", "split", "-t", "snapshot", "--fn-data-path", - DB_PATH + File.separator + databaseDir, "--dataset-path", - DB_PATH}; + dbPath + File.separator + databaseDir, "--dataset-path", + dbPath}; final String[] argsForHistory = new String[]{"-o", "split", "-t", "history", "--fn-data-path", - DB_PATH + File.separator + databaseDir, "--dataset-path", - DB_PATH}; + dbPath + File.separator + databaseDir, "--dataset-path", + dbPath}; final String[] argsForMerge = - new String[]{"-o", "merge", "--fn-data-path", DB_PATH + File.separator + databaseDir, - "--dataset-path", DB_PATH + File.separator + "history"}; + new String[]{"-o", "merge", "--fn-data-path", dbPath + File.separator + databaseDir, + "--dataset-path", dbPath + File.separator + "history"}; Args.getInstance().getStorage().setDbEngine(dbType); Args.getInstance().getStorage().setCheckpointVersion(checkpointVersion); LiteFullNodeTool.setRecentBlks(3); @@ -149,7 +152,7 @@ private void testTools(String dbType, int checkpointVersion) { // stop the node shutdown(); // delete tran-cache - FileUtil.deleteDir(Paths.get(DB_PATH, databaseDir, "trans-cache").toFile()); + FileUtil.deleteDir(Paths.get(dbPath, databaseDir, "trans-cache").toFile()); // generate snapshot LiteFullNodeTool.main(argsForSnapshot); // start fullnode @@ -161,18 +164,18 @@ private void testTools(String dbType, int checkpointVersion) { // generate history LiteFullNodeTool.main(argsForHistory); // backup original database to database_bak - File database = new File(Paths.get(DB_PATH, databaseDir).toString()); - if (!database.renameTo(new File(Paths.get(DB_PATH, databaseDir + "_bak").toString()))) { + File database = new File(Paths.get(dbPath, databaseDir).toString()); + if (!database.renameTo(new File(Paths.get(dbPath, databaseDir + "_bak").toString()))) { throw new RuntimeException( String.format("rename %s to %s failed", database.getPath(), - Paths.get(DB_PATH, databaseDir).toString())); + Paths.get(dbPath, databaseDir).toString())); } // change snapshot to the new database - File snapshot = new File(Paths.get(DB_PATH, "snapshot").toString()); - if (!snapshot.renameTo(new File(Paths.get(DB_PATH, databaseDir).toString()))) { + File snapshot = new File(Paths.get(dbPath, "snapshot").toString()); + if (!snapshot.renameTo(new File(Paths.get(dbPath, databaseDir).toString()))) { throw new RuntimeException( String.format("rename snapshot to %s failed", - Paths.get(DB_PATH, databaseDir).toString())); + Paths.get(dbPath, databaseDir).toString())); } // start and validate the snapshot startApp(); From 998d7fb03cadef03ed0336d382434d9746ca7b0e Mon Sep 17 00:00:00 2001 From: Asuka Date: Fri, 17 Mar 2023 18:24:03 +0800 Subject: [PATCH 054/142] fix(interface): some conditions not suitable --- .../services/http/TriggerConstantContractServlet.java | 11 +++++------ .../services/http/TriggerSmartContractServlet.java | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java b/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java index 1baed135039..fa3336df5eb 100644 --- a/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java @@ -44,14 +44,13 @@ protected void validateParameter(String contract) { if (StringUtil.isNullOrEmpty(jsonObject.getString(OWNER_ADDRESS))) { throw new InvalidParameterException(OWNER_ADDRESS + " isn't set."); } - if (StringUtil.isNullOrEmpty(jsonObject.getString(CONTRACT_ADDRESS))) { - if (StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { - throw new InvalidParameterException("At least one of " - + CONTRACT_ADDRESS + " and " + CALL_DATA + " must be set."); - } + if (StringUtil.isNullOrEmpty(jsonObject.getString(CONTRACT_ADDRESS)) + && StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { + throw new InvalidParameterException("At least one of " + + CONTRACT_ADDRESS + " and " + CALL_DATA + " must be set."); } if (!StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)) - && !StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { + ^ StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { throw new InvalidParameterException("Only one of " + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); } diff --git a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java index 23481fff8e8..5ce27e7cd0b 100644 --- a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java @@ -48,7 +48,7 @@ protected void validateParameter(String contract) { throw new InvalidParameterException("contract_address isn't set."); } if (!StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)) - && !StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { + ^ StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { throw new InvalidParameterException("Only one of " + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); } From 9c98abfd04f3942ede88aa654cc375fd4edaf51b Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 20 Mar 2023 15:30:26 +0800 Subject: [PATCH 055/142] fix(net): merge 4.7.2 and update libp2p --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 329676bf560..6ce3c0bef41 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.17' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.19' compile project(":protocol") } From df2840e29f21a854061ff8622414b6e57a9abaf4 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 20 Mar 2023 17:30:56 +0800 Subject: [PATCH 056/142] feature(net): add config node.enableEffectiveCheck; add one ReasonCode --- .../common/parameter/CommonParameter.java | 6 +-- .../src/main/java/org/tron/core/Constant.java | 1 + .../java/org/tron/core/config/args/Args.java | 5 ++ .../org/tron/core/net/TronNetService.java | 8 ++-- ...ervice.java => EffectiveCheckService.java} | 47 +++++++++++-------- .../service/handshake/HandshakeService.java | 15 +++--- protocol/src/main/protos/core/Tron.proto | 1 + 7 files changed, 49 insertions(+), 34 deletions(-) rename framework/src/main/java/org/tron/core/net/service/effective/{EffectiveService.java => EffectiveCheckService.java} (81%) 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 ad956895bc1..0ba57c2050c 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -1,7 +1,5 @@ package org.tron.common.parameter; -import static org.tron.core.Constant.DYNAMIC_ENERGY_FACTOR_DECIMAL; - import com.beust.jcommander.Parameter; import java.net.InetAddress; import java.net.InetSocketAddress; @@ -9,7 +7,6 @@ import java.util.List; import java.util.Set; -import com.google.common.annotations.VisibleForTesting; import lombok.Getter; import lombok.Setter; import org.quartz.CronExpression; @@ -143,6 +140,9 @@ public class CommonParameter { public boolean nodeDiscoveryPersist; @Getter @Setter + public boolean nodeEffectiveCheckEnable; + @Getter + @Setter public int nodeConnectionTimeout; @Getter @Setter diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index ec921f1a858..efff664f38e 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -83,6 +83,7 @@ public class Constant { public static final String BLOCK_NEED_SYNC_CHECK = "block.needSyncCheck"; public static final String NODE_DISCOVERY_ENABLE = "node.discovery.enable"; public static final String NODE_DISCOVERY_PERSIST = "node.discovery.persist"; + public static final String NODE_ENABLE_EFFECTIVE_CHECK = "node.enableEffectiveCheck"; public static final String NODE_CONNECTION_TIMEOUT = "node.connection.timeout"; public static final String NODE_FETCH_BLOCK_TIMEOUT = "node.fetchBlock.timeout"; public static final String NODE_CHANNEL_READ_TIMEOUT = "node.channel.read.timeout"; 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 70a3174748e..29d33fec436 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 @@ -124,6 +124,7 @@ public static void clearParam() { PARAMETER.needSyncCheck = false; PARAMETER.nodeDiscoveryEnable = false; PARAMETER.nodeDiscoveryPersist = false; + PARAMETER.nodeEffectiveCheckEnable = true; PARAMETER.nodeConnectionTimeout = 2000; PARAMETER.activeNodes = new ArrayList<>(); PARAMETER.passiveNodes = new ArrayList<>(); @@ -554,6 +555,10 @@ public static void setParam(final String[] args, final String confFileName) { config.hasPath(Constant.NODE_DISCOVERY_PERSIST) && config.getBoolean(Constant.NODE_DISCOVERY_PERSIST); + PARAMETER.nodeEffectiveCheckEnable = + config.hasPath(Constant.NODE_ENABLE_EFFECTIVE_CHECK) + && config.getBoolean(Constant.NODE_ENABLE_EFFECTIVE_CHECK); + PARAMETER.nodeConnectionTimeout = config.hasPath(Constant.NODE_CONNECTION_TIMEOUT) ? config.getInt(Constant.NODE_CONNECTION_TIMEOUT) * 1000 diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index d92b794296d..ebd0b1b4114 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -21,7 +21,7 @@ import org.tron.core.net.peer.PeerManager; import org.tron.core.net.peer.PeerStatusCheck; import org.tron.core.net.service.adv.AdvService; -import org.tron.core.net.service.effective.EffectiveService; +import org.tron.core.net.service.effective.EffectiveCheckService; import org.tron.core.net.service.fetchblock.FetchBlockService; import org.tron.core.net.service.nodepersist.NodePersistService; import org.tron.core.net.service.relay.RelayService; @@ -71,7 +71,7 @@ public class TronNetService { private RelayService relayService; @Autowired - private EffectiveService effectiveService; + private EffectiveCheckService effectiveCheckService; private volatile boolean init; @@ -94,7 +94,7 @@ public void start() { tronStatsManager.init(); PeerManager.init(); relayService.init(); - effectiveService.init(); + effectiveCheckService.init(); logger.info("Net service start successfully"); } catch (Exception e) { logger.error("Net service start failed", e); @@ -115,7 +115,7 @@ public void close() { fetchBlockService.close(); p2pService.close(); relayService.close(); - effectiveService.close(); + effectiveCheckService.close(); logger.info("Net service closed successfully"); } diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java similarity index 81% rename from framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java rename to framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index 43686fa505f..c2d399bf1e5 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -16,6 +16,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.common.parameter.CommonParameter; import org.tron.core.net.TronNetDelegate; import org.tron.core.net.TronNetService; import org.tron.core.net.peer.PeerConnection; @@ -25,8 +26,11 @@ @Slf4j(topic = "net") @Component -public class EffectiveService { +public class EffectiveCheckService { + @Getter + private final boolean isEffectiveCheck = CommonParameter.getInstance() + .isNodeEffectiveCheckEnable(); @Autowired private TronNetDelegate tronNetDelegate; @@ -39,43 +43,46 @@ public class EffectiveService { private final AtomicInteger count = new AtomicInteger(0); @Setter private boolean found = false; + private ScheduledExecutorService executor = null; - private final ScheduledExecutorService executor = Executors - .newSingleThreadScheduledExecutor( + public void init() { + if (isEffectiveCheck) { + executor = Executors.newSingleThreadScheduledExecutor( new ThreadFactoryBuilder().setNameFormat("effective-thread-%d").build()); + executor.scheduleWithFixedDelay(() -> { + try { + findEffectiveNode(); + } catch (Exception e) { + logger.error("Check effective connection processing failed", e); + } + }, 1 * 60, 5, TimeUnit.SECONDS); + } + } - public void init() { - executor.scheduleWithFixedDelay(() -> { + public void close() { + if (executor != null) { try { - findEffectiveNode(); + executor.shutdown(); } catch (Exception e) { - logger.error("Check effective connection processing failed", e); + logger.error("Exception in shutdown effective service worker, {}", e.getMessage()); } - }, 1 * 60, 5, TimeUnit.SECONDS); - } - - public void close() { - try { - executor.shutdownNow(); - } catch (Exception e) { - logger.error("Exception in shutdown effective service worker, {}", e.getMessage()); } } - public boolean isIsolateLand() { + public boolean haveEffectiveConnection() { return (int) tronNetDelegate.getActivePeer().stream() .filter(PeerConnection::isNeedSyncFromUs) - .count() == tronNetDelegate.getActivePeer().size(); + .count() != tronNetDelegate.getActivePeer().size(); } private synchronized void findEffectiveNode() throws InterruptedException { - if (!isIsolateLand()) { + if (haveEffectiveConnection()) { resetCount(); return; } if (found) { Thread.sleep(10_000);//wait found node to sync - if (isIsolateLand()) { + if (!haveEffectiveConnection()) { found = false; disconnect(); } @@ -127,7 +134,7 @@ private synchronized void findEffectiveNode() throws InterruptedException { // Connection established successfully future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { logger.info("Close chosen channel:{}", cur); - if (isIsolateLand()) { + if (!haveEffectiveConnection()) { findEffectiveNode(); } }); diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index a3bc241f9a9..64eefacbb72 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -11,7 +11,7 @@ import org.tron.core.net.message.handshake.HelloMessage; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.peer.PeerManager; -import org.tron.core.net.service.effective.EffectiveService; +import org.tron.core.net.service.effective.EffectiveCheckService; import org.tron.core.net.service.relay.RelayService; import org.tron.p2p.discover.Node; import org.tron.protos.Protocol.ReasonCode; @@ -24,7 +24,7 @@ public class HandshakeService { private RelayService relayService; @Autowired - private EffectiveService effectiveService; + private EffectiveCheckService effectiveCheckService; @Autowired private ChainBaseManager chainBaseManager; @@ -102,8 +102,9 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } - if (peer.getInetSocketAddress().equals(effectiveService.getCur())) { - if (effectiveService.isIsolateLand() + if (effectiveCheckService.isEffectiveCheck() && + peer.getInetSocketAddress().equals(effectiveCheckService.getCur())) { + if (!effectiveCheckService.haveEffectiveConnection() && msg.getSolidBlockId().getNum() <= chainBaseManager.getSolidBlockId().getNum()) { logger.info("Peer's solid block {} is below than we, peer->{}, me->{}", peer.getInetSocketAddress(), @@ -113,9 +114,9 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } else { logger.info("Success to find effective node {} at times {}", - peer.getInetSocketAddress(), effectiveService.getCount()); - effectiveService.setFound(true); - effectiveService.resetCount(); + peer.getInetSocketAddress(), effectiveCheckService.getCount()); + effectiveCheckService.setFound(true); + effectiveCheckService.resetCount(); } } diff --git a/protocol/src/main/protos/core/Tron.proto b/protocol/src/main/protos/core/Tron.proto index e6aac408f95..437f5bf85a2 100644 --- a/protocol/src/main/protos/core/Tron.proto +++ b/protocol/src/main/protos/core/Tron.proto @@ -600,6 +600,7 @@ enum ReasonCode { CONNECT_FAIL = 0x21; TOO_MANY_PEERS_WITH_SAME_IP = 0x22; LIGHT_NODE_SYNC_FAIL = 0x23; + BELOW_THAN_ME = 0X24; UNKNOWN = 0xFF; } From 429f2a0fc0febc384cdc306e1776cf43ee731d9d Mon Sep 17 00:00:00 2001 From: forfreeday Date: Mon, 20 Mar 2023 18:24:55 +0800 Subject: [PATCH 057/142] feature(shell): move shell to script directory --- DownloadLinks.sh | 21 --------------------- checkStyle.sh => script/checkStyle.sh | 0 codecov.sh => script/codecov.sh | 0 querySonar.sh => script/querySonar.sh | 0 sonar.sh => script/sonar.sh | 0 5 files changed, 21 deletions(-) delete mode 100644 DownloadLinks.sh rename checkStyle.sh => script/checkStyle.sh (100%) rename codecov.sh => script/codecov.sh (100%) rename querySonar.sh => script/querySonar.sh (100%) rename sonar.sh => script/sonar.sh (100%) diff --git a/DownloadLinks.sh b/DownloadLinks.sh deleted file mode 100644 index babc5a266f6..00000000000 --- a/DownloadLinks.sh +++ /dev/null @@ -1,21 +0,0 @@ -PassFlag=`curl -s http://47.95.206.44:50080/Daily_Build_Task_Report | grep "Failed: 0" | wc -c` - -if [ $PassFlag -eq 0 ]; then - echo "Daily Build Stest Fail" - echo "To view Daily Replay and Stress Test logs please visit website below on browsers" - echo "--- http://47.95.206.44:50080/latestReplayLog" - echo "--- http://47.95.206.44:50080/latestStressLog" - -else - echo "Daily Build Stest Pass" - echo "Build on `date +"%Y-%m-%d"` 3:00:00 (CST), UTC +8" - echo "Please visit following website to download java-tron.jar on browsers" - echo "--- http://47.95.206.44:50080/Daily_Build/jFava-tron.jar" - echo "To view Daily Replay and Stress Test logs please visit website below on browsers" - echo "--- http://47.95.206.44:50080/latestReplayLog" - echo "--- http://47.95.206.44:50080/latestStressLog" - echo "The following compressed package is provided for user to set up Fullnode. Please use Linux OS to Download" - echo "--- curl -# -O http://47.95.206.44:50080/Daily_Build/java-tron.tar.gz" - echo "To unzip file use the command below" - echo "--- tar -xzvf java-tron.tar.gz" -fi \ No newline at end of file diff --git a/checkStyle.sh b/script/checkStyle.sh similarity index 100% rename from checkStyle.sh rename to script/checkStyle.sh diff --git a/codecov.sh b/script/codecov.sh similarity index 100% rename from codecov.sh rename to script/codecov.sh diff --git a/querySonar.sh b/script/querySonar.sh similarity index 100% rename from querySonar.sh rename to script/querySonar.sh diff --git a/sonar.sh b/script/sonar.sh similarity index 100% rename from sonar.sh rename to script/sonar.sh From 5959a1bf76786aed364c5cf3828507c3cfdcd307 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Tue, 21 Mar 2023 16:40:41 +0800 Subject: [PATCH 058/142] feat(config):add support for dynamically loading configuration --- .../common/parameter/CommonParameter.java | 5 + .../src/main/java/org/tron/core/Constant.java | 2 + .../common/application/ApplicationImpl.java | 6 + .../java/org/tron/core/config/args/Args.java | 8 +- .../tron/core/config/args/DynamicArgs.java | 163 ++++++++++++++++++ .../org/tron/core/net/TronNetService.java | 4 +- 6 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 framework/src/main/java/org/tron/core/config/args/DynamicArgs.java 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 ab04ca3e7a4..ef1bff15d16 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -30,6 +30,7 @@ public class CommonParameter { public static CommonParameter PARAMETER = new CommonParameter(); @Setter public static boolean ENERGY_LIMIT_HARD_FORK = false; + @Getter @Parameter(names = {"-c", "--config"}, description = "Config file (default:config.conf)") public String shellConfFileName = ""; @Getter @@ -608,6 +609,10 @@ public class CommonParameter { @Setter public long dynamicEnergyMaxFactor = 0L; + @Getter + @Setter + public boolean dynamicConfigEnable; + private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); return 5.0; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 408782752f2..59d69bfecfd 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -343,4 +343,6 @@ public class Constant { public static final String NODE_SHUTDOWN_BLOCK_COUNT = "node.shutdown.BlockCount"; public static final String BLOCK_CACHE_TIMEOUT = "node.blockCacheTimeout"; + + public static final String DYNAMIC_CONFIG_ENABLE = "dynamicConfigEnable"; } diff --git a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java index 235ece75835..174dc92b25d 100644 --- a/framework/src/main/java/org/tron/common/application/ApplicationImpl.java +++ b/framework/src/main/java/org/tron/common/application/ApplicationImpl.java @@ -7,6 +7,7 @@ import org.tron.common.parameter.CommonParameter; import org.tron.core.ChainBaseManager; import org.tron.core.config.args.Args; +import org.tron.core.config.args.DynamicArgs; import org.tron.core.consensus.ConsensusService; import org.tron.core.db.Manager; import org.tron.core.metrics.MetricsUtil; @@ -32,6 +33,9 @@ public class ApplicationImpl implements Application { @Autowired private ConsensusService consensusService; + @Autowired + private DynamicArgs dynamicArgs; + @Override public void setOptions(Args args) { // not used @@ -62,6 +66,7 @@ public void startup() { } consensusService.start(); MetricsUtil.init(); + dynamicArgs.init(); } @Override @@ -80,6 +85,7 @@ public void shutdown() { dbManager.stopRePushTriggerThread(); EventPluginLoader.getInstance().stopPlugin(); dbManager.stopFilterProcessThread(); + dynamicArgs.close(); logger.info("******** end to shutdown ********"); FullNode.shutDownSign = true; } 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 8e6a7526362..b9cfde485da 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 @@ -221,6 +221,7 @@ public static void clearParam() { PARAMETER.allowNewRewardAlgorithm = 0; PARAMETER.allowNewReward = 0; PARAMETER.memoFee = 0; + PARAMETER.dynamicConfigEnable = false; } /** @@ -1122,6 +1123,9 @@ public static void setParam(final String[] args, final String confFileName) { Math.max(PARAMETER.dynamicEnergyMaxFactor, 0); } + PARAMETER.dynamicConfigEnable = config.hasPath(Constant.DYNAMIC_CONFIG_ENABLE) + && config.getBoolean(Constant.DYNAMIC_CONFIG_ENABLE); + logConfig(); } @@ -1174,7 +1178,7 @@ private static RateLimiterInitialization getRateLimiterFromConfig( return initialization; } - private static List getInetSocketAddress( + public static List getInetSocketAddress( final com.typesafe.config.Config config, String path) { List ret = new ArrayList<>(); if (!config.hasPath(path)) { @@ -1195,7 +1199,7 @@ private static List getInetSocketAddress( return ret; } - private static List getInetAddress( + public static List getInetAddress( final com.typesafe.config.Config config, String path) { List ret = new ArrayList<>(); if (!config.hasPath(path)) { diff --git a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java new file mode 100644 index 00000000000..e441bc527a2 --- /dev/null +++ b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java @@ -0,0 +1,163 @@ +package org.tron.core.config.args; + +import static org.apache.commons.lang3.StringUtils.isNoneBlank; + +import com.typesafe.config.Config; +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.file.FileSystems; +import java.nio.file.Path; +import java.nio.file.StandardWatchEventKinds; +import java.nio.file.WatchEvent; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.tron.common.parameter.CommonParameter; +import org.tron.core.Constant; +import org.tron.core.config.Configuration; +import org.tron.core.net.TronNetService; + + +@Slf4j(topic = "app") +@Component +public class DynamicArgs { + private final CommonParameter parameter = Args.getInstance(); + + private volatile boolean shutdown = false; + + public void init() { + if (parameter.isDynamicConfigEnable()) { + new Thread(this::start, "DynamicArgs").start(); + } + } + + public void start() { + WatchService watchService; + Path path; + String confFileName; + try { + logger.info("Start the dynamic loading configuration service"); + String confFile; + if (isNoneBlank(parameter.getShellConfFileName())) { + confFile = parameter.getShellConfFileName(); + } else { + confFile = Constant.TESTNET_CONF; + // + //logger.warn("Configuration path is required!"); + //return; + } + + File confDir = new File(confFile); + confFileName = confDir.getName(); + if (confFile.contains(File.separator)) { + path = FileSystems.getDefault().getPath(confDir.getPath()).getParent(); + } else { + File directory = new File(""); + path = FileSystems.getDefault().getPath(directory.getAbsolutePath()); + } + + logger.info("confDirString = {}", confDir); + watchService = FileSystems.getDefault().newWatchService(); + path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); + logger.info("watch path : {}", path.toString()); + } catch (Exception e) { + logger.error("Exception caught when register the watch key", e.getCause()); + return; + } + + while (!shutdown) { + try { + WatchKey wk = watchService.take(); + long changeCount = 0; + for (WatchEvent event : wk.pollEvents()) { + final Path changed = (Path)event.context(); + if (changed.endsWith(confFileName)) { + reload(); + logger.info("Config was modify and we reload it"); + } + changeCount++; + } + logger.info("change count : {}", changeCount); + + boolean valid = wk.reset(); + if (!valid) { + path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); + } + } catch (InterruptedException e) { + logger.warn(""); + break; + } catch (IOException e) { + break; + } + } + } + + public void reload() { + logger.info("reloading ... "); + Config config = Configuration.getByFileName(parameter.getShellConfFileName(), + Constant.TESTNET_CONF); + + updateActiveNodes(config); + + updateTrustNodes(config); + } + + private void updateActiveNodes(Config config) { + if (parameter.isWitness() || parameter.isFastForward()) { + return; + } + + List lastActiveNodes = parameter.getActiveNodes(); + List newActiveNodes = + Args.getInetSocketAddress(config, Constant.NODE_ACTIVE); + parameter.setActiveNodes(newActiveNodes); + parameter.getActiveNodes().forEach(n -> { + logger.info("active node : {}", n.toString()); + if (!lastActiveNodes.contains(n)) { + TronNetService.getP2pConfig().getActiveNodes().add(n); + if (!TronNetService.getP2pConfig().getTrustNodes().contains(n.getAddress())) { + TronNetService.getP2pConfig().getTrustNodes().add(n.getAddress()); + } + } + }); + + lastActiveNodes.forEach(ln -> { + if (!parameter.getActiveNodes().contains(ln)) { + TronNetService.getP2pConfig().getActiveNodes().remove(ln); + TronNetService.getP2pConfig().getTrustNodes().remove(ln.getAddress()); + } + }); + } + + private void updateTrustNodes(Config config) { + if (parameter.isWitness() || parameter.isFastForward()) { + return; + } + + List lastPassiveNodes = parameter.getPassiveNodes(); + List newPassiveNodes = Args.getInetAddress(config, Constant.NODE_PASSIVE); + parameter.setPassiveNodes(newPassiveNodes); + parameter.getPassiveNodes().forEach(n -> { + logger.info("passive node : {}", n.toString()); + if (!lastPassiveNodes.contains(n) + || !TronNetService.getP2pConfig().getTrustNodes().contains(n)) { + TronNetService.getP2pConfig().getTrustNodes().add(n); + } + }); + + lastPassiveNodes.forEach(ln -> { + if (!parameter.getPassiveNodes().contains(ln)) { + TronNetService.getP2pConfig().getTrustNodes().remove(ln); + } + }); + } + + public void close() { + logger.info("Closing watchService ..."); + shutdown = true; + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index dcee7ecc7b2..5e32d834d67 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -136,8 +136,8 @@ private P2pConfig getConfig() { P2pConfig config = new P2pConfig(); config.setSeedNodes(seeds); - config.setActiveNodes(parameter.getActiveNodes()); - config.setTrustNodes(parameter.getPassiveNodes()); + config.getActiveNodes().addAll(parameter.getActiveNodes()); + config.getTrustNodes().addAll(parameter.getPassiveNodes()); config.getActiveNodes().forEach(n -> config.getTrustNodes().add(n.getAddress())); parameter.getFastForwardNodes().forEach(f -> config.getTrustNodes().add(f.getAddress())); int maxConnections = parameter.getMaxConnections(); From db678c1279a82c854f924c27e0d4f2873c98d052 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 21 Mar 2023 17:01:04 +0800 Subject: [PATCH 059/142] fix(net): simplify EffectiveCheckService; set nodeEffectiveCheckEnable deafult to true --- .../java/org/tron/core/config/args/Args.java | 4 +- .../effective/EffectiveCheckService.java | 51 +++++++------------ .../service/handshake/HandshakeService.java | 8 ++- .../org/tron/common/config/args/ArgsTest.java | 1 + 4 files changed, 23 insertions(+), 41 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 29d33fec436..4d3c76deb97 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 @@ -556,8 +556,8 @@ public static void setParam(final String[] args, final String confFileName) { && config.getBoolean(Constant.NODE_DISCOVERY_PERSIST); PARAMETER.nodeEffectiveCheckEnable = - config.hasPath(Constant.NODE_ENABLE_EFFECTIVE_CHECK) - && config.getBoolean(Constant.NODE_ENABLE_EFFECTIVE_CHECK); + !config.hasPath(Constant.NODE_ENABLE_EFFECTIVE_CHECK) + || config.getBoolean(Constant.NODE_ENABLE_EFFECTIVE_CHECK); PARAMETER.nodeConnectionTimeout = config.hasPath(Constant.NODE_CONNECTION_TIMEOUT) diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index c2d399bf1e5..d00340a3ada 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -12,16 +12,14 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import lombok.Getter; -import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.tron.common.parameter.CommonParameter; +import org.tron.core.config.args.Args; import org.tron.core.net.TronNetDelegate; import org.tron.core.net.TronNetService; import org.tron.core.net.peer.PeerConnection; import org.tron.p2p.discover.Node; -import org.tron.p2p.utils.NetUtil; import org.tron.protos.Protocol.ReasonCode; @Slf4j(topic = "net") @@ -29,8 +27,7 @@ public class EffectiveCheckService { @Getter - private final boolean isEffectiveCheck = CommonParameter.getInstance() - .isNodeEffectiveCheckEnable(); + private final boolean isEffectiveCheck = Args.getInstance().isNodeEffectiveCheckEnable(); @Autowired private TronNetDelegate tronNetDelegate; @@ -41,8 +38,6 @@ public class EffectiveCheckService { @Getter private InetSocketAddress cur; private final AtomicInteger count = new AtomicInteger(0); - @Setter - private boolean found = false; private ScheduledExecutorService executor = null; public void init() { @@ -55,7 +50,9 @@ public void init() { } catch (Exception e) { logger.error("Check effective connection processing failed", e); } - }, 1 * 60, 5, TimeUnit.SECONDS); + }, 60, 5, TimeUnit.SECONDS); + } else { + logger.warn("EffectiveCheckService is disabled"); } } @@ -69,23 +66,19 @@ public void close() { } } - public boolean haveEffectiveConnection() { + public boolean isIsolateLand() { return (int) tronNetDelegate.getActivePeer().stream() .filter(PeerConnection::isNeedSyncFromUs) - .count() != tronNetDelegate.getActivePeer().size(); + .count() == tronNetDelegate.getActivePeer().size(); } - private synchronized void findEffectiveNode() throws InterruptedException { - if (haveEffectiveConnection()) { - resetCount(); - return; - } - if (found) { - Thread.sleep(10_000);//wait found node to sync - if (!haveEffectiveConnection()) { - found = false; - disconnect(); + //try to find node which we can sync from + private synchronized void findEffectiveNode() { + if (!isIsolateLand()) { + if (count.get() > 0) { + logger.info("Success to verify effective node {}", cur); } + resetCount(); return; } @@ -97,11 +90,6 @@ private synchronized void findEffectiveNode() throws InterruptedException { } List tableNodes = TronNetService.getP2pService().getAllNodes(); - for (Node node : tableNodes) { - if (node.getId() == null) { - node.setId(NetUtil.getNodeId()); - } - } Optional chosenNode = tableNodes.stream() .filter(node -> nodesCache.getIfPresent(node.getPreferInetSocketAddress()) == null) @@ -109,8 +97,7 @@ private synchronized void findEffectiveNode() throws InterruptedException { .contains(node.getPreferInetSocketAddress())) .findFirst(); if (!chosenNode.isPresent()) { - logger.warn("Failed to find effective node, have tried {} times", count.get()); - resetCount(); + logger.warn("No available node to choose"); return; } @@ -119,7 +106,7 @@ private synchronized void findEffectiveNode() throws InterruptedException { cur = new InetSocketAddress(chosenNode.get().getPreferInetSocketAddress().getAddress(), chosenNode.get().getPreferInetSocketAddress().getPort()); - logger.info("Try to get effective connection by using {} at times {}", cur, count.get()); + logger.info("Try to get effective connection by using {} at seq {}", cur, count.get()); TronNetService.getP2pService().connect(chosenNode.get(), future -> { if (future.isCancelled()) { // Connection attempt cancelled by user @@ -134,7 +121,7 @@ private synchronized void findEffectiveNode() throws InterruptedException { // Connection established successfully future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { logger.info("Close chosen channel:{}", cur); - if (!haveEffectiveConnection()) { + if (isIsolateLand()) { findEffectiveNode(); } }); @@ -142,14 +129,10 @@ private synchronized void findEffectiveNode() throws InterruptedException { }); } - public void resetCount() { + private void resetCount() { count.set(0); } - public int getCount() { - return count.get(); - } - private void disconnect() { tronNetDelegate.getActivePeer().forEach(p -> { if (p.getInetSocketAddress().equals(cur)) { diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 64eefacbb72..0332e008c72 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -104,7 +104,7 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { if (effectiveCheckService.isEffectiveCheck() && peer.getInetSocketAddress().equals(effectiveCheckService.getCur())) { - if (!effectiveCheckService.haveEffectiveConnection() + if (effectiveCheckService.isIsolateLand() && msg.getSolidBlockId().getNum() <= chainBaseManager.getSolidBlockId().getNum()) { logger.info("Peer's solid block {} is below than we, peer->{}, me->{}", peer.getInetSocketAddress(), @@ -113,10 +113,8 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { peer.disconnect(ReasonCode.BELOW_THAN_ME); return; } else { - logger.info("Success to find effective node {} at times {}", - peer.getInetSocketAddress(), effectiveCheckService.getCount()); - effectiveCheckService.setFound(true); - effectiveCheckService.resetCount(); + logger.info("Success to find effective node {}", peer.getInetSocketAddress()); + peer.setNeedSyncFromUs(false); } } diff --git a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java index cbacb5f6246..b523cbf82b2 100644 --- a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java @@ -31,5 +31,6 @@ public void testConfig() { Assert.assertEquals(Args.getInstance().getMaxFastForwardNum(), 3); Assert.assertEquals(Args.getInstance().getBlockCacheTimeout(), 60); Assert.assertEquals(Args.getInstance().isNodeDetectEnable(), false); + Assert.assertTrue(Args.getInstance().isNodeEffectiveCheckEnable()); } } \ No newline at end of file From 73b88097823b62e97b3d7623ab7128a2b6a54197 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 21 Mar 2023 17:01:58 +0800 Subject: [PATCH 060/142] fix(net): update libp2p to test-callback-v2 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index bd5b400ae38..84433da52d1 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v1' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v2' compile project(":protocol") } From 02d2e9f7b175ba5d4d6974d2d7e6f802ef348876 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 22 Mar 2023 12:20:00 +0800 Subject: [PATCH 061/142] feat(net): normalize http urls to prevent attacks --- .../java/org/tron/core/services/filter/HttpApiAccessFilter.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java b/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java index 35ebd9d6d6d..ae7ab75a473 100644 --- a/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java +++ b/framework/src/main/java/org/tron/core/services/filter/HttpApiAccessFilter.java @@ -1,6 +1,7 @@ package org.tron.core.services.filter; import com.alibaba.fastjson.JSONObject; +import java.net.URI; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -58,6 +59,7 @@ private boolean isDisabled(String endpoint) { boolean disabled = false; try { + endpoint = URI.create(endpoint).normalize().toString(); List disabledApiList = CommonParameter.getInstance().getDisabledApiList(); if (!disabledApiList.isEmpty()) { disabled = disabledApiList.contains(endpoint.split("/")[2].toLowerCase()); From fdb17bcd72dc7ca20cac4d509fdab2d6ec5904f5 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 22 Mar 2023 15:20:08 +0800 Subject: [PATCH 062/142] fix(net): resolve the bug that Lack size is increasing by time --- common/build.gradle | 2 +- .../effective/EffectiveCheckService.java | 18 +++++++++++++++--- .../service/handshake/HandshakeService.java | 4 ++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 84433da52d1..bcbfb8b9249 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v2' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v3' compile project(":protocol") } diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index d00340a3ada..7739e065487 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -39,6 +39,7 @@ public class EffectiveCheckService { private InetSocketAddress cur; private final AtomicInteger count = new AtomicInteger(0); private ScheduledExecutorService executor = null; + private boolean isRunning = false; public void init() { if (isEffectiveCheck) { @@ -50,7 +51,7 @@ public void init() { } catch (Exception e) { logger.error("Check effective connection processing failed", e); } - }, 60, 5, TimeUnit.SECONDS); + }, 60, 2, TimeUnit.SECONDS); } else { logger.warn("EffectiveCheckService is disabled"); } @@ -73,7 +74,7 @@ public boolean isIsolateLand() { } //try to find node which we can sync from - private synchronized void findEffectiveNode() { + private void findEffectiveNode() { if (!isIsolateLand()) { if (count.get() > 0) { logger.info("Success to verify effective node {}", cur); @@ -82,14 +83,21 @@ private synchronized void findEffectiveNode() { return; } + if (isRunning) { + logger.info("Thread is running"); + return; + } + isRunning = true; + if (cur != null && tronNetDelegate.getActivePeer().stream() .anyMatch(p -> p.getInetSocketAddress().equals(cur))) { // we encounter no effective connection again, so we disconnect with last used node disconnect(); + isRunning = false; return; } - List tableNodes = TronNetService.getP2pService().getAllNodes(); + List tableNodes = TronNetService.getP2pService().getConnectableNodes(); Optional chosenNode = tableNodes.stream() .filter(node -> nodesCache.getIfPresent(node.getPreferInetSocketAddress()) == null) @@ -110,17 +118,20 @@ private synchronized void findEffectiveNode() { TronNetService.getP2pService().connect(chosenNode.get(), future -> { if (future.isCancelled()) { // Connection attempt cancelled by user + isRunning = false; logger.warn("Channel {} has been cancelled by user", cur); } else if (!future.isSuccess()) { // You might get a NullPointerException here because the future might not be completed yet. logger.warn("Connect to chosen peer {} fail, cause:{}", cur, future.cause().getMessage()); future.channel().close(); + isRunning = false; findEffectiveNode(); } else { // Connection established successfully future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { logger.info("Close chosen channel:{}", cur); + isRunning = false; if (isIsolateLand()) { findEffectiveNode(); } @@ -134,6 +145,7 @@ private void resetCount() { } private void disconnect() { + logger.info("Disconnect with {}", cur); tronNetDelegate.getActivePeer().forEach(p -> { if (p.getInetSocketAddress().equals(cur)) { p.disconnect(ReasonCode.BELOW_THAN_ME); diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 0332e008c72..b81517e2adc 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -102,8 +102,8 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } - if (effectiveCheckService.isEffectiveCheck() && - peer.getInetSocketAddress().equals(effectiveCheckService.getCur())) { + if (effectiveCheckService.isEffectiveCheck() && peer.getInetSocketAddress() + .equals(effectiveCheckService.getCur())) { if (effectiveCheckService.isIsolateLand() && msg.getSolidBlockId().getNum() <= chainBaseManager.getSolidBlockId().getNum()) { logger.info("Peer's solid block {} is below than we, peer->{}, me->{}", From 891c15aeb0291485a8cda6946a9966c8701c6033 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 22 Mar 2023 15:29:52 +0800 Subject: [PATCH 063/142] fix(net): optimize code --- .../tron/core/net/service/handshake/HandshakeService.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index b81517e2adc..924c792d0c4 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -102,10 +102,9 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } - if (effectiveCheckService.isEffectiveCheck() && peer.getInetSocketAddress() - .equals(effectiveCheckService.getCur())) { - if (effectiveCheckService.isIsolateLand() - && msg.getSolidBlockId().getNum() <= chainBaseManager.getSolidBlockId().getNum()) { + if (effectiveCheckService.isEffectiveCheck() && effectiveCheckService.isIsolateLand() + && peer.getInetSocketAddress().equals(effectiveCheckService.getCur())) { + if (msg.getSolidBlockId().getNum() <= chainBaseManager.getSolidBlockId().getNum()) { logger.info("Peer's solid block {} is below than we, peer->{}, me->{}", peer.getInetSocketAddress(), msg.getSolidBlockId().getNum(), From f7c93fa3f2829ee0192bbf8b4e7579b8e17f6222 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 22 Mar 2023 17:00:31 +0800 Subject: [PATCH 064/142] fix(net): optimize EffectiveCheckService --- .../tron/core/net/service/effective/EffectiveCheckService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index 7739e065487..18e380f102a 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -98,7 +98,6 @@ private void findEffectiveNode() { } List tableNodes = TronNetService.getP2pService().getConnectableNodes(); - Optional chosenNode = tableNodes.stream() .filter(node -> nodesCache.getIfPresent(node.getPreferInetSocketAddress()) == null) .filter(node -> !TronNetService.getP2pConfig().getActiveNodes() @@ -106,6 +105,7 @@ private void findEffectiveNode() { .findFirst(); if (!chosenNode.isPresent()) { logger.warn("No available node to choose"); + isRunning = false; return; } From bfa2ffef5e743f6d0109dbac796fe8251ac0ec3d Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 23 Mar 2023 12:27:18 +0800 Subject: [PATCH 065/142] feat(net): add unit test for url checking --- .../filter/HttpApiAccessFilterTest.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java index 4a288b4402c..dcf56c18ae9 100644 --- a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java @@ -4,7 +4,9 @@ import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.http.HttpResponse; @@ -21,10 +23,13 @@ import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; +import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.ReflectUtils; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; +import org.tron.core.net.peer.PeerConnection; import org.tron.core.services.http.FullNodeHttpApiService; import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService; import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService; @@ -37,6 +42,7 @@ public class HttpApiAccessFilterTest { private static Application appTest; private static CloseableHttpClient httpClient = HttpClients.createDefault(); private static String dbPath = "output_http_api_access_filter_test"; + private static HttpApiAccessFilter httpApiAccessFilter; /** * init dependencies. @@ -47,7 +53,7 @@ public static void init() { Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); context = new TronApplicationContext(DefaultConfig.class); appTest = ApplicationFactory.create(context); - + httpApiAccessFilter = context.getBean(HttpApiAccessFilter.class); FullNodeHttpApiService httpApiService = context .getBean(FullNodeHttpApiService.class); HttpApiOnSolidityService httpApiOnSolidityService = context @@ -153,4 +159,31 @@ private int getReuqestCode(String url) { return 0; } + + @Test + public void testIsDisabled() throws Exception { + List list = new ArrayList<>(); + list.add("getnowblock"); + CommonParameter.getInstance().setDisabledApiList(list); + Method privateMethod = httpApiAccessFilter.getClass() + .getDeclaredMethod("isDisabled", String.class); + privateMethod.setAccessible(true); + + String url = "/wallet/getnowblock"; + boolean f = (boolean) privateMethod.invoke(httpApiAccessFilter,url); + Assert.assertTrue(f); + + url = "/wallet/a/../b/../getnowblock"; + f = (boolean) privateMethod.invoke(httpApiAccessFilter,url); + Assert.assertTrue(f); + + url = "/wallet/a/b/../getnowblock"; + f = (boolean) privateMethod.invoke(httpApiAccessFilter,url); + Assert.assertTrue(!f); + + url = "/wallet/getblock"; + f = (boolean) privateMethod.invoke(httpApiAccessFilter,url); + Assert.assertTrue(!f); + } + } From d23fbb17e206618d7d45d7b2d9b6e5dcbfb05624 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 23 Mar 2023 16:36:22 +0800 Subject: [PATCH 066/142] fix(net): change node.effectiveCheckEnable default to false --- common/build.gradle | 2 +- common/src/main/java/org/tron/core/Constant.java | 2 +- .../src/main/java/org/tron/core/config/args/Args.java | 8 +++++--- .../net/service/effective/EffectiveCheckService.java | 9 +++++++-- .../test/java/org/tron/common/config/args/ArgsTest.java | 2 +- 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index bcbfb8b9249..a09a1ac9159 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v3' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v4' compile project(":protocol") } diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index efff664f38e..faa01540cda 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -83,7 +83,7 @@ public class Constant { public static final String BLOCK_NEED_SYNC_CHECK = "block.needSyncCheck"; public static final String NODE_DISCOVERY_ENABLE = "node.discovery.enable"; public static final String NODE_DISCOVERY_PERSIST = "node.discovery.persist"; - public static final String NODE_ENABLE_EFFECTIVE_CHECK = "node.enableEffectiveCheck"; + public static final String NODE_EFFECTIVE_CHECK_ENABLE = "node.effectiveCheckEnable"; public static final String NODE_CONNECTION_TIMEOUT = "node.connection.timeout"; public static final String NODE_FETCH_BLOCK_TIMEOUT = "node.fetchBlock.timeout"; public static final String NODE_CHANNEL_READ_TIMEOUT = "node.channel.read.timeout"; 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 4d3c76deb97..60c87f737ff 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 @@ -124,7 +124,7 @@ public static void clearParam() { PARAMETER.needSyncCheck = false; PARAMETER.nodeDiscoveryEnable = false; PARAMETER.nodeDiscoveryPersist = false; - PARAMETER.nodeEffectiveCheckEnable = true; + PARAMETER.nodeEffectiveCheckEnable = false; PARAMETER.nodeConnectionTimeout = 2000; PARAMETER.activeNodes = new ArrayList<>(); PARAMETER.passiveNodes = new ArrayList<>(); @@ -556,8 +556,8 @@ public static void setParam(final String[] args, final String confFileName) { && config.getBoolean(Constant.NODE_DISCOVERY_PERSIST); PARAMETER.nodeEffectiveCheckEnable = - !config.hasPath(Constant.NODE_ENABLE_EFFECTIVE_CHECK) - || config.getBoolean(Constant.NODE_ENABLE_EFFECTIVE_CHECK); + config.hasPath(Constant.NODE_EFFECTIVE_CHECK_ENABLE) + && config.getBoolean(Constant.NODE_EFFECTIVE_CHECK_ENABLE); PARAMETER.nodeConnectionTimeout = config.hasPath(Constant.NODE_CONNECTION_TIMEOUT) @@ -1612,6 +1612,7 @@ public static void logConfig() { logger.info("Bind IP: {}", parameter.getNodeDiscoveryBindIp()); logger.info("External IP: {}", parameter.getNodeExternalIp()); logger.info("Listen port: {}", parameter.getNodeListenPort()); + logger.info("Node ipv6 enable: {}", parameter.isNodeEnableIpv6()); logger.info("Discover enable: {}", parameter.isNodeDiscoveryEnable()); logger.info("Active node size: {}", parameter.getActiveNodes().size()); logger.info("Passive node size: {}", parameter.getPassiveNodes().size()); @@ -1626,6 +1627,7 @@ public static void logConfig() { logger.info("Trx reference block: {}", parameter.getTrxReferenceBlock()); logger.info("Open full tcp disconnect: {}", parameter.isOpenFullTcpDisconnect()); logger.info("Node detect enable: {}", parameter.isNodeDetectEnable()); + logger.info("Node effective check enable: {}", parameter.isNodeEffectiveCheckEnable()); logger.info("************************ Backup config ************************"); logger.info("Backup priority: {}", parameter.getBackupPriority()); logger.info("Backup listen port: {}", parameter.getBackupPort()); diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index 18e380f102a..ab4a2bdbd7e 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -5,8 +5,10 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import io.netty.channel.ChannelFutureListener; import java.net.InetSocketAddress; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -33,7 +35,7 @@ public class EffectiveCheckService { private final Cache nodesCache = CacheBuilder.newBuilder() .initialCapacity(100) - .maximumSize(1000) + .maximumSize(10000) .expireAfterWrite(10, TimeUnit.MINUTES).build(); @Getter private InetSocketAddress cur; @@ -53,7 +55,7 @@ public void init() { } }, 60, 2, TimeUnit.SECONDS); } else { - logger.warn("EffectiveCheckService is disabled"); + logger.info("EffectiveCheckService is disabled"); } } @@ -98,8 +100,11 @@ private void findEffectiveNode() { } List tableNodes = TronNetService.getP2pService().getConnectableNodes(); + Set usedAddressSet = new HashSet<>(); + tronNetDelegate.getActivePeer().forEach(p -> usedAddressSet.add(p.getInetSocketAddress())); Optional chosenNode = tableNodes.stream() .filter(node -> nodesCache.getIfPresent(node.getPreferInetSocketAddress()) == null) + .filter(node -> !usedAddressSet.contains(node.getPreferInetSocketAddress())) .filter(node -> !TronNetService.getP2pConfig().getActiveNodes() .contains(node.getPreferInetSocketAddress())) .findFirst(); diff --git a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java index b523cbf82b2..b72855539d2 100644 --- a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java @@ -31,6 +31,6 @@ public void testConfig() { Assert.assertEquals(Args.getInstance().getMaxFastForwardNum(), 3); Assert.assertEquals(Args.getInstance().getBlockCacheTimeout(), 60); Assert.assertEquals(Args.getInstance().isNodeDetectEnable(), false); - Assert.assertTrue(Args.getInstance().isNodeEffectiveCheckEnable()); + Assert.assertFalse(Args.getInstance().isNodeEffectiveCheckEnable()); } } \ No newline at end of file From 3799c16f3719fd70b451e636a353688051cdb194 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Thu, 23 Mar 2023 18:20:54 +0800 Subject: [PATCH 067/142] feat(config):optimize logs for dynamic loading configuration --- .../tron/core/config/args/DynamicArgs.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java index e441bc527a2..6e7aabe1119 100644 --- a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java +++ b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java @@ -46,12 +46,15 @@ public void start() { confFile = parameter.getShellConfFileName(); } else { confFile = Constant.TESTNET_CONF; - // //logger.warn("Configuration path is required!"); //return; } File confDir = new File(confFile); + if (!confDir.exists()) { + logger.warn("Configuration path is required! No such file {}", confFile); + return; + } confFileName = confDir.getName(); if (confFile.contains(File.separator)) { path = FileSystems.getDefault().getPath(confDir.getPath()).getParent(); @@ -60,10 +63,10 @@ public void start() { path = FileSystems.getDefault().getPath(directory.getAbsolutePath()); } - logger.info("confDirString = {}", confDir); + logger.debug("confDirString = {}", confDir); watchService = FileSystems.getDefault().newWatchService(); path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); - logger.info("watch path : {}", path.toString()); + logger.debug("watch path : {}", path.toString()); } catch (Exception e) { logger.error("Exception caught when register the watch key", e.getCause()); return; @@ -77,27 +80,28 @@ public void start() { final Path changed = (Path)event.context(); if (changed.endsWith(confFileName)) { reload(); - logger.info("Config was modify and we reload it"); + logger.info("The configuration was modified and we reloaded it"); } changeCount++; } - logger.info("change count : {}", changeCount); + logger.debug("change count : {}", changeCount); boolean valid = wk.reset(); if (!valid) { path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); } } catch (InterruptedException e) { - logger.warn(""); + logger.warn("WatchService was interrupted"); break; } catch (IOException e) { + logger.error("Exception caught when register the watch key", e.getCause()); break; } } } public void reload() { - logger.info("reloading ... "); + logger.debug("Reloading ... "); Config config = Configuration.getByFileName(parameter.getShellConfFileName(), Constant.TESTNET_CONF); @@ -116,7 +120,6 @@ private void updateActiveNodes(Config config) { Args.getInetSocketAddress(config, Constant.NODE_ACTIVE); parameter.setActiveNodes(newActiveNodes); parameter.getActiveNodes().forEach(n -> { - logger.info("active node : {}", n.toString()); if (!lastActiveNodes.contains(n)) { TronNetService.getP2pConfig().getActiveNodes().add(n); if (!TronNetService.getP2pConfig().getTrustNodes().contains(n.getAddress())) { @@ -131,6 +134,8 @@ private void updateActiveNodes(Config config) { TronNetService.getP2pConfig().getTrustNodes().remove(ln.getAddress()); } }); + logger.debug("p2p active nodes : {}", + TronNetService.getP2pConfig().getActiveNodes().toString()); } private void updateTrustNodes(Config config) { @@ -142,7 +147,6 @@ private void updateTrustNodes(Config config) { List newPassiveNodes = Args.getInetAddress(config, Constant.NODE_PASSIVE); parameter.setPassiveNodes(newPassiveNodes); parameter.getPassiveNodes().forEach(n -> { - logger.info("passive node : {}", n.toString()); if (!lastPassiveNodes.contains(n) || !TronNetService.getP2pConfig().getTrustNodes().contains(n)) { TronNetService.getP2pConfig().getTrustNodes().add(n); @@ -154,6 +158,7 @@ private void updateTrustNodes(Config config) { TronNetService.getP2pConfig().getTrustNodes().remove(ln); } }); + logger.debug("p2p trust nodes : {}", TronNetService.getP2pConfig().getTrustNodes().toString()); } public void close() { From ef6b5349f2489c151c1a78458e0a06609a658753 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Fri, 24 Mar 2023 14:28:42 +0800 Subject: [PATCH 068/142] feat(config):add dynamic loading configuration test case --- .../tron/core/config/args/DynamicArgs.java | 1 + .../core/config/args/DynamicArgsTest.java | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java diff --git a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java index 6e7aabe1119..9da606e680a 100644 --- a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java +++ b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java @@ -92,6 +92,7 @@ public void start() { } } catch (InterruptedException e) { logger.warn("WatchService was interrupted"); + Thread.currentThread().interrupt(); break; } catch (IOException e) { logger.error("Exception caught when register the watch key", e.getCause()); diff --git a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java new file mode 100644 index 00000000000..c544a545e16 --- /dev/null +++ b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java @@ -0,0 +1,55 @@ +package org.tron.core.config.args; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.FileUtil; +import org.tron.common.utils.ReflectUtils; +import org.tron.core.Constant; +import org.tron.core.config.DefaultConfig; +import org.tron.core.net.TronNetService; +import org.tron.p2p.P2pConfig; + +import java.io.File; + +public class DynamicArgsTest { + protected TronApplicationContext context; + private DynamicArgs dynamicArgs; + private String dbPath = "output-dynamic-config-test"; + + @Before + public void init() { + Args.setParam(new String[]{"--output-directory", dbPath}, + Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + dynamicArgs = context.getBean(DynamicArgs.class); + + } + + @After + public void destroy() { + Args.clearParam(); + context.destroy(); + FileUtil.deleteDir(new File(dbPath)); + } + + @Test + public void get() { + CommonParameter parameter = Args.getInstance(); + Assert.assertFalse(parameter.isDynamicConfigEnable()); + + } + + @Test + public void start() { + dynamicArgs.start(); + TronNetService tronNetService = context.getBean(TronNetService.class); + ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig()); + dynamicArgs.reload(); + dynamicArgs.close(); + Assert.assertTrue((boolean)ReflectUtils.getFieldObject(dynamicArgs, "shutdown")); + } +} From dd56bf0b4c5f2966c9b42b3991e6411e8ec0d814 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 24 Mar 2023 17:57:13 +0800 Subject: [PATCH 069/142] fix(net): use get,add to replace set list in P2pConfig --- .../src/main/java/org/tron/core/net/TronNetService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index ebd0b1b4114..718f0844fc2 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -154,9 +154,9 @@ private P2pConfig getConfig() { logger.debug("Seed InetSocketAddress: {}", inetSocketAddress); } P2pConfig config = new P2pConfig(); - config.setSeedNodes(seeds); - config.setActiveNodes(parameter.getActiveNodes()); - config.setTrustNodes(parameter.getPassiveNodes()); + config.getSeedNodes().addAll(seeds); + config.getActiveNodes().addAll(parameter.getActiveNodes()); + config.getTrustNodes().addAll(parameter.getPassiveNodes()); config.getActiveNodes().forEach(n -> config.getTrustNodes().add(n.getAddress())); parameter.getFastForwardNodes().forEach(f -> config.getTrustNodes().add(f.getAddress())); int maxConnections = parameter.getMaxConnections(); From 659d80a1c221645dc13b82c081508c25c933ec65 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Fri, 24 Mar 2023 18:29:13 +0800 Subject: [PATCH 070/142] fix(net):fix the problem of repeated fetch block in FetchBlockService --- .../main/java/org/tron/core/net/peer/PeerConnection.java | 8 ++++++++ .../java/org/tron/core/net/service/adv/AdvService.java | 5 +++-- .../core/net/service/fetchblock/FetchBlockService.java | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index a13240fa8ff..ab379ec8b75 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -293,6 +293,14 @@ public static boolean needToLog(Message msg) { return true; } + public synchronized boolean checkAndPutAdvInvRequest(Item key, Long value) { + if (advInvRequest.containsKey(key)) { + return false; + } + advInvRequest.put(key, value); + return true; + } + @Override public boolean equals(Object o) { if (!(o instanceof PeerConnection)) { diff --git a/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java b/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java index b6ea7a3445f..03668d01837 100644 --- a/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java +++ b/framework/src/main/java/org/tron/core/net/service/adv/AdvService.java @@ -281,8 +281,9 @@ private void consumerInvToFetch() { && invSender.getSize(peer) < MAX_TRX_FETCH_PER_PEER) .sorted(Comparator.comparingInt(peer -> invSender.getSize(peer))) .findFirst().ifPresent(peer -> { - invSender.add(item, peer); - peer.getAdvInvRequest().put(item, now); + if (peer.checkAndPutAdvInvRequest(item, now)) { + invSender.add(item, peer); + } invToFetch.remove(item); }); }); diff --git a/framework/src/main/java/org/tron/core/net/service/fetchblock/FetchBlockService.java b/framework/src/main/java/org/tron/core/net/service/fetchblock/FetchBlockService.java index f3699c3be2e..de20a17af0b 100644 --- a/framework/src/main/java/org/tron/core/net/service/fetchblock/FetchBlockService.java +++ b/framework/src/main/java/org/tron/core/net/service/fetchblock/FetchBlockService.java @@ -117,8 +117,8 @@ private void fetchBlockProcess(FetchBlockInfo fetchBlock) { if (optionalPeerConnection.isPresent()) { optionalPeerConnection.ifPresent(firstPeer -> { - if (shouldFetchBlock(firstPeer, fetchBlock)) { - firstPeer.getAdvInvRequest().put(item, System.currentTimeMillis()); + if (shouldFetchBlock(firstPeer, fetchBlock) + && firstPeer.checkAndPutAdvInvRequest(item, System.currentTimeMillis())) { firstPeer.sendMessage(new FetchInvDataMessage(Collections.singletonList(item.getHash()), item.getType())); this.fetchBlockInfo = null; From 52eaea6eb8df81edc92d46b6b91e8fd477d505a7 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Mon, 27 Mar 2023 12:15:25 +0800 Subject: [PATCH 071/142] feat(net): add global rate limiter test --- .../ratelimiter/GlobalRateLimiterTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java diff --git a/framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java b/framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java new file mode 100644 index 00000000000..3187ed36792 --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java @@ -0,0 +1,22 @@ +package org.tron.core.services.ratelimiter; + +import java.lang.reflect.Field; +import org.junit.Assert; +import org.junit.Test; +import org.tron.core.Constant; +import org.tron.core.config.args.Args; + +public class GlobalRateLimiterTest { + + @Test + public void testAcquire() throws Exception { + String[] a = new String[0]; + Args.setParam(a, Constant.TESTNET_CONF); + RuntimeData runtimeData = new RuntimeData(null); + Field field = runtimeData.getClass().getDeclaredField("address"); + field.setAccessible(true); + field.set(runtimeData, "127.0.0.1"); + Assert.assertEquals(runtimeData.getRemoteAddr(), "127.0.0.1"); + GlobalRateLimiter.acquire(runtimeData); + } +} \ No newline at end of file From 7128fa9f1755ea73cd8598295a067653cc724c52 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 27 Mar 2023 14:44:07 +0800 Subject: [PATCH 072/142] fix(net): don't find new node if executor is closed --- .../src/main/java/org/tron/core/net/TronNetService.java | 2 +- .../core/net/service/effective/EffectiveCheckService.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 718f0844fc2..fab50cd500d 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -113,9 +113,9 @@ public void close() { peerStatusCheck.close(); transactionsMsgHandler.close(); fetchBlockService.close(); + effectiveCheckService.close(); p2pService.close(); relayService.close(); - effectiveCheckService.close(); logger.info("Net service closed successfully"); } diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index ab4a2bdbd7e..e3bdc82c05c 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -5,6 +5,7 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import io.netty.channel.ChannelFutureListener; import java.net.InetSocketAddress; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Optional; @@ -42,6 +43,7 @@ public class EffectiveCheckService { private final AtomicInteger count = new AtomicInteger(0); private ScheduledExecutorService executor = null; private boolean isRunning = false; + private boolean isClosed = false; public void init() { if (isEffectiveCheck) { @@ -60,6 +62,7 @@ public void init() { } public void close() { + isClosed = true; if (executor != null) { try { executor.shutdown(); @@ -77,6 +80,9 @@ public boolean isIsolateLand() { //try to find node which we can sync from private void findEffectiveNode() { + if (isClosed) { + return; + } if (!isIsolateLand()) { if (count.get() > 0) { logger.info("Success to verify effective node {}", cur); @@ -100,6 +106,7 @@ private void findEffectiveNode() { } List tableNodes = TronNetService.getP2pService().getConnectableNodes(); + tableNodes.sort(Comparator.comparingLong(node -> -node.getUpdateTime())); Set usedAddressSet = new HashSet<>(); tronNetDelegate.getActivePeer().forEach(p -> usedAddressSet.add(p.getInetSocketAddress())); Optional chosenNode = tableNodes.stream() From ae5dd9d5238229440d70aff9deca7924eb833796 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 27 Mar 2023 20:08:02 +0800 Subject: [PATCH 073/142] fix(net): remove isClosed, use executor to schedule --- .../effective/EffectiveCheckService.java | 40 +++++++++---------- .../service/handshake/HandshakeService.java | 4 +- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index e3bdc82c05c..437e88a12bd 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -37,13 +37,12 @@ public class EffectiveCheckService { private final Cache nodesCache = CacheBuilder.newBuilder() .initialCapacity(100) .maximumSize(10000) - .expireAfterWrite(10, TimeUnit.MINUTES).build(); + .expireAfterWrite(20, TimeUnit.MINUTES).build(); @Getter private InetSocketAddress cur; private final AtomicInteger count = new AtomicInteger(0); private ScheduledExecutorService executor = null; private boolean isRunning = false; - private boolean isClosed = false; public void init() { if (isEffectiveCheck) { @@ -61,8 +60,15 @@ public void init() { } } + private void triggerNext() { + try { + executor.submit(this::findEffectiveNode); + } catch (Exception e) { + logger.warn("Submit effective service task failed, message:{}", e.getMessage()); + } + } + public void close() { - isClosed = true; if (executor != null) { try { executor.shutdown(); @@ -80,14 +86,11 @@ public boolean isIsolateLand() { //try to find node which we can sync from private void findEffectiveNode() { - if (isClosed) { - return; - } if (!isIsolateLand()) { if (count.get() > 0) { logger.info("Success to verify effective node {}", cur); + resetCount(); } - resetCount(); return; } @@ -100,8 +103,12 @@ private void findEffectiveNode() { if (cur != null && tronNetDelegate.getActivePeer().stream() .anyMatch(p -> p.getInetSocketAddress().equals(cur))) { // we encounter no effective connection again, so we disconnect with last used node - disconnect(); - isRunning = false; + logger.info("Disconnect with {}", cur); + tronNetDelegate.getActivePeer().forEach(p -> { + if (p.getInetSocketAddress().equals(cur)) { + p.disconnect(ReasonCode.BELOW_THAN_ME); + } + }); return; } @@ -130,22 +137,20 @@ private void findEffectiveNode() { TronNetService.getP2pService().connect(chosenNode.get(), future -> { if (future.isCancelled()) { // Connection attempt cancelled by user - isRunning = false; - logger.warn("Channel {} has been cancelled by user", cur); } else if (!future.isSuccess()) { // You might get a NullPointerException here because the future might not be completed yet. logger.warn("Connect to chosen peer {} fail, cause:{}", cur, future.cause().getMessage()); future.channel().close(); isRunning = false; - findEffectiveNode(); + triggerNext(); } else { // Connection established successfully future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { logger.info("Close chosen channel:{}", cur); isRunning = false; if (isIsolateLand()) { - findEffectiveNode(); + triggerNext(); } }); } @@ -155,13 +160,4 @@ private void findEffectiveNode() { private void resetCount() { count.set(0); } - - private void disconnect() { - logger.info("Disconnect with {}", cur); - tronNetDelegate.getActivePeer().forEach(p -> { - if (p.getInetSocketAddress().equals(cur)) { - p.disconnect(ReasonCode.BELOW_THAN_ME); - } - }); - } } diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 924c792d0c4..317a3f47a53 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -104,8 +104,8 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { if (effectiveCheckService.isEffectiveCheck() && effectiveCheckService.isIsolateLand() && peer.getInetSocketAddress().equals(effectiveCheckService.getCur())) { - if (msg.getSolidBlockId().getNum() <= chainBaseManager.getSolidBlockId().getNum()) { - logger.info("Peer's solid block {} is below than we, peer->{}, me->{}", + if (msg.getHeadBlockId().getNum() <= chainBaseManager.getHeadBlockId().getNum()) { + logger.info("Peer's head block {} is below than we, peer->{}, me->{}", peer.getInetSocketAddress(), msg.getSolidBlockId().getNum(), chainBaseManager.getSolidBlockId().getNum()); From b4171911874d26886a5802f5f0b9d291b960bd99 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 27 Mar 2023 21:20:31 +0800 Subject: [PATCH 074/142] fix(net): remove isRunnig --- .../effective/EffectiveCheckService.java | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index 437e88a12bd..32854341c19 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -42,7 +42,6 @@ public class EffectiveCheckService { private InetSocketAddress cur; private final AtomicInteger count = new AtomicInteger(0); private ScheduledExecutorService executor = null; - private boolean isRunning = false; public void init() { if (isEffectiveCheck) { @@ -54,7 +53,7 @@ public void init() { } catch (Exception e) { logger.error("Check effective connection processing failed", e); } - }, 60, 2, TimeUnit.SECONDS); + }, 60 * 1000, 200, TimeUnit.MILLISECONDS); } else { logger.info("EffectiveCheckService is disabled"); } @@ -94,21 +93,19 @@ private void findEffectiveNode() { return; } - if (isRunning) { - logger.info("Thread is running"); - return; - } - isRunning = true; - - if (cur != null && tronNetDelegate.getActivePeer().stream() - .anyMatch(p -> p.getInetSocketAddress().equals(cur))) { - // we encounter no effective connection again, so we disconnect with last used node - logger.info("Disconnect with {}", cur); - tronNetDelegate.getActivePeer().forEach(p -> { - if (p.getInetSocketAddress().equals(cur)) { - p.disconnect(ReasonCode.BELOW_THAN_ME); - } - }); + if (cur != null) { + if (tronNetDelegate.getActivePeer().stream() + .anyMatch(p -> p.getInetSocketAddress().equals(cur))) { + // we encounter no effective connection again, so we disconnect with last used node + logger.info("Disconnect with {}", cur); + tronNetDelegate.getActivePeer().forEach(p -> { + if (p.getInetSocketAddress().equals(cur)) { + p.disconnect(ReasonCode.BELOW_THAN_ME); + } + }); + } else { + logger.info("Thread is running"); + } return; } @@ -124,7 +121,6 @@ private void findEffectiveNode() { .findFirst(); if (!chosenNode.isPresent()) { logger.warn("No available node to choose"); - isRunning = false; return; } @@ -137,21 +133,19 @@ private void findEffectiveNode() { TronNetService.getP2pService().connect(chosenNode.get(), future -> { if (future.isCancelled()) { // Connection attempt cancelled by user + cur = null; } else if (!future.isSuccess()) { // You might get a NullPointerException here because the future might not be completed yet. logger.warn("Connect to chosen peer {} fail, cause:{}", cur, future.cause().getMessage()); future.channel().close(); - - isRunning = false; + cur = null; triggerNext(); } else { // Connection established successfully future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { logger.info("Close chosen channel:{}", cur); - isRunning = false; - if (isIsolateLand()) { - triggerNext(); - } + cur = null; + triggerNext(); }); } }); From dc63ec19171a84db78c5a5ba08ae846b9fb9fdfd Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 28 Mar 2023 11:41:35 +0800 Subject: [PATCH 075/142] feat(net): modify global rate limiter default value --- .../src/main/java/org/tron/core/config/args/Args.java | 10 ++++++---- .../java/org/tron/common/config/args/ArgsTest.java | 4 ++-- 2 files changed, 8 insertions(+), 6 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 ea44ec36475..368012cfc3d 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 @@ -221,8 +221,8 @@ public static void clearParam() { PARAMETER.allowNewRewardAlgorithm = 0; PARAMETER.allowNewReward = 0; PARAMETER.memoFee = 0; - PARAMETER.rateLimiterGlobalQps = 3000; - PARAMETER.rateLimiterGlobalIpQps = 30; + PARAMETER.rateLimiterGlobalQps = 50000; + PARAMETER.rateLimiterGlobalIpQps = 10000; PARAMETER.p2pDisable = false; } @@ -932,11 +932,11 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.rateLimiterGlobalQps = config.hasPath(Constant.RATE_LIMITER_GLOBAL_QPS) ? config - .getInt(Constant.RATE_LIMITER_GLOBAL_QPS) : 3000; + .getInt(Constant.RATE_LIMITER_GLOBAL_QPS) : 50000; PARAMETER.rateLimiterGlobalIpQps = config.hasPath(Constant.RATE_LIMITER_GLOBAL_IP_QPS) ? config - .getInt(Constant.RATE_LIMITER_GLOBAL_IP_QPS) : 30; + .getInt(Constant.RATE_LIMITER_GLOBAL_IP_QPS) : 10000; PARAMETER.rateLimiterInitialization = config.hasPath(Constant.RATE_LIMITER) ? getRateLimiterFromConfig(config) @@ -1490,6 +1490,8 @@ public static void logConfig() { logger.info("Max connection with same IP: {}", parameter.getMaxConnectionsWithSameIp()); logger.info("Solidity threads: {}", parameter.getSolidityThreads()); logger.info("Trx reference block: {}", parameter.getTrxReferenceBlock()); + logger.info("Rate limiter global qps: {}", parameter.getRateLimiterGlobalQps()); + logger.info("Rate limiter global ip qps: {}", parameter.getRateLimiterGlobalIpQps()); logger.info("************************ Backup config ************************"); logger.info("Backup priority: {}", parameter.getBackupPriority()); logger.info("Backup listen port: {}", parameter.getBackupPort()); diff --git a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java index 5b3f2c8eb78..8bb77ee36da 100644 --- a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java @@ -30,8 +30,8 @@ public void testConfig() { Assert.assertEquals(Args.getInstance().getNodeDiscoveryPingTimeout(), 15_000); Assert.assertEquals(Args.getInstance().getMaxFastForwardNum(), 3); Assert.assertEquals(Args.getInstance().getBlockCacheTimeout(), 60); - Assert.assertEquals(Args.getInstance().getRateLimiterGlobalQps(), 3000); - Assert.assertEquals(Args.getInstance().getRateLimiterGlobalIpQps(), 30); + Assert.assertEquals(Args.getInstance().getRateLimiterGlobalQps(), 50000); + Assert.assertEquals(Args.getInstance().getRateLimiterGlobalIpQps(), 10000); Assert.assertEquals(Args.getInstance().p2pDisable, true); } } \ No newline at end of file From 6959bd4590b9dae0dd59a521f853f2b448390e4e Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 28 Mar 2023 14:35:11 +0800 Subject: [PATCH 076/142] fix(net):optimize EffectiveCheckService --- .../org/tron/core/net/P2pEventHandlerImpl.java | 5 +++++ .../org/tron/core/net/peer/PeerConnection.java | 11 +++++++++++ .../service/effective/EffectiveCheckService.java | 14 ++++++++------ .../net/service/handshake/HandshakeService.java | 15 --------------- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java b/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java index 66774a216f2..602b6c9f81c 100644 --- a/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java +++ b/framework/src/main/java/org/tron/core/net/P2pEventHandlerImpl.java @@ -28,6 +28,7 @@ import org.tron.core.net.messagehandler.TransactionsMsgHandler; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.peer.PeerManager; +import org.tron.core.net.service.effective.EffectiveCheckService; import org.tron.core.net.service.handshake.HandshakeService; import org.tron.core.net.service.keepalive.KeepAliveService; import org.tron.p2p.P2pEventHandler; @@ -78,6 +79,9 @@ public class P2pEventHandlerImpl extends P2pEventHandler { @Autowired private KeepAliveService keepAliveService; + @Autowired + private EffectiveCheckService effectiveCheckService; + private byte MESSAGE_MAX_TYPE = 127; public P2pEventHandlerImpl() { @@ -102,6 +106,7 @@ public synchronized void onDisconnect(Channel channel) { if (peerConnection != null) { peerConnection.onDisconnect(); } + effectiveCheckService.onDisconnect(channel.getInetSocketAddress()); } @Override diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index 7e417bd24f4..c6bdb413f68 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -40,12 +40,14 @@ import org.tron.core.net.message.keepalive.PingMessage; import org.tron.core.net.message.keepalive.PongMessage; import org.tron.core.net.service.adv.AdvService; +import org.tron.core.net.service.effective.EffectiveCheckService; import org.tron.core.net.service.statistics.NodeStatistics; import org.tron.core.net.service.statistics.PeerStatistics; import org.tron.core.net.service.statistics.TronStatsManager; import org.tron.core.net.service.sync.SyncService; import org.tron.p2p.connection.Channel; import org.tron.protos.Protocol; +import org.tron.protos.Protocol.ReasonCode; @Slf4j(topic = "net") @Component @@ -88,6 +90,9 @@ public class PeerConnection { @Autowired private AdvService advService; + @Autowired + private EffectiveCheckService effectiveCheckService; + @Setter @Getter private HelloMessage helloMessageReceive; @@ -182,6 +187,12 @@ public void onConnect() { needSyncFromUs = false; syncService.startSync(this); } else { + if (getInetSocketAddress().equals(effectiveCheckService.getCur())) { + logger.info("Peer's head block {} is below than we, peer->{}, me->{}", + getInetSocketAddress(), peerHeadBlockNum, headBlockNum); + disconnect(ReasonCode.BELOW_THAN_ME); + return; + } needSyncFromPeer = false; if (peerHeadBlockNum == headBlockNum) { needSyncFromUs = false; diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index 32854341c19..ac8587c0b5b 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -3,7 +3,6 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import io.netty.channel.ChannelFutureListener; import java.net.InetSocketAddress; import java.util.Comparator; import java.util.HashSet; @@ -142,11 +141,6 @@ private void findEffectiveNode() { triggerNext(); } else { // Connection established successfully - future.channel().closeFuture().addListener((ChannelFutureListener) closeFuture -> { - logger.info("Close chosen channel:{}", cur); - cur = null; - triggerNext(); - }); } }); } @@ -154,4 +148,12 @@ private void findEffectiveNode() { private void resetCount() { count.set(0); } + + public void onDisconnect(InetSocketAddress inetSocketAddress) { + if (inetSocketAddress.equals(cur)) { + logger.warn("Close chosen peer: {}", cur); + cur = null; + triggerNext(); + } + } } diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 317a3f47a53..81feb590e4f 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -102,21 +102,6 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } - if (effectiveCheckService.isEffectiveCheck() && effectiveCheckService.isIsolateLand() - && peer.getInetSocketAddress().equals(effectiveCheckService.getCur())) { - if (msg.getHeadBlockId().getNum() <= chainBaseManager.getHeadBlockId().getNum()) { - logger.info("Peer's head block {} is below than we, peer->{}, me->{}", - peer.getInetSocketAddress(), - msg.getSolidBlockId().getNum(), - chainBaseManager.getSolidBlockId().getNum()); - peer.disconnect(ReasonCode.BELOW_THAN_ME); - return; - } else { - logger.info("Success to find effective node {}", peer.getInetSocketAddress()); - peer.setNeedSyncFromUs(false); - } - } - peer.setHelloMessageReceive(msg); peer.getChannel().updateAvgLatency( From 66f1ea6d64890b20fc673595252abc7bdfcb6c84 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 28 Mar 2023 14:39:15 +0800 Subject: [PATCH 077/142] fix(net): delete changes in HandshakeService --- .../org/tron/core/net/service/handshake/HandshakeService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 81feb590e4f..6c9e53c3a98 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -11,7 +11,6 @@ import org.tron.core.net.message.handshake.HelloMessage; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.peer.PeerManager; -import org.tron.core.net.service.effective.EffectiveCheckService; import org.tron.core.net.service.relay.RelayService; import org.tron.p2p.discover.Node; import org.tron.protos.Protocol.ReasonCode; @@ -23,9 +22,6 @@ public class HandshakeService { @Autowired private RelayService relayService; - @Autowired - private EffectiveCheckService effectiveCheckService; - @Autowired private ChainBaseManager chainBaseManager; From 8b23eb705ccf1e27a01190ce7708197656afe76f Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 28 Mar 2023 14:43:15 +0800 Subject: [PATCH 078/142] fix(net):optimize EffectiveCheckService --- .../tron/core/net/service/effective/EffectiveCheckService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index ac8587c0b5b..057480905f2 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -52,7 +52,7 @@ public void init() { } catch (Exception e) { logger.error("Check effective connection processing failed", e); } - }, 60 * 1000, 200, TimeUnit.MILLISECONDS); + }, 60 , 5, TimeUnit.SECONDS); } else { logger.info("EffectiveCheckService is disabled"); } From ec5ac7069cea0b5837f77dc2d2a72afc5f62a6c8 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Tue, 28 Mar 2023 14:58:23 +0800 Subject: [PATCH 079/142] feat(config):change the method of getting configuration file changes --- .../tron/core/config/args/DynamicArgs.java | 161 ++++++------------ .../core/config/args/DynamicArgsTest.java | 19 ++- 2 files changed, 63 insertions(+), 117 deletions(-) diff --git a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java index 9da606e680a..c0f08f61148 100644 --- a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java +++ b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java @@ -4,16 +4,13 @@ import com.typesafe.config.Config; import java.io.File; -import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; -import java.nio.file.FileSystems; -import java.nio.file.Path; -import java.nio.file.StandardWatchEventKinds; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.tron.common.parameter.CommonParameter; @@ -27,78 +24,54 @@ public class DynamicArgs { private final CommonParameter parameter = Args.getInstance(); - private volatile boolean shutdown = false; + private long lastModified = 0; + + private ScheduledExecutorService reloadExecutor = Executors.newSingleThreadScheduledExecutor(); public void init() { if (parameter.isDynamicConfigEnable()) { - new Thread(this::start, "DynamicArgs").start(); + File config = getConfigFile(); + if (config != null) { + lastModified = config.lastModified(); + } else { + return; + } + logger.info("Start the dynamic loading configuration service"); + reloadExecutor.scheduleWithFixedDelay(() -> { + try { + run(); + } catch (Exception e) { + logger.error("Exception caught when reloading configuration", e); + } + }, 100, 10, TimeUnit.SECONDS); } } - public void start() { - WatchService watchService; - Path path; - String confFileName; - try { - logger.info("Start the dynamic loading configuration service"); - String confFile; - if (isNoneBlank(parameter.getShellConfFileName())) { - confFile = parameter.getShellConfFileName(); - } else { - confFile = Constant.TESTNET_CONF; - //logger.warn("Configuration path is required!"); - //return; + public void run() { + File config = getConfigFile(); + if (config != null) { + long lastModifiedTime = config.lastModified(); + if (lastModifiedTime > lastModified) { + reload(); + lastModified = lastModifiedTime; } - - File confDir = new File(confFile); - if (!confDir.exists()) { - logger.warn("Configuration path is required! No such file {}", confFile); - return; - } - confFileName = confDir.getName(); - if (confFile.contains(File.separator)) { - path = FileSystems.getDefault().getPath(confDir.getPath()).getParent(); - } else { - File directory = new File(""); - path = FileSystems.getDefault().getPath(directory.getAbsolutePath()); - } - - logger.debug("confDirString = {}", confDir); - watchService = FileSystems.getDefault().newWatchService(); - path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); - logger.debug("watch path : {}", path.toString()); - } catch (Exception e) { - logger.error("Exception caught when register the watch key", e.getCause()); - return; } + } - while (!shutdown) { - try { - WatchKey wk = watchService.take(); - long changeCount = 0; - for (WatchEvent event : wk.pollEvents()) { - final Path changed = (Path)event.context(); - if (changed.endsWith(confFileName)) { - reload(); - logger.info("The configuration was modified and we reloaded it"); - } - changeCount++; - } - logger.debug("change count : {}", changeCount); + private File getConfigFile() { + String confFilePath; + if (isNoneBlank(parameter.getShellConfFileName())) { + confFilePath = parameter.getShellConfFileName(); + } else { + confFilePath = Constant.TESTNET_CONF; + } - boolean valid = wk.reset(); - if (!valid) { - path.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY); - } - } catch (InterruptedException e) { - logger.warn("WatchService was interrupted"); - Thread.currentThread().interrupt(); - break; - } catch (IOException e) { - logger.error("Exception caught when register the watch key", e.getCause()); - break; - } + File confFile = new File(confFilePath); + if (!confFile.exists()) { + logger.warn("Configuration path is required! No such file {}", confFile); + return null; } + return confFile; } public void reload() { @@ -112,58 +85,30 @@ public void reload() { } private void updateActiveNodes(Config config) { - if (parameter.isWitness() || parameter.isFastForward()) { - return; - } - - List lastActiveNodes = parameter.getActiveNodes(); List newActiveNodes = Args.getInetSocketAddress(config, Constant.NODE_ACTIVE); parameter.setActiveNodes(newActiveNodes); - parameter.getActiveNodes().forEach(n -> { - if (!lastActiveNodes.contains(n)) { - TronNetService.getP2pConfig().getActiveNodes().add(n); - if (!TronNetService.getP2pConfig().getTrustNodes().contains(n.getAddress())) { - TronNetService.getP2pConfig().getTrustNodes().add(n.getAddress()); - } - } - }); - - lastActiveNodes.forEach(ln -> { - if (!parameter.getActiveNodes().contains(ln)) { - TronNetService.getP2pConfig().getActiveNodes().remove(ln); - TronNetService.getP2pConfig().getTrustNodes().remove(ln.getAddress()); - } - }); + List activeNodes = TronNetService.getP2pConfig().getActiveNodes(); + activeNodes.clear(); + activeNodes.addAll(newActiveNodes); logger.debug("p2p active nodes : {}", TronNetService.getP2pConfig().getActiveNodes().toString()); } private void updateTrustNodes(Config config) { - if (parameter.isWitness() || parameter.isFastForward()) { - return; - } - - List lastPassiveNodes = parameter.getPassiveNodes(); List newPassiveNodes = Args.getInetAddress(config, Constant.NODE_PASSIVE); parameter.setPassiveNodes(newPassiveNodes); - parameter.getPassiveNodes().forEach(n -> { - if (!lastPassiveNodes.contains(n) - || !TronNetService.getP2pConfig().getTrustNodes().contains(n)) { - TronNetService.getP2pConfig().getTrustNodes().add(n); - } - }); - - lastPassiveNodes.forEach(ln -> { - if (!parameter.getPassiveNodes().contains(ln)) { - TronNetService.getP2pConfig().getTrustNodes().remove(ln); - } - }); - logger.debug("p2p trust nodes : {}", TronNetService.getP2pConfig().getTrustNodes().toString()); + List trustNodes = TronNetService.getP2pConfig().getTrustNodes(); + trustNodes.clear(); + trustNodes.addAll(newPassiveNodes); + parameter.getActiveNodes().forEach(n -> trustNodes.add(n.getAddress())); + parameter.getFastForwardNodes().forEach(f -> trustNodes.add(f.getAddress())); + logger.debug("p2p trust nodes : {}", + TronNetService.getP2pConfig().getTrustNodes().toString()); } public void close() { - logger.info("Closing watchService ..."); - shutdown = true; + logger.info("Closing the dynamic loading configuration service ..."); + reloadExecutor.shutdown(); } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java index c544a545e16..0dcb755894f 100644 --- a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java @@ -1,5 +1,6 @@ package org.tron.core.config.args; +import java.io.File; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -10,10 +11,8 @@ import org.tron.common.utils.ReflectUtils; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; -import org.tron.core.net.TronNetService; -import org.tron.p2p.P2pConfig; - -import java.io.File; +//import org.tron.core.net.TronNetService; +//import org.tron.p2p.P2pConfig; public class DynamicArgsTest { protected TronApplicationContext context; @@ -45,11 +44,13 @@ public void get() { @Test public void start() { - dynamicArgs.start(); - TronNetService tronNetService = context.getBean(TronNetService.class); - ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig()); - dynamicArgs.reload(); + dynamicArgs.init(); + Assert.assertEquals(0, (long) ReflectUtils.getFieldObject(dynamicArgs, "lastModified")); + + dynamicArgs.run(); +// TronNetService tronNetService = context.getBean(TronNetService.class); +// ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig()); +// dynamicArgs.reload(); dynamicArgs.close(); - Assert.assertTrue((boolean)ReflectUtils.getFieldObject(dynamicArgs, "shutdown")); } } From 06b814e67ecd1b5943714074ee1136191089a8b9 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 29 Mar 2023 13:13:45 +0800 Subject: [PATCH 080/142] fix(net):don't start program if some dns patameter is empty --- .../java/org/tron/core/config/args/Args.java | 42 +++++++-------- .../test/java/org/tron/core/net/NodeTest.java | 6 ++- framework/src/test/resources/config-test.conf | 54 +++++++++++++++++++ 3 files changed, 79 insertions(+), 23 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 af4fca636ad..b39770980ea 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 @@ -1315,11 +1315,11 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi } if (publishConfig.isDnsPublishEnable()) { - if (config.hasPath(Constant.NODE_DNS_DOMAIN)) { + if (config.hasPath(Constant.NODE_DNS_DOMAIN) && StringUtils.isNotEmpty( + config.getString(Constant.NODE_DNS_DOMAIN))) { publishConfig.setDnsDomain(config.getString(Constant.NODE_DNS_DOMAIN)); } else { logEmptyError(Constant.NODE_DNS_DOMAIN); - return null; } if (config.hasPath(Constant.NODE_DNS_CHANGE_THRESHOLD)) { @@ -1341,11 +1341,11 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi } } - if (config.hasPath(Constant.NODE_DNS_PRIVATE)) { + if (config.hasPath(Constant.NODE_DNS_PRIVATE) && StringUtils.isNotEmpty( + config.getString(Constant.NODE_DNS_PRIVATE))) { publishConfig.setDnsPrivate(config.getString(Constant.NODE_DNS_PRIVATE)); } else { logEmptyError(Constant.NODE_DNS_PRIVATE); - return null; } if (config.hasPath(Constant.NODE_DNS_KNOWN_URLS)) { @@ -1357,11 +1357,12 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi getInetSocketAddress(config, Constant.NODE_DNS_STATIC_NODES, false)); } - if (config.hasPath(Constant.NODE_DNS_SERVER_TYPE)) { + if (config.hasPath(Constant.NODE_DNS_SERVER_TYPE) && StringUtils.isNotEmpty( + config.getString(Constant.NODE_DNS_SERVER_TYPE))) { String serverType = config.getString(Constant.NODE_DNS_SERVER_TYPE); if (!"aws".equalsIgnoreCase(serverType) && !"aliyun".equalsIgnoreCase(serverType)) { - logger.error("Check {}, must be aws or aliyun", Constant.NODE_DNS_SERVER_TYPE); - return null; + throw new IllegalArgumentException( + String.format("Check %s, must be aws or aliyun", Constant.NODE_DNS_SERVER_TYPE)); } if ("aws".equalsIgnoreCase(serverType)) { publishConfig.setDnsType(DnsType.AwsRoute53); @@ -1370,38 +1371,37 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi } } else { logEmptyError(Constant.NODE_DNS_SERVER_TYPE); - return null; } - if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_ID)) { + if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_ID) && StringUtils.isNotEmpty( + config.getString(Constant.NODE_DNS_ACCESS_KEY_ID))) { publishConfig.setAccessKeyId(config.getString(Constant.NODE_DNS_ACCESS_KEY_ID)); } else { logEmptyError(Constant.NODE_DNS_ACCESS_KEY_ID); - return null; } - if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_SECRET)) { + if (config.hasPath(Constant.NODE_DNS_ACCESS_KEY_SECRET) && StringUtils.isNotEmpty( + config.getString(Constant.NODE_DNS_ACCESS_KEY_SECRET))) { publishConfig.setAccessKeySecret(config.getString(Constant.NODE_DNS_ACCESS_KEY_SECRET)); } else { logEmptyError(Constant.NODE_DNS_ACCESS_KEY_SECRET); - return null; } if (publishConfig.getDnsType() == DnsType.AwsRoute53) { - if (!config.hasPath(Constant.NODE_DNS_AWS_REGION)) { - logEmptyError(Constant.NODE_DNS_AWS_REGION); - return null; - } else { + if (config.hasPath(Constant.NODE_DNS_AWS_REGION) && StringUtils.isNotEmpty( + config.getString(Constant.NODE_DNS_AWS_REGION))) { publishConfig.setAwsRegion(config.getString(Constant.NODE_DNS_AWS_REGION)); + } else { + logEmptyError(Constant.NODE_DNS_AWS_REGION); } if (config.hasPath(Constant.NODE_DNS_AWS_HOST_ZONE_ID)) { publishConfig.setAwsHostZoneId(config.getString(Constant.NODE_DNS_AWS_HOST_ZONE_ID)); } } else { - if (!config.hasPath(Constant.NODE_DNS_ALIYUN_ENDPOINT)) { - logEmptyError(Constant.NODE_DNS_ALIYUN_ENDPOINT); - return null; - } else { + if (config.hasPath(Constant.NODE_DNS_ALIYUN_ENDPOINT) && StringUtils.isNotEmpty( + config.getString(Constant.NODE_DNS_ALIYUN_ENDPOINT))) { publishConfig.setAliDnsEndpoint(config.getString(Constant.NODE_DNS_ALIYUN_ENDPOINT)); + } else { + logEmptyError(Constant.NODE_DNS_ALIYUN_ENDPOINT); } } } @@ -1409,7 +1409,7 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi } private static void logEmptyError(String arg) { - logger.error("Check {}, must not be null", arg); + throw new IllegalArgumentException(String.format("Check %s, must not be null or empty", arg)); } private static TriggerConfig createTriggerConfig(ConfigObject triggerObject) { diff --git a/framework/src/test/java/org/tron/core/net/NodeTest.java b/framework/src/test/java/org/tron/core/net/NodeTest.java index ac01a46dbc8..421b93f589a 100644 --- a/framework/src/test/java/org/tron/core/net/NodeTest.java +++ b/framework/src/test/java/org/tron/core/net/NodeTest.java @@ -15,6 +15,7 @@ import org.tron.core.config.Configuration; import org.tron.core.config.args.Args; import org.tron.p2p.discover.Node; +import org.tron.p2p.dns.update.DnsType; import org.tron.p2p.dns.update.PublishConfig; import org.tron.p2p.utils.NetUtil; import org.tron.protos.Discover.Endpoint; @@ -79,7 +80,8 @@ public void testEndpointFromNode() { public void testPublishConfig() { Config config = Configuration.getByFileName(Constant.TEST_CONF, Constant.TEST_CONF); PublishConfig publishConfig = Args.loadDnsPublishConfig(config); - assert publishConfig != null; - Assert.assertFalse(publishConfig.isDnsPublishEnable()); + Assert.assertTrue(publishConfig.isDnsPublishEnable()); + Assert.assertEquals(5, publishConfig.getMaxMergeSize()); + Assert.assertEquals(DnsType.AwsRoute53, publishConfig.getDnsType()); } } diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 2cd108bf966..d61e0eead64 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -105,6 +105,60 @@ node { solidityPort = 8091 } + enableIpv6 = false + + dns { + # dns urls to get nodes, url format tree://{pubkey}@{domain}, default empty + treeUrls = [ + #"tree://APFGGTFOBVE2ZNAB3CSMNNX6RRK3ODIRLP2AA5U4YFAA6MSYZUYTQ@nodes1.example.org", + ] + + # enable or disable dns publish, default false + publish = true + + # dns domain to publish nodes, required if publish is true + dnsDomain = "nodes1.example.org" + + # dns private key used to publish, required if publish is true, hex string of length 64 + dnsPrivate = "b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291" + + # known dns urls to publish if publish is true, url format tree://{pubkey}@{domain}, default empty + knownUrls = [ + #"tree://APFGGTFOBVE2ZNAB3CSMNNX6RRK3ODIRLP2AA5U4YFAA6MSYZUYTQ@nodes2.example.org", + ] + + staticNodes = [ + # static nodes to published on dns + # Sample entries: + # "ip:port", + # "ip:port" + ] + + # merge several nodes into a leaf of tree, should be 1~5 + maxMergeSize = 5 + + # only nodes change percent is bigger then the threshold, we update data on dns + changeThreshold = 0.1 + + # dns server to publish, required if publish is true, only aws or aliyun is support + serverType = "aws" + + # access key id of aws or aliyun api, required if publish is true, string + accessKeyId = "your-key-id" + + # access key secret of aws or aliyun api, required if publish is true, string + accessKeySecret = "your-key-secret" + + # if publish is true and serverType is aliyun, it's endpoint of aws dns server, string + aliyunDnsEndpoint = "alidns.aliyuncs.com" + + # if publish is true and serverType is aws, it's region of aws api, such as "eu-south-1", string + awsRegion = "us-east-1" + + # if publish is true and server-type is aws, it's host zone id of aws's domain, string + awsHostZoneId = "your-host-zone-id" + } + rpc { port = 50051 From cf3dfd254b323931cb792d32fba9581ac9a5e2f9 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 29 Mar 2023 13:20:05 +0800 Subject: [PATCH 081/142] fix(net):revert log level of net to info --- framework/src/main/resources/logback.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/resources/logback.xml b/framework/src/main/resources/logback.xml index 62accd7f2c5..39c7f463172 100644 --- a/framework/src/main/resources/logback.xml +++ b/framework/src/main/resources/logback.xml @@ -75,7 +75,7 @@ - + From b1d52552ebc9f8b9ab18e69a9e060afcb41b5639 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 29 Mar 2023 14:48:03 +0800 Subject: [PATCH 082/142] fix(net): optimize EffectiveCheckService --- .../java/org/tron/core/config/args/Args.java | 11 ++------ .../org/tron/core/net/TronNetService.java | 4 +-- .../tron/core/net/peer/PeerConnection.java | 10 ------- .../effective/EffectiveCheckService.java | 26 +++++++++---------- .../service/handshake/HandshakeService.java | 13 ++++++++++ 5 files changed, 28 insertions(+), 36 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 60c87f737ff..a746e96c97e 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 @@ -1202,9 +1202,6 @@ private static List getInetSocketAddress( List list = config.getStringList(path); for (String configString : list) { InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(configString); - if (inetSocketAddress == null) { - continue; - } if (filter) { String ip = inetSocketAddress.getAddress().getHostAddress(); int port = inetSocketAddress.getPort(); @@ -1230,9 +1227,7 @@ private static List getInetAddress( List list = config.getStringList(path); for (String configString : list) { InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(configString); - if (inetSocketAddress != null) { - ret.add(inetSocketAddress.getAddress()); - } + ret.add(inetSocketAddress.getAddress()); } return ret; } @@ -1301,9 +1296,7 @@ private static List loadSeeds(final com.typesafe.config.Confi if (PARAMETER.seedNodes != null && !PARAMETER.seedNodes.isEmpty()) { for (String s : PARAMETER.seedNodes) { InetSocketAddress inetSocketAddress = NetUtil.parseInetSocketAddress(s); - if (inetSocketAddress != null) { - inetSocketAddressList.add(inetSocketAddress); - } + inetSocketAddressList.add(inetSocketAddress); } } else { inetSocketAddressList = getInetSocketAddress(config, Constant.SEED_NODE_IP_LIST, false); diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index fab50cd500d..89767e31827 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -150,9 +150,7 @@ public static boolean hasIpv4Stack(Set ipSet) { private P2pConfig getConfig() { List seeds = parameter.getSeedNode().getAddressList(); seeds.addAll(nodePersistService.dbRead()); - for (InetSocketAddress inetSocketAddress : seeds) { - logger.debug("Seed InetSocketAddress: {}", inetSocketAddress); - } + logger.debug("Seed InetSocketAddress: {}", seeds); P2pConfig config = new P2pConfig(); config.getSeedNodes().addAll(seeds); config.getActiveNodes().addAll(parameter.getActiveNodes()); diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index c6bdb413f68..1bd1ce20595 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -47,7 +47,6 @@ import org.tron.core.net.service.sync.SyncService; import org.tron.p2p.connection.Channel; import org.tron.protos.Protocol; -import org.tron.protos.Protocol.ReasonCode; @Slf4j(topic = "net") @Component @@ -90,9 +89,6 @@ public class PeerConnection { @Autowired private AdvService advService; - @Autowired - private EffectiveCheckService effectiveCheckService; - @Setter @Getter private HelloMessage helloMessageReceive; @@ -187,12 +183,6 @@ public void onConnect() { needSyncFromUs = false; syncService.startSync(this); } else { - if (getInetSocketAddress().equals(effectiveCheckService.getCur())) { - logger.info("Peer's head block {} is below than we, peer->{}, me->{}", - getInetSocketAddress(), peerHeadBlockNum, headBlockNum); - disconnect(ReasonCode.BELOW_THAN_ME); - return; - } needSyncFromPeer = false; if (peerHeadBlockNum == headBlockNum) { needSyncFromUs = false; diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index 057480905f2..b5792507d06 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -38,9 +38,10 @@ public class EffectiveCheckService { .maximumSize(10000) .expireAfterWrite(20, TimeUnit.MINUTES).build(); @Getter - private InetSocketAddress cur; + private volatile InetSocketAddress cur; private final AtomicInteger count = new AtomicInteger(0); private ScheduledExecutorService executor = null; + private long MAX_HANDSHAKE_TIME = 60_000; public void init() { if (isEffectiveCheck) { @@ -52,7 +53,7 @@ public void init() { } catch (Exception e) { logger.error("Check effective connection processing failed", e); } - }, 60 , 5, TimeUnit.SECONDS); + }, 60, 5, TimeUnit.SECONDS); } else { logger.info("EffectiveCheckService is disabled"); } @@ -93,18 +94,15 @@ private void findEffectiveNode() { } if (cur != null) { - if (tronNetDelegate.getActivePeer().stream() - .anyMatch(p -> p.getInetSocketAddress().equals(cur))) { - // we encounter no effective connection again, so we disconnect with last used node - logger.info("Disconnect with {}", cur); - tronNetDelegate.getActivePeer().forEach(p -> { - if (p.getInetSocketAddress().equals(cur)) { - p.disconnect(ReasonCode.BELOW_THAN_ME); - } - }); - } else { - logger.info("Thread is running"); - } + tronNetDelegate.getActivePeer().forEach(p -> { + if (p.getInetSocketAddress().equals(cur) + && System.currentTimeMillis() - p.getChannel().getStartTime() >= MAX_HANDSHAKE_TIME) { + // we encounter no effective connection again, so we disconnect with last used node + logger.info("Disconnect with {}", cur); + p.disconnect(ReasonCode.BELOW_THAN_ME); + } + }); + logger.info("Thread is running"); return; } diff --git a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java index 6c9e53c3a98..aa6567d1cda 100644 --- a/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java +++ b/framework/src/main/java/org/tron/core/net/service/handshake/HandshakeService.java @@ -11,6 +11,7 @@ import org.tron.core.net.message.handshake.HelloMessage; import org.tron.core.net.peer.PeerConnection; import org.tron.core.net.peer.PeerManager; +import org.tron.core.net.service.effective.EffectiveCheckService; import org.tron.core.net.service.relay.RelayService; import org.tron.p2p.discover.Node; import org.tron.protos.Protocol.ReasonCode; @@ -22,6 +23,9 @@ public class HandshakeService { @Autowired private RelayService relayService; + @Autowired + private EffectiveCheckService effectiveCheckService; + @Autowired private ChainBaseManager chainBaseManager; @@ -98,6 +102,15 @@ public void processHelloMessage(PeerConnection peer, HelloMessage msg) { return; } + if (msg.getHeadBlockId().getNum() < chainBaseManager.getHeadBlockId().getNum() + && peer.getInetSocketAddress().equals(effectiveCheckService.getCur())) { + logger.info("Peer's head block {} is below than we, peer->{}, me->{}", + peer.getInetSocketAddress(), msg.getHeadBlockId().getNum(), + chainBaseManager.getHeadBlockId().getNum()); + peer.disconnect(ReasonCode.BELOW_THAN_ME); + return; + } + peer.setHelloMessageReceive(msg); peer.getChannel().updateAvgLatency( From 2fd5fbef5a9428a037640a43e29cc179d218a844 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 29 Mar 2023 14:59:13 +0800 Subject: [PATCH 083/142] feat(net): optimize sync block chain message check logic --- .../SyncBlockChainMsgHandler.java | 13 ++++- .../messagehandler/BlockMsgHandlerTest.java | 10 +++- .../SyncBlockChainMsgHandlerTest.java | 57 ++++++++++++++++++- 3 files changed, 71 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java b/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java index 37d46f6a8f3..9027034ccc7 100644 --- a/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java +++ b/framework/src/main/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandler.java @@ -29,7 +29,10 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep SyncBlockChainMessage syncBlockChainMessage = (SyncBlockChainMessage) msg; - check(peer, syncBlockChainMessage); + if (!check(peer, syncBlockChainMessage)) { + peer.disconnect(Protocol.ReasonCode.BAD_PROTOCOL); + return; + } long remainNum = 0; @@ -53,7 +56,7 @@ public void processMessage(PeerConnection peer, TronMessage msg) throws P2pExcep peer.sendMessage(new ChainInventoryMessage(blockIds, remainNum)); } - private void check(PeerConnection peer, SyncBlockChainMessage msg) throws P2pException { + private boolean check(PeerConnection peer, SyncBlockChainMessage msg) throws P2pException { List blockIds = msg.getBlockIds(); if (CollectionUtils.isEmpty(blockIds)) { throw new P2pException(TypeEnum.BAD_MESSAGE, "SyncBlockChain blockIds is empty"); @@ -61,7 +64,9 @@ private void check(PeerConnection peer, SyncBlockChainMessage msg) throws P2pExc BlockId firstId = blockIds.get(0); if (!tronNetDelegate.containBlockInMainChain(firstId)) { - throw new P2pException(TypeEnum.BAD_MESSAGE, "No first block:" + firstId.getString()); + logger.warn("Sync message from peer {} without the first block: {}", + peer.getInetSocketAddress(), firstId.getString()); + return false; } long headNum = tronNetDelegate.getHeadBlockId().getNum(); @@ -76,6 +81,8 @@ private void check(PeerConnection peer, SyncBlockChainMessage msg) throws P2pExc throw new P2pException(TypeEnum.BAD_MESSAGE, "lastSyncNum:" + lastSyncBlockId.getNum() + " gt lastNum:" + lastNum); } + + return true; } private LinkedList getLostBlockIds(List blockIds) throws P2pException { diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java index ff6203ee870..d4d53da1748 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/BlockMsgHandlerTest.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableList; import com.google.protobuf.ByteString; +import java.io.File; import java.lang.reflect.Field; import java.net.InetSocketAddress; import java.util.List; @@ -10,6 +11,7 @@ import org.junit.Before; import org.junit.Test; import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.FileUtil; import org.tron.common.utils.Sha256Hash; import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; @@ -26,23 +28,24 @@ public class BlockMsgHandlerTest { - protected TronApplicationContext context; + private TronApplicationContext context; private BlockMsgHandler handler; private PeerConnection peer; + private String dbPath = "output-block-message-handler-test"; /** * init context. */ @Before public void init() throws Exception { - Args.setParam(new String[]{"--output-directory", "output-directory", "--debug"}, + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, Constant.TEST_CONF); context = new TronApplicationContext(DefaultConfig.class); handler = context.getBean(BlockMsgHandler.class); peer = context.getBean(PeerConnection.class); Channel c1 = new Channel(); InetSocketAddress a1 = new InetSocketAddress("100.1.1.1", 100); - Field field = c1.getClass().getDeclaredField("inetAddress"); + Field field = c1.getClass().getDeclaredField("inetAddress"); field.setAccessible(true); field.set(c1, a1.getAddress()); peer.setChannel(c1); @@ -120,5 +123,6 @@ public void testProcessMessage() { public void destroy() { Args.clearParam(); context.destroy(); + FileUtil.deleteDir(new File(dbPath)); } } diff --git a/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java b/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java index a0c37d246da..2dbad09c655 100644 --- a/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java +++ b/framework/src/test/java/org/tron/core/net/messagehandler/SyncBlockChainMsgHandlerTest.java @@ -1,24 +1,75 @@ package org.tron.core.net.messagehandler; +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.InetSocketAddress; import java.util.ArrayList; +import java.util.List; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; import org.tron.core.exception.P2pException; import org.tron.core.net.message.sync.SyncBlockChainMessage; import org.tron.core.net.peer.PeerConnection; +import org.tron.p2p.connection.Channel; public class SyncBlockChainMsgHandlerTest { - private SyncBlockChainMsgHandler handler = new SyncBlockChainMsgHandler(); - private PeerConnection peer = new PeerConnection(); + private TronApplicationContext context; + private SyncBlockChainMsgHandler handler; + private PeerConnection peer; + private String dbPath = "output-sync-chain-test"; + + @Before + public void init() throws Exception { + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, + Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + handler = context.getBean(SyncBlockChainMsgHandler.class); + peer = context.getBean(PeerConnection.class); + Channel c1 = new Channel(); + InetSocketAddress a1 = new InetSocketAddress("100.1.1.1", 100); + Field field = c1.getClass().getDeclaredField("inetSocketAddress"); + field.setAccessible(true); + field.set(c1, a1); + + field = c1.getClass().getDeclaredField("inetAddress"); + field.setAccessible(true); + field.set(c1, a1.getAddress()); + + peer.setChannel(c1); + } @Test - public void testProcessMessage() { + public void testProcessMessage() throws Exception { try { handler.processMessage(peer, new SyncBlockChainMessage(new ArrayList<>())); } catch (P2pException e) { Assert.assertTrue(e.getMessage().equals("SyncBlockChain blockIds is empty")); } + + List blockIds = new ArrayList<>(); + blockIds.add(new BlockCapsule.BlockId()); + SyncBlockChainMessage message = new SyncBlockChainMessage(blockIds); + Method method = handler.getClass().getDeclaredMethod( + "check", PeerConnection.class, SyncBlockChainMessage.class); + method.setAccessible(true); + boolean f = (boolean)method.invoke(handler, peer, message); + Assert.assertTrue(!f); + } + + @After + public void destroy() { + Args.clearParam(); + FileUtil.deleteDir(new File(dbPath)); } } From 272a16a286c0090cac0665ba5086279ad1179cac Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 29 Mar 2023 16:20:37 +0800 Subject: [PATCH 084/142] fix(net): update libp2p to test-v0.2.20 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index a09a1ac9159..5c70edf0b65 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-callback-v4' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.20' compile project(":protocol") } From 83ed16c03b2ff1655c96204c882be14da27d99fe Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Wed, 29 Mar 2023 16:21:34 +0800 Subject: [PATCH 085/142] feat(config):add test case --- .../common/parameter/CommonParameter.java | 4 +++ .../src/main/java/org/tron/core/Constant.java | 3 ++- .../java/org/tron/core/config/args/Args.java | 10 +++++++ .../tron/core/config/args/DynamicArgs.java | 10 +++---- .../core/config/args/DynamicArgsTest.java | 27 ++++++++++++++----- framework/src/test/resources/config-test.conf | 4 ++- 6 files changed, 44 insertions(+), 14 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 9ff70a42a30..c878acd943e 100644 --- a/common/src/main/java/org/tron/common/parameter/CommonParameter.java +++ b/common/src/main/java/org/tron/common/parameter/CommonParameter.java @@ -618,6 +618,10 @@ public class CommonParameter { @Setter public boolean dynamicConfigEnable; + @Getter + @Setter + public long dynamicConfigCheckInterval; + private static double calcMaxTimeRatio() { //return max(2.0, min(5.0, 5 * 4.0 / max(Runtime.getRuntime().availableProcessors(), 1))); return 5.0; diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 59d69bfecfd..7f572058218 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -344,5 +344,6 @@ public class Constant { public static final String BLOCK_CACHE_TIMEOUT = "node.blockCacheTimeout"; - public static final String DYNAMIC_CONFIG_ENABLE = "dynamicConfigEnable"; + public static final String DYNAMIC_CONFIG_ENABLE = "node.dynamicConfig.enable"; + public static final String DYNAMIC_CONFIG_CHECK_INTERVAL = "node.dynamicConfig.checkInterval"; } 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 78be66c6576..e18984ed7f7 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 @@ -223,6 +223,7 @@ public static void clearParam() { PARAMETER.memoFee = 0; PARAMETER.p2pDisable = false; PARAMETER.dynamicConfigEnable = false; + PARAMETER.dynamicConfigCheckInterval = 600; } /** @@ -1126,6 +1127,15 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.dynamicConfigEnable = config.hasPath(Constant.DYNAMIC_CONFIG_ENABLE) && config.getBoolean(Constant.DYNAMIC_CONFIG_ENABLE); + if (config.hasPath(Constant.DYNAMIC_CONFIG_CHECK_INTERVAL)) { + PARAMETER.dynamicConfigCheckInterval + = config.getLong(Constant.DYNAMIC_CONFIG_CHECK_INTERVAL); + if (PARAMETER.dynamicConfigCheckInterval <= 0) { + PARAMETER.dynamicConfigCheckInterval = 600; + } + } else { + PARAMETER.dynamicConfigCheckInterval = 600; + } logConfig(); } diff --git a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java index c0f08f61148..4834bb6bdff 100644 --- a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java +++ b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java @@ -31,19 +31,19 @@ public class DynamicArgs { public void init() { if (parameter.isDynamicConfigEnable()) { File config = getConfigFile(); - if (config != null) { - lastModified = config.lastModified(); - } else { + if (config == null) { return; } + lastModified = config.lastModified(); logger.info("Start the dynamic loading configuration service"); + long checkInterval = parameter.getDynamicConfigCheckInterval(); reloadExecutor.scheduleWithFixedDelay(() -> { try { run(); } catch (Exception e) { logger.error("Exception caught when reloading configuration", e); } - }, 100, 10, TimeUnit.SECONDS); + }, 10, checkInterval, TimeUnit.SECONDS); } } @@ -108,7 +108,7 @@ private void updateTrustNodes(Config config) { } public void close() { - logger.info("Closing the dynamic loading configuration service ..."); + logger.info("Closing the dynamic loading configuration service"); reloadExecutor.shutdown(); } } \ No newline at end of file diff --git a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java index 0dcb755894f..09f527fdd08 100644 --- a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java @@ -11,8 +11,8 @@ import org.tron.common.utils.ReflectUtils; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; -//import org.tron.core.net.TronNetService; -//import org.tron.p2p.P2pConfig; +import org.tron.core.net.TronNetService; +import org.tron.p2p.P2pConfig; public class DynamicArgsTest { protected TronApplicationContext context; @@ -39,7 +39,7 @@ public void destroy() { public void get() { CommonParameter parameter = Args.getInstance(); Assert.assertFalse(parameter.isDynamicConfigEnable()); - + Assert.assertEquals(600, parameter.getDynamicConfigCheckInterval()); } @Test @@ -47,10 +47,23 @@ public void start() { dynamicArgs.init(); Assert.assertEquals(0, (long) ReflectUtils.getFieldObject(dynamicArgs, "lastModified")); - dynamicArgs.run(); -// TronNetService tronNetService = context.getBean(TronNetService.class); -// ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig()); -// dynamicArgs.reload(); + TronNetService tronNetService = context.getBean(TronNetService.class); + ReflectUtils.setFieldValue(tronNetService, "p2pConfig", new P2pConfig()); + File config = new File(Constant.TESTNET_CONF); + if (!config.exists()) { + try { + config.createNewFile(); + } catch (Exception e) { + return; + } + dynamicArgs.run(); + try { + config.delete(); + } catch (Exception e) { + return; + } + } + dynamicArgs.close(); } } diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 2cd108bf966..2dcb7daa34a 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -286,4 +286,6 @@ vm = { } committee = { allowCreationOfContracts = 1 //mainnet:0 (reset by committee),test:1 -} \ No newline at end of file +} + +node.dynamicConfig.checkInterval = 0 \ No newline at end of file From 1f61d7ff9f9d8fa850cfc6a3b27a96fccf3107b4 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 29 Mar 2023 16:23:25 +0800 Subject: [PATCH 086/142] fix(net): revert PeerConnection --- .../src/main/java/org/tron/core/net/peer/PeerConnection.java | 1 - 1 file changed, 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java index 1bd1ce20595..7e417bd24f4 100644 --- a/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java +++ b/framework/src/main/java/org/tron/core/net/peer/PeerConnection.java @@ -40,7 +40,6 @@ import org.tron.core.net.message.keepalive.PingMessage; import org.tron.core.net.message.keepalive.PongMessage; import org.tron.core.net.service.adv.AdvService; -import org.tron.core.net.service.effective.EffectiveCheckService; import org.tron.core.net.service.statistics.NodeStatistics; import org.tron.core.net.service.statistics.PeerStatistics; import org.tron.core.net.service.statistics.TronStatsManager; From d0adfa06be9f89480e7f059682ea10ccebe645c5 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Wed, 29 Mar 2023 16:30:58 +0800 Subject: [PATCH 087/142] feat(config):fix merge issue --- .../src/main/java/org/tron/core/config/args/DynamicArgs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java index 4834bb6bdff..5e2725c8322 100644 --- a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java +++ b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java @@ -86,7 +86,7 @@ public void reload() { private void updateActiveNodes(Config config) { List newActiveNodes = - Args.getInetSocketAddress(config, Constant.NODE_ACTIVE); + Args.getInetSocketAddress(config, Constant.NODE_ACTIVE, true); parameter.setActiveNodes(newActiveNodes); List activeNodes = TronNetService.getP2pConfig().getActiveNodes(); activeNodes.clear(); From 88565009844905ad6c727ff2a0afa7408b53c28e Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Wed, 29 Mar 2023 17:53:18 +0800 Subject: [PATCH 088/142] feat(config):change libp2p version --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 6ce3c0bef41..5c70edf0b65 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.19' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.20' compile project(":protocol") } From a4aaa80ff4685c0fb9f947067894ae7e2a4158f7 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 29 Mar 2023 18:12:13 +0800 Subject: [PATCH 089/142] fix(net): add test case EffectiveCheckServiceTest --- .../effective/EffectiveCheckService.java | 9 ++-- .../services/EffectiveCheckServiceTest.java | 44 +++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java diff --git a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java index b5792507d06..44fdc56f938 100644 --- a/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java +++ b/framework/src/main/java/org/tron/core/net/service/effective/EffectiveCheckService.java @@ -14,6 +14,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -38,15 +39,15 @@ public class EffectiveCheckService { .maximumSize(10000) .expireAfterWrite(20, TimeUnit.MINUTES).build(); @Getter + @Setter private volatile InetSocketAddress cur; private final AtomicInteger count = new AtomicInteger(0); - private ScheduledExecutorService executor = null; + private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor( + new ThreadFactoryBuilder().setNameFormat("effective-thread-%d").build()); private long MAX_HANDSHAKE_TIME = 60_000; public void init() { if (isEffectiveCheck) { - executor = Executors.newSingleThreadScheduledExecutor( - new ThreadFactoryBuilder().setNameFormat("effective-thread-%d").build()); executor.scheduleWithFixedDelay(() -> { try { findEffectiveNode(); @@ -59,7 +60,7 @@ public void init() { } } - private void triggerNext() { + public void triggerNext() { try { executor.submit(this::findEffectiveNode); } catch (Exception e) { diff --git a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java new file mode 100644 index 00000000000..315159cfea2 --- /dev/null +++ b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java @@ -0,0 +1,44 @@ +package org.tron.core.net.services; + +import java.io.File; +import java.net.InetSocketAddress; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.net.service.effective.EffectiveCheckService; + +public class EffectiveCheckServiceTest { + + protected TronApplicationContext context; + private EffectiveCheckService service; + private String dbPath = "output-effective-service-test"; + + @Before + public void init() { + Args.setParam(new String[] {"--output-directory", dbPath, "--debug"}, + Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + service = context.getBean(EffectiveCheckService.class); + } + + @After + public void destroy() { + Args.clearParam(); + FileUtil.deleteDir(new File(dbPath)); + } + + @Test + public void testFind() { + service.triggerNext(); + Assert.assertNull(service.getCur()); + service.setCur(new InetSocketAddress("192.168.10.100", 12345)); + service.triggerNext(); + Assert.assertNotNull(service.getCur()); + } +} From 287aa7ae20cdbef07cd6b0406eafbb77039799d8 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 30 Mar 2023 01:04:45 +0800 Subject: [PATCH 090/142] fix(net): add test case for MessageStatistics --- .../service/statistics/MessageStatistics.java | 7 +- .../java/org/tron/core/net/MessageTest.java | 74 +++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/service/statistics/MessageStatistics.java b/framework/src/main/java/org/tron/core/net/service/statistics/MessageStatistics.java index 6ed67026ada..787f6ef5de2 100644 --- a/framework/src/main/java/org/tron/core/net/service/statistics/MessageStatistics.java +++ b/framework/src/main/java/org/tron/core/net/service/statistics/MessageStatistics.java @@ -143,16 +143,17 @@ private void addTcpMessage(Message msg, boolean flag) { break; case TRX: if (flag) { - tronInMessage.add(); + tronInTrx.add(); } else { - tronOutMessage.add(); + tronOutTrx.add(); } break; case BLOCK: if (flag) { tronInBlock.add(); + } else { + tronOutBlock.add(); } - tronOutBlock.add(); break; default: break; diff --git a/framework/src/test/java/org/tron/core/net/MessageTest.java b/framework/src/test/java/org/tron/core/net/MessageTest.java index 0400d16b669..f9179868858 100644 --- a/framework/src/test/java/org/tron/core/net/MessageTest.java +++ b/framework/src/test/java/org/tron/core/net/MessageTest.java @@ -2,9 +2,11 @@ import org.junit.Assert; import org.junit.Test; +import org.tron.common.overlay.message.Message; import org.tron.core.exception.P2pException; import org.tron.core.net.message.MessageTypes; import org.tron.core.net.message.base.DisconnectMessage; +import org.tron.core.net.service.statistics.MessageStatistics; import org.tron.protos.Protocol.ReasonCode; public class MessageTest { @@ -35,4 +37,76 @@ public void test2() throws Exception { System.out.println("spend time : " + (endTime - startTime)); } + @Test + public void testMessageStatistics() { + MessageStatistics messageStatistics = new MessageStatistics(); + Message message1 = new Message(MessageTypes.P2P_HELLO.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + Message message2 = new Message(MessageTypes.P2P_PING.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + Message message3 = new Message(MessageTypes.P2P_PONG.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + Message message4 = new Message(MessageTypes.P2P_DISCONNECT.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + Message message5 = new Message(MessageTypes.SYNC_BLOCK_CHAIN.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + Message message6 = new Message(MessageTypes.BLOCK_CHAIN_INVENTORY.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + Message message7 = new Message(MessageTypes.TRX.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + Message message8 = new Message(MessageTypes.BLOCK.asByte(), null) { + @Override + public Class getAnswerMessage() { + return null; + } + }; + messageStatistics.addTcpInMessage(message1); + messageStatistics.addTcpOutMessage(message1); + messageStatistics.addTcpInMessage(message2); + messageStatistics.addTcpOutMessage(message2); + messageStatistics.addTcpInMessage(message3); + messageStatistics.addTcpOutMessage(message3); + messageStatistics.addTcpInMessage(message4); + messageStatistics.addTcpOutMessage(message4); + messageStatistics.addTcpInMessage(message5); + messageStatistics.addTcpOutMessage(message5); + messageStatistics.addTcpInMessage(message6); + messageStatistics.addTcpOutMessage(message6); + messageStatistics.addTcpInMessage(message7); + messageStatistics.addTcpOutMessage(message7); + messageStatistics.addTcpInMessage(message8); + messageStatistics.addTcpOutMessage(message8); + + Assert.assertEquals(8, messageStatistics.tronInMessage.getTotalCount()); + Assert.assertEquals(8, messageStatistics.tronOutMessage.getTotalCount()); + } + } From 74c8179ca154a8384f0154996bbe873622e6f188 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Thu, 30 Mar 2023 09:33:23 +0800 Subject: [PATCH 091/142] fix(net):add unit test for peer connection --- .../test/java/org/tron/core/net/services/AdvServiceTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java index a6189346ae5..556eec980ed 100644 --- a/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/AdvServiceTest.java @@ -85,6 +85,7 @@ private void testBroadcast() { try { peer = context.getBean(PeerConnection.class); + Assert.assertFalse(peer.isDisconnect()); p2pEventHandler = context.getBean(P2pEventHandlerImpl.class); List peers = Lists.newArrayList(); @@ -96,6 +97,9 @@ private void testBroadcast() { service.broadcast(msg); Item item = new Item(blockCapsule.getBlockId(), InventoryType.BLOCK); Assert.assertNotNull(service.getMessage(item)); + peer.checkAndPutAdvInvRequest(item, System.currentTimeMillis()); + boolean res = peer.checkAndPutAdvInvRequest(item, System.currentTimeMillis()); + Assert.assertFalse(res); } catch (NullPointerException e) { System.out.println(e); } From 1467908dc009b85601e694a466632dbbd819ef53 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Thu, 30 Mar 2023 10:11:12 +0800 Subject: [PATCH 092/142] feat(config):add unit test for DynamicArgs --- .../java/org/tron/core/config/args/DynamicArgs.java | 4 ++-- .../org/tron/core/config/args/DynamicArgsTest.java | 12 +++++++----- framework/src/test/resources/config-test.conf | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java index 5e2725c8322..cbf167cb955 100644 --- a/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java +++ b/framework/src/main/java/org/tron/core/config/args/DynamicArgs.java @@ -30,13 +30,13 @@ public class DynamicArgs { public void init() { if (parameter.isDynamicConfigEnable()) { + logger.info("Start the dynamic loading configuration service"); + long checkInterval = parameter.getDynamicConfigCheckInterval(); File config = getConfigFile(); if (config == null) { return; } lastModified = config.lastModified(); - logger.info("Start the dynamic loading configuration service"); - long checkInterval = parameter.getDynamicConfigCheckInterval(); reloadExecutor.scheduleWithFixedDelay(() -> { try { run(); diff --git a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java index 09f527fdd08..2ca95239ad7 100644 --- a/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java +++ b/framework/src/test/java/org/tron/core/config/args/DynamicArgsTest.java @@ -36,14 +36,11 @@ public void destroy() { } @Test - public void get() { + public void start() { CommonParameter parameter = Args.getInstance(); - Assert.assertFalse(parameter.isDynamicConfigEnable()); + Assert.assertTrue(parameter.isDynamicConfigEnable()); Assert.assertEquals(600, parameter.getDynamicConfigCheckInterval()); - } - @Test - public void start() { dynamicArgs.init(); Assert.assertEquals(0, (long) ReflectUtils.getFieldObject(dynamicArgs, "lastModified")); @@ -63,6 +60,11 @@ public void start() { return; } } + try { + dynamicArgs.reload(); + } catch (Exception e) { + // no need to deal with + } dynamicArgs.close(); } diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index f800fb2486b..76e99c8d4a1 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -342,4 +342,5 @@ committee = { allowCreationOfContracts = 1 //mainnet:0 (reset by committee),test:1 } +node.dynamicConfig.enable = true node.dynamicConfig.checkInterval = 0 \ No newline at end of file From e0c8ba5e41fbbe7268d17024a0b4afcc5fbe7c2c Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Thu, 30 Mar 2023 10:15:01 +0800 Subject: [PATCH 093/142] feat(config):resolve code conflicts --- framework/src/main/java/org/tron/core/net/TronNetService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 95a3cc869c6..561c3cbae9e 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -149,8 +149,8 @@ private P2pConfig getConfig() { } P2pConfig config = new P2pConfig(); config.setSeedNodes(seeds); - config.getActiveNodes().addAll(parameter.getActiveNodes()); - config.getTrustNodes().addAll(parameter.getPassiveNodes()); + config.setActiveNodes(parameter.getActiveNodes()); + config.setTrustNodes(parameter.getPassiveNodes()); config.getActiveNodes().forEach(n -> config.getTrustNodes().add(n.getAddress())); parameter.getFastForwardNodes().forEach(f -> config.getTrustNodes().add(f.getAddress())); int maxConnections = parameter.getMaxConnections(); From c7cf0a8eda9ddc4cbd9bf0b96ad1e8eeb56468ce Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Thu, 30 Mar 2023 10:51:40 +0800 Subject: [PATCH 094/142] fix(freezeV2): optimize the query return of the interface --- framework/src/main/java/org/tron/core/Wallet.java | 11 +++++++++-- framework/src/test/java/org/tron/core/WalletTest.java | 11 ++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index ea47c2c686b..86429b65fe0 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -765,19 +765,26 @@ public DelegatedResourceList getDelegatedResourceV2( .createDbKeyV2(fromAddress.toByteArray(), toAddress.toByteArray(), false); DelegatedResourceCapsule unlockResource = chainBaseManager.getDelegatedResourceStore() .get(dbKey); - if (unlockResource != null) { + if (nonEmptyResource(unlockResource)) { builder.addDelegatedResource(unlockResource.getInstance()); } dbKey = DelegatedResourceCapsule .createDbKeyV2(fromAddress.toByteArray(), toAddress.toByteArray(), true); DelegatedResourceCapsule lockResource = chainBaseManager.getDelegatedResourceStore() .get(dbKey); - if (lockResource != null) { + if (nonEmptyResource(lockResource)) { builder.addDelegatedResource(lockResource.getInstance()); } return builder.build(); } + private boolean nonEmptyResource(DelegatedResourceCapsule resource) { + return Objects.nonNull(resource) && !(resource.getExpireTimeForBandwidth() == 0 + && resource.getExpireTimeForEnergy() == 0 + && resource.getFrozenBalanceForBandwidth() == 0 + && resource.getFrozenBalanceForEnergy() == 0); + } + public GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage getCanWithdrawUnfreezeAmount( ByteString ownerAddress, long timestamp) { GrpcAPI.CanWithdrawUnfreezeAmountResponseMessage.Builder builder = diff --git a/framework/src/test/java/org/tron/core/WalletTest.java b/framework/src/test/java/org/tron/core/WalletTest.java index 36a34edc295..1d8ae810dfd 100644 --- a/framework/src/test/java/org/tron/core/WalletTest.java +++ b/framework/src/test/java/org/tron/core/WalletTest.java @@ -728,7 +728,7 @@ private Any getLockedDelegateContractForBandwidth(String ownerAddress, String re .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(ownerAddress))) .setReceiverAddress(ByteString.copyFrom(ByteArray.fromHexString(receiveAddress))) .setBalance(unfreezeBalance) - .setResource(Common.ResourceCode.BANDWIDTH) + .setResource(BANDWIDTH) .setLock(lock) .build()); } @@ -753,6 +753,11 @@ public void testGetDelegatedResourceV2() { ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), ByteString.copyFrom(ByteArray.fromHexString(RECEIVER_ADDRESS))); + Protocol.Account account = Protocol.Account.newBuilder() + .setAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))).build(); + wallet.getAccount(account); + wallet.getProposalList(); + wallet.getWitnessList(); Assert.assertEquals(1L, delegatedResourceList.getDelegatedResourceCount()); Assert.assertEquals(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), delegatedResourceList.getDelegatedResource(0).getFrom()); @@ -809,7 +814,7 @@ public void testGetCanDelegatedMaxSizeBandWidth() { GrpcAPI.CanDelegatedMaxSizeResponseMessage message = wallet.getCanDelegatedMaxSize( ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), - Common.ResourceCode.BANDWIDTH.getNumber()); + BANDWIDTH.getNumber()); Assert.assertEquals(initBalance - 280L, message.getMaxSize()); } @@ -832,7 +837,7 @@ private Any getContractForBandwidthV2(String ownerAddress, long unfreezeBalance) ByteString.copyFrom(ByteArray.fromHexString(ownerAddress)) ) .setUnfreezeBalance(unfreezeBalance) - .setResource(Common.ResourceCode.BANDWIDTH) + .setResource(BANDWIDTH) .build() ); } From c2dc4081b46fa6bc768d44b1536488db44a423c4 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 30 Mar 2023 12:02:39 +0800 Subject: [PATCH 095/142] feat(net): optimize processSyncBlock function logic --- .../main/java/org/tron/core/net/service/sync/SyncService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 5b8ea730e99..68f113afd9f 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -292,7 +292,7 @@ private void processSyncBlock(BlockCapsule block) { if (peer.getSyncBlockInProcess().remove(blockId)) { if (flag) { peer.setBlockBothHave(blockId); - if (peer.getSyncBlockToFetch().isEmpty()) { + if (peer.getSyncBlockToFetch().isEmpty() && !peer.isFetchAble()) { syncNext(peer); } } else { From 0ce3ad365ba400b2d61c7ca9a7a7b9257ab7b067 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 30 Mar 2023 13:10:21 +0800 Subject: [PATCH 096/142] fix(net): add test case for MessageTest --- .../java/org/tron/core/net/MessageTest.java | 19 +++++++++++++++++-- .../services/EffectiveCheckServiceTest.java | 18 +++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/framework/src/test/java/org/tron/core/net/MessageTest.java b/framework/src/test/java/org/tron/core/net/MessageTest.java index f9179868858..d27f37214c5 100644 --- a/framework/src/test/java/org/tron/core/net/MessageTest.java +++ b/framework/src/test/java/org/tron/core/net/MessageTest.java @@ -1,12 +1,17 @@ package org.tron.core.net; +import java.util.ArrayList; import org.junit.Assert; import org.junit.Test; import org.tron.common.overlay.message.Message; import org.tron.core.exception.P2pException; import org.tron.core.net.message.MessageTypes; +import org.tron.core.net.message.adv.FetchInvDataMessage; +import org.tron.core.net.message.adv.InventoryMessage; +import org.tron.core.net.message.adv.TransactionsMessage; import org.tron.core.net.message.base.DisconnectMessage; import org.tron.core.net.service.statistics.MessageStatistics; +import org.tron.protos.Protocol.Inventory.InventoryType; import org.tron.protos.Protocol.ReasonCode; public class MessageTest { @@ -88,6 +93,10 @@ public Class getAnswerMessage() { return null; } }; + InventoryMessage message9 = new InventoryMessage(new ArrayList<>(), InventoryType.TRX); + FetchInvDataMessage message10 = new FetchInvDataMessage(new ArrayList<>(), InventoryType.TRX); + TransactionsMessage message11 = new TransactionsMessage(new ArrayList<>()); + messageStatistics.addTcpInMessage(message1); messageStatistics.addTcpOutMessage(message1); messageStatistics.addTcpInMessage(message2); @@ -104,9 +113,15 @@ public Class getAnswerMessage() { messageStatistics.addTcpOutMessage(message7); messageStatistics.addTcpInMessage(message8); messageStatistics.addTcpOutMessage(message8); + messageStatistics.addTcpInMessage(message9); + messageStatistics.addTcpOutMessage(message9); + messageStatistics.addTcpInMessage(message10); + messageStatistics.addTcpOutMessage(message10); + messageStatistics.addTcpInMessage(message11); + messageStatistics.addTcpOutMessage(message11); - Assert.assertEquals(8, messageStatistics.tronInMessage.getTotalCount()); - Assert.assertEquals(8, messageStatistics.tronOutMessage.getTotalCount()); + Assert.assertEquals(11, messageStatistics.tronInMessage.getTotalCount()); + Assert.assertEquals(11, messageStatistics.tronOutMessage.getTotalCount()); } } diff --git a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java index 315159cfea2..eb517df23a7 100644 --- a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java @@ -8,10 +8,13 @@ import org.junit.Test; import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.ReflectUtils; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; import org.tron.core.config.args.Args; +import org.tron.core.net.TronNetService; import org.tron.core.net.service.effective.EffectiveCheckService; +import org.tron.p2p.P2pConfig; public class EffectiveCheckServiceTest { @@ -35,10 +38,19 @@ public void destroy() { @Test public void testFind() { + TronNetService tronNetService = context.getBean(TronNetService.class); + P2pConfig p2pConfig = new P2pConfig(); + p2pConfig.setIp("127.0.0.1"); + p2pConfig.setPort(34567); + ReflectUtils.setFieldValue(tronNetService, "p2pConfig", p2pConfig); + TronNetService.getP2pService().start(p2pConfig); + service.triggerNext(); Assert.assertNull(service.getCur()); - service.setCur(new InetSocketAddress("192.168.10.100", 12345)); - service.triggerNext(); - Assert.assertNotNull(service.getCur()); + + ReflectUtils.invokeMethod(service, "resetCount"); + InetSocketAddress cur = new InetSocketAddress("192.168.0.1", 34567); + service.setCur(cur); + service.onDisconnect(cur); } } From 7bf49f799a3ed4d01e2c76b63e47a5994e162da0 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Tue, 28 Mar 2023 16:55:31 +0800 Subject: [PATCH 097/142] feat(api): remove insecure API --- .../org/tron/core/utils/TransactionUtil.java | 16 - .../src/main/java/org/tron/core/Wallet.java | 12 - .../org/tron/core/services/RpcApiService.java | 205 ------------- .../http/AddTransactionSignServlet.java | 51 ---- .../services/http/CreateAddressServlet.java | 76 ----- .../EasyTransferAssetByPrivateServlet.java | 75 ----- .../http/EasyTransferAssetServlet.java | 101 ------- .../http/EasyTransferByPrivateServlet.java | 72 ----- .../services/http/EasyTransferServlet.java | 82 ----- .../services/http/FullNodeHttpApiService.java | 27 -- .../services/http/GenerateAddressServlet.java | 43 --- .../http/HttpSelfFormatFieldName.java | 14 - .../services/http/TransactionSignServlet.java | 47 --- .../org/tron/core/services/http/Util.java | 7 - .../interfaceOnPBFT/RpcApiServiceOnPBFT.java | 18 -- .../RpcApiServiceOnSolidity.java | 19 -- .../ShieldedTransferActuatorTest.java | 37 +-- .../core/zksnark/ShieldedReceiveTest.java | 11 +- .../wallet/account/WalletTestAccount011.java | 7 - .../common/client/utils/HttpMethed.java | 124 +------- .../common/client/utils/TransactionUtils.java | 31 +- .../http/HttpTestEasyAccount001.java | 281 ------------------ protocol/src/main/protos/api/api.proto | 114 ------- protocol/src/main/protos/core/Tron.proto | 5 - 24 files changed, 46 insertions(+), 1429 deletions(-) delete mode 100644 framework/src/main/java/org/tron/core/services/http/AddTransactionSignServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/http/CreateAddressServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/http/EasyTransferAssetByPrivateServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/http/EasyTransferAssetServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/http/EasyTransferByPrivateServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/http/EasyTransferServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/http/GenerateAddressServlet.java delete mode 100644 framework/src/main/java/org/tron/core/services/http/TransactionSignServlet.java delete mode 100644 framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestEasyAccount001.java diff --git a/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java b/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java index 496af641cde..e5cffa49790 100644 --- a/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java +++ b/actuator/src/main/java/org/tron/core/utils/TransactionUtil.java @@ -49,7 +49,6 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.Protocol.Transaction.Result.contractResult; -import org.tron.protos.Protocol.TransactionSign; import org.tron.protos.contract.SmartContractOuterClass.CreateSmartContract; import org.tron.protos.contract.SmartContractOuterClass.TriggerSmartContract; import org.tron.protos.Protocol.Transaction.Contract.ContractType; @@ -184,21 +183,6 @@ public static String makeUpperCamelMethod(String originName) { .replace("_", ""); } - public static TransactionCapsule getTransactionSign(TransactionSign transactionSign) { - byte[] privateKey = transactionSign.getPrivateKey().toByteArray(); - TransactionCapsule trx = new TransactionCapsule(transactionSign.getTransaction()); - trx.sign(privateKey); - return trx; - } - - public TransactionCapsule addSign(TransactionSign transactionSign) - throws PermissionException, SignatureException, SignatureFormatException { - byte[] privateKey = transactionSign.getPrivateKey().toByteArray(); - TransactionCapsule trx = new TransactionCapsule(transactionSign.getTransaction()); - trx.addSign(privateKey, chainBaseManager.getAccountStore()); - return trx; - } - public TransactionSignWeight getTransactionSignWeight(Transaction trx) { TransactionSignWeight.Builder tswBuilder = TransactionSignWeight.newBuilder(); TransactionExtention.Builder trxExBuilder = TransactionExtention.newBuilder(); diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 86429b65fe0..8fd966384e3 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -648,18 +648,6 @@ public TransactionApprovedList getTransactionApprovedList(Transaction trx) { return tswBuilder.build(); } - public byte[] pass2Key(byte[] passPhrase) { - return Sha256Hash.hash(CommonParameter - .getInstance().isECKeyCryptoEngine(), passPhrase); - } - - public byte[] createAddress(byte[] passPhrase) { - byte[] privateKey = pass2Key(passPhrase); - SignInterface ecKey = SignUtils.fromPrivate(privateKey, - Args.getInstance().isECKeyCryptoEngine()); - return ecKey.getAddress(); - } - public Block getNowBlock() { List blockList = chainBaseManager.getBlockStore().getBlockByLatestNum(1); if (CollectionUtils.isEmpty(blockList)) { diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index a81be8f7728..1f767eeb237 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -16,15 +16,12 @@ import java.util.concurrent.TimeUnit; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Hex; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tron.api.DatabaseGrpc.DatabaseImplBase; import org.tron.api.GrpcAPI; import org.tron.api.GrpcAPI.AccountNetMessage; import org.tron.api.GrpcAPI.AccountResourceMessage; -import org.tron.api.GrpcAPI.Address; -import org.tron.api.GrpcAPI.AddressPrKeyPairMessage; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.api.GrpcAPI.BlockExtention; import org.tron.api.GrpcAPI.BlockLimit; @@ -39,11 +36,6 @@ import org.tron.api.GrpcAPI.DelegatedResourceList; import org.tron.api.GrpcAPI.DelegatedResourceMessage; import org.tron.api.GrpcAPI.DiversifierMessage; -import org.tron.api.GrpcAPI.EasyTransferAssetByPrivateMessage; -import org.tron.api.GrpcAPI.EasyTransferAssetMessage; -import org.tron.api.GrpcAPI.EasyTransferByPrivateMessage; -import org.tron.api.GrpcAPI.EasyTransferMessage; -import org.tron.api.GrpcAPI.EasyTransferResponse; import org.tron.api.GrpcAPI.EmptyMessage; import org.tron.api.GrpcAPI.EstimateEnergyMessage; import org.tron.api.GrpcAPI.ExchangeList; @@ -52,7 +44,6 @@ import org.tron.api.GrpcAPI.IncomingViewingKeyMessage; import org.tron.api.GrpcAPI.IvkDecryptTRC20Parameters; import org.tron.api.GrpcAPI.NfTRC20Parameters; -import org.tron.api.GrpcAPI.Node; import org.tron.api.GrpcAPI.NodeList; import org.tron.api.GrpcAPI.NoteParameters; import org.tron.api.GrpcAPI.NumberMessage; @@ -85,13 +76,10 @@ import org.tron.api.WalletGrpc.WalletImplBase; import org.tron.api.WalletSolidityGrpc.WalletSolidityImplBase; import org.tron.common.application.Service; -import org.tron.common.crypto.SignInterface; -import org.tron.common.crypto.SignUtils; import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; import org.tron.common.utils.Sha256Hash; import org.tron.common.utils.StringUtil; -import org.tron.common.utils.Utils; import org.tron.core.ChainBaseManager; import org.tron.core.Wallet; import org.tron.core.capsule.AccountCapsule; @@ -108,7 +96,6 @@ import org.tron.core.exception.VMIllegalException; import org.tron.core.exception.ZksnarkException; import org.tron.core.metrics.MetricsApiService; -import org.tron.core.net.TronNetService; import org.tron.core.services.filter.LiteFnQueryGrpcInterceptor; import org.tron.core.services.ratelimiter.RateLimiterInterceptor; import org.tron.core.services.ratelimiter.RpcApiAccessInterceptor; @@ -130,7 +117,6 @@ import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; import org.tron.protos.Protocol.TransactionInfo; -import org.tron.protos.Protocol.TransactionSign; import org.tron.protos.contract.AccountContract.AccountCreateContract; import org.tron.protos.contract.AccountContract.AccountPermissionUpdateContract; import org.tron.protos.contract.AccountContract.AccountUpdateContract; @@ -726,12 +712,6 @@ public void getTransactionInfoById(BytesMessage request, responseObserver.onCompleted(); } - @Override - public void generateAddress(EmptyMessage request, - StreamObserver responseObserver) { - generateAddressCommon(request, responseObserver); - } - @Override public void getRewardInfo(BytesMessage request, StreamObserver responseObserver) { @@ -1145,55 +1125,6 @@ private void createTransactionExtention(Message request, ContractType contractTy responseObserver.onCompleted(); } - - @Override - public void getTransactionSign(TransactionSign req, - StreamObserver responseObserver) { - TransactionCapsule result = TransactionUtil.getTransactionSign(req); - responseObserver.onNext(result.getInstance()); - responseObserver.onCompleted(); - } - - @Override - public void getTransactionSign2(TransactionSign req, - StreamObserver responseObserver) { - TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); - Return.Builder retBuilder = Return.newBuilder(); - try { - TransactionCapsule trx = TransactionUtil.getTransactionSign(req); - trxExtBuilder.setTransaction(trx.getInstance()); - trxExtBuilder.setTxid(trx.getTransactionId().getByteString()); - retBuilder.setResult(true).setCode(response_code.SUCCESS); - } catch (Exception e) { - retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); - logger.info(EXCEPTION_CAUGHT + e.getMessage()); - } - trxExtBuilder.setResult(retBuilder); - responseObserver.onNext(trxExtBuilder.build()); - responseObserver.onCompleted(); - } - - @Override - public void addSign(TransactionSign req, - StreamObserver responseObserver) { - TransactionExtention.Builder trxExtBuilder = TransactionExtention.newBuilder(); - Return.Builder retBuilder = Return.newBuilder(); - try { - TransactionCapsule trx = transactionUtil.addSign(req); - trxExtBuilder.setTransaction(trx.getInstance()); - trxExtBuilder.setTxid(trx.getTransactionId().getByteString()); - retBuilder.setResult(true).setCode(response_code.SUCCESS); - } catch (Exception e) { - retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); - logger.info(EXCEPTION_CAUGHT + e.getMessage()); - } - trxExtBuilder.setResult(retBuilder); - responseObserver.onNext(trxExtBuilder.build()); - responseObserver.onCompleted(); - } - @Override public void getTransactionSignWeight(Transaction req, StreamObserver responseObserver) { @@ -1210,121 +1141,6 @@ public void getTransactionApprovedList(Transaction req, responseObserver.onCompleted(); } - @Override - public void createAddress(BytesMessage req, - StreamObserver responseObserver) { - byte[] address = wallet.createAddress(req.getValue().toByteArray()); - BytesMessage.Builder builder = BytesMessage.newBuilder(); - builder.setValue(ByteString.copyFrom(address)); - responseObserver.onNext(builder.build()); - responseObserver.onCompleted(); - } - - private EasyTransferResponse easyTransfer(byte[] privateKey, ByteString toAddress, - long amount) { - TransactionCapsule transactionCapsule; - GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder(); - EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder(); - try { - SignInterface cryptoEngine = SignUtils.fromPrivate(privateKey, Args.getInstance() - .isECKeyCryptoEngine()); - byte[] owner = cryptoEngine.getAddress(); - TransferContract.Builder builder = TransferContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)); - builder.setToAddress(toAddress); - builder.setAmount(amount); - transactionCapsule = createTransactionCapsule(builder.build(), - ContractType.TransferContract); - transactionCapsule.sign(privateKey); - GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); - responseBuild.setTransaction(transactionCapsule.getInstance()); - responseBuild.setTxid(transactionCapsule.getTransactionId().getByteString()); - responseBuild.setResult(result); - } catch (ContractValidateException e) { - returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - } catch (Exception e) { - returnBuilder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - } - - return responseBuild.build(); - } - - @Override - public void easyTransfer(EasyTransferMessage req, - StreamObserver responseObserver) { - byte[] privateKey = wallet.pass2Key(req.getPassPhrase().toByteArray()); - EasyTransferResponse response = easyTransfer(privateKey, req.getToAddress(), req.getAmount()); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } - - @Override - public void easyTransferAsset(EasyTransferAssetMessage req, - StreamObserver responseObserver) { - byte[] privateKey = wallet.pass2Key(req.getPassPhrase().toByteArray()); - EasyTransferResponse response = easyTransferAsset(privateKey, req.getToAddress(), - req.getAssetId(), req.getAmount()); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } - - private EasyTransferResponse easyTransferAsset(byte[] privateKey, ByteString toAddress, - String assetId, long amount) { - TransactionCapsule transactionCapsule; - GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder(); - EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder(); - try { - SignInterface cryptoEngine = SignUtils.fromPrivate(privateKey, - Args.getInstance().isECKeyCryptoEngine()); - byte[] owner = cryptoEngine.getAddress(); - TransferAssetContract.Builder builder = TransferAssetContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)); - builder.setToAddress(toAddress); - builder.setAssetName(ByteString.copyFrom(assetId.getBytes())); - builder.setAmount(amount); - transactionCapsule = createTransactionCapsule(builder.build(), - ContractType.TransferAssetContract); - transactionCapsule.sign(privateKey); - GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); - responseBuild.setTransaction(transactionCapsule.getInstance()); - responseBuild.setTxid(transactionCapsule.getTransactionId().getByteString()); - responseBuild.setResult(result); - } catch (ContractValidateException e) { - returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - } catch (Exception e) { - returnBuilder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - } - - return responseBuild.build(); - } - - @Override - public void easyTransferByPrivate(EasyTransferByPrivateMessage req, - StreamObserver responseObserver) { - byte[] privateKey = req.getPrivateKey().toByteArray(); - EasyTransferResponse response = easyTransfer(privateKey, req.getToAddress(), req.getAmount()); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } - - @Override - public void easyTransferAssetByPrivate(EasyTransferAssetByPrivateMessage req, - StreamObserver responseObserver) { - byte[] privateKey = req.getPrivateKey().toByteArray(); - EasyTransferResponse response = easyTransferAsset(privateKey, req.getToAddress(), - req.getAssetId(), req.getAmount()); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } - @Override public void broadcastTransaction(Transaction req, StreamObserver responseObserver) { @@ -2235,12 +2051,6 @@ public void getChainParameters(EmptyMessage request, responseObserver.onCompleted(); } - @Override - public void generateAddress(EmptyMessage request, - StreamObserver responseObserver) { - generateAddressCommon(request, responseObserver); - } - @Override public void getTransactionInfoById(BytesMessage request, StreamObserver responseObserver) { @@ -2899,21 +2709,6 @@ public void getStatsInfo(EmptyMessage request, } } - public void generateAddressCommon(EmptyMessage request, - StreamObserver responseObserver) { - SignInterface cryptoEngine = SignUtils.getGeneratedRandomSign(Utils.getRandom(), - Args.getInstance().isECKeyCryptoEngine()); - byte[] priKey = cryptoEngine.getPrivateKey(); - byte[] address = cryptoEngine.getAddress(); - String addressStr = StringUtil.encode58Check(address); - String priKeyStr = Hex.encodeHexString(priKey); - AddressPrKeyPairMessage.Builder builder = AddressPrKeyPairMessage.newBuilder(); - builder.setAddress(addressStr); - builder.setPrivateKey(priKeyStr); - responseObserver.onNext(builder.build()); - responseObserver.onCompleted(); - } - public void getRewardInfoCommon(BytesMessage request, StreamObserver responseObserver) { try { diff --git a/framework/src/main/java/org/tron/core/services/http/AddTransactionSignServlet.java b/framework/src/main/java/org/tron/core/services/http/AddTransactionSignServlet.java deleted file mode 100644 index f9fd1fa4936..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/AddTransactionSignServlet.java +++ /dev/null @@ -1,51 +0,0 @@ -package org.tron.core.services.http; - -import com.alibaba.fastjson.JSONObject; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.utils.TransactionUtil; -import org.tron.protos.Protocol.Transaction; -import org.tron.protos.Protocol.TransactionSign; - - -@Component -@Slf4j(topic = "API") -public class AddTransactionSignServlet extends RateLimiterServlet { - - @Autowired - private TransactionUtil transactionUtil; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - try { - String contract = request.getReader().lines() - .collect(Collectors.joining(System.lineSeparator())); - Util.checkBodySize(contract); - JSONObject input = JSONObject.parseObject(contract); - boolean visible = Util.getVisibleOnlyForSign(input); - String strTransaction = input.getJSONObject("transaction").toJSONString(); - Transaction transaction = Util.packTransaction(strTransaction, visible); - JSONObject jsonTransaction = JSONObject.parseObject(JsonFormat.printToString(transaction, - visible)); - input.put("transaction", jsonTransaction); - TransactionSign.Builder build = TransactionSign.newBuilder(); - JsonFormat.merge(input.toJSONString(), build, visible); - TransactionCapsule reply = transactionUtil.addSign(build.build()); - if (reply != null) { - response.getWriter().println(Util.printCreateTransaction(reply.getInstance(), visible)); - } else { - response.getWriter().println("{}"); - } - } catch (Exception e) { - Util.processError(e, response); - } - } -} diff --git a/framework/src/main/java/org/tron/core/services/http/CreateAddressServlet.java b/framework/src/main/java/org/tron/core/services/http/CreateAddressServlet.java deleted file mode 100644 index 7e52abddf6a..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/CreateAddressServlet.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.tron.core.services.http; - -import static org.tron.core.services.http.PostParams.S_VALUE; - -import com.alibaba.fastjson.JSONObject; -import com.google.protobuf.ByteString; -import java.io.IOException; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.api.GrpcAPI.BytesMessage; -import org.tron.common.utils.ByteArray; -import org.tron.common.utils.StringUtil; -import org.tron.core.Wallet; - - -@Component -@Slf4j(topic = "API") -public class CreateAddressServlet extends RateLimiterServlet { - - @Autowired - private Wallet wallet; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - try { - boolean visible = Util.getVisible(request); - String input = request.getParameter(S_VALUE); - if (visible) { - input = Util.getHexString(input); - } - JSONObject jsonObject = new JSONObject(); - jsonObject.put(S_VALUE, input); - BytesMessage.Builder build = BytesMessage.newBuilder(); - JsonFormat.merge(jsonObject.toJSONString(), build, visible); - fillResponse(build.getValue(), response); - } catch (Exception e) { - Util.processError(e, response); - } - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - try { - PostParams params = PostParams.getPostParams(request); - boolean visible = params.isVisible(); - String input = params.getParams(); - if (visible) { - input = covertStringToHex(input); - } - BytesMessage.Builder build = BytesMessage.newBuilder(); - JsonFormat.merge(input, build, visible); - fillResponse(build.getValue(), response); - } catch (Exception e) { - Util.processError(e, response); - } - } - - private String covertStringToHex(String input) { - JSONObject jsonObject = JSONObject.parseObject(input); - String value = jsonObject.getString(S_VALUE); - jsonObject.put(S_VALUE, Util.getHexString(value)); - return jsonObject.toJSONString(); - } - - private void fillResponse(ByteString value, HttpServletResponse response) throws IOException { - byte[] address = wallet.createAddress(value.toByteArray()); - String base58check = StringUtil.encode58Check(address); - String hexString = ByteArray.toHexString(address); - JSONObject jsonAddress = new JSONObject(); - jsonAddress.put("base58checkAddress", base58check); - jsonAddress.put(S_VALUE, hexString); - response.getWriter().println(jsonAddress.toJSONString()); - } -} diff --git a/framework/src/main/java/org/tron/core/services/http/EasyTransferAssetByPrivateServlet.java b/framework/src/main/java/org/tron/core/services/http/EasyTransferAssetByPrivateServlet.java deleted file mode 100644 index 2739df81387..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/EasyTransferAssetByPrivateServlet.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.tron.core.services.http; - -import com.google.protobuf.ByteString; -import java.io.IOException; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.EasyTransferAssetByPrivateMessage; -import org.tron.api.GrpcAPI.EasyTransferResponse; -import org.tron.api.GrpcAPI.Return.response_code; -import org.tron.common.crypto.SignInterface; -import org.tron.common.crypto.SignUtils; -import org.tron.core.Wallet; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.args.Args; -import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; - - -@Component -@Slf4j -public class EasyTransferAssetByPrivateServlet extends RateLimiterServlet { - - @Autowired - private Wallet wallet; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder(); - EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder(); - boolean visible = false; - try { - String input = request.getReader().lines() - .collect(Collectors.joining(System.lineSeparator())); - visible = Util.getVisiblePost(input); - EasyTransferAssetByPrivateMessage.Builder build = EasyTransferAssetByPrivateMessage - .newBuilder(); - JsonFormat.merge(input, build, visible); - byte[] privateKey = build.getPrivateKey().toByteArray(); - SignInterface ecKey = SignUtils.fromPrivate(privateKey, Args.getInstance() - .isECKeyCryptoEngine()); - byte[] owner = ecKey.getAddress(); - TransferAssetContract.Builder builder = TransferAssetContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)); - builder.setToAddress(build.getToAddress()); - builder.setAssetName(ByteString.copyFrom(build.getAssetId().getBytes())); - builder.setAmount(build.getAmount()); - - TransactionCapsule transactionCapsule; - transactionCapsule = wallet - .createTransactionCapsule(builder.build(), ContractType.TransferAssetContract); - transactionCapsule.sign(privateKey); - GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); - responseBuild.setTransaction(transactionCapsule.getInstance()); - responseBuild.setResult(result); - response.getWriter().println(Util.printEasyTransferResponse(responseBuild.build(), visible)); - } catch (Exception e) { - returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - try { - response.getWriter().println(JsonFormat.printToString(responseBuild.build(), visible)); - } catch (IOException ioe) { - logger.debug("IOException: {}", ioe.getMessage()); - } - } - } -} diff --git a/framework/src/main/java/org/tron/core/services/http/EasyTransferAssetServlet.java b/framework/src/main/java/org/tron/core/services/http/EasyTransferAssetServlet.java deleted file mode 100644 index b6939570bac..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/EasyTransferAssetServlet.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.tron.core.services.http; - -import com.google.protobuf.ByteString; -import java.io.IOException; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.EasyTransferAssetMessage; -import org.tron.api.GrpcAPI.EasyTransferResponse; -import org.tron.api.GrpcAPI.Return.response_code; -import org.tron.common.crypto.SignInterface; -import org.tron.common.crypto.SignUtils; -import org.tron.core.Wallet; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.args.Args; -import org.tron.core.exception.ContractValidateException; -import org.tron.core.services.http.JsonFormat.ParseException; -import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.contract.AssetIssueContractOuterClass.TransferAssetContract; - - -@Component -@Slf4j -public class EasyTransferAssetServlet extends RateLimiterServlet { - - private static final String S_IOEXCEPTION = "IOException: {}"; - - @Autowired - private Wallet wallet; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder(); - EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder(); - boolean visible = false; - try { - String input = request.getReader().lines() - .collect(Collectors.joining(System.lineSeparator())); - visible = Util.getVisiblePost(input); - EasyTransferAssetMessage.Builder build = EasyTransferAssetMessage.newBuilder(); - JsonFormat.merge(input, build, visible); - byte[] privateKey = wallet.pass2Key(build.getPassPhrase().toByteArray()); - SignInterface ecKey = SignUtils.fromPrivate(privateKey, Args.getInstance() - .isECKeyCryptoEngine()); - byte[] owner = ecKey.getAddress(); - TransferAssetContract.Builder builder = TransferAssetContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)); - builder.setToAddress(build.getToAddress()); - builder.setAssetName(ByteString.copyFrom(build.getAssetId().getBytes())); - builder.setAmount(build.getAmount()); - - TransactionCapsule transactionCapsule; - transactionCapsule = wallet - .createTransactionCapsule(builder.build(), ContractType.TransferAssetContract); - transactionCapsule.sign(privateKey); - GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); - responseBuild.setTransaction(transactionCapsule.getInstance()); - responseBuild.setResult(result); - response.getWriter().println(Util.printEasyTransferResponse(responseBuild.build(), visible)); - } catch (ParseException e) { - logger.debug("ParseException: {}", e.getMessage()); - returnBuilder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - try { - response.getWriter().println(JsonFormat.printToString(responseBuild.build(), visible)); - } catch (IOException ioe) { - logger.debug(S_IOEXCEPTION, ioe.getMessage()); - } - return; - } catch (IOException e) { - logger.debug(S_IOEXCEPTION, e.getMessage()); - returnBuilder.setResult(false).setCode(response_code.OTHER_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - try { - response.getWriter().println(JsonFormat.printToString(responseBuild.build(), visible)); - } catch (IOException ioe) { - logger.debug(S_IOEXCEPTION, ioe.getMessage()); - } - return; - } catch (ContractValidateException e) { - returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - try { - response.getWriter().println(JsonFormat.printToString(responseBuild.build(), visible)); - } catch (IOException ioe) { - logger.debug(S_IOEXCEPTION, ioe.getMessage()); - } - return; - } - } -} diff --git a/framework/src/main/java/org/tron/core/services/http/EasyTransferByPrivateServlet.java b/framework/src/main/java/org/tron/core/services/http/EasyTransferByPrivateServlet.java deleted file mode 100644 index aa6574dc66f..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/EasyTransferByPrivateServlet.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.tron.core.services.http; - -import com.google.protobuf.ByteString; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.EasyTransferByPrivateMessage; -import org.tron.api.GrpcAPI.EasyTransferResponse; -import org.tron.api.GrpcAPI.Return.response_code; -import org.tron.common.crypto.SignInterface; -import org.tron.common.crypto.SignUtils; -import org.tron.core.Wallet; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.args.Args; -import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.contract.BalanceContract.TransferContract; - - -@Component -@Slf4j(topic = "API") -public class EasyTransferByPrivateServlet extends RateLimiterServlet { - - @Autowired - private Wallet wallet; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder(); - EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder(); - boolean visible = false; - try { - PostParams params = PostParams.getPostParams(request); - visible = params.isVisible(); - EasyTransferByPrivateMessage.Builder build = EasyTransferByPrivateMessage.newBuilder(); - JsonFormat.merge(params.getParams(), build, visible); - byte[] privateKey = build.getPrivateKey().toByteArray(); - SignInterface ecKey = SignUtils.fromPrivate(privateKey, Args.getInstance() - .isECKeyCryptoEngine()); - byte[] owner = ecKey.getAddress(); - TransferContract.Builder builder = TransferContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)); - builder.setToAddress(build.getToAddress()); - builder.setAmount(build.getAmount()); - - TransactionCapsule transactionCapsule; - transactionCapsule = wallet - .createTransactionCapsule(builder.build(), ContractType.TransferContract); - transactionCapsule.sign(privateKey); - GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); - responseBuild.setTransaction(transactionCapsule.getInstance()); - responseBuild.setResult(result); - response.getWriter().println(Util.printEasyTransferResponse(responseBuild.build(), visible)); - } catch (Exception e) { - returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - try { - response.getWriter().println(JsonFormat.printToString(responseBuild.build(), visible)); - } catch (IOException ioe) { - logger.debug("IOException: {}", ioe.getMessage()); - } - return; - } - } -} diff --git a/framework/src/main/java/org/tron/core/services/http/EasyTransferServlet.java b/framework/src/main/java/org/tron/core/services/http/EasyTransferServlet.java deleted file mode 100644 index 6c80153044e..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/EasyTransferServlet.java +++ /dev/null @@ -1,82 +0,0 @@ -package org.tron.core.services.http; - -import com.google.protobuf.ByteString; -import java.io.IOException; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.EasyTransferMessage; -import org.tron.api.GrpcAPI.EasyTransferResponse; -import org.tron.api.GrpcAPI.Return.response_code; -import org.tron.common.crypto.SignInterface; -import org.tron.common.crypto.SignUtils; -import org.tron.core.Wallet; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.config.args.Args; -import org.tron.core.exception.ContractValidateException; -import org.tron.core.services.http.JsonFormat.ParseException; -import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.contract.BalanceContract.TransferContract; - - -@Component -@Slf4j(topic = "API") -public class EasyTransferServlet extends RateLimiterServlet { - - @Autowired - private Wallet wallet; - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - GrpcAPI.Return.Builder returnBuilder = GrpcAPI.Return.newBuilder(); - EasyTransferResponse.Builder responseBuild = EasyTransferResponse.newBuilder(); - boolean visible = false; - try { - String input = request.getReader().lines() - .collect(Collectors.joining(System.lineSeparator())); - Util.checkBodySize(input); - visible = Util.getVisiblePost(input); - EasyTransferMessage.Builder build = EasyTransferMessage.newBuilder(); - JsonFormat.merge(input, build, visible); - byte[] privateKey = wallet.pass2Key(build.getPassPhrase().toByteArray()); - SignInterface ecKey = SignUtils.fromPrivate(privateKey, Args.getInstance() - .isECKeyCryptoEngine()); - byte[] owner = ecKey.getAddress(); - TransferContract.Builder builder = TransferContract.newBuilder(); - builder.setOwnerAddress(ByteString.copyFrom(owner)); - builder.setToAddress(build.getToAddress()); - builder.setAmount(build.getAmount()); - - TransactionCapsule transactionCapsule; - transactionCapsule = wallet - .createTransactionCapsule(builder.build(), ContractType.TransferContract); - transactionCapsule.sign(privateKey); - GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); - responseBuild.setTransaction(transactionCapsule.getInstance()); - responseBuild.setResult(result); - response.getWriter().println(Util.printEasyTransferResponse(responseBuild.build(), visible)); - } catch (ParseException e) { - logger.debug("ParseException: {}", e.getMessage()); - } catch (IOException e) { - logger.debug("IOException: {}", e.getMessage()); - } catch (ContractValidateException e) { - returnBuilder.setResult(false).setCode(response_code.CONTRACT_VALIDATE_ERROR) - .setMessage(ByteString.copyFromUtf8(e.getMessage())); - responseBuild.setResult(returnBuilder.build()); - try { - response.getWriter().println(JsonFormat.printToString(responseBuild.build(), visible)); - } catch (IOException ioe) { - logger.debug("IOException: {}", ioe.getMessage()); - } - } catch (Exception e) { - logger.debug("Exception: {}", e.getMessage()); - } - } -} diff --git a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java index 43f00454fd3..030adc489ed 100644 --- a/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java +++ b/framework/src/main/java/org/tron/core/services/http/FullNodeHttpApiService.java @@ -42,8 +42,6 @@ public class FullNodeHttpApiService implements Service { @Autowired private BroadcastServlet broadcastServlet; @Autowired - private TransactionSignServlet transactionSignServlet; - @Autowired private UpdateAccountServlet updateAccountServlet; @Autowired private VoteWitnessAccountServlet voteWitnessAccountServlet; @@ -114,18 +112,6 @@ public class FullNodeHttpApiService implements Service { @Autowired private GetNextMaintenanceTimeServlet getNextMaintenanceTimeServlet; @Autowired - private EasyTransferServlet easyTransferServlet; - @Autowired - private EasyTransferByPrivateServlet easyTransferByPrivateServlet; - @Autowired - private EasyTransferAssetServlet easyTransferAssetServlet; - @Autowired - private EasyTransferAssetByPrivateServlet easyTransferAssetByPrivateServlet; - @Autowired - private CreateAddressServlet createAddressServlet; - @Autowired - private GenerateAddressServlet generateAddressServlet; - @Autowired private ValidateAddressServlet validateAddressServlet; @Autowired private DeployContractServlet deployContractServlet; @@ -170,8 +156,6 @@ public class FullNodeHttpApiService implements Service { @Autowired private GetNodeInfoServlet getNodeInfoServlet; @Autowired - private AddTransactionSignServlet addTransactionSignServlet; - @Autowired private GetTransactionSignWeightServlet getTransactionSignWeightServlet; @Autowired private GetTransactionApprovedListServlet getTransactionApprovedListServlet; @@ -377,7 +361,6 @@ public void start() { context.addServlet(new ServletHolder(getAccountServlet), "/wallet/getaccount"); context.addServlet(new ServletHolder(transferServlet), "/wallet/createtransaction"); context.addServlet(new ServletHolder(broadcastServlet), "/wallet/broadcasttransaction"); - context.addServlet(new ServletHolder(transactionSignServlet), "/wallet/gettransactionsign"); context.addServlet(new ServletHolder(updateAccountServlet), "/wallet/updateaccount"); context.addServlet(new ServletHolder(voteWitnessAccountServlet), "/wallet/votewitnessaccount"); @@ -430,14 +413,6 @@ public void start() { context.addServlet(new ServletHolder(totalTransactionServlet), "/wallet/totaltransaction"); context.addServlet( new ServletHolder(getNextMaintenanceTimeServlet), "/wallet/getnextmaintenancetime"); - context.addServlet(new ServletHolder(createAddressServlet), "/wallet/createaddress"); - context.addServlet(new ServletHolder(easyTransferServlet), "/wallet/easytransfer"); - context.addServlet(new ServletHolder(easyTransferByPrivateServlet), - "/wallet/easytransferbyprivate"); - context.addServlet(new ServletHolder(easyTransferAssetServlet), "/wallet/easytransferasset"); - context.addServlet(new ServletHolder(easyTransferAssetByPrivateServlet), - "/wallet/easytransferassetbyprivate"); - context.addServlet(new ServletHolder(generateAddressServlet), "/wallet/generateaddress"); context.addServlet(new ServletHolder(validateAddressServlet), "/wallet/validateaddress"); context.addServlet(new ServletHolder(deployContractServlet), "/wallet/deploycontract"); context.addServlet(new ServletHolder(triggerSmartContractServlet), @@ -464,8 +439,6 @@ public void start() { "/wallet/getchainparameters"); context.addServlet(new ServletHolder(getAccountResourceServlet), "/wallet/getaccountresource"); - context.addServlet(new ServletHolder(addTransactionSignServlet), - "/wallet/addtransactionsign"); context.addServlet(new ServletHolder(getTransactionSignWeightServlet), "/wallet/getsignweight"); context.addServlet(new ServletHolder(getTransactionApprovedListServlet), diff --git a/framework/src/main/java/org/tron/core/services/http/GenerateAddressServlet.java b/framework/src/main/java/org/tron/core/services/http/GenerateAddressServlet.java deleted file mode 100644 index 1814b34c322..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/GenerateAddressServlet.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.tron.core.services.http; - -import com.alibaba.fastjson.JSONObject; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Hex; -import org.springframework.stereotype.Component; -import org.tron.common.crypto.SignInterface; -import org.tron.common.crypto.SignUtils; -import org.tron.common.utils.ByteArray; -import org.tron.common.utils.StringUtil; -import org.tron.common.utils.Utils; -import org.tron.core.config.args.Args; - - -@Component -@Slf4j(topic = "API") -public class GenerateAddressServlet extends RateLimiterServlet { - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - try { - SignInterface sign = SignUtils.getGeneratedRandomSign(Utils.getRandom(), - Args.getInstance().isECKeyCryptoEngine()); - byte[] priKey = sign.getPrivateKey(); - byte[] address = sign.getAddress(); - String priKeyStr = Hex.encodeHexString(priKey); - String base58check = StringUtil.encode58Check(address); - String hexString = ByteArray.toHexString(address); - JSONObject jsonAddress = new JSONObject(); - jsonAddress.put("address", base58check); - jsonAddress.put("hexAddress", hexString); - jsonAddress.put("privateKey", priKeyStr); - response.getWriter().println(jsonAddress.toJSONString()); - } catch (Exception e) { - Util.processError(e, response); - } - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - doGet(request, response); - } -} \ No newline at end of file diff --git a/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java b/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java index 3d3f73468bd..93b726bb0e5 100644 --- a/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java +++ b/framework/src/main/java/org/tron/core/services/http/HttpSelfFormatFieldName.java @@ -13,14 +13,6 @@ public class HttpSelfFormatFieldName { //DelegatedResourceMessage AddressFieldNameMap.put("protocol.DelegatedResourceMessage.fromAddress", 1); AddressFieldNameMap.put("protocol.DelegatedResourceMessage.toAddress", 1); - //EasyTransferMessage - AddressFieldNameMap.put("protocol.EasyTransferMessage.toAddress", 1); - //EasyTransferAssetMessage - AddressFieldNameMap.put("protocol.EasyTransferAssetMessage.toAddress", 1); - //EasyTransferByPrivateMessage - AddressFieldNameMap.put("protocol.EasyTransferByPrivateMessage.toAddress", 1); - //EasyTransferAssetByPrivateMessage - AddressFieldNameMap.put("protocol.EasyTransferAssetByPrivateMessage.toAddress", 1); //TransactionSignWeight AddressFieldNameMap.put("protocol.TransactionSignWeight.approved_list", 1); //TransactionApprovedList @@ -140,8 +132,6 @@ public class HttpSelfFormatFieldName { //ShieldedTransferContract AddressFieldNameMap.put("protocol.ShieldedTransferContract.transparent_from_address", 1); AddressFieldNameMap.put("protocol.ShieldedTransferContract.transparent_to_address", 1); - //UpdateBrokerageContract - AddressFieldNameMap.put("protocol.UpdateBrokerageContract.owner_address", 1); //FreezeBalanceV2Contract AddressFieldNameMap.put("protocol.FreezeBalanceV2Contract.owner_address", 1); //UnfreezeBalanceV2Contract @@ -206,10 +196,6 @@ public class HttpSelfFormatFieldName { NameFieldNameMap.put("protocol.Return.message", 1); //Address NameFieldNameMap.put("protocol.Address.host", 1); - //EasyTransferMessage - NameFieldNameMap.put("protocol.EasyTransferMessage.passPhrase", 1); - //EasyTransferAssetMessage - NameFieldNameMap.put("protocol.EasyTransferAssetMessage.passPhrase", 1); //Note NameFieldNameMap.put("protocol.Note.memo", 1); diff --git a/framework/src/main/java/org/tron/core/services/http/TransactionSignServlet.java b/framework/src/main/java/org/tron/core/services/http/TransactionSignServlet.java deleted file mode 100644 index 86d1b07f457..00000000000 --- a/framework/src/main/java/org/tron/core/services/http/TransactionSignServlet.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.tron.core.services.http; - -import com.alibaba.fastjson.JSONObject; -import java.util.stream.Collectors; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.utils.TransactionUtil; -import org.tron.protos.Protocol.Transaction; -import org.tron.protos.Protocol.TransactionSign; - - -@Component -@Slf4j(topic = "API") -public class TransactionSignServlet extends RateLimiterServlet { - - protected void doGet(HttpServletRequest request, HttpServletResponse response) { - - } - - protected void doPost(HttpServletRequest request, HttpServletResponse response) { - try { - String contract = request.getReader().lines() - .collect(Collectors.joining(System.lineSeparator())); - Util.checkBodySize(contract); - JSONObject input = JSONObject.parseObject(contract); - boolean visible = Util.getVisibleOnlyForSign(input); - String strTransaction = input.getJSONObject("transaction").toJSONString(); - Transaction transaction = Util.packTransaction(strTransaction, visible); - JSONObject jsonTransaction = JSONObject.parseObject(JsonFormat.printToString(transaction, - visible)); - input.put("transaction", jsonTransaction); - TransactionSign.Builder build = TransactionSign.newBuilder(); - JsonFormat.merge(input.toJSONString(), build, visible); - TransactionCapsule reply = TransactionUtil.getTransactionSign(build.build()); - if (reply != null) { - response.getWriter().println(Util.printCreateTransaction(reply.getInstance(), visible)); - } else { - response.getWriter().println("{}"); - } - } catch (Exception e) { - Util.processError(e, response); - } - } -} diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 6c8ce0b832c..28ec18b59ac 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -27,7 +27,6 @@ import org.eclipse.jetty.util.StringUtil; import org.tron.api.GrpcAPI; import org.tron.api.GrpcAPI.BlockList; -import org.tron.api.GrpcAPI.EasyTransferResponse; import org.tron.api.GrpcAPI.TransactionApprovedList; import org.tron.api.GrpcAPI.TransactionExtention; import org.tron.api.GrpcAPI.TransactionIdList; @@ -129,12 +128,6 @@ public static JSONArray printTransactionListToJSON(List list return transactions; } - public static String printEasyTransferResponse(EasyTransferResponse response, boolean selfType) { - JSONObject jsonResponse = JSONObject.parseObject(JsonFormat.printToString(response, selfType)); - jsonResponse.put(TRANSACTION, printTransactionToJSON(response.getTransaction(), selfType)); - return jsonResponse.toJSONString(); - } - public static String printTransaction(Transaction transaction, boolean selfType) { return printTransactionToJSON(transaction, selfType).toJSONString(); } diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java index 7232ba01ce5..c003f9d3994 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnPBFT/RpcApiServiceOnPBFT.java @@ -7,11 +7,9 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Hex; import org.springframework.beans.factory.annotation.Autowired; import org.tron.api.DatabaseGrpc.DatabaseImplBase; import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.AddressPrKeyPairMessage; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.api.GrpcAPI.BlockExtention; import org.tron.api.GrpcAPI.BlockReference; @@ -414,22 +412,6 @@ public void estimateEnergy(TriggerSmartContract request, ); } - - @Override - public void generateAddress(EmptyMessage request, - StreamObserver responseObserver) { - ECKey ecKey = new ECKey(Utils.getRandom()); - byte[] priKey = ecKey.getPrivKeyBytes(); - byte[] address = ecKey.getAddress(); - String addressStr = StringUtil.encode58Check(address); - String priKeyStr = Hex.encodeHexString(priKey); - AddressPrKeyPairMessage.Builder builder = AddressPrKeyPairMessage.newBuilder(); - builder.setAddress(addressStr); - builder.setPrivateKey(priKeyStr); - responseObserver.onNext(builder.build()); - responseObserver.onCompleted(); - } - @Override public void getRewardInfo(BytesMessage request, StreamObserver responseObserver) { diff --git a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java index 254c5227929..3f4bfeda731 100755 --- a/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java +++ b/framework/src/main/java/org/tron/core/services/interfaceOnSolidity/RpcApiServiceOnSolidity.java @@ -8,11 +8,9 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.binary.Hex; import org.springframework.beans.factory.annotation.Autowired; import org.tron.api.DatabaseGrpc.DatabaseImplBase; import org.tron.api.GrpcAPI; -import org.tron.api.GrpcAPI.AddressPrKeyPairMessage; import org.tron.api.GrpcAPI.AssetIssueList; import org.tron.api.GrpcAPI.BlockExtention; import org.tron.api.GrpcAPI.BlockReference; @@ -398,23 +396,6 @@ public void estimateEnergy(TriggerSmartContract request, .estimateEnergy(request, responseObserver)); } - - @Override - public void generateAddress(EmptyMessage request, - StreamObserver responseObserver) { - SignInterface cryptoEngine = SignUtils - .getGeneratedRandomSign(Utils.getRandom(), Args.getInstance().isECKeyCryptoEngine()); - byte[] priKey = cryptoEngine.getPrivateKey(); - byte[] address = cryptoEngine.getAddress(); - String addressStr = StringUtil.encode58Check(address); - String priKeyStr = Hex.encodeHexString(priKey); - AddressPrKeyPairMessage.Builder builder = AddressPrKeyPairMessage.newBuilder(); - builder.setAddress(addressStr); - builder.setPrivateKey(priKeyStr); - responseObserver.onNext(builder.build()); - responseObserver.onCompleted(); - } - @Override public void getRewardInfo(BytesMessage request, StreamObserver responseObserver) { diff --git a/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java b/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java index 3042a745d94..5bac3effbef 100755 --- a/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java +++ b/framework/src/test/java/org/tron/core/actuator/ShieldedTransferActuatorTest.java @@ -41,10 +41,10 @@ import org.tron.core.zen.note.Note; import org.tron.protos.Protocol.AccountType; import org.tron.protos.Protocol.Transaction.Contract; -import org.tron.protos.Protocol.TransactionSign; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; import org.tron.protos.contract.ShieldContract.PedersenHash; import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; +import stest.tron.wallet.common.client.utils.TransactionUtils; @Slf4j public class ShieldedTransferActuatorTest { @@ -232,11 +232,8 @@ public void publicAddressToShieldedAddressSuccess() { TransactionCapsule transactionCap = getPublicToShieldedTransaction(); //Add public address sign - TransactionSign.Builder transactionSignBuild = TransactionSign.newBuilder(); - transactionSignBuild.setTransaction(transactionCap.getInstance()); - transactionSignBuild.setPrivateKey(ByteString.copyFrom( - ByteArray.fromHexString(ADDRESS_ONE_PRIVATE_KEY))); - transactionCap = transactionUtil.addSign(transactionSignBuild.build()); + transactionCap = TransactionUtils.addTransactionSign(transactionCap.getInstance(), + ADDRESS_ONE_PRIVATE_KEY, dbManager.getAccountStore()); Assert.assertTrue(dbManager.pushTransaction(transactionCap)); } catch (Exception e) { @@ -263,11 +260,8 @@ public void publicAddressToPublicAddressAndZereValueOutputSuccess() { TransactionCapsule transactionCap = builder.build(); //Add public address sign - TransactionSign.Builder transactionSignBuild = TransactionSign.newBuilder(); - transactionSignBuild.setTransaction(transactionCap.getInstance()); - transactionSignBuild.setPrivateKey(ByteString.copyFrom( - ByteArray.fromHexString(ADDRESS_ONE_PRIVATE_KEY))); - transactionCap = transactionUtil.addSign(transactionSignBuild.build()); + transactionCap = TransactionUtils.addTransactionSign(transactionCap.getInstance(), + ADDRESS_ONE_PRIVATE_KEY, dbManager.getAccountStore()); Assert.assertTrue(dbManager.pushTransaction(transactionCap)); } catch (Exception e) { @@ -286,11 +280,8 @@ public void publicAddressToShieldedAddressInvalidSign() { TransactionCapsule transactionCap = getPublicToShieldedTransaction(); //Add public address sign - TransactionSign.Builder transactionSignBuild = TransactionSign.newBuilder(); - transactionSignBuild.setTransaction(transactionCap.getInstance()); - transactionSignBuild.setPrivateKey(ByteString.copyFrom( - ByteArray.fromHexString(ADDRESS_TWO_PRIVATE_KEY))); - transactionUtil.addSign(transactionSignBuild.build()); + TransactionUtils.addTransactionSign(transactionCap.getInstance(), ADDRESS_TWO_PRIVATE_KEY, + dbManager.getAccountStore()); Assert.assertTrue(false); } catch (PermissionException e) { Assert.assertTrue(e instanceof PermissionException); @@ -429,11 +420,8 @@ public void publicAddressToShieldedAddressNotConsumeBandwidth() { try { TransactionCapsule transactionCap = getPublicToShieldedTransaction(); //Add public address sign - TransactionSign.Builder transactionSignBuild = TransactionSign.newBuilder(); - transactionSignBuild.setTransaction(transactionCap.getInstance()); - transactionSignBuild.setPrivateKey(ByteString.copyFrom( - ByteArray.fromHexString(ADDRESS_ONE_PRIVATE_KEY))); - transactionCap = transactionUtil.addSign(transactionSignBuild.build()); + transactionCap = TransactionUtils.addTransactionSign(transactionCap.getInstance(), + ADDRESS_ONE_PRIVATE_KEY, dbManager.getAccountStore()); AccountCapsule accountCapsule = dbManager.getAccountStore().get(ByteArray.fromHexString(PUBLIC_ADDRESS_ONE)); @@ -1020,11 +1008,8 @@ public void publicToShieldAddressAndShieldToPublicAddressWithZoreValueSuccess() TransactionCapsule transactionCapOne = builderOne.build(); //Add public address sign - TransactionSign.Builder transactionSignBuild = TransactionSign.newBuilder(); - transactionSignBuild.setTransaction(transactionCapOne.getInstance()); - transactionSignBuild.setPrivateKey(ByteString.copyFrom( - ByteArray.fromHexString(ADDRESS_ONE_PRIVATE_KEY))); - transactionCapOne = transactionUtil.addSign(transactionSignBuild.build()); + transactionCapOne = TransactionUtils.addTransactionSign(transactionCapOne.getInstance(), + ADDRESS_ONE_PRIVATE_KEY, dbManager.getAccountStore()); Assert.assertTrue(dbManager.pushTransaction(transactionCapOne)); AccountCapsule accountCapsuleOne = 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 d3cbdb71e95..71501d68a41 100755 --- a/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/ShieldedReceiveTest.java @@ -93,7 +93,6 @@ import org.tron.protos.Protocol.Block; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.Protocol.TransactionSign; import org.tron.protos.contract.AssetIssueContractOuterClass.AssetIssueContract; import org.tron.protos.contract.ShieldContract.IncrementalMerkleVoucherInfo; import org.tron.protos.contract.ShieldContract.OutputPoint; @@ -102,6 +101,7 @@ import org.tron.protos.contract.ShieldContract.ReceiveDescription; import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; import org.tron.protos.contract.ShieldContract.SpendDescription; +import stest.tron.wallet.common.client.utils.TransactionUtils; @Slf4j public class ShieldedReceiveTest extends BlockGenerate { @@ -329,13 +329,8 @@ public void testBroadcastBeforeAllowZksnark() TransactionCapsule transactionCap = builder.build(); //Add public address sign - TransactionSign.Builder transactionSignBuild = TransactionSign.newBuilder(); - transactionSignBuild.setTransaction(transactionCap.getInstance()); - transactionSignBuild.setPrivateKey(ByteString.copyFrom( - ByteArray.fromHexString(ADDRESS_ONE_PRIVATE_KEY))); - - transactionCap = transactionUtil.addSign(transactionSignBuild.build()); - + transactionCap = TransactionUtils.addTransactionSign(transactionCap.getInstance(), + ADDRESS_ONE_PRIVATE_KEY, chainBaseManager.getAccountStore()); try { dbManager.pushTransaction(transactionCap); Assert.assertFalse(true); diff --git a/framework/src/test/java/stest/tron/wallet/account/WalletTestAccount011.java b/framework/src/test/java/stest/tron/wallet/account/WalletTestAccount011.java index d50783f72c1..8d829424643 100644 --- a/framework/src/test/java/stest/tron/wallet/account/WalletTestAccount011.java +++ b/framework/src/test/java/stest/tron/wallet/account/WalletTestAccount011.java @@ -58,13 +58,6 @@ public void beforeClass() { } - @Test(enabled = true) - public void testgenerateAddress() { - EmptyMessage.Builder builder = EmptyMessage.newBuilder(); - blockingStubFull.generateAddress(builder.build()); - blockingStubSolidity.generateAddress(builder.build()); - } - /** * constructor. */ diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index 8ef8fecbd8e..adb7c0e54a0 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -1174,12 +1174,8 @@ public static HttpResponse unFreezeBalance( public static String gettransactionsign( String httpNode, String transactionString, String privateKey) { try { - String requestUrl = "http://" + httpNode + "/wallet/gettransactionsign"; - JsonObject userBaseObj2 = new JsonObject(); - userBaseObj2.addProperty("transaction", transactionString); - userBaseObj2.addProperty("privateKey", privateKey); - response = createConnect(requestUrl, userBaseObj2); - transactionSignString = EntityUtils.toString(response.getEntity()); + transactionSignString = TransactionUtils.getTransactionSign(transactionString, privateKey, + false); } catch (Exception e) { e.printStackTrace(); httppost.releaseConnection(); @@ -2968,36 +2964,6 @@ public static HttpResponse updateEnergyLimit( return response; } - /** constructor. */ - public static HttpResponse createAddress(String httpNode, String value) { - try { - final String requestUrl = "http://" + httpNode + "/wallet/createaddress"; - JsonObject userBaseObj2 = new JsonObject(); - userBaseObj2.addProperty("value", str2hex(value)); - response = createConnect(requestUrl, userBaseObj2); - logger.info(userBaseObj2.toString()); - } catch (Exception e) { - e.printStackTrace(); - httppost.releaseConnection(); - return null; - } - return response; - } - - /** constructor. */ - public static HttpResponse generateAddress(String httpNode) { - try { - final String requestUrl = "http://" + httpNode + "/wallet/generateaddress"; - JsonObject userBaseObj2 = new JsonObject(); - response = createConnect(requestUrl, userBaseObj2); - } catch (Exception e) { - e.printStackTrace(); - httppost.releaseConnection(); - return null; - } - return response; - } - /** constructor. */ public static HttpResponse getTransactionCountByBlocknum(String httpNode, long blocknum) { try { @@ -3029,92 +2995,6 @@ public static HttpResponse validateAddress(String httpNode, String address) { return response; } - /** constructor. */ - public static HttpResponse easyTransfer( - String httpNode, String value, byte[] toAddress, Long amount) { - try { - final String requestUrl = "http://" + httpNode + "/wallet/easytransfer"; - JsonObject userBaseObj2 = new JsonObject(); - userBaseObj2.addProperty("toAddress", ByteArray.toHexString(toAddress)); - userBaseObj2.addProperty("passPhrase", str2hex(value)); - userBaseObj2.addProperty("amount", amount); - response = createConnect(requestUrl, userBaseObj2); - logger.info(userBaseObj2.toString()); - transactionString = EntityUtils.toString(response.getEntity()); - logger.info(transactionString); - } catch (Exception e) { - e.printStackTrace(); - httppost.releaseConnection(); - return null; - } - return response; - } - - /** constructor. */ - public static HttpResponse easyTransferByPrivate( - String httpNode, String privateKey, byte[] toAddress, Long amount) { - try { - final String requestUrl = "http://" + httpNode + "/wallet/easytransferbyprivate"; - JsonObject userBaseObj2 = new JsonObject(); - userBaseObj2.addProperty("privateKey", privateKey); - userBaseObj2.addProperty("toAddress", ByteArray.toHexString(toAddress)); - userBaseObj2.addProperty("amount", amount); - response = createConnect(requestUrl, userBaseObj2); - logger.info(userBaseObj2.toString()); - transactionString = EntityUtils.toString(response.getEntity()); - logger.info(transactionString); - } catch (Exception e) { - e.printStackTrace(); - httppost.releaseConnection(); - return null; - } - return response; - } - - /** constructor. */ - public static HttpResponse easyTransferAsset( - String httpNode, String value, byte[] toAddress, Long amount, String assetId) { - try { - final String requestUrl = "http://" + httpNode + "/wallet/easytransferasset"; - JsonObject userBaseObj2 = new JsonObject(); - userBaseObj2.addProperty("toAddress", ByteArray.toHexString(toAddress)); - userBaseObj2.addProperty("passPhrase", str2hex(value)); - userBaseObj2.addProperty("amount", amount); - userBaseObj2.addProperty("assetId", assetId); - response = createConnect(requestUrl, userBaseObj2); - logger.info(userBaseObj2.toString()); - transactionString = EntityUtils.toString(response.getEntity()); - logger.info(transactionString); - } catch (Exception e) { - e.printStackTrace(); - httppost.releaseConnection(); - return null; - } - return response; - } - - /** constructor. */ - public static HttpResponse easyTransferAssetByPrivate( - String httpNode, String privateKey, byte[] toAddress, Long amount, String assetId) { - try { - final String requestUrl = "http://" + httpNode + "/wallet/easytransferassetbyprivate"; - JsonObject userBaseObj2 = new JsonObject(); - userBaseObj2.addProperty("privateKey", privateKey); - userBaseObj2.addProperty("toAddress", ByteArray.toHexString(toAddress)); - userBaseObj2.addProperty("amount", amount); - userBaseObj2.addProperty("assetId", assetId); - response = createConnect(requestUrl, userBaseObj2); - logger.info(userBaseObj2.toString()); - transactionString = EntityUtils.toString(response.getEntity()); - logger.info(transactionString); - } catch (Exception e) { - e.printStackTrace(); - httppost.releaseConnection(); - return null; - } - return response; - } - /** constructor. */ public static HttpResponse getContractInfo(String httpNode, String contractAddress) { try { diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/TransactionUtils.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/TransactionUtils.java index cc2af15ec7b..179af83e083 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/TransactionUtils.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/TransactionUtils.java @@ -24,7 +24,13 @@ import org.tron.common.crypto.ECKey; import org.tron.common.crypto.ECKey.ECDSASignature; import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.ByteArray; import org.tron.common.utils.Sha256Hash; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.exception.PermissionException; +import org.tron.core.exception.SignatureFormatException; +import org.tron.core.services.http.JsonFormat; +import org.tron.core.store.AccountStore; import org.tron.protos.Protocol.Transaction; import org.tron.protos.Protocol.Transaction.Contract; import org.tron.protos.contract.AccountContract.AccountCreateContract; @@ -168,7 +174,6 @@ public static boolean validTransaction(Transaction signedTransaction) { */ public static Transaction sign(Transaction transaction, ECKey myKey) { - ByteString lockSript = ByteString.copyFrom(myKey.getAddress()); Transaction.Builder transactionBuilderSigned = transaction.toBuilder(); byte[] hash = Sha256Hash.hash(CommonParameter @@ -185,6 +190,30 @@ public static Transaction sign(Transaction transaction, ECKey myKey) { return transaction; } + public static String getTransactionSign(String transaction, String priKey, + boolean selfType) { + byte[] privateKey = ByteArray.fromHexString(priKey); + Transaction.Builder builder = Transaction.newBuilder(); + try { + JsonFormat.merge(transaction, builder, selfType); + TransactionCapsule trx = new TransactionCapsule(builder.build()); + trx.sign(privateKey); + return JsonFormat.printToString(trx.getInstance(), selfType); + } catch (JsonFormat.ParseException e) { + logger.error("{}", e); + } + return null; + } + + public static TransactionCapsule addTransactionSign(Transaction transaction, String priKey, + AccountStore accountStore) + throws PermissionException, SignatureException, SignatureFormatException { + byte[] privateKey = ByteArray.fromHexString(priKey); + TransactionCapsule trx = new TransactionCapsule(transaction); + trx.addSign(privateKey, accountStore); + return trx; + } + /** * constructor. */ diff --git a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestEasyAccount001.java b/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestEasyAccount001.java deleted file mode 100644 index a4d854547fd..00000000000 --- a/framework/src/test/java/stest/tron/wallet/dailybuild/http/HttpTestEasyAccount001.java +++ /dev/null @@ -1,281 +0,0 @@ -package stest.tron.wallet.dailybuild.http; - -import com.alibaba.fastjson.JSONObject; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.HttpResponse; -import org.junit.Assert; -import org.testng.annotations.AfterClass; -import org.testng.annotations.Test; -import org.tron.common.crypto.ECKey; -import org.tron.common.utils.ByteArray; -import org.tron.common.utils.Commons; -import org.tron.common.utils.Utils; -import stest.tron.wallet.common.client.Configuration; -import stest.tron.wallet.common.client.utils.HttpMethed; -import stest.tron.wallet.common.client.utils.PublicMethed; - -@Slf4j -public class HttpTestEasyAccount001 { - - private static String assetIssueId; - private final String testKey002 = Configuration.getByPath("testng.conf") - .getString("foundationAccount.key1"); - private final byte[] fromAddress = PublicMethed.getFinalAddress(testKey002); - String description = Configuration.getByPath("testng.conf") - .getString("defaultParameter.assetDescription"); - String url = Configuration.getByPath("testng.conf").getString("defaultParameter.assetUrl"); - long beforeEasyBalance = 0L; - long afterEasyBalance = 0L; - long beforeGenerateBalance = 0L; - long afterGenerateBalance = 0L; - long beforeEasyAsset = 0L; - long afterEasyAsset = 0L; - long beforeGenerateAsset = 0L; - long afterGenerateAsset = 0L; - ECKey ecKey1 = new ECKey(Utils.getRandom()); - byte[] assetAddress = ecKey1.getAddress(); - String assetKey = ByteArray.toHexString(ecKey1.getPrivKeyBytes()); - private JSONObject responseContent; - private HttpResponse response; - private String httpnode = Configuration.getByPath("testng.conf").getStringList("httpnode.ip.list") - .get(0); - private long now = System.currentTimeMillis(); - private final long totalSupply = now; - private String userPassword = "ps_" + now; - private String assetName = "httpEasyAsset_" + now; - private String easyAddress = null; - private String generatePriKey = null; - private String generateAddress = null; - private String generateHexAddress = null; - - /** - * constructor. - */ - @Test(enabled = true, description = "Create address by http") - public void test01CreateAddress() { - logger.info(userPassword); - response = HttpMethed.createAddress(httpnode, userPassword); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - easyAddress = responseContent.get("base58checkAddress").toString(); - - //Send trx to easy account - response = HttpMethed - .sendCoin(httpnode, fromAddress, Commons.decodeFromBase58Check(easyAddress), 5000000L, - testKey002); - Assert.assertTrue(HttpMethed.verificationResult(response)); - HttpMethed.waitToProduceOneBlock(httpnode); - - beforeEasyBalance = HttpMethed.getBalance(httpnode, Commons.decodeFromBase58Check(easyAddress)); - logger.info("beforeEasyBalance: " + beforeEasyBalance); - - } - - /** - * constructor. - */ - @Test(enabled = true, description = "Generate address by http") - public void test02GenerateAddress() { - response = HttpMethed.generateAddress(httpnode); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - generateAddress = responseContent.get("address").toString(); - generateHexAddress = responseContent.get("hexAddress").toString(); - generatePriKey = responseContent.get("privateKey").toString(); - - //Send trx to easy account - response = HttpMethed - .sendCoin(httpnode, fromAddress, Commons.decodeFromBase58Check(generateAddress), 5000000L, - testKey002); - Assert.assertTrue(HttpMethed.verificationResult(response)); - HttpMethed.waitToProduceOneBlock(httpnode); - - beforeGenerateBalance = HttpMethed - .getBalance(httpnode, Commons.decodeFromBase58Check(generateAddress)); - logger.info("beforeGenerateBalance: " + beforeGenerateBalance); - } - - - /** - * constructor. - */ - @Test(enabled = true, description = "Validate address by http") - public void test03ValideteAddress() { - // Base58check format - response = HttpMethed.validateAddress(httpnode, generateAddress); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - - // Hex string format - response = HttpMethed.validateAddress(httpnode, generateHexAddress); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - } - - - /** - * constructor. - */ - @Test(enabled = true, description = "Easy transfer by http") - public void test04EasyTransfer() { - response = HttpMethed - .easyTransfer(httpnode, userPassword, Commons.decodeFromBase58Check(generateAddress), - 1000000L); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - HttpMethed.waitToProduceOneBlock(httpnode); - - //Send trx to easy account - afterEasyBalance = HttpMethed.getBalance(httpnode, Commons.decodeFromBase58Check(easyAddress)); - logger.info("afterEasyBalance: " + afterEasyBalance); - - afterGenerateBalance = HttpMethed - .getBalance(httpnode, Commons.decodeFromBase58Check(generateAddress)); - logger.info("afterGenerateBalance: " + afterGenerateBalance); - - Assert.assertEquals(beforeEasyBalance - afterEasyBalance, - afterGenerateBalance - beforeGenerateBalance); - beforeEasyBalance = afterEasyBalance; - beforeGenerateBalance = afterGenerateBalance; - } - - /** - * constructor. - */ - @Test(enabled = true, description = "Easy transfer by privateKey by http") - public void test05EasyTransferByPrivateKey() { - response = HttpMethed - .easyTransferByPrivate(httpnode, generatePriKey, Commons.decodeFromBase58Check(easyAddress), - 1000000L); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - HttpMethed.waitToProduceOneBlock(httpnode); - - //Send trx to easy account - afterEasyBalance = HttpMethed.getBalance(httpnode, Commons.decodeFromBase58Check(easyAddress)); - logger.info("beforeEasyBalance: " + beforeEasyBalance); - logger.info("afterEasyBalance: " + afterEasyBalance); - - afterGenerateBalance = HttpMethed - .getBalance(httpnode, Commons.decodeFromBase58Check(generateAddress)); - logger.info("beforeGenerateBalance: " + beforeGenerateBalance); - logger.info("afterGenerateBalance: " + afterGenerateBalance); - - Assert.assertEquals(beforeGenerateBalance - afterGenerateBalance, - afterEasyBalance - beforeEasyBalance); - } - - /** - * constructor. - */ - @Test(enabled = true, description = "Create asset issue by http") - public void test06CreateAssetIssue() { - Long amount = 2048000000L; - response = HttpMethed.sendCoin(httpnode, fromAddress, assetAddress, amount, testKey002); - Assert.assertTrue(HttpMethed.verificationResult(response)); - HttpMethed.waitToProduceOneBlock(httpnode); - //Create an asset issue - response = HttpMethed - .assetIssue(httpnode, assetAddress, assetName, assetName, totalSupply, 1, 1, - System.currentTimeMillis() + 5000, System.currentTimeMillis() + 50000000, 2, 3, - description, url, 1000L, 1000L, assetKey); - Assert.assertTrue(HttpMethed.verificationResult(response)); - HttpMethed.waitToProduceOneBlock(httpnode); - - response = HttpMethed.getAccount(httpnode, assetAddress); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - - assetIssueId = responseContent.getString("asset_issued_ID"); - logger.info(assetIssueId); - Assert.assertTrue(Integer.parseInt(assetIssueId) > 1000000); - - response = HttpMethed - .transferAsset(httpnode, assetAddress, Commons.decodeFromBase58Check(easyAddress), - assetIssueId, 100L, assetKey); - Assert.assertTrue(HttpMethed.verificationResult(response)); - HttpMethed.waitToProduceOneBlock(httpnode); - - response = HttpMethed.getAccount(httpnode, Commons.decodeFromBase58Check(easyAddress)); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - beforeEasyAsset = responseContent.getJSONArray("assetV2").getJSONObject(0) - .getLongValue("value"); - logger.info("beforeEasyAsset:" + beforeEasyAsset); - } - - /** - * constructor. - */ - @Test(enabled = true, description = "Easy transfer asset by http") - public void test07EasyTransferAsset() { - response = HttpMethed - .easyTransferAsset(httpnode, userPassword, Commons.decodeFromBase58Check(generateAddress), - 10L, assetIssueId); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - HttpMethed.waitToProduceOneBlock(httpnode); - - response = HttpMethed.getAccount(httpnode, Commons.decodeFromBase58Check(easyAddress)); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - afterEasyAsset = responseContent.getJSONArray("assetV2").getJSONObject(0).getLongValue("value"); - logger.info("afterEasyAsset:" + afterEasyAsset); - - response = HttpMethed.getAccount(httpnode, Commons.decodeFromBase58Check(generateAddress)); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - beforeGenerateAsset = responseContent.getJSONArray("assetV2").getJSONObject(0) - .getLongValue("value"); - logger.info("beforeGenerateAsset:" + beforeGenerateAsset); - Assert.assertEquals(beforeEasyAsset - afterEasyAsset, beforeGenerateAsset); - beforeEasyAsset = afterEasyAsset; - } - - /** - * constructor. - */ - @Test(enabled = true, description = "Easy transfer asset by private key by http") - public void test08EasyTransferAssetByPrivateKey() { - response = HttpMethed.easyTransferAssetByPrivate(httpnode, generatePriKey, - Commons.decodeFromBase58Check(easyAddress), 5L, assetIssueId); - logger.info("code is " + response.getStatusLine().getStatusCode()); - Assert.assertEquals(response.getStatusLine().getStatusCode(), 200); - HttpMethed.waitToProduceOneBlock(httpnode); - - response = HttpMethed.getAccount(httpnode, Commons.decodeFromBase58Check(easyAddress)); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - afterEasyAsset = responseContent.getJSONArray("assetV2").getJSONObject(0).getLongValue("value"); - logger.info("beforeEasyAsset:" + beforeEasyAsset); - logger.info("afterEasyAsset:" + afterEasyAsset); - - response = HttpMethed.getAccount(httpnode, Commons.decodeFromBase58Check(generateAddress)); - responseContent = HttpMethed.parseResponseContent(response); - HttpMethed.printJsonContent(responseContent); - afterGenerateAsset = responseContent.getJSONArray("assetV2").getJSONObject(0) - .getLongValue("value"); - logger.info("afterGenerateAsset:" + afterGenerateAsset); - Assert.assertEquals(beforeGenerateAsset - afterGenerateAsset, afterEasyAsset - beforeEasyAsset); - } - - /** - * constructor. - */ - @AfterClass - public void shutdown() throws InterruptedException { - HttpMethed.freedResource(httpnode, Commons.decodeFromBase58Check(generateAddress), fromAddress, - generatePriKey); - HttpMethed.freedResource(httpnode, assetAddress, fromAddress, assetKey); - HttpMethed.disConnect(); - } - -} diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index 48cd64acc5b..70297d0959b 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -624,68 +624,6 @@ service Wallet { } }; } - //Warning: do not invoke this interface provided by others. - //Please use GetTransactionSign2 instead of this function. - rpc GetTransactionSign (TransactionSign) returns (Transaction) { - option (google.api.http) = { - post: "/wallet/gettransactionsign" - body: "*" - additional_bindings { - get: "/wallet/gettransactionsign" - } - }; - }; - //Warning: do not invoke this interface provided by others. - //Use this function instead of GetTransactionSign. - rpc GetTransactionSign2 (TransactionSign) returns (TransactionExtention) { - }; - //Warning: do not invoke this interface provided by others. - rpc CreateAddress (BytesMessage) returns (BytesMessage) { - option (google.api.http) = { - post: "/wallet/createaddress" - body: "*" - additional_bindings { - get: "/wallet/createaddress" - } - }; - }; - //Warning: do not invoke this interface provided by others. - rpc EasyTransferAsset (EasyTransferAssetMessage) returns (EasyTransferResponse) { - }; - //Warning: do not invoke this interface provided by others. - rpc EasyTransferAssetByPrivate (EasyTransferAssetByPrivateMessage) returns (EasyTransferResponse) { - }; - //Warning: do not invoke this interface provided by others. - rpc EasyTransfer (EasyTransferMessage) returns (EasyTransferResponse) { - option (google.api.http) = { - post: "/wallet/easytransfer" - body: "*" - additional_bindings { - get: "/wallet/easytransfer" - } - }; - }; - //Warning: do not invoke this interface provided by others. - rpc EasyTransferByPrivate (EasyTransferByPrivateMessage) returns (EasyTransferResponse) { - option (google.api.http) = { - post: "/wallet/easytransferbyprivate" - body: "*" - additional_bindings { - get: "/wallet/easytransferbyprivate" - } - }; - }; - //Warning: do not invoke this interface provided by others. - rpc GenerateAddress (EmptyMessage) returns (AddressPrKeyPairMessage) { - - option (google.api.http) = { - post: "/wallet/generateaddress" - body: "*" - additional_bindings { - get: "/wallet/generateaddress" - } - }; - } rpc GetTransactionInfoById (BytesMessage) returns (TransactionInfo) { option (google.api.http) = { @@ -707,10 +645,6 @@ service Wallet { }; } - rpc AddSign (TransactionSign) returns (TransactionExtention) { - - } - rpc GetTransactionSignWeight (Transaction) returns (TransactionSignWeight) { } @@ -968,17 +902,6 @@ service WalletSolidity { }; } - //Warning: do not invoke this interface provided by others. - rpc GenerateAddress (EmptyMessage) returns (AddressPrKeyPairMessage) { - option (google.api.http) = { - post: "/walletsolidity/generateaddress" - body: "*" - additional_bindings { - get: "/walletsolidity/generateaddress" - } - }; - } - rpc GetMerkleTreeVoucherInfo (OutputPointInfo) returns (IncrementalMerkleVoucherInfo) { } @@ -1269,43 +1192,6 @@ message PaginatedMessage { int64 limit = 2; } -message EasyTransferMessage { - bytes passPhrase = 1; - bytes toAddress = 2; - int64 amount = 3; -} - -message EasyTransferAssetMessage { - bytes passPhrase = 1; - bytes toAddress = 2; - string assetId = 3; - int64 amount = 4; -} - -message EasyTransferByPrivateMessage { - bytes privateKey = 1; - bytes toAddress = 2; - int64 amount = 3; -} - -message EasyTransferAssetByPrivateMessage { - bytes privateKey = 1; - bytes toAddress = 2; - string assetId = 3; - int64 amount = 4; -} - -message EasyTransferResponse { - Transaction transaction = 1; - Return result = 2; - bytes txid = 3; //transaction id = sha256(transaction.rowdata) -} - -message AddressPrKeyPairMessage { - string address = 1; - string privateKey = 2; -} - message TransactionExtention { Transaction transaction = 1; bytes txid = 2; //transaction id = sha256(transaction.rowdata) diff --git a/protocol/src/main/protos/core/Tron.proto b/protocol/src/main/protos/core/Tron.proto index 437f5bf85a2..e5145484f05 100644 --- a/protocol/src/main/protos/core/Tron.proto +++ b/protocol/src/main/protos/core/Tron.proto @@ -494,11 +494,6 @@ message Transactions { repeated Transaction transactions = 1; } -message TransactionSign { - Transaction transaction = 1; - bytes privateKey = 2; -} - message BlockHeader { message raw { int64 timestamp = 1; From 3f00ebdd0f0af107bbcee07044738012a8fe0eb8 Mon Sep 17 00:00:00 2001 From: vikingzzu Date: Fri, 31 Mar 2023 16:51:09 +0800 Subject: [PATCH 098/142] update fetchBlockTimeout to 500ms --- framework/src/main/java/org/tron/core/config/args/Args.java | 2 +- 1 file changed, 1 insertion(+), 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 80c87b91005..a44e79ae5aa 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 @@ -570,7 +570,7 @@ public static void setParam(final String[] args, final String confFileName) { : 2000; if (!config.hasPath(Constant.NODE_FETCH_BLOCK_TIMEOUT)) { - PARAMETER.fetchBlockTimeout = 200; + PARAMETER.fetchBlockTimeout = 500; } else if (config.getInt(Constant.NODE_FETCH_BLOCK_TIMEOUT) > 1000) { PARAMETER.fetchBlockTimeout = 1000; } else if (config.getInt(Constant.NODE_FETCH_BLOCK_TIMEOUT) < 100) { From 5c615f7c160162c92fd9b8d71d1594c9abc63cd4 Mon Sep 17 00:00:00 2001 From: Asuka Date: Sun, 2 Apr 2023 18:23:56 +0800 Subject: [PATCH 099/142] fix(interface): continue to estimate if runtime exception occurred while estimating --- .../java/org/tron/core/db/TransactionTrace.java | 2 +- .../src/main/java/org/tron/core/Wallet.java | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java index 84b22adf0d9..c239639f019 100644 --- a/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java +++ b/chainbase/src/main/java/org/tron/core/db/TransactionTrace.java @@ -255,7 +255,7 @@ public void pay() throws BalanceInsufficientException { AccountCapsule origin = accountStore.get(originAccount); AccountCapsule caller = accountStore.get(callerAccount); if (dynamicPropertiesStore.supportUnfreezeDelay() - && receipt.getReceipt().getResult().equals(contractResult.SUCCESS)) { + && getRuntimeResult().getException() == null && !getRuntimeResult().isRevert()) { // just fo caller is not origin, we set the related field for origin account if (origin != null && !caller.getAddress().equals(origin.getAddress())) { diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index d834d4ae661..2d5503e9c39 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -2842,7 +2842,7 @@ public Transaction triggerContract(TriggerSmartContract triggerSmartContract.getData().toByteArray()); if (isConstant(abi, selector)) { - return callConstantContract(trxCap, builder, retBuilder); + return callConstantContract(trxCap, builder, retBuilder, false); } else { return trxCap.getInstance(); } @@ -2960,13 +2960,19 @@ private Transaction cleanContextAndTriggerConstantContract( txExtBuilder.clear(); txRetBuilder.clear(); transaction = triggerConstantContract( - triggerSmartContract, txCap, txExtBuilder, txRetBuilder); + triggerSmartContract, txCap, txExtBuilder, txRetBuilder, true); return transaction; } public Transaction triggerConstantContract(TriggerSmartContract triggerSmartContract, TransactionCapsule trxCap, Builder builder, Return.Builder retBuilder) throws ContractValidateException, ContractExeException, HeaderNotFound, VMIllegalException { + return triggerConstantContract(triggerSmartContract, trxCap, builder, retBuilder, false); + } + + public Transaction triggerConstantContract(TriggerSmartContract triggerSmartContract, + TransactionCapsule trxCap, Builder builder, Return.Builder retBuilder, boolean isEstimating) + throws ContractValidateException, ContractExeException, HeaderNotFound, VMIllegalException { if (triggerSmartContract.getContractAddress().isEmpty()) { // deploy contract CreateSmartContract.Builder deployBuilder = CreateSmartContract.newBuilder(); @@ -2991,11 +2997,11 @@ public Transaction triggerConstantContract(TriggerSmartContract triggerSmartCont throw new ContractValidateException("Smart contract is not exist."); } } - return callConstantContract(trxCap, builder, retBuilder); + return callConstantContract(trxCap, builder, retBuilder, isEstimating); } public Transaction callConstantContract(TransactionCapsule trxCap, - Builder builder, Return.Builder retBuilder) + Builder builder, Return.Builder retBuilder, boolean isEstimating) throws ContractValidateException, ContractExeException, HeaderNotFound, VMIllegalException { if (!Args.getInstance().isSupportConstant()) { @@ -3020,7 +3026,7 @@ public Transaction callConstantContract(TransactionCapsule trxCap, vmActuator.execute(context); ProgramResult result = context.getProgramResult(); - if (result.getException() != null) { + if (!isEstimating && result.getException() != null) { RuntimeException e = result.getException(); logger.warn("Constant call has an error {}", e.getMessage()); throw e; From ad30d13976c38bc58076cd98dcd32ec3db4942d9 Mon Sep 17 00:00:00 2001 From: Asuka Date: Sun, 2 Apr 2023 19:38:18 +0800 Subject: [PATCH 100/142] fix(interface): throw out of time exception in any case --- framework/src/main/java/org/tron/core/Wallet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 2d5503e9c39..c36437a806d 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3026,7 +3026,8 @@ public Transaction callConstantContract(TransactionCapsule trxCap, vmActuator.execute(context); ProgramResult result = context.getProgramResult(); - if (!isEstimating && result.getException() != null) { + if (!isEstimating && result.getException() != null + || result.getException() instanceof Program.OutOfTimeException) { RuntimeException e = result.getException(); logger.warn("Constant call has an error {}", e.getMessage()); throw e; From 6956e371bf884a7e630c4e13bbd38063ff7bf73c Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 3 Apr 2023 11:49:08 +0800 Subject: [PATCH 101/142] func(interface): do the same modification for estimate energy --- .../services/http/EstimateEnergyServlet.java | 31 ++++-------------- .../http/TriggerConstantContractServlet.java | 32 +++---------------- .../http/TriggerSmartContractServlet.java | 28 +++++++--------- .../org/tron/core/services/http/Util.java | 32 +++++++++++++++++++ 4 files changed, 54 insertions(+), 69 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/EstimateEnergyServlet.java b/framework/src/main/java/org/tron/core/services/http/EstimateEnergyServlet.java index 6b82199bd0e..d88f7dd1af1 100644 --- a/framework/src/main/java/org/tron/core/services/http/EstimateEnergyServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/EstimateEnergyServlet.java @@ -4,7 +4,6 @@ import com.google.protobuf.ByteString; import io.netty.util.internal.StringUtil; import java.io.IOException; -import java.security.InvalidParameterException; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -25,26 +24,12 @@ @Slf4j(topic = "API") public class EstimateEnergyServlet extends RateLimiterServlet { - private final String functionSelector = "function_selector"; - @Autowired private Wallet wallet; protected void doGet(HttpServletRequest request, HttpServletResponse response) { } - protected void validateParameter(String contract) { - JSONObject jsonObject = JSONObject.parseObject(contract); - if (!jsonObject.containsKey("owner_address") - || StringUtil.isNullOrEmpty(jsonObject.getString("owner_address"))) { - throw new InvalidParameterException("owner_address isn't set."); - } - if (!jsonObject.containsKey("contract_address") - || StringUtil.isNullOrEmpty(jsonObject.getString("contract_address"))) { - throw new InvalidParameterException("contract_address isn't set."); - } - } - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { TriggerSmartContract.Builder build = TriggerSmartContract.newBuilder(); @@ -57,21 +42,19 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) .collect(Collectors.joining(System.lineSeparator())); Util.checkBodySize(contract); visible = Util.getVisiblePost(contract); - validateParameter(contract); + Util.validateParameter(contract); JsonFormat.merge(contract, build, visible); JSONObject jsonObject = JSONObject.parseObject(contract); - boolean isFunctionSelectorSet = jsonObject.containsKey(functionSelector) - && !StringUtil.isNullOrEmpty(jsonObject.getString(functionSelector)); - String data; + boolean isFunctionSelectorSet = + !StringUtil.isNullOrEmpty(jsonObject.getString(Util.FUNCTION_SELECTOR)); if (isFunctionSelectorSet) { - String selector = jsonObject.getString(functionSelector); - String parameter = jsonObject.getString("parameter"); - data = Util.parseMethod(selector, parameter); + String selector = jsonObject.getString(Util.FUNCTION_SELECTOR); + String parameter = jsonObject.getString(Util.FUNCTION_PARAMETER); + String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); - } else { - build.setData(ByteString.copyFrom(new byte[0])); } + TransactionCapsule trxCap = wallet.createTransactionCapsule(build.build(), Protocol.Transaction.Contract.ContractType.TriggerSmartContract); diff --git a/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java b/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java index fa3336df5eb..8a46ee1ed74 100644 --- a/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/TriggerConstantContractServlet.java @@ -4,7 +4,6 @@ import com.google.protobuf.ByteString; import io.netty.util.internal.StringUtil; import java.io.IOException; -import java.security.InvalidParameterException; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -27,35 +26,12 @@ @Slf4j(topic = "API") public class TriggerConstantContractServlet extends RateLimiterServlet { - private final String OWNER_ADDRESS = "owner_address"; - private final String CONTRACT_ADDRESS = "contract_address"; - private final String FUNCTION_SELECTOR = "function_selector"; - private final String FUNCTION_PARAMETER = "parameter"; - private final String CALL_DATA = "data"; - @Autowired private Wallet wallet; protected void doGet(HttpServletRequest request, HttpServletResponse response) { } - protected void validateParameter(String contract) { - JSONObject jsonObject = JSONObject.parseObject(contract); - if (StringUtil.isNullOrEmpty(jsonObject.getString(OWNER_ADDRESS))) { - throw new InvalidParameterException(OWNER_ADDRESS + " isn't set."); - } - if (StringUtil.isNullOrEmpty(jsonObject.getString(CONTRACT_ADDRESS)) - && StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { - throw new InvalidParameterException("At least one of " - + CONTRACT_ADDRESS + " and " + CALL_DATA + " must be set."); - } - if (!StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)) - ^ StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { - throw new InvalidParameterException("Only one of " - + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); - } - } - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { TriggerSmartContract.Builder build = TriggerSmartContract.newBuilder(); @@ -67,15 +43,15 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) .collect(Collectors.joining(System.lineSeparator())); Util.checkBodySize(contract); visible = Util.getVisiblePost(contract); - validateParameter(contract); + Util.validateParameter(contract); JsonFormat.merge(contract, build, visible); JSONObject jsonObject = JSONObject.parseObject(contract); boolean isFunctionSelectorSet = - !StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)); + !StringUtil.isNullOrEmpty(jsonObject.getString(Util.FUNCTION_SELECTOR)); if (isFunctionSelectorSet) { - String selector = jsonObject.getString(FUNCTION_SELECTOR); - String parameter = jsonObject.getString(FUNCTION_PARAMETER); + String selector = jsonObject.getString(Util.FUNCTION_SELECTOR); + String parameter = jsonObject.getString(Util.FUNCTION_PARAMETER); String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); } diff --git a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java index 5ce27e7cd0b..d8f142edb46 100644 --- a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java @@ -27,30 +27,24 @@ @Slf4j(topic = "API") public class TriggerSmartContractServlet extends RateLimiterServlet { - private final String OWNER_ADDRESS = "owner_address"; - private final String CONTRACT_ADDRESS = "contract_address"; - private final String FUNCTION_SELECTOR = "function_selector"; - private final String FUNCTION_PARAMETER = "parameter"; - private final String CALL_DATA = "data"; - @Autowired private Wallet wallet; protected void doGet(HttpServletRequest request, HttpServletResponse response) { } - protected void validateParameter(String contract) { + private void validateParameter(String contract) { JSONObject jsonObject = JSONObject.parseObject(contract); - if (StringUtil.isNullOrEmpty(jsonObject.getString(OWNER_ADDRESS))) { - throw new InvalidParameterException("owner_address isn't set."); + if (StringUtil.isNullOrEmpty(jsonObject.getString(Util.OWNER_ADDRESS))) { + throw new InvalidParameterException(Util.OWNER_ADDRESS + " isn't set."); } - if (StringUtil.isNullOrEmpty(jsonObject.getString(CONTRACT_ADDRESS))) { - throw new InvalidParameterException("contract_address isn't set."); + if (StringUtil.isNullOrEmpty(jsonObject.getString(Util.CONTRACT_ADDRESS))) { + throw new InvalidParameterException(Util.CONTRACT_ADDRESS + " isn't set."); } - if (!StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)) - ^ StringUtil.isNullOrEmpty(jsonObject.getString(CALL_DATA))) { + if (!StringUtil.isNullOrEmpty(jsonObject.getString(Util.FUNCTION_SELECTOR)) + ^ StringUtil.isNullOrEmpty(jsonObject.getString(Util.CALL_DATA))) { throw new InvalidParameterException("Only one of " - + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); + + Util.FUNCTION_SELECTOR + " and " + Util.CALL_DATA + " can be set."); } } @@ -70,10 +64,10 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) JSONObject jsonObject = JSONObject.parseObject(contract); boolean isFunctionSelectorSet = - !StringUtil.isNullOrEmpty(jsonObject.getString(FUNCTION_SELECTOR)); + !StringUtil.isNullOrEmpty(jsonObject.getString(Util.FUNCTION_SELECTOR)); if (isFunctionSelectorSet) { - String selector = jsonObject.getString(FUNCTION_SELECTOR); - String parameter = jsonObject.getString(FUNCTION_PARAMETER); + String selector = jsonObject.getString(Util.FUNCTION_SELECTOR); + String parameter = jsonObject.getString(Util.FUNCTION_PARAMETER); String data = Util.parseMethod(selector, parameter); build.setData(ByteString.copyFrom(ByteArray.fromHexString(data))); } diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 6c8ce0b832c..2e91a5693fc 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -65,6 +65,13 @@ public class Util { public static final String EXTRA_DATA = "extra_data"; public static final String PARAMETER = "parameter"; + // Used for TVM http interfaces + public static final String OWNER_ADDRESS = "owner_address"; + public static final String CONTRACT_ADDRESS = "contract_address"; + public static final String FUNCTION_SELECTOR = "function_selector"; + public static final String FUNCTION_PARAMETER = "parameter"; + public static final String CALL_DATA = "data"; + public static String printTransactionFee(String transactionFee) { JSONObject jsonObject = new JSONObject(); JSONObject receipt = JSONObject.parseObject(transactionFee); @@ -543,4 +550,29 @@ public static List convertLogAddressToTronAddress(TransactionInfo transacti return newLogList; } + /** + * Validate parameters for trigger constant and estimate energy + * - Rule-1: owner address must be set + * - Rule-2: either contract address is set or call data is set + * - Rule-3: only one of function selector and call data can be set + * @param contract parameters in json format + * @throws InvalidParameterException if validation is not passed, this kind of exception is thrown + */ + public static void validateParameter(String contract) throws InvalidParameterException { + JSONObject jsonObject = JSONObject.parseObject(contract); + if (StringUtils.isEmpty(jsonObject.getString(OWNER_ADDRESS))) { + throw new InvalidParameterException(OWNER_ADDRESS + " isn't set."); + } + if (StringUtils.isEmpty(jsonObject.getString(CONTRACT_ADDRESS)) + && StringUtils.isEmpty(jsonObject.getString(CALL_DATA))) { + throw new InvalidParameterException("At least one of " + + CONTRACT_ADDRESS + " and " + CALL_DATA + " must be set."); + } + if (!StringUtils.isEmpty(jsonObject.getString(FUNCTION_SELECTOR)) + ^ StringUtils.isEmpty(jsonObject.getString(CALL_DATA))) { + throw new InvalidParameterException("Only one of " + + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); + } + } + } From 708271491cad976c7caf60f7fc246781db93bec0 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Mon, 3 Apr 2023 13:56:59 +0800 Subject: [PATCH 102/142] fix(net):fix the issue of block synchronization --- .../main/java/org/tron/core/net/service/sync/SyncService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 68f113afd9f..79cc4830e60 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -292,7 +292,7 @@ private void processSyncBlock(BlockCapsule block) { if (peer.getSyncBlockInProcess().remove(blockId)) { if (flag) { peer.setBlockBothHave(blockId); - if (peer.getSyncBlockToFetch().isEmpty() && !peer.isFetchAble()) { + if (peer.getSyncBlockToFetch().isEmpty() && peer.isFetchAble()) { syncNext(peer); } } else { From 5643063f8e5632b4bb521eddd95e84144a7a5b59 Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 3 Apr 2023 14:11:30 +0800 Subject: [PATCH 103/142] style(http,util): fix sonar check problem --- framework/src/main/java/org/tron/core/services/http/Util.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 2e91a5693fc..15c5bc97009 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -227,7 +227,7 @@ public static JSONObject printTransactionToJSON(Transaction transaction, boolean .parseObject(JsonFormat.printToString(deployContract, selfType)); byte[] ownerAddress = deployContract.getOwnerAddress().toByteArray(); byte[] contractAddress = generateContractAddress(transaction, ownerAddress); - jsonTransaction.put("contract_address", ByteArray.toHexString(contractAddress)); + jsonTransaction.put(CONTRACT_ADDRESS, ByteArray.toHexString(contractAddress)); break; default: Class clazz = TransactionFactory.getContract(contract.getType()); From a3afa12bb5e9c422c60c1c6809a01a7ab4db8958 Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Mon, 3 Apr 2023 16:16:54 +0800 Subject: [PATCH 104/142] feat(net):add unit test for block synchronization --- .../core/net/services/SyncServiceTest.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java diff --git a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java new file mode 100644 index 00000000000..dd8707d3dc6 --- /dev/null +++ b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java @@ -0,0 +1,74 @@ +package org.tron.core.net.services; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.FileUtil; +import org.tron.common.utils.ReflectUtils; +import org.tron.core.Constant; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.net.P2pEventHandlerImpl; +import org.tron.core.net.peer.PeerConnection; +import org.tron.core.net.peer.TronState; +import org.tron.core.net.service.sync.SyncService; +import org.tron.p2p.connection.Channel; + +import java.io.File; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; + +public class SyncServiceTest { + protected TronApplicationContext context; + private SyncService service; + private PeerConnection peer; + private P2pEventHandlerImpl p2pEventHandler; + private String dbPath = "output-sync-service-test"; + + /** + * init context. + */ + @Before + public void init() { + Args.setParam(new String[]{"--output-directory", dbPath, "--debug"}, + Constant.TEST_CONF); + context = new TronApplicationContext(DefaultConfig.class); + service = context.getBean(SyncService.class); + } + + /** + * destroy. + */ + @After + public void destroy() { + Args.clearParam(); + FileUtil.deleteDir(new File(dbPath)); + } + + @Test + public void test() { + try { + ReflectUtils.setFieldValue(service, "fetchFlag", true); + ReflectUtils.setFieldValue(service, "handleFlag", true); + service.init(); + Assert.assertTrue((boolean) ReflectUtils.getFieldObject(service, "fetchFlag")); + Assert.assertTrue((boolean) ReflectUtils.getFieldObject(service, "handleFlag")); + peer = context.getBean(PeerConnection.class); + Assert.assertNull(peer.getSyncChainRequested()); + Channel c1 = new Channel(); + InetSocketAddress a1 =new InetSocketAddress("127.0.0.1", 10001); + Field field = c1.getClass().getDeclaredField("inetSocketAddress"); + field.setAccessible(true); + field.set(c1, a1.getAddress()); + peer.setChannel(c1); + service.startSync(peer); + ReflectUtils.setFieldValue(peer, "tronState", TronState.SYNCING); + service.startSync(peer); + } catch (Exception e) { + // no need to deal with + } + service.close(); + } +} From 7c1bd7d8e78dd8019a817872344fd4594df4e86b Mon Sep 17 00:00:00 2001 From: chengtx01 Date: Mon, 3 Apr 2023 16:49:03 +0800 Subject: [PATCH 105/142] fix(net):fix checkstyle issues --- .../java/org/tron/core/net/services/SyncServiceTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java index dd8707d3dc6..8493b1785be 100644 --- a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java @@ -1,5 +1,8 @@ package org.tron.core.net.services; +import java.io.File; +import java.lang.reflect.Field; +import java.net.InetSocketAddress; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -16,9 +19,6 @@ import org.tron.core.net.service.sync.SyncService; import org.tron.p2p.connection.Channel; -import java.io.File; -import java.lang.reflect.Field; -import java.net.InetSocketAddress; public class SyncServiceTest { protected TronApplicationContext context; @@ -58,7 +58,7 @@ public void test() { peer = context.getBean(PeerConnection.class); Assert.assertNull(peer.getSyncChainRequested()); Channel c1 = new Channel(); - InetSocketAddress a1 =new InetSocketAddress("127.0.0.1", 10001); + InetSocketAddress a1 = new InetSocketAddress("127.0.0.1", 10001); Field field = c1.getClass().getDeclaredField("inetSocketAddress"); field.setAccessible(true); field.set(c1, a1.getAddress()); From 7af64889e3d0f9d1ed09de47466def4dafe415b6 Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 3 Apr 2023 17:17:29 +0800 Subject: [PATCH 106/142] func(http,util): remove rule-3 validation --- framework/src/main/java/org/tron/core/Wallet.java | 1 - .../src/main/java/org/tron/core/services/http/Util.java | 6 ------ 2 files changed, 7 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index c36437a806d..98b9c992f0d 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3035,7 +3035,6 @@ public Transaction callConstantContract(TransactionCapsule trxCap, TransactionResultCapsule ret = new TransactionResultCapsule(); builder.setEnergyUsed(result.getEnergyUsed()); - builder.setEnergyPenalty(result.getEnergyPenaltyTotal()); builder.setBlockNumber(headBlockCapsule.getNum()); builder.setBlockHash(ByteString.copyFrom(headBlockCapsule.getBlockId().getBytes())); builder.setEnergyPenalty(result.getEnergyPenaltyTotal()); diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 15c5bc97009..5d97e944709 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -554,7 +554,6 @@ public static List convertLogAddressToTronAddress(TransactionInfo transacti * Validate parameters for trigger constant and estimate energy * - Rule-1: owner address must be set * - Rule-2: either contract address is set or call data is set - * - Rule-3: only one of function selector and call data can be set * @param contract parameters in json format * @throws InvalidParameterException if validation is not passed, this kind of exception is thrown */ @@ -568,11 +567,6 @@ public static void validateParameter(String contract) throws InvalidParameterExc throw new InvalidParameterException("At least one of " + CONTRACT_ADDRESS + " and " + CALL_DATA + " must be set."); } - if (!StringUtils.isEmpty(jsonObject.getString(FUNCTION_SELECTOR)) - ^ StringUtils.isEmpty(jsonObject.getString(CALL_DATA))) { - throw new InvalidParameterException("Only one of " - + FUNCTION_SELECTOR + " and " + CALL_DATA + " can be set."); - } } } From 131161e9504fa6aa9b7ead0c42fd39b6f05aba7e Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 3 Apr 2023 17:37:08 +0800 Subject: [PATCH 107/142] func(http,util): add new rule-3 validation --- .../src/main/java/org/tron/core/services/http/Util.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 5d97e944709..4bd1be3fb6f 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -554,6 +554,7 @@ public static List convertLogAddressToTronAddress(TransactionInfo transacti * Validate parameters for trigger constant and estimate energy * - Rule-1: owner address must be set * - Rule-2: either contract address is set or call data is set + * - Rule-3: if try to deploy, function selector and call data can not be both set * @param contract parameters in json format * @throws InvalidParameterException if validation is not passed, this kind of exception is thrown */ @@ -567,6 +568,12 @@ public static void validateParameter(String contract) throws InvalidParameterExc throw new InvalidParameterException("At least one of " + CONTRACT_ADDRESS + " and " + CALL_DATA + " must be set."); } + if (StringUtils.isEmpty(jsonObject.getString(CONTRACT_ADDRESS)) + && !StringUtils.isEmpty(jsonObject.getString(FUNCTION_SELECTOR)) + && !StringUtils.isEmpty(jsonObject.getString(CALL_DATA))) { + throw new InvalidParameterException("While trying to deploy, " + + FUNCTION_SELECTOR + " and " + CALL_DATA + " can not be both set."); + } } } From 495f7ac69bc32252c57da8610c09ccab4ecd42dc Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 3 Apr 2023 18:54:58 +0800 Subject: [PATCH 108/142] func(interface): drop rule-3 for trigger contract --- .../tron/core/services/http/TriggerSmartContractServlet.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java index d8f142edb46..6577a9e5f24 100644 --- a/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java +++ b/framework/src/main/java/org/tron/core/services/http/TriggerSmartContractServlet.java @@ -41,11 +41,6 @@ private void validateParameter(String contract) { if (StringUtil.isNullOrEmpty(jsonObject.getString(Util.CONTRACT_ADDRESS))) { throw new InvalidParameterException(Util.CONTRACT_ADDRESS + " isn't set."); } - if (!StringUtil.isNullOrEmpty(jsonObject.getString(Util.FUNCTION_SELECTOR)) - ^ StringUtil.isNullOrEmpty(jsonObject.getString(Util.CALL_DATA))) { - throw new InvalidParameterException("Only one of " - + Util.FUNCTION_SELECTOR + " and " + Util.CALL_DATA + " can be set."); - } } protected void doPost(HttpServletRequest request, HttpServletResponse response) From 78b46c3ed411764f7f103ddb8d0e695ad360b38f Mon Sep 17 00:00:00 2001 From: Asuka Date: Mon, 3 Apr 2023 19:29:25 +0800 Subject: [PATCH 109/142] log(vm): reduce exception log level of featured instructions from error to warn --- .../org/tron/core/vm/program/Program.java | 43 +++++++++---------- .../src/main/java/org/tron/core/Wallet.java | 6 +-- .../org/tron/core/services/RpcApiService.java | 4 +- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/program/Program.java b/actuator/src/main/java/org/tron/core/vm/program/Program.java index 3a0aaf21f70..90a59f53a36 100644 --- a/actuator/src/main/java/org/tron/core/vm/program/Program.java +++ b/actuator/src/main/java/org/tron/core/vm/program/Program.java @@ -17,7 +17,6 @@ import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; - import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -1815,9 +1814,9 @@ public boolean freeze(DataWord receiverAddress, DataWord frozenBalance, DataWord repository.commit(); return true; } catch (ContractValidateException e) { - logger.error("TVM Freeze: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM Freeze: validate failure. Reason: {}", e.getMessage()); } catch (ArithmeticException e) { - logger.error("TVM Freeze: frozenBalance out of long range."); + logger.warn("TVM Freeze: frozenBalance out of long range."); } if (internalTx != null) { internalTx.reject(); @@ -1848,7 +1847,7 @@ public boolean unfreeze(DataWord receiverAddress, DataWord resourceType) { } return true; } catch (ContractValidateException e) { - logger.error("TVM Unfreeze: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM Unfreeze: validate failure. Reason: {}", e.getMessage()); } if (internalTx != null) { internalTx.reject(); @@ -1911,9 +1910,9 @@ public boolean freezeBalanceV2(DataWord frozenBalance, DataWord resourceType) { repository.commit(); return true; } catch (ContractValidateException e) { - logger.error("TVM FreezeBalanceV2: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM FreezeBalanceV2: validate failure. Reason: {}", e.getMessage()); } catch (ArithmeticException e) { - logger.error("TVM FreezeBalanceV2: frozenBalance out of long range."); + logger.warn("TVM FreezeBalanceV2: frozenBalance out of long range."); } if (internalTx != null) { internalTx.reject(); @@ -1947,9 +1946,9 @@ public boolean unfreezeBalanceV2(DataWord unfreezeBalance, DataWord resourceType } return true; } catch (ContractValidateException e) { - logger.error("TVM UnfreezeBalanceV2: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM UnfreezeBalanceV2: validate failure. Reason: {}", e.getMessage()); } catch (ArithmeticException e) { - logger.error("TVM UnfreezeBalanceV2: balance out of long range."); + logger.warn("TVM UnfreezeBalanceV2: balance out of long range."); } if (internalTx != null) { internalTx.reject(); @@ -1978,9 +1977,9 @@ public long withdrawExpireUnfreeze() { } return expireUnfreezeBalance; } catch (ContractValidateException e) { - logger.error("TVM WithdrawExpireUnfreeze: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM WithdrawExpireUnfreeze: validate failure. Reason: {}", e.getMessage()); } catch (ContractExeException e) { - logger.error("TVM WithdrawExpireUnfreeze: execute failure. Reason: {}", e.getMessage()); + logger.warn("TVM WithdrawExpireUnfreeze: execute failure. Reason: {}", e.getMessage()); } if (internalTx != null) { internalTx.reject(); @@ -2011,9 +2010,9 @@ public boolean cancelAllUnfreezeV2Action() { } return true; } catch (ContractValidateException e) { - logger.error("TVM CancelAllUnfreezeV2: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM CancelAllUnfreezeV2: validate failure. Reason: {}", e.getMessage()); } catch (ContractExeException e) { - logger.error("TVM CancelAllUnfreezeV2: execute failure. Reason: {}", e.getMessage()); + logger.warn("TVM CancelAllUnfreezeV2: execute failure. Reason: {}", e.getMessage()); } if (internalTx != null) { internalTx.reject(); @@ -2045,9 +2044,9 @@ public boolean delegateResource( repository.commit(); return true; } catch (ContractValidateException e) { - logger.error("TVM DelegateResource: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM DelegateResource: validate failure. Reason: {}", e.getMessage()); } catch (ArithmeticException e) { - logger.error("TVM DelegateResource: balance out of long range."); + logger.warn("TVM DelegateResource: balance out of long range."); } if (internalTx != null) { internalTx.reject(); @@ -2079,9 +2078,9 @@ public boolean unDelegateResource( repository.commit(); return true; } catch (ContractValidateException e) { - logger.error("TVM UnDelegateResource: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM UnDelegateResource: validate failure. Reason: {}", e.getMessage()); } catch (ArithmeticException e) { - logger.error("TVM UnDelegateResource: balance out of long range."); + logger.warn("TVM UnDelegateResource: balance out of long range."); } if (internalTx != null) { internalTx.reject(); @@ -2114,7 +2113,7 @@ private Common.ResourceCode parseResourceCodeV2(DataWord resourceType) { return Common.ResourceCode.UNRECOGNIZED; } } catch (ArithmeticException e) { - logger.error("TVM ParseResourceCodeV2: invalid resource code: {}", resourceType.sValue()); + logger.warn("TVM ParseResourceCodeV2: invalid resource code: {}", resourceType.sValue()); return Common.ResourceCode.UNRECOGNIZED; } } @@ -2180,11 +2179,11 @@ public boolean voteWitness(int witnessArrayOffset, int witnessArrayLength, repository.commit(); return true; } catch (ContractValidateException e) { - logger.error("TVM VoteWitness: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM VoteWitness: validate failure. Reason: {}", e.getMessage()); } catch (ContractExeException e) { - logger.error("TVM VoteWitness: execute failure. Reason: {}", e.getMessage()); + logger.warn("TVM VoteWitness: execute failure. Reason: {}", e.getMessage()); } catch (ArithmeticException e) { - logger.error("TVM VoteWitness: int or long out of range. caused by: {}", e.getMessage()); + logger.warn("TVM VoteWitness: int or long out of range. caused by: {}", e.getMessage()); } if (internalTx != null) { internalTx.reject(); @@ -2213,9 +2212,9 @@ public long withdrawReward() { } return allowance; } catch (ContractValidateException e) { - logger.error("TVM WithdrawReward: validate failure. Reason: {}", e.getMessage()); + logger.warn("TVM WithdrawReward: validate failure. Reason: {}", e.getMessage()); } catch (ContractExeException e) { - logger.error("TVM WithdrawReward: execute failure. Reason: {}", e.getMessage()); + logger.warn("TVM WithdrawReward: execute failure. Reason: {}", e.getMessage()); } if (internalTx != null) { internalTx.reject(); diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 98b9c992f0d..adb6c26db5a 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3029,7 +3029,7 @@ public Transaction callConstantContract(TransactionCapsule trxCap, if (!isEstimating && result.getException() != null || result.getException() instanceof Program.OutOfTimeException) { RuntimeException e = result.getException(); - logger.warn("Constant call has an error {}", e.getMessage()); + logger.warn("Constant call failed for reason: {}", e.getMessage()); throw e; } @@ -3866,7 +3866,7 @@ private boolean isShieldedTRC20NoteSpent(GrpcAPI.Note note, long pos, byte[] ak, retBuilder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); trxExtBuilder.setResult(retBuilder); - logger.warn("When run constant call in VM, have RuntimeException: " + e.getMessage()); + logger.warn("When run constant call in VM, failed for reason: " + e.getMessage()); } catch (Exception e) { retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); @@ -4130,7 +4130,7 @@ private byte[] getShieldedContractScalingFactor(byte[] contractAddress) retBuilder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); trxExtBuilder.setResult(retBuilder); - logger.warn("When run constant call in VM, have RuntimeException: " + e.getMessage()); + logger.warn("When run constant call in VM, failed for reason: " + e.getMessage()); } catch (Exception e) { retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); diff --git a/framework/src/main/java/org/tron/core/services/RpcApiService.java b/framework/src/main/java/org/tron/core/services/RpcApiService.java index a6e1c5181ad..991124cc2ba 100755 --- a/framework/src/main/java/org/tron/core/services/RpcApiService.java +++ b/framework/src/main/java/org/tron/core/services/RpcApiService.java @@ -312,7 +312,7 @@ private void callContract(TriggerSmartContract request, retBuilder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); trxExtBuilder.setResult(retBuilder); - logger.warn("When run constant call in VM, have RuntimeException: " + e.getMessage()); + logger.warn("When run constant call in VM, failed for reason: " + e.getMessage()); } catch (Exception e) { retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); @@ -2077,7 +2077,7 @@ private void callContract(TriggerSmartContract request, retBuilder.setResult(false).setCode(response_code.CONTRACT_EXE_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); trxExtBuilder.setResult(retBuilder); - logger.warn("When run constant call in VM, have Runtime Exception: " + e.getMessage()); + logger.warn("When run constant call in VM, failed for reason: " + e.getMessage()); } catch (Exception e) { retBuilder.setResult(false).setCode(response_code.OTHER_ERROR) .setMessage(ByteString.copyFromUtf8(e.getClass() + " : " + e.getMessage())); From 77700b952c692a8ec944d23e9e51819de059651d Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 4 Apr 2023 14:48:31 +0800 Subject: [PATCH 110/142] chore(vm): replace `ResourceCode error` with `Unknown ResourceCode` --- .../DelegateResourceProcessor.java | 2 +- .../FreezeBalanceProcessor.java | 2 +- .../FreezeBalanceV2Processor.java | 18 +++++++++--------- .../UnDelegateResourceProcessor.java | 19 +++++++++---------- .../UnfreezeBalanceProcessor.java | 8 ++++---- .../UnfreezeBalanceV2Processor.java | 6 +++--- 6 files changed, 27 insertions(+), 28 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java index 66ea919d713..18eb543097b 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java @@ -96,7 +96,7 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra break; default: throw new ContractValidateException( - "ResourceCode error, valid ResourceCode[BANDWIDTH、ENERGY]"); + "Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY]"); } byte[] receiverAddress = param.getReceiverAddress(); diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java index 9a1af3c9cec..c5c8fa91344 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java @@ -48,7 +48,7 @@ public void validate(FreezeBalanceParam param, Repository repo) throws ContractV break; default: throw new ContractValidateException( - "ResourceCode error,valid ResourceCode[BANDWIDTH、ENERGY]"); + "Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY]"); } // validate for delegating resource diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java index 2ab9fc451c2..b3dd258ae59 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java @@ -1,5 +1,11 @@ package org.tron.core.vm.nativecontract; +import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; +import static org.tron.core.actuator.ActuatorConstant.STORE_NOT_EXIST; +import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; +import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; +import static org.tron.protos.contract.Common.ResourceCode.ENERGY; + import lombok.extern.slf4j.Slf4j; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; @@ -9,12 +15,6 @@ import org.tron.core.vm.nativecontract.param.FreezeBalanceV2Param; import org.tron.core.vm.repository.Repository; -import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; -import static org.tron.core.actuator.ActuatorConstant.STORE_NOT_EXIST; -import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; -import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; -import static org.tron.protos.contract.Common.ResourceCode.ENERGY; - @Slf4j(topic = "VMProcessor") public class FreezeBalanceV2Processor { @@ -50,16 +50,16 @@ public void validate(FreezeBalanceV2Param param, Repository repo) throws Contrac case TRON_POWER: if (!repo.getDynamicPropertiesStore().supportAllowNewResourceModel()) { throw new ContractValidateException( - "ResourceCode error, valid ResourceCode[BANDWIDTH、ENERGY]"); + "Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY]"); } break; default: if (repo.getDynamicPropertiesStore().supportAllowNewResourceModel()) { throw new ContractValidateException( - "ResourceCode error, valid ResourceCode[BANDWIDTH、ENERGY、TRON_POWER]"); + "Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY、TRON_POWER]"); } else { throw new ContractValidateException( - "ResourceCode error, valid ResourceCode[BANDWIDTH、ENERGY]"); + "Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY]"); } } } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java index f4c18af85e5..d4cc2fcb8ce 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java @@ -1,6 +1,14 @@ package org.tron.core.vm.nativecontract; +import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; +import static org.tron.core.actuator.ActuatorConstant.STORE_NOT_EXIST; +import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; +import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; +import static org.tron.protos.contract.Common.ResourceCode.ENERGY; + import com.google.common.primitives.Bytes; +import java.util.Arrays; +import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.tron.common.utils.DecodeUtil; @@ -17,15 +25,6 @@ import org.tron.core.vm.nativecontract.param.UnDelegateResourceParam; import org.tron.core.vm.repository.Repository; -import java.util.Arrays; -import java.util.Objects; - -import static org.tron.core.actuator.ActuatorConstant.ACCOUNT_EXCEPTION_STR; -import static org.tron.core.actuator.ActuatorConstant.STORE_NOT_EXIST; -import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; -import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; -import static org.tron.protos.contract.Common.ResourceCode.ENERGY; - @Slf4j(topic = "VMProcessor") public class UnDelegateResourceProcessor { @@ -84,7 +83,7 @@ public void validate(UnDelegateResourceParam param, Repository repo) throws Cont break; default: throw new ContractValidateException( - "ResourceCode error.valid ResourceCode[BANDWIDTH、ENERGY]"); + "Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY]"); } } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java index 0eda888d3ca..211784d279b 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceProcessor.java @@ -65,8 +65,8 @@ public void validate(UnfreezeBalanceParam param, Repository repo) } break; default: - throw new ContractValidateException("ResourceCode error." - + "valid ResourceCode[BANDWIDTH、Energy]"); + throw new ContractValidateException("Unknown ResourceCode, " + + "valid ResourceCode[BANDWIDTH、ENERGY]"); } } else { switch (param.getResourceType()) { @@ -95,8 +95,8 @@ public void validate(UnfreezeBalanceParam param, Repository repo) } break; default: - throw new ContractValidateException("ResourceCode error." - + "valid ResourceCode[BANDWIDTH、Energy]"); + throw new ContractValidateException("Unknown ResourceCode, " + + "valid ResourceCode[BANDWIDTH、ENERGY]"); } } } diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java index f4d5c407373..56366bbdb0c 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnfreezeBalanceV2Processor.java @@ -71,14 +71,14 @@ public void validate(UnfreezeBalanceV2Param param, Repository repo) throw new ContractValidateException("no frozenBalance(TRON_POWER)"); } } else { - throw new ContractValidateException("ResourceCode error.valid ResourceCode[BANDWIDTH、ENERGY]"); + throw new ContractValidateException("Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY]"); } break; default: if (dynamicStore.supportAllowNewResourceModel()) { - throw new ContractValidateException("ResourceCode error.valid ResourceCode[BANDWIDTH、ENERGY、TRON_POWER]"); + throw new ContractValidateException("Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY、TRON_POWER]"); } else { - throw new ContractValidateException("ResourceCode error.valid ResourceCode[BANDWIDTH、ENERGY]"); + throw new ContractValidateException("Unknown ResourceCode, valid ResourceCode[BANDWIDTH、ENERGY]"); } } From 26360b987c01f890bf532c56c45402afb0d1181c Mon Sep 17 00:00:00 2001 From: Asuka Date: Tue, 4 Apr 2023 19:00:23 +0800 Subject: [PATCH 111/142] test(interface): add http unit tests --- .../http/TriggerSmartContractServletTest.java | 105 ++++++++++++++++++ .../common/client/utils/HttpMethed.java | 11 +- 2 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java new file mode 100644 index 00000000000..8e9b79dbb53 --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java @@ -0,0 +1,105 @@ +package org.tron.core.services.http; + +import com.google.gson.JsonObject; +import java.io.File; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.bouncycastle.util.encoders.Hex; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.tron.common.application.Application; +import org.tron.common.application.ApplicationFactory; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.core.Constant; +import org.tron.core.capsule.ContractCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.store.StoreFactory; +import org.tron.core.vm.repository.Repository; +import org.tron.core.vm.repository.RepositoryImpl; +import org.tron.protos.Protocol; +import org.tron.protos.contract.SmartContractOuterClass; +import stest.tron.wallet.common.client.utils.HttpMethed; + +@Slf4j +public class TriggerSmartContractServletTest { + + private static String dbPath; + private static byte[] ownerAddr = Hex.decode("410000000000000000000000000000000000000000"); + private static byte[] contractAddr = Hex.decode("41000000000000000000000000000000000000dEaD"); + private static TronApplicationContext context; + + @BeforeClass + public static void init() throws Exception { + dbPath = "output_" + TriggerSmartContractServletTest.class.getName(); + Args.setParam( + new String[]{"--output-directory", dbPath, "--debug", "--witness"}, Constant.TEST_CONF); + Args.getInstance().needSyncCheck = false; + + // build app context + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + beanFactory.setAllowCircularReferences(false); + context = new TronApplicationContext(beanFactory); + context.register(DefaultConfig.class); + context.refresh(); + Application appT = ApplicationFactory.create(context); + + // register http service + FullNodeHttpApiService httpApiService = context.getBean(FullNodeHttpApiService.class); + appT.addService(httpApiService); + + // start services + appT.initServices(Args.getInstance()); + appT.startServices(); + appT.startup(); + + // create contract for testing + Repository rootRepository = RepositoryImpl.createRoot(StoreFactory.getInstance()); + rootRepository.createAccount(contractAddr, Protocol.AccountType.Contract); + rootRepository.createContract(contractAddr, new ContractCapsule( + SmartContractOuterClass.SmartContract.newBuilder().build())); + rootRepository.saveCode(contractAddr, Hex.decode( + "608060405260043610601c5760003560e01c8063f8a8fd6d146021575b600080fd5b60276029565b00" + + "5b3373ffffffffffffffffffffffffffffffffffffffff166108fc34908115029060405160006040518" + + "0830381858888f19350505050158015606e573d6000803e3d6000fd5b5056fea2646970667358221220" + + "45fe2c565cf16b27bb8cbafbe251a850a0bb5cd8806a186dbda12d57685ced6f64736f6c63430008120" + + "033")); + rootRepository.commit(); + } + + @AfterClass + public static void destroy() { + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.error("Release resources failure."); + } + } + + @Test + public void testNormalCall() throws Exception { + HttpMethed.waitToProduceOneBlock("127.0.0.1:8090"); + JsonObject parameter = new JsonObject(); + parameter.addProperty("owner_address", ByteArray.toHexString(ownerAddr)); + parameter.addProperty("contract_address", ByteArray.toHexString(contractAddr)); + parameter.addProperty("function_selector", "test()"); + invokeToLocal("triggersmartcontract", parameter); + invokeToLocal("triggerconstantcontract", parameter); + invokeToLocal("estimateenergy", parameter); + } + + public static HttpResponse invokeToLocal( + String method, JsonObject parameter) { + try { + final String requestUrl = "http://127.0.0.1:8090/wallet/" + method; + return HttpMethed.createConnect(requestUrl, parameter); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java index 8ef8fecbd8e..9aaa74938d8 100644 --- a/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java +++ b/framework/src/test/java/stest/tron/wallet/common/client/utils/HttpMethed.java @@ -8,14 +8,12 @@ import com.google.gson.JsonParser; import com.google.protobuf.ByteString; import io.netty.util.internal.StringUtil; - import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; - import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -2231,7 +2229,10 @@ public static void waitToProduceOneBlock(String httpNode) { responseContent = HttpMethed.parseResponseContent(response); responseContent = HttpMethed.parseStringContent(responseContent.get("block_header").toString()); responseContent = HttpMethed.parseStringContent(responseContent.get("raw_data").toString()); - Integer currentBlockNum = Integer.parseInt(responseContent.get("number").toString()); + Integer currentBlockNum = 0; + if (responseContent.containsKey("number")) { + currentBlockNum = Integer.parseInt(responseContent.get("number").toString()); + } Integer nextBlockNum = 0; Integer times = 0; while (nextBlockNum <= currentBlockNum + 1 && times++ <= 10) { @@ -2240,7 +2241,9 @@ public static void waitToProduceOneBlock(String httpNode) { responseContent = HttpMethed.parseStringContent(responseContent.get("block_header").toString()); responseContent = HttpMethed.parseStringContent(responseContent.get("raw_data").toString()); - nextBlockNum = Integer.parseInt(responseContent.get("number").toString()); + if (responseContent.containsKey("number")) { + nextBlockNum = Integer.parseInt(responseContent.get("number").toString()); + } try { Thread.sleep(1200); } catch (InterruptedException e) { From 4b12b178cef2188164257c0051d008e0a54f9796 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 6 Apr 2023 14:52:57 +0800 Subject: [PATCH 112/142] feat(net): update libp2p with latest grpc --- build.gradle | 12 +++++++++--- common/build.gradle | 6 +++++- .../org/tron/common/client/DatabaseGrpcClient.java | 4 ++-- .../org/tron/common/client/WalletGrpcClient.java | 4 ++-- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 427ea071d57..490348dd559 100644 --- a/build.gradle +++ b/build.gradle @@ -44,7 +44,7 @@ subprojects { annotationProcessor 'org.projectlombok:lombok:1.18.12' testCompileOnly 'org.projectlombok:lombok:1.18.12' testAnnotationProcessor 'org.projectlombok:lombok:1.18.12' - compile group: 'com.google.guava', name: 'guava', version: '24.1-jre' + compile group: 'com.google.guava', name: 'guava', version: '30.1-jre' compile "com.google.code.findbugs:jsr305:3.0.0" compile group: 'org.springframework', name: 'spring-context', version: '5.3.18' compile group: 'org.springframework', name: 'spring-tx', version: '5.3.18' @@ -67,8 +67,14 @@ subprojects { } configurations.all { - resolutionStrategy { - force group: 'com.google.guava', name: 'guava', version: '30.1-jre' + resolutionStrategy.eachDependency { details -> + if (details.requested.group == 'com.google.guava' && details.requested.name == 'guava') { + details.useVersion "30.1-jre" + } + // TODO if update grpc remove + if(details.requested.group == 'io.netty') { + details.useVersion "4.1.27.Final" + } } } } diff --git a/common/build.gradle b/common/build.gradle index 5c70edf0b65..e81a2ceae85 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,11 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.20' + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-grpc-v2-1',{ + exclude group: 'io.grpc', module: 'grpc-context' + exclude group: 'io.grpc', module: 'grpc-core' + exclude group: 'io.grpc', module: 'grpc-netty' + } compile project(":protocol") } diff --git a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java index b83c7235900..f3650bfd2be 100644 --- a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java +++ b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java @@ -15,14 +15,14 @@ public class DatabaseGrpcClient { public DatabaseGrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) - .usePlaintext(true) + .usePlaintext() .build(); databaseBlockingStub = DatabaseGrpc.newBlockingStub(channel); } public DatabaseGrpcClient(String host) { channel = ManagedChannelBuilder.forTarget(host) - .usePlaintext(true) + .usePlaintext() .build(); databaseBlockingStub = DatabaseGrpc.newBlockingStub(channel); } diff --git a/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java b/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java index 9d3b5797e20..d28df0e7c77 100644 --- a/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java +++ b/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java @@ -29,14 +29,14 @@ public class WalletGrpcClient { public WalletGrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) - .usePlaintext(true) + .usePlaintext() .build(); walletBlockingStub = WalletGrpc.newBlockingStub(channel); } public WalletGrpcClient(String host) { channel = ManagedChannelBuilder.forTarget(host) - .usePlaintext(true) + .usePlaintext() .build(); walletBlockingStub = WalletGrpc.newBlockingStub(channel); } From cfd4fbd62bcf9b81545cf119d6f1a1137734cf04 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 6 Apr 2023 15:57:20 +0800 Subject: [PATCH 113/142] fix(net): update libp2p version --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index e81a2ceae85..2ffc1f82f16 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-grpc-v2-1',{ + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-grpc-v2-2',{ exclude group: 'io.grpc', module: 'grpc-context' exclude group: 'io.grpc', module: 'grpc-core' exclude group: 'io.grpc', module: 'grpc-netty' From 42e0ab35e96620ab346a3bd052a43a88df1a45c6 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 6 Apr 2023 17:54:00 +0800 Subject: [PATCH 114/142] fix(net): update libp2p to test-v0.2.21 --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 2ffc1f82f16..47d8a1302c7 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -53,7 +53,7 @@ dependencies { compile 'org.aspectj:aspectjrt:1.8.13' compile 'org.aspectj:aspectjweaver:1.8.13' compile 'org.aspectj:aspectjtools:1.8.13' - compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-grpc-v2-2',{ + compile group: 'com.github.tronprotocol', name: 'libp2p', version: 'test-v0.2.21',{ exclude group: 'io.grpc', module: 'grpc-context' exclude group: 'io.grpc', module: 'grpc-core' exclude group: 'io.grpc', module: 'grpc-netty' From 78130633f13997111ac7b95a595f2a959a9fcf12 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 7 Apr 2023 17:32:16 +0800 Subject: [PATCH 115/142] fix(net):revert DatabaseGrpcClient WalletGrpcClient --- .../main/java/org/tron/common/client/DatabaseGrpcClient.java | 4 ++-- .../main/java/org/tron/common/client/WalletGrpcClient.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java index f3650bfd2be..b83c7235900 100644 --- a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java +++ b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java @@ -15,14 +15,14 @@ public class DatabaseGrpcClient { public DatabaseGrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) - .usePlaintext() + .usePlaintext(true) .build(); databaseBlockingStub = DatabaseGrpc.newBlockingStub(channel); } public DatabaseGrpcClient(String host) { channel = ManagedChannelBuilder.forTarget(host) - .usePlaintext() + .usePlaintext(true) .build(); databaseBlockingStub = DatabaseGrpc.newBlockingStub(channel); } diff --git a/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java b/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java index d28df0e7c77..9d3b5797e20 100644 --- a/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java +++ b/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java @@ -29,14 +29,14 @@ public class WalletGrpcClient { public WalletGrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) - .usePlaintext() + .usePlaintext(true) .build(); walletBlockingStub = WalletGrpc.newBlockingStub(channel); } public WalletGrpcClient(String host) { channel = ManagedChannelBuilder.forTarget(host) - .usePlaintext() + .usePlaintext(true) .build(); walletBlockingStub = WalletGrpc.newBlockingStub(channel); } From 9c2208bfcfa1cef7e71189adbc8e3d15eb5c04d5 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 7 Apr 2023 19:24:48 +0800 Subject: [PATCH 116/142] fix(net): exclude com.google.protobuf from libp2p --- common/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/build.gradle b/common/build.gradle index 47d8a1302c7..86f9b328184 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -57,6 +57,8 @@ dependencies { exclude group: 'io.grpc', module: 'grpc-context' exclude group: 'io.grpc', module: 'grpc-core' exclude group: 'io.grpc', module: 'grpc-netty' + exclude group: 'com.google.protobuf', module: 'protobuf-java' + exclude group: 'com.google.protobuf', module: 'protobuf-java-util' } compile project(":protocol") } From 5fc0c7879933736951e4d6f1ff97288c30d83fd7 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 7 Apr 2023 20:16:45 +0800 Subject: [PATCH 117/142] fix(net): optimize build.gradle --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 490348dd559..a4d23e2184e 100644 --- a/build.gradle +++ b/build.gradle @@ -67,10 +67,10 @@ subprojects { } configurations.all { + resolutionStrategy { + force group: 'com.google.guava', name: 'guava', version: '30.1-jre' + } resolutionStrategy.eachDependency { details -> - if (details.requested.group == 'com.google.guava' && details.requested.name == 'guava') { - details.useVersion "30.1-jre" - } // TODO if update grpc remove if(details.requested.group == 'io.netty') { details.useVersion "4.1.27.Final" From 81d31dd97179541de129be9c82e02b83c0242639 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Sun, 9 Apr 2023 22:00:36 +0800 Subject: [PATCH 118/142] fix(net): try to remove shield in test case --- .../org/tron/core/services/filter/HttpApiAccessFilterTest.java | 2 +- .../tron/core/services/filter/LiteFnQueryHttpFilterTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java index dcf56c18ae9..63e215f87af 100644 --- a/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/HttpApiAccessFilterTest.java @@ -50,7 +50,7 @@ public class HttpApiAccessFilterTest { @BeforeClass public static void init() { Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); + //Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); context = new TronApplicationContext(DefaultConfig.class); appTest = ApplicationFactory.create(context); httpApiAccessFilter = context.getBean(HttpApiAccessFilter.class); diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java index b63ebc9caed..87e124725dc 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java @@ -51,7 +51,7 @@ public class LiteFnQueryHttpFilterTest { @Before public void init() { Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); - Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); + //Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); context = new TronApplicationContext(DefaultConfig.class); appTest = ApplicationFactory.create(context); FullNodeHttpApiService httpApiService = context From 3e1298c7d9bef89afc2bc4e535be45eddd1003b5 Mon Sep 17 00:00:00 2001 From: guoquanwu Date: Fri, 7 Apr 2023 20:26:18 +0800 Subject: [PATCH 119/142] feature(test): use random port in unit test --- .../org/tron/common/utils/PublicMethod.java | 29 +++++++++++++++++-- .../filter/LiteFnQueryHttpFilterTest.java | 6 +++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/framework/src/test/java/org/tron/common/utils/PublicMethod.java b/framework/src/test/java/org/tron/common/utils/PublicMethod.java index 3c945b47530..b6e8f661b2c 100644 --- a/framework/src/test/java/org/tron/common/utils/PublicMethod.java +++ b/framework/src/test/java/org/tron/common/utils/PublicMethod.java @@ -1,7 +1,11 @@ package org.tron.common.utils; import com.google.protobuf.ByteString; + +import java.io.IOException; import java.math.BigInteger; +import java.net.InetAddress; +import java.net.Socket; import java.util.Random; import org.tron.api.GrpcAPI; @@ -105,11 +109,30 @@ public static GrpcAPI.Return broadcastTransaction( return response; } + public static int chooseRandomPort() { + return chooseRandomPort(10240, 65000); + } + public static int chooseRandomPort(int min, int max) { - return new Random().nextInt(max - min + 1) + min; + int port = new Random().nextInt(max - min + 1) + min; + try { + while (!checkPortAvailable(port)) { + port = new Random().nextInt(max - min + 1) + min; + } + } catch (IOException e) { + return new Random().nextInt(max - min + 1) + min; + } + return port; } - public static int chooseRandomPort() { - return new Random().nextInt(65530 - 1024) + 1024; + private static boolean checkPortAvailable(int port) throws IOException { + InetAddress theAddress = InetAddress.getByName("127.0.0.1"); + try (Socket socket = new Socket(theAddress, port)) { + // only check + socket.getPort(); + } catch (IOException e) { + return true; + } + return false; } } diff --git a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java index b63ebc9caed..660cb521fc4 100644 --- a/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java +++ b/framework/src/test/java/org/tron/core/services/filter/LiteFnQueryHttpFilterTest.java @@ -23,6 +23,7 @@ import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; import org.tron.common.utils.FileUtil; +import org.tron.common.utils.PublicMethod; import org.tron.core.ChainBaseManager; import org.tron.core.Constant; import org.tron.core.config.DefaultConfig; @@ -50,8 +51,11 @@ public class LiteFnQueryHttpFilterTest { */ @Before public void init() { - Args.setParam(new String[]{"-d", dbPath}, Constant.TEST_CONF); + Args.setParam(new String[]{"-d", dbPath, "--p2p-disable", "true"}, Constant.TEST_CONF); Args.getInstance().setFullNodeAllowShieldedTransactionArgs(false); + Args.getInstance().setFullNodeHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setSolidityHttpPort(PublicMethod.chooseRandomPort()); + Args.getInstance().setPBFTHttpPort(PublicMethod.chooseRandomPort()); context = new TronApplicationContext(DefaultConfig.class); appTest = ApplicationFactory.create(context); FullNodeHttpApiService httpApiService = context From da14f79143c4afa22952afad969e3350e1a23f8d Mon Sep 17 00:00:00 2001 From: wubin01 Date: Mon, 10 Apr 2023 14:36:34 +0800 Subject: [PATCH 120/142] feat(net): optimize the acquisition of the ip address of the GRPC interface --- .../java/org/tron/core/services/ratelimiter/RuntimeData.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/services/ratelimiter/RuntimeData.java b/framework/src/main/java/org/tron/core/services/ratelimiter/RuntimeData.java index 0f3c78b18d8..7cbadbc5435 100644 --- a/framework/src/main/java/org/tron/core/services/ratelimiter/RuntimeData.java +++ b/framework/src/main/java/org/tron/core/services/ratelimiter/RuntimeData.java @@ -2,6 +2,7 @@ import io.grpc.Grpc; import io.grpc.ServerCall; +import java.net.InetSocketAddress; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; @@ -16,7 +17,9 @@ public RuntimeData(Object o) { address = ((HttpServletRequest) o).getRemoteAddr(); } else if (o instanceof ServerCall) { try { - address = ((ServerCall) o).getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR).toString(); + InetSocketAddress s = (InetSocketAddress) + ((ServerCall) o).getAttributes().get(Grpc.TRANSPORT_ATTR_REMOTE_ADDR); + address = s.getAddress().getHostAddress(); } catch (Exception npe) { logger.warn("the address get from the runtime data is a null value unexpected."); } From 150dd39abfcef3af5e0817d40fb406538eccb0ed Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 10 Apr 2023 16:59:54 +0800 Subject: [PATCH 121/142] fix(net): optimize NodeTest --- .../src/main/java/org/tron/core/config/args/Args.java | 6 +++++- framework/src/test/java/org/tron/core/net/NodeTest.java | 8 +++++++- .../java/org/tron/core/zksnark/SendCoinShieldTest.java | 2 ++ framework/src/test/resources/config-test.conf | 2 +- 4 files changed, 15 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 a44e79ae5aa..19962fbac8e 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 @@ -1335,7 +1335,12 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi if (config.hasPath(Constant.NODE_DNS_PUBLISH)) { publishConfig.setDnsPublishEnable(config.getBoolean(Constant.NODE_DNS_PUBLISH)); } + loadDnsPublishParameters(config, publishConfig); + return publishConfig; + } + public static void loadDnsPublishParameters(final com.typesafe.config.Config config, + PublishConfig publishConfig) { if (publishConfig.isDnsPublishEnable()) { if (config.hasPath(Constant.NODE_DNS_DOMAIN) && StringUtils.isNotEmpty( config.getString(Constant.NODE_DNS_DOMAIN))) { @@ -1427,7 +1432,6 @@ public static PublishConfig loadDnsPublishConfig(final com.typesafe.config.Confi } } } - return publishConfig; } private static void logEmptyError(String arg) { diff --git a/framework/src/test/java/org/tron/core/net/NodeTest.java b/framework/src/test/java/org/tron/core/net/NodeTest.java index 421b93f589a..623c24d6040 100644 --- a/framework/src/test/java/org/tron/core/net/NodeTest.java +++ b/framework/src/test/java/org/tron/core/net/NodeTest.java @@ -79,7 +79,13 @@ public void testEndpointFromNode() { @Test public void testPublishConfig() { Config config = Configuration.getByFileName(Constant.TEST_CONF, Constant.TEST_CONF); - PublishConfig publishConfig = Args.loadDnsPublishConfig(config); + + PublishConfig publishConfig = new PublishConfig(); + Assert.assertFalse(publishConfig.isDnsPublishEnable()); + + publishConfig.setDnsPublishEnable(true); + Assert.assertTrue(publishConfig.isDnsPublishEnable()); + Args.loadDnsPublishParameters(config, publishConfig); Assert.assertTrue(publishConfig.isDnsPublishEnable()); Assert.assertEquals(5, publishConfig.getMaxMergeSize()); Assert.assertEquals(DnsType.AwsRoute53, publishConfig.getDnsType()); 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 1eb5becffb6..96ff338d3ce 100644 --- a/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java @@ -126,6 +126,8 @@ public class SendCoinShieldTest { */ @BeforeClass public static void init() { + FileUtil.deleteDir(new File(dbPath)); + dbManager = context.getBean(Manager.class); wallet = context.getBean(Wallet.class); //init energy diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 76e99c8d4a1..c9602ef977b 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -114,7 +114,7 @@ node { ] # enable or disable dns publish, default false - publish = true + publish = false # dns domain to publish nodes, required if publish is true dnsDomain = "nodes1.example.org" From 2e38098cae993154c7521b45394d43ca9069be56 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Mon, 10 Apr 2023 18:09:38 +0800 Subject: [PATCH 122/142] fix(net): optimize new test case --- framework/src/test/java/org/tron/core/net/NodeTest.java | 6 ++++++ .../core/net/services/EffectiveCheckServiceTest.java | 1 + .../java/org/tron/core/net/services/SyncServiceTest.java | 1 + .../services/http/TriggerSmartContractServletTest.java | 9 ++++----- .../core/services/ratelimiter/GlobalRateLimiterTest.java | 6 ++++++ 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/framework/src/test/java/org/tron/core/net/NodeTest.java b/framework/src/test/java/org/tron/core/net/NodeTest.java index 623c24d6040..5f0e2c38b2b 100644 --- a/framework/src/test/java/org/tron/core/net/NodeTest.java +++ b/framework/src/test/java/org/tron/core/net/NodeTest.java @@ -9,6 +9,7 @@ import java.util.HashSet; import java.util.Set; import lombok.extern.slf4j.Slf4j; +import org.junit.After; import org.junit.Assert; import org.junit.Test; import org.tron.core.Constant; @@ -90,4 +91,9 @@ public void testPublishConfig() { Assert.assertEquals(5, publishConfig.getMaxMergeSize()); Assert.assertEquals(DnsType.AwsRoute53, publishConfig.getDnsType()); } + + @After + public void destroy() { + Args.clearParam(); + } } diff --git a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java index eb517df23a7..5f68be84251 100644 --- a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java @@ -33,6 +33,7 @@ public void init() { @After public void destroy() { Args.clearParam(); + context.destroy(); FileUtil.deleteDir(new File(dbPath)); } diff --git a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java index 8493b1785be..fd2bb5dd017 100644 --- a/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/SyncServiceTest.java @@ -44,6 +44,7 @@ public void init() { @After public void destroy() { Args.clearParam(); + context.destroy(); FileUtil.deleteDir(new File(dbPath)); } diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java index 8e9b79dbb53..1fdf884eab6 100644 --- a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java @@ -73,13 +73,12 @@ public static void init() throws Exception { @AfterClass public static void destroy() { - if (FileUtil.deleteDir(new File(dbPath))) { - logger.info("Release resources successful."); - } else { - logger.error("Release resources failure."); - } + Args.clearParam(); + context.destroy(); + FileUtil.deleteDir(new File(dbPath)); } + @Test public void testNormalCall() throws Exception { HttpMethed.waitToProduceOneBlock("127.0.0.1:8090"); diff --git a/framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java b/framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java index 3187ed36792..b2f4915df1e 100644 --- a/framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java +++ b/framework/src/test/java/org/tron/core/services/ratelimiter/GlobalRateLimiterTest.java @@ -1,6 +1,7 @@ package org.tron.core.services.ratelimiter; import java.lang.reflect.Field; +import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; import org.tron.core.Constant; @@ -19,4 +20,9 @@ public void testAcquire() throws Exception { Assert.assertEquals(runtimeData.getRemoteAddr(), "127.0.0.1"); GlobalRateLimiter.acquire(runtimeData); } + + @AfterClass + public static void destroy() { + Args.clearParam(); + } } \ No newline at end of file From 36e9e10b4142ff9366c18c0de7960d446c2a1aa1 Mon Sep 17 00:00:00 2001 From: halibobo1205 Date: Mon, 10 Apr 2023 17:09:45 +0800 Subject: [PATCH 123/142] refactor(log):downgrade certain log level in some files --- .../tron/core/capsule/TransactionCapsule.java | 4 ++-- .../src/main/java/org/tron/core/Wallet.java | 23 ++++++++++--------- .../main/java/org/tron/core/db/Manager.java | 2 +- .../org/tron/core/services/http/Util.java | 2 +- .../core/services/jsonrpc/JsonRpcApiUtil.java | 2 +- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java index 1b6bf0722d4..a33f445c15f 100755 --- a/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java +++ b/chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java @@ -333,13 +333,13 @@ public static byte[] getOwner(Transaction.Contract contract) { Class clazz = TransactionFactory .getContract(contract.getType()); if (clazz == null) { - logger.error("not exist {}", contract.getType()); + logger.warn("not exist {}", contract.getType()); return new byte[0]; } GeneratedMessageV3 generatedMessageV3 = contractParameter.unpack(clazz); owner = ReflectUtils.getFieldValue(generatedMessageV3, OWNER_ADDRESS); if (owner == null) { - logger.error("not exist [{}] field,{}", OWNER_ADDRESS, clazz); + logger.warn("not exist [{}] field,{}", OWNER_ADDRESS, clazz); return new byte[0]; } break; diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index f6b48e68509..02d1d1d2f9f 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -110,6 +110,7 @@ import org.tron.common.utils.ByteUtil; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.Sha256Hash; +import org.tron.common.utils.StringUtil; import org.tron.common.utils.Utils; import org.tron.common.utils.WalletUtil; import org.tron.common.zksnark.IncrementalMerkleTreeContainer; @@ -583,7 +584,7 @@ public GrpcAPI.Return broadcastTransaction(Transaction signedTransaction) { .setMessage(ByteString.copyFromUtf8("Transaction expired")) .build(); } catch (Exception e) { - logger.error(BROADCAST_TRANS_FAILED, txID, e.getMessage()); + logger.warn("Broadcast transaction {} failed", txID, e); return builder.setResult(false).setCode(response_code.OTHER_ERROR) .setMessage(ByteString.copyFromUtf8("Error: " + e.getMessage())) .build(); @@ -1708,7 +1709,7 @@ public Proposal getProposalById(ByteString proposalId) { proposalCapsule = chainBaseManager.getProposalStore() .get(proposalId.toByteArray()); } catch (StoreException e) { - logger.error(e.getMessage()); + logger.warn(e.getMessage()); } if (proposalCapsule != null) { return proposalCapsule.getInstance(); @@ -2626,7 +2627,7 @@ public TransactionInfoList getTransactionInfoByBlockNum(long blockNum) { } } } catch (BadItemException | ItemNotFoundException e) { - logger.error(e.getMessage()); + logger.warn(e.getMessage()); } return transactionInfoList.build(); @@ -2658,7 +2659,7 @@ public MarketOrder getMarketOrderById(ByteString orderId) { try { return marketOrderStore.get(orderId.toByteArray()).getInstance(); } catch (ItemNotFoundException e) { - logger.error("orderId = " + orderId.toString() + " not found"); + logger.warn("orderId = {} not found", orderId); throw new IllegalStateException("order not found in store"); } @@ -2694,7 +2695,7 @@ public MarketOrderList getMarketOrderByAccount(ByteString accountAddress) { marketOrderListBuilder .addOrders(orderCapsule.getInstance()); } catch (ItemNotFoundException e) { - logger.error("orderId = " + orderId.toString() + " not found"); + logger.warn("orderId = {} not found", orderId); throw new IllegalStateException("order not found in store"); } } @@ -3061,9 +3062,9 @@ public SmartContract getContract(GrpcAPI.BytesMessage bytesMessage) { byte[] address = bytesMessage.getValue().toByteArray(); AccountCapsule accountCapsule = chainBaseManager.getAccountStore().get(address); if (accountCapsule == null) { - logger.error( - "Get contract failed, the account does not exist or the account " - + "does not have a code hash!"); + logger.warn( + "Get contract failed, the account {} does not exist or the account " + + "does not have a code hash!", StringUtil.encode58Check(address)); return null; } @@ -3090,9 +3091,9 @@ public SmartContractDataWrapper getContractInfo(GrpcAPI.BytesMessage bytesMessag byte[] address = bytesMessage.getValue().toByteArray(); AccountCapsule accountCapsule = chainBaseManager.getAccountStore().get(address); if (accountCapsule == null) { - logger.error( - "Get contract failed, the account does not exist or the account does not have a code " - + "hash!"); + logger.warn( + "Get contract failed, the account {} does not exist or the account does not have a code " + + "hash!", StringUtil.encode58Check(address)); return null; } diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 8787c70aeb8..c323df397a8 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1609,7 +1609,7 @@ public BlockCapsule generateBlock(Miner miner, long blockTime, long timeout) { toBePacked.add(trx); currentSize += trxPackSize; } catch (Exception e) { - logger.error("Process trx {} failed when generating block {}, {}.", trx.getTransactionId(), + logger.warn("Process trx {} failed when generating block {}, {}.", trx.getTransactionId(), blockCapsule.getNum(), e.getMessage()); } } diff --git a/framework/src/main/java/org/tron/core/services/http/Util.java b/framework/src/main/java/org/tron/core/services/http/Util.java index 8ce5a647566..2cbf5d2e718 100644 --- a/framework/src/main/java/org/tron/core/services/http/Util.java +++ b/framework/src/main/java/org/tron/core/services/http/Util.java @@ -303,7 +303,7 @@ public static Transaction packTransaction(String strTransaction, boolean selfTyp } catch (JSONException e) { logger.debug("JSONException: {}", e.getMessage()); } catch (Exception e) { - logger.error("", e); + logger.warn("{}", contractType, e); } } rawData.put("contract", contracts); diff --git a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java index a25bedc577d..00a33f21bff 100644 --- a/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java +++ b/framework/src/main/java/org/tron/core/services/jsonrpc/JsonRpcApiUtil.java @@ -338,7 +338,7 @@ public static long getAmountFromTransactionInfo(String hash, ContractType contra break; } } else { - logger.error("Can't find transaction {} ", hash); + logger.warn("Can't find transaction {} ", hash); } } catch (Exception e) { logger.warn("Exception happens when get amount from transactionInfo. Exception = [{}]", From 9a825ec23f0871ebf036677bac2ac5f3951736f4 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Wed, 12 Apr 2023 18:10:52 +0800 Subject: [PATCH 124/142] feat(net): optimize sync block processing logic --- .../core/exception/BadBlockException.java | 26 +++++++++++++++++++ .../org/tron/core/exception/P2pException.java | 2 ++ .../main/java/org/tron/core/db/Manager.java | 5 ++-- .../org/tron/core/net/TronNetDelegate.java | 12 ++++++--- .../core/net/service/sync/SyncService.java | 26 +++++++++++++++---- .../java/org/tron/core/db/ManagerTest.java | 2 ++ 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/org/tron/core/exception/BadBlockException.java b/common/src/main/java/org/tron/core/exception/BadBlockException.java index e3308819d22..224ffc253ee 100644 --- a/common/src/main/java/org/tron/core/exception/BadBlockException.java +++ b/common/src/main/java/org/tron/core/exception/BadBlockException.java @@ -2,6 +2,8 @@ public class BadBlockException extends TronException { + private TypeEnum type = TypeEnum.DEFAULT; + public BadBlockException() { super(); } @@ -9,4 +11,28 @@ public BadBlockException() { public BadBlockException(String message) { super(message); } + + public BadBlockException(TypeEnum type, String message) { + super(message); + this.type = type; + } + + public TypeEnum getType() { + return type; + } + + public enum TypeEnum { + CALC_MERKLE_ROOT_FAILED(1), + DEFAULT(100); + + private Integer value; + + TypeEnum(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + } } diff --git a/common/src/main/java/org/tron/core/exception/P2pException.java b/common/src/main/java/org/tron/core/exception/P2pException.java index d566b833d59..33c4c4fbec7 100644 --- a/common/src/main/java/org/tron/core/exception/P2pException.java +++ b/common/src/main/java/org/tron/core/exception/P2pException.java @@ -50,6 +50,8 @@ public enum TypeEnum { TRX_EXE_FAILED(12, "trx exe failed"), DB_ITEM_NOT_FOUND(13, "DB item not found"), PROTOBUF_ERROR(14, "protobuf inconsistent"), + SIGN_ERROR(15, "sign error"), + CALC_MERKLE_ROOT_FAILED(16, "calc merkle root failed"), DEFAULT(100, "default exception"); diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index c323df397a8..b1127029b46 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -1,6 +1,7 @@ package org.tron.core.db; import static org.tron.common.utils.Commons.adjustBalance; +import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED; import static org.tron.protos.Protocol.Transaction.Contract.ContractType.TransferContract; import static org.tron.protos.Protocol.Transaction.Result.contractResult.SUCCESS; @@ -1213,8 +1214,8 @@ public void pushBlock(final BlockCapsule block) if (!block.calcMerkleRoot().equals(block.getMerkleRoot())) { logger.warn("Num: {}, the merkle root doesn't match, expect is {} , actual is {}.", block.getNum(), block.getMerkleRoot(), block.calcMerkleRoot()); - throw new BadBlockException(String.format("The merkle hash is not validated for %d", - block.getNum())); + throw new BadBlockException(CALC_MERKLE_ROOT_FAILED, + String.format("The merkle hash is not validated for %d", block.getNum())); } consensus.receiveBlock(block); } diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 05dde7a9701..f840341c1b2 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -1,6 +1,7 @@ package org.tron.core.net; import static org.tron.core.config.Parameter.ChainConstant.BLOCK_PRODUCED_INTERVAL; +import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -282,7 +283,12 @@ public void processBlock(BlockCapsule block, boolean isSync) throws P2pException | EventBloomException e) { metricsService.failProcessBlock(block.getNum(), e.getMessage()); logger.error("Process block failed, {}, reason: {}", blockId.getString(), e.getMessage()); - throw new P2pException(TypeEnum.BAD_BLOCK, e); + if (e instanceof BadBlockException + && ((BadBlockException) e).getType().equals(CALC_MERKLE_ROOT_FAILED)) { + throw new P2pException(TypeEnum.CALC_MERKLE_ROOT_FAILED, e); + } else { + throw new P2pException(TypeEnum.BAD_BLOCK, e); + } } } } @@ -312,10 +318,10 @@ public void validSignature(BlockCapsule block) throws P2pException { try { if (!block.validateSignature(dbManager.getDynamicPropertiesStore(), dbManager.getAccountStore())) { - throw new P2pException(TypeEnum.BAD_BLOCK, "valid signature failed."); + throw new P2pException(TypeEnum.SIGN_ERROR, "valid signature failed."); } } catch (ValidateSignatureException e) { - throw new P2pException(TypeEnum.BAD_BLOCK, e); + throw new P2pException(TypeEnum.SIGN_ERROR, e); } } diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 79cc4830e60..2ba35723e06 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -1,6 +1,8 @@ package org.tron.core.net.service.sync; import static org.tron.core.config.Parameter.NetConstants.MAX_BLOCK_FETCH_PER_PEER; +import static org.tron.core.exception.P2pException.TypeEnum.CALC_MERKLE_ROOT_FAILED; +import static org.tron.core.exception.P2pException.TypeEnum.SIGN_ERROR; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -23,6 +25,7 @@ import org.tron.core.capsule.BlockCapsule.BlockId; import org.tron.core.config.Parameter.NetConstants; import org.tron.core.config.args.Args; +import org.tron.core.exception.BadBlockException; import org.tron.core.exception.P2pException; import org.tron.core.exception.P2pException.TypeEnum; import org.tron.core.net.TronNetDelegate; @@ -263,33 +266,46 @@ private synchronized void handleSyncBlock() { tronNetDelegate.getActivePeer().stream() .filter(peer -> msg.getBlockId().equals(peer.getSyncBlockToFetch().peek())) .forEach(peer -> { - peer.getSyncBlockToFetch().pop(); - peer.getSyncBlockInProcess().add(msg.getBlockId()); isFound[0] = true; }); if (isFound[0]) { blockWaitToProcess.remove(msg); isProcessed[0] = true; - processSyncBlock(msg.getBlockCapsule()); + processSyncBlock(msg.getBlockCapsule(), peerConnection); } } }); } } - private void processSyncBlock(BlockCapsule block) { + private void processSyncBlock(BlockCapsule block, PeerConnection peerConnection) { boolean flag = true; + boolean attackFlag = false; BlockId blockId = block.getBlockId(); try { tronNetDelegate.validSignature(block); tronNetDelegate.processBlock(block, true); pbftDataSyncHandler.processPBFTCommitData(block); + } catch (P2pException p2pException) { + logger.error("Process sync block {} failed, type: {}", + blockId.getString(), p2pException.getType()); + attackFlag = p2pException.getType().equals(SIGN_ERROR) + || p2pException.getType().equals(CALC_MERKLE_ROOT_FAILED); + flag = false; } catch (Exception e) { logger.error("Process sync block {} failed", blockId.getString(), e); flag = false; } + + if (attackFlag) { + invalid(blockId, peerConnection); + peerConnection.disconnect(ReasonCode.BAD_BLOCK); + return; + } + for (PeerConnection peer : tronNetDelegate.getActivePeer()) { - if (peer.getSyncBlockInProcess().remove(blockId)) { + if (blockId.equals(peer.getSyncBlockToFetch().peek())) { + peer.getSyncBlockToFetch().pop(); if (flag) { peer.setBlockBothHave(blockId); if (peer.getSyncBlockToFetch().isEmpty() && peer.isFetchAble()) { diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index e7319d0ed0b..8cec1fc9cb8 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -4,6 +4,7 @@ import static org.tron.common.utils.Commons.adjustBalance; import static org.tron.common.utils.Commons.adjustTotalShieldedPoolValue; import static org.tron.common.utils.Commons.getExchangeStoreFinal; +import static org.tron.core.exception.BadBlockException.TypeEnum.CALC_MERKLE_ROOT_FAILED; import com.google.common.collect.Maps; import com.google.protobuf.ByteString; @@ -392,6 +393,7 @@ public void pushBlockInvalidMerkelRoot() { Assert.assertTrue(false); } catch (BadBlockException e) { Assert.assertTrue(e instanceof BadBlockException); + Assert.assertTrue(e.getType().equals(CALC_MERKLE_ROOT_FAILED)); Assert.assertEquals("The merkle hash is not validated for " + blockCapsule2.getNum(), e.getMessage()); } catch (Exception e) { From 75fba7a1c242611415efbd2e112f262597470afd Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Thu, 13 Apr 2023 14:37:36 +0800 Subject: [PATCH 125/142] fix(net): stable test case; add parameters in config --- .../main/java/org/tron/core/net/TronNetService.java | 6 +++--- framework/src/main/resources/config.conf | 13 +++++++++++++ .../java/org/tron/common/config/args/ArgsTest.java | 6 ++++-- .../tron/core/actuator/utils/ProposalUtilTest.java | 4 ++++ .../src/test/java/org/tron/core/db/ManagerTest.java | 7 +++++++ .../test/java/org/tron/core/net/MessageTest.java | 5 +++++ .../net/services/EffectiveCheckServiceTest.java | 13 +++++++++++++ framework/src/test/resources/config-test.conf | 4 ++++ 8 files changed, 53 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 89767e31827..dda3be886dc 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -82,7 +82,8 @@ private static void setP2pConfig(P2pConfig config) { public void start() { try { init = true; - setP2pConfig(getConfig()); + P2pConfig config = new P2pConfig(); + setP2pConfig(getConfig(config)); p2pService.start(p2pConfig); p2pService.register(p2pEventHandler); advService.init(); @@ -147,11 +148,10 @@ public static boolean hasIpv4Stack(Set ipSet) { return false; } - private P2pConfig getConfig() { + private P2pConfig getConfig(P2pConfig config) { List seeds = parameter.getSeedNode().getAddressList(); seeds.addAll(nodePersistService.dbRead()); logger.debug("Seed InetSocketAddress: {}", seeds); - P2pConfig config = new P2pConfig(); config.getSeedNodes().addAll(seeds); config.getActiveNodes().addAll(parameter.getActiveNodes()); config.getTrustNodes().addAll(parameter.getPassiveNodes()); diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 47635540017..67aa374eec3 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -202,6 +202,19 @@ node { solidityPort = 8091 } + # use your ipv6 address for node discovery and tcp connection, default false + enableIpv6 = false + + # if your node's highest block num is below than all your pees', try to acquire new connection. default false + effectiveCheckEnable = false + + dns { + # dns urls to get nodes, url format tree://{pubkey}@{domain}, default empty + treeUrls = [ + #"tree://APFGGTFOBVE2ZNAB3CSMNNX6RRK3ODIRLP2AA5U4YFAA6MSYZUYTQ@nodes1.example.org", + ] + } + rpc { port = 50051 #solidityPort = 50061 diff --git a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java index 2c85397eb1b..aa58d8e0fc9 100644 --- a/framework/src/test/java/org/tron/common/config/args/ArgsTest.java +++ b/framework/src/test/java/org/tron/common/config/args/ArgsTest.java @@ -11,16 +11,18 @@ public class ArgsTest { + private static final String dbPath = "output_arg_test"; + @Before public void init() { - Args.setParam(new String[]{"--output-directory", "output-directory", "--p2p-disable", "true", + Args.setParam(new String[]{"--output-directory", dbPath, "--p2p-disable", "true", "--debug"}, Constant.TEST_CONF); } @After public void destroy() { Args.clearParam(); - FileUtil.deleteDir(new File("output-directory")); + FileUtil.deleteDir(new File(dbPath)); } @Test diff --git a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java index ed19516a608..4f409815f8b 100644 --- a/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java +++ b/framework/src/test/java/org/tron/core/actuator/utils/ProposalUtilTest.java @@ -357,6 +357,10 @@ public void validateCheck() { Assert.assertEquals("Bad chain parameter value, valid range is [0, 1_000_000_000_000L]", e.getMessage()); } + + forkUtils.getManager().getDynamicPropertiesStore() + .statsByVersion(ForkBlockVersionEnum.ENERGY_LIMIT.getValue(), stats); + forkUtils.reset(); } @Test diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index e7319d0ed0b..b7b29f49930 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -226,6 +226,13 @@ public void pushBlock() { } } + try { + chainManager.getBlockIdByNum(-1); + Assert.fail(); + } catch (ItemNotFoundException e) { + Assert.assertTrue(true); + } + Assert.assertTrue("hasBlocks is error", chainManager.hasBlocks()); } diff --git a/framework/src/test/java/org/tron/core/net/MessageTest.java b/framework/src/test/java/org/tron/core/net/MessageTest.java index d27f37214c5..5b81d18a599 100644 --- a/framework/src/test/java/org/tron/core/net/MessageTest.java +++ b/framework/src/test/java/org/tron/core/net/MessageTest.java @@ -107,6 +107,11 @@ public Class getAnswerMessage() { messageStatistics.addTcpOutMessage(message4); messageStatistics.addTcpInMessage(message5); messageStatistics.addTcpOutMessage(message5); + try { + Thread.sleep(2000);// so that gap > 1 in MessageCount.update method + } catch (InterruptedException e) { + //ignore + } messageStatistics.addTcpInMessage(message6); messageStatistics.addTcpOutMessage(message6); messageStatistics.addTcpInMessage(message7); diff --git a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java index 5f68be84251..1c422047e10 100644 --- a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java @@ -1,6 +1,7 @@ package org.tron.core.net.services; import java.io.File; +import java.lang.reflect.Method; import java.net.InetSocketAddress; import org.junit.After; import org.junit.Assert; @@ -37,6 +38,18 @@ public void destroy() { FileUtil.deleteDir(new File(dbPath)); } + @Test + public void testNoIpv4() throws Exception { + TronNetService tronNetService = context.getBean(TronNetService.class); + Method privateMethod = tronNetService.getClass() + .getDeclaredMethod("getConfig", P2pConfig.class); + privateMethod.setAccessible(true); + P2pConfig config = new P2pConfig(); + config.setIp(null); + P2pConfig newConfig = (P2pConfig) privateMethod.invoke(tronNetService, config); + Assert.assertNotNull(newConfig.getIp()); + } + @Test public void testFind() { TronNetService tronNetService = context.getBean(TronNetService.class); diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index c9602ef977b..bef8239fd86 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -105,8 +105,12 @@ node { solidityPort = 8091 } + # use your ipv6 address for node discovery and tcp connection, default false enableIpv6 = false + # if your node's highest block num is below than all your pees', try to acquire new connection + effectiveCheckEnable = false + dns { # dns urls to get nodes, url format tree://{pubkey}@{domain}, default empty treeUrls = [ From ab6a65e117049f5a23df0866471e3ddff0bf898b Mon Sep 17 00:00:00 2001 From: wubin01 Date: Thu, 13 Apr 2023 19:23:38 +0800 Subject: [PATCH 126/142] feat(net): optimize p2p exception type description --- .../src/main/java/org/tron/core/exception/P2pException.java | 4 ++-- .../src/main/java/org/tron/core/net/TronNetDelegate.java | 6 +++--- .../java/org/tron/core/net/service/sync/SyncService.java | 6 ++---- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/org/tron/core/exception/P2pException.java b/common/src/main/java/org/tron/core/exception/P2pException.java index 33c4c4fbec7..00d82e9fbf7 100644 --- a/common/src/main/java/org/tron/core/exception/P2pException.java +++ b/common/src/main/java/org/tron/core/exception/P2pException.java @@ -50,8 +50,8 @@ public enum TypeEnum { TRX_EXE_FAILED(12, "trx exe failed"), DB_ITEM_NOT_FOUND(13, "DB item not found"), PROTOBUF_ERROR(14, "protobuf inconsistent"), - SIGN_ERROR(15, "sign error"), - CALC_MERKLE_ROOT_FAILED(16, "calc merkle root failed"), + BLOCK_SIGN_ERROR(15, "block sign error"), + BLOCK_MERKLE_ERROR(16, "block merkle error"), DEFAULT(100, "default exception"); diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index f840341c1b2..3e7381a0504 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -285,7 +285,7 @@ public void processBlock(BlockCapsule block, boolean isSync) throws P2pException logger.error("Process block failed, {}, reason: {}", blockId.getString(), e.getMessage()); if (e instanceof BadBlockException && ((BadBlockException) e).getType().equals(CALC_MERKLE_ROOT_FAILED)) { - throw new P2pException(TypeEnum.CALC_MERKLE_ROOT_FAILED, e); + throw new P2pException(TypeEnum.BLOCK_MERKLE_ERROR, e); } else { throw new P2pException(TypeEnum.BAD_BLOCK, e); } @@ -318,10 +318,10 @@ public void validSignature(BlockCapsule block) throws P2pException { try { if (!block.validateSignature(dbManager.getDynamicPropertiesStore(), dbManager.getAccountStore())) { - throw new P2pException(TypeEnum.SIGN_ERROR, "valid signature failed."); + throw new P2pException(TypeEnum.BLOCK_SIGN_ERROR, "valid signature failed."); } } catch (ValidateSignatureException e) { - throw new P2pException(TypeEnum.SIGN_ERROR, e); + throw new P2pException(TypeEnum.BLOCK_SIGN_ERROR, e); } } diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 2ba35723e06..86b775df6f8 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -1,8 +1,6 @@ package org.tron.core.net.service.sync; import static org.tron.core.config.Parameter.NetConstants.MAX_BLOCK_FETCH_PER_PEER; -import static org.tron.core.exception.P2pException.TypeEnum.CALC_MERKLE_ROOT_FAILED; -import static org.tron.core.exception.P2pException.TypeEnum.SIGN_ERROR; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; @@ -289,8 +287,8 @@ private void processSyncBlock(BlockCapsule block, PeerConnection peerConnection) } catch (P2pException p2pException) { logger.error("Process sync block {} failed, type: {}", blockId.getString(), p2pException.getType()); - attackFlag = p2pException.getType().equals(SIGN_ERROR) - || p2pException.getType().equals(CALC_MERKLE_ROOT_FAILED); + attackFlag = p2pException.getType().equals(TypeEnum.BLOCK_SIGN_ERROR) + || p2pException.getType().equals(TypeEnum.BLOCK_MERKLE_ERROR); flag = false; } catch (Exception e) { logger.error("Process sync block {} failed", blockId.getString(), e); From 071a15bf69caebb59e42387ab0a144194b78c609 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Apr 2023 12:15:52 +0800 Subject: [PATCH 127/142] fix(net):modify BaseNet --- .../main/java/org/tron/core/net/TronNetService.java | 10 +++++++--- framework/src/test/java/org/tron/core/net/BaseNet.java | 8 ++++---- .../core/net/services/EffectiveCheckServiceTest.java | 2 +- framework/src/test/resources/config-test.conf | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index dda3be886dc..2e9345a6794 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -82,8 +82,7 @@ private static void setP2pConfig(P2pConfig config) { public void start() { try { init = true; - P2pConfig config = new P2pConfig(); - setP2pConfig(getConfig(config)); + setP2pConfig(getConfig()); p2pService.start(p2pConfig); p2pService.register(p2pEventHandler); advService.init(); @@ -148,7 +147,12 @@ public static boolean hasIpv4Stack(Set ipSet) { return false; } - private P2pConfig getConfig(P2pConfig config) { + private P2pConfig getConfig(){ + P2pConfig config = new P2pConfig(); + return updateConfig(config); + } + + private P2pConfig updateConfig(P2pConfig config) { List seeds = parameter.getSeedNode().getAddressList(); seeds.addAll(nodePersistService.dbRead()); logger.debug("Seed InetSocketAddress: {}", seeds); diff --git a/framework/src/test/java/org/tron/core/net/BaseNet.java b/framework/src/test/java/org/tron/core/net/BaseNet.java index ca42dc2a65e..64d4b128543 100644 --- a/framework/src/test/java/org/tron/core/net/BaseNet.java +++ b/framework/src/test/java/org/tron/core/net/BaseNet.java @@ -103,9 +103,9 @@ public void run() { } }); int tryTimes = 0; - while (++tryTimes < 100 && tronNetDelegate == null) { - Thread.sleep(3000); - } + do { + Thread.sleep(3000); //coverage consumerInvToSpread,consumerInvToFetch in AdvService.init + } while (++tryTimes < 100 && tronNetDelegate == null); } @After @@ -115,7 +115,7 @@ public void destroy() { for (PeerConnection peer : peerConnections) { peer.getChannel().close(); } - + Args.clearParam(); context.destroy(); FileUtil.deleteDir(new File(dbPath)); } diff --git a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java index 1c422047e10..aa42e0fcb89 100644 --- a/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java +++ b/framework/src/test/java/org/tron/core/net/services/EffectiveCheckServiceTest.java @@ -42,7 +42,7 @@ public void destroy() { public void testNoIpv4() throws Exception { TronNetService tronNetService = context.getBean(TronNetService.class); Method privateMethod = tronNetService.getClass() - .getDeclaredMethod("getConfig", P2pConfig.class); + .getDeclaredMethod("updateConfig", P2pConfig.class); privateMethod.setAccessible(true); P2pConfig config = new P2pConfig(); config.setIp(null); diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index bef8239fd86..dea5d72961d 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -108,7 +108,7 @@ node { # use your ipv6 address for node discovery and tcp connection, default false enableIpv6 = false - # if your node's highest block num is below than all your pees', try to acquire new connection + # if your node's highest block num is below than all your pees', try to acquire new connection, default false effectiveCheckEnable = false dns { From 1b2024de69eeabc3545f4c4e63e21466c1616737 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Apr 2023 12:17:34 +0800 Subject: [PATCH 128/142] fix(net):format code --- framework/src/main/java/org/tron/core/net/TronNetService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetService.java b/framework/src/main/java/org/tron/core/net/TronNetService.java index 2e9345a6794..87d878be8c9 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetService.java +++ b/framework/src/main/java/org/tron/core/net/TronNetService.java @@ -147,7 +147,7 @@ public static boolean hasIpv4Stack(Set ipSet) { return false; } - private P2pConfig getConfig(){ + private P2pConfig getConfig() { P2pConfig config = new P2pConfig(); return updateConfig(config); } From ebd21421438a8c02ca00d51368858249451d588c Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Thu, 13 Apr 2023 15:20:42 +0800 Subject: [PATCH 129/142] fix(freezeV2): optimize Stake2.0 code --- .../actuator/DelegateResourceActuator.java | 28 +-- .../core/actuator/FreezeBalanceActuator.java | 4 +- .../actuator/FreezeBalanceV2Actuator.java | 4 +- .../actuator/UnDelegateResourceActuator.java | 3 +- .../DelegateResourceProcessor.java | 26 +-- .../FreezeBalanceProcessor.java | 4 +- .../FreezeBalanceV2Processor.java | 5 +- .../UnDelegateResourceProcessor.java | 6 +- .../org/tron/core/vm/utils/FreezeV2Util.java | 40 ++-- .../src/main/java/org/tron/core/Wallet.java | 20 +- .../DelegateResourceActuatorTest.java | 16 +- .../actuator/FreezeBalanceActuatorTest.java | 134 +++++------- .../actuator/FreezeBalanceV2ActuatorTest.java | 75 +++---- .../actuator/UnfreezeBalanceActuatorTest.java | 194 ++++++++---------- .../newaddinterface2/FreezeBalance2Test.java | 2 +- 15 files changed, 234 insertions(+), 327 deletions(-) diff --git a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java index f91c147e3ee..c1dc9c3758b 100755 --- a/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/DelegateResourceActuator.java @@ -3,6 +3,8 @@ import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.config.Parameter.ChainConstant.DELEGATE_PERIOD; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; +import static org.tron.core.vm.utils.FreezeV2Util.getV2EnergyUsage; +import static org.tron.core.vm.utils.FreezeV2Util.getV2NetUsage; import com.google.protobuf.ByteString; import com.google.protobuf.InvalidProtocolBufferException; @@ -136,7 +138,7 @@ public boolean validate() throws ContractValidateException { long delegateBalance = delegateResourceContract.getBalance(); if (delegateBalance < TRX_PRECISION) { - throw new ContractValidateException("delegateBalance must be more than 1TRX"); + throw new ContractValidateException("delegateBalance must be greater than or equal to 1 TRX"); } switch (delegateResourceContract.getResource()) { @@ -152,16 +154,11 @@ public boolean validate() throws ContractValidateException { long netUsage = (long) (accountNetUsage * TRX_PRECISION * ((double) (dynamicStore.getTotalNetWeight()) / dynamicStore.getTotalNetLimit())); - long remainNetUsage = netUsage - - ownerCapsule.getFrozenBalance() - - ownerCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() - - ownerCapsule.getAcquiredDelegatedFrozenV2BalanceForBandwidth(); + long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage); - remainNetUsage = Math.max(0, remainNetUsage); - - if (ownerCapsule.getFrozenV2BalanceForBandwidth() - remainNetUsage < delegateBalance) { + if (ownerCapsule.getFrozenV2BalanceForBandwidth() - v2NetUsage < delegateBalance) { throw new ContractValidateException( - "delegateBalance must be less than available FreezeBandwidthV2 balance"); + "delegateBalance must be less than or equal to available FreezeBandwidthV2 balance"); } } break; @@ -172,16 +169,11 @@ public boolean validate() throws ContractValidateException { long energyUsage = (long) (ownerCapsule.getEnergyUsage() * TRX_PRECISION * ((double) (dynamicStore.getTotalEnergyWeight()) / dynamicStore.getTotalEnergyCurrentLimit())); - long remainEnergyUsage = energyUsage - - ownerCapsule.getEnergyFrozenBalance() - - ownerCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() - - ownerCapsule.getAcquiredDelegatedFrozenV2BalanceForEnergy(); - - remainEnergyUsage = Math.max(0, remainEnergyUsage); + long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage); - if (ownerCapsule.getFrozenV2BalanceForEnergy() - remainEnergyUsage < delegateBalance) { + if (ownerCapsule.getFrozenV2BalanceForEnergy() - v2EnergyUsage < delegateBalance) { throw new ContractValidateException( - "delegateBalance must be less than available FreezeEnergyV2 balance"); + "delegateBalance must be less than or equal to available FreezeEnergyV2 balance"); } } break; @@ -218,6 +210,8 @@ public boolean validate() throws ContractValidateException { return true; } + + @Override public ByteString getOwnerAddress() throws InvalidProtocolBufferException { return any.unpack(DelegateResourceContract.class).getOwnerAddress(); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java index 0cfd981217f..421b4e3013a 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceActuator.java @@ -189,7 +189,7 @@ public boolean validate() throws ContractValidateException { throw new ContractValidateException("frozenBalance must be positive"); } if (frozenBalance < TRX_PRECISION) { - throw new ContractValidateException("frozenBalance must be more than 1TRX"); + throw new ContractValidateException("frozenBalance must be greater than or equal to 1 TRX"); } int frozenCount = accountCapsule.getFrozenCount(); @@ -197,7 +197,7 @@ public boolean validate() throws ContractValidateException { throw new ContractValidateException("frozenCount must be 0 or 1"); } if (frozenBalance > accountCapsule.getBalance()) { - throw new ContractValidateException("frozenBalance must be less than accountBalance"); + throw new ContractValidateException("frozenBalance must be less than or equal to accountBalance"); } long frozenDuration = freezeBalanceContract.getFrozenDuration(); diff --git a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java index 90b03e43e1a..bb1555f502e 100755 --- a/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/FreezeBalanceV2Actuator.java @@ -133,11 +133,11 @@ public boolean validate() throws ContractValidateException { throw new ContractValidateException("frozenBalance must be positive"); } if (frozenBalance < TRX_PRECISION) { - throw new ContractValidateException("frozenBalance must be more than 1TRX"); + throw new ContractValidateException("frozenBalance must be greater than or equal to 1 TRX"); } if (frozenBalance > accountCapsule.getBalance()) { - throw new ContractValidateException("frozenBalance must be less than accountBalance"); + throw new ContractValidateException("frozenBalance must be less than or equal to accountBalance"); } switch (freezeBalanceV2Contract.getResource()) { diff --git a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java index a99d462b61c..6b101df6eb9 100755 --- a/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java +++ b/actuator/src/main/java/org/tron/core/actuator/UnDelegateResourceActuator.java @@ -10,7 +10,6 @@ import java.util.Arrays; import java.util.Objects; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.ArrayUtils; import org.tron.common.utils.DecodeUtil; import org.tron.common.utils.StringUtil; import org.tron.core.capsule.AccountCapsule; @@ -240,7 +239,7 @@ public boolean validate() throws ContractValidateException { } byte[] receiverAddress = unDelegateResourceContract.getReceiverAddress().toByteArray(); - if (ArrayUtils.isEmpty(receiverAddress) || !DecodeUtil.addressValid(receiverAddress)) { + if (!DecodeUtil.addressValid(receiverAddress)) { throw new ContractValidateException("Invalid receiverAddress"); } if (Arrays.equals(receiverAddress, ownerAddress)) { diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java index 66ea919d713..bd0b5a941d8 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/DelegateResourceProcessor.java @@ -3,6 +3,8 @@ import static org.tron.core.actuator.ActuatorConstant.NOT_EXIST_STR; import static org.tron.core.actuator.ActuatorConstant.STORE_NOT_EXIST; import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; +import static org.tron.core.vm.utils.FreezeV2Util.getV2EnergyUsage; +import static org.tron.core.vm.utils.FreezeV2Util.getV2NetUsage; import com.google.common.primitives.Bytes; import com.google.protobuf.ByteString; @@ -49,7 +51,7 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra } long delegateBalance = param.getDelegateBalance(); if (delegateBalance < TRX_PRECISION) { - throw new ContractValidateException("delegateBalance must be more than 1TRX"); + throw new ContractValidateException("delegateBalance must be greater than or equal to 1 TRX"); } switch (param.getResourceType()) { @@ -60,16 +62,11 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra long netUsage = (long) (ownerCapsule.getNetUsage() * TRX_PRECISION * ((double) (repo.getTotalNetWeight()) / dynamicStore.getTotalNetLimit())); - long remainNetUsage = netUsage - - ownerCapsule.getFrozenBalance() - - ownerCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() - - ownerCapsule.getAcquiredDelegatedFrozenV2BalanceForBandwidth(); + long v2NetUsage = getV2NetUsage(ownerCapsule, netUsage); - remainNetUsage = Math.max(0, remainNetUsage); - - if (ownerCapsule.getFrozenV2BalanceForBandwidth() - remainNetUsage < delegateBalance) { + if (ownerCapsule.getFrozenV2BalanceForBandwidth() - v2NetUsage < delegateBalance) { throw new ContractValidateException( - "delegateBalance must be less than available FreezeBandwidthV2 balance"); + "delegateBalance must be less than or equal to available FreezeBandwidthV2 balance"); } } break; @@ -81,16 +78,11 @@ public void validate(DelegateResourceParam param, Repository repo) throws Contra long energyUsage = (long) (ownerCapsule.getEnergyUsage() * TRX_PRECISION * ((double) (repo.getTotalEnergyWeight()) / dynamicStore.getTotalEnergyCurrentLimit())); - long remainEnergyUsage = energyUsage - - ownerCapsule.getEnergyFrozenBalance() - - ownerCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() - - ownerCapsule.getAcquiredDelegatedFrozenV2BalanceForEnergy(); - - remainEnergyUsage = Math.max(0, remainEnergyUsage); + long v2EnergyUsage = getV2EnergyUsage(ownerCapsule, energyUsage); - if (ownerCapsule.getFrozenV2BalanceForEnergy() - remainEnergyUsage < delegateBalance) { + if (ownerCapsule.getFrozenV2BalanceForEnergy() - v2EnergyUsage < delegateBalance) { throw new ContractValidateException( - "delegateBalance must be less than available FreezeEnergyV2 balance"); + "delegateBalance must be less than or equal to available FreezeEnergyV2 balance"); } } break; diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java index 9a1af3c9cec..40b26e11fdf 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceProcessor.java @@ -30,9 +30,9 @@ public void validate(FreezeBalanceParam param, Repository repo) throws ContractV if (frozenBalance <= 0) { throw new ContractValidateException("FrozenBalance must be positive"); } else if (frozenBalance < TRX_PRECISION) { - throw new ContractValidateException("FrozenBalance must be more than 1TRX"); + throw new ContractValidateException("FrozenBalance must be greater than or equal to 1 TRX"); } else if (frozenBalance > ownerCapsule.getBalance()) { - throw new ContractValidateException("FrozenBalance must be less than accountBalance"); + throw new ContractValidateException("FrozenBalance must be less than or equal to accountBalance"); } // validate frozen count of owner account diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java index 2ab9fc451c2..ed23e50abf0 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/FreezeBalanceV2Processor.java @@ -37,9 +37,10 @@ public void validate(FreezeBalanceV2Param param, Repository repo) throws Contrac if (frozenBalance <= 0) { throw new ContractValidateException("FrozenBalance must be positive"); } else if (frozenBalance < TRX_PRECISION) { - throw new ContractValidateException("FrozenBalance must be more than 1TRX"); + throw new ContractValidateException("FrozenBalance must be greater than or equal to 1 TRX"); } else if (frozenBalance > ownerCapsule.getBalance()) { - throw new ContractValidateException("FrozenBalance must be less than accountBalance"); + throw new ContractValidateException( + "FrozenBalance must be less than or equal to accountBalance"); } // validate arg @resourceType diff --git a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java index f4c18af85e5..88dc88546d8 100644 --- a/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java +++ b/actuator/src/main/java/org/tron/core/vm/nativecontract/UnDelegateResourceProcessor.java @@ -50,7 +50,7 @@ public void validate(UnDelegateResourceParam param, Repository repo) throws Cont } byte[] receiverAddress = param.getReceiverAddress(); - if (ArrayUtils.isEmpty(receiverAddress) || !DecodeUtil.addressValid(receiverAddress)) { + if (!DecodeUtil.addressValid(receiverAddress)) { throw new ContractValidateException("Invalid receiverAddress"); } if (Arrays.equals(receiverAddress, ownerAddress)) { @@ -104,7 +104,9 @@ public void execute(UnDelegateResourceParam param, Repository repo) { case BANDWIDTH: BandwidthProcessor bandwidthProcessor = new BandwidthProcessor(ChainBaseManager.getInstance()); bandwidthProcessor.updateUsageForDelegated(receiverCapsule); - + /* For example, in a scenario where a regular account can be upgraded to a contract + account through an interface, the account information will be cleared after the + contract suicide, and this account will be converted to a regular account in the future */ if (receiverCapsule.getAcquiredDelegatedFrozenV2BalanceForBandwidth() < unDelegateBalance) { // A TVM contract suicide, re-create will produce this situation diff --git a/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java b/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java index 9a22f796228..dcc44db262a 100644 --- a/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java +++ b/actuator/src/main/java/org/tron/core/vm/utils/FreezeV2Util.java @@ -1,5 +1,9 @@ package org.tron.core.vm.utils; +import static org.tron.protos.contract.Common.ResourceCode; +import static org.tron.protos.contract.Common.ResourceCode.BANDWIDTH; +import static org.tron.protos.contract.Common.ResourceCode.ENERGY; + import java.util.List; import java.util.stream.Collectors; @@ -11,8 +15,8 @@ import org.tron.core.vm.config.VMConfig; import org.tron.core.vm.repository.Repository; import org.tron.protos.Protocol; +import org.tron.protos.contract.Common; -import static org.tron.core.config.Parameter.ChainConstant.TRX_PRECISION; public class FreezeV2Util { @@ -163,13 +167,8 @@ public static long queryDelegatableResource(byte[] address, long type, Repositor return frozenV2Resource; } - long remainNetUsage = usage - - accountCapsule.getFrozenBalance() - - accountCapsule.getAcquiredDelegatedFrozenBalanceForBandwidth() - - accountCapsule.getAcquiredDelegatedFrozenV2BalanceForBandwidth(); - - remainNetUsage = Math.max(0, remainNetUsage); - return Math.max(0L, frozenV2Resource - remainNetUsage); + long v2NetUsage = getV2NetUsage(accountCapsule, usage); + return Math.max(0L, frozenV2Resource - v2NetUsage); } if (type == 1) { @@ -188,13 +187,8 @@ public static long queryDelegatableResource(byte[] address, long type, Repositor return frozenV2Resource; } - long remainEnergyUsage = usage - - accountCapsule.getEnergyFrozenBalance() - - accountCapsule.getAcquiredDelegatedFrozenBalanceForEnergy() - - accountCapsule.getAcquiredDelegatedFrozenV2BalanceForEnergy(); - - remainEnergyUsage = Math.max(0, remainEnergyUsage); - return Math.max(0L, frozenV2Resource - remainEnergyUsage); + long v2EnergyUsage = getV2EnergyUsage(accountCapsule, usage); + return Math.max(0L, frozenV2Resource - v2EnergyUsage); } return 0L; @@ -250,4 +244,20 @@ private static List getTotalWithdrawList(List oldVotes = new ArrayList(); + List oldVotes = new ArrayList<>(); VotesCapsule votesCapsule = new VotesCapsule( ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), oldVotes); votesCapsule.addNewVotes(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), @@ -1017,10 +996,8 @@ public void testClearVotes() { votesCapsule = dbManager.getVotesStore().get(ownerAddressBytes); Assert.assertNotNull(votesCapsule); Assert.assertEquals(0, votesCapsule.getNewVotes().size()); - } catch (ContractValidateException e) { - Assert.assertFalse(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + } catch (ContractValidateException | ContractExeException e) { + Assert.fail(); } } @@ -1099,8 +1076,8 @@ public void commonErrorCheck() { AccountCapsule accountCapsule = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); accountCapsule.setFrozen(frozenBalance, now); - Assert.assertEquals(accountCapsule.getFrozenBalance(), frozenBalance); - Assert.assertEquals(accountCapsule.getTronPower(), frozenBalance); + Assert.assertEquals(frozenBalance, accountCapsule.getFrozenBalance()); + Assert.assertEquals(frozenBalance, accountCapsule.getTronPower()); dbManager.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); @@ -1123,7 +1100,7 @@ public void testUnfreezeBalanceForEnergyWithOldTronPowerAfterNewResourceModel() accountCapsule.setFrozenForEnergy(frozenBalance, now); accountCapsule.setOldTronPower(frozenBalance); accountCapsule.addVotes(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS)), 100L); - Assert.assertEquals(accountCapsule.getAllFrozenBalanceForEnergy(), frozenBalance); + Assert.assertEquals(frozenBalance, accountCapsule.getAllFrozenBalanceForEnergy()); dbManager.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); UnfreezeBalanceActuator actuator = new UnfreezeBalanceActuator(); @@ -1134,16 +1111,14 @@ public void testUnfreezeBalanceForEnergyWithOldTronPowerAfterNewResourceModel() try { actuator.validate(); actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); AccountCapsule owner = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); - Assert.assertEquals(owner.getVotesList().size(), 0L); + Assert.assertEquals(0L, owner.getVotesList().size()); Assert.assertEquals(owner.getInstance().getOldTronPower(), -1L); - } catch (ContractValidateException e) { - Assert.assertFalse(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + } catch (ContractValidateException | ContractExeException e) { + Assert.fail(); } } @@ -1169,16 +1144,14 @@ public void testUnfreezeBalanceForEnergyWithoutOldTronPowerAfterNewResourceModel try { actuator.validate(); actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); AccountCapsule owner = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); - Assert.assertEquals(owner.getVotesList().size(), 1L); + Assert.assertEquals(1L, owner.getVotesList().size()); Assert.assertEquals(owner.getInstance().getOldTronPower(), -1L); - } catch (ContractValidateException e) { - Assert.assertFalse(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + } catch (ContractValidateException | ContractExeException e) { + Assert.fail(); } } @@ -1204,16 +1177,14 @@ public void testUnfreezeBalanceForTronPowerWithOldTronPowerAfterNewResourceModel try { actuator.validate(); actuator.execute(ret); - Assert.assertEquals(ret.getInstance().getRet(), code.SUCESS); + Assert.assertEquals(code.SUCESS, ret.getInstance().getRet()); AccountCapsule owner = dbManager.getAccountStore() .get(ByteArray.fromHexString(OWNER_ADDRESS)); - Assert.assertEquals(owner.getVotesList().size(), 0L); + Assert.assertEquals(0L, owner.getVotesList().size()); Assert.assertEquals(owner.getInstance().getOldTronPower(), -1L); - } catch (ContractValidateException e) { - Assert.assertFalse(e instanceof ContractValidateException); - } catch (ContractExeException e) { - Assert.assertFalse(e instanceof ContractExeException); + } catch (ContractValidateException | ContractExeException e) { + Assert.fail(); } } @@ -1234,13 +1205,12 @@ public void testUnfreezeBalanceForTronPowerWithOldTronPowerAfterNewResourceModel UnfreezeBalanceActuator actuator = new UnfreezeBalanceActuator(); actuator.setChainBaseManager(dbManager.getChainBaseManager()) .setAny(getContractForTronPower(OWNER_ADDRESS)); - TransactionResultCapsule ret = new TransactionResultCapsule(); try { actuator.validate(); Assert.fail(); } catch (ContractValidateException e) { - Assert.assertTrue(e instanceof ContractValidateException); + Assert.assertTrue(true); } } diff --git a/framework/src/test/java/stest/tron/wallet/newaddinterface2/FreezeBalance2Test.java b/framework/src/test/java/stest/tron/wallet/newaddinterface2/FreezeBalance2Test.java index 1253cdc8e0d..4ca463afc33 100644 --- a/framework/src/test/java/stest/tron/wallet/newaddinterface2/FreezeBalance2Test.java +++ b/framework/src/test/java/stest/tron/wallet/newaddinterface2/FreezeBalance2Test.java @@ -87,7 +87,7 @@ public void testFreezeBalance2() { ret1 = freezeBalance2(fromAddress, 999999L, 3L, testKey002); Assert.assertEquals(ret1.getCode(), GrpcAPI.Return.response_code.CONTRACT_VALIDATE_ERROR); Assert.assertEquals(ret1.getMessage().toStringUtf8(), - "Contract validate error : frozenBalance must be more than 1TRX"); + "Contract validate error : frozenBalance must be greater than or equal to 1 TRX"); //Freeze failed when freeze duration isn't 3 days. ret1 = freezeBalance2(fromAddress, 1000000L, 2L, testKey002); Assert.assertEquals(ret1.getCode(), GrpcAPI.Return.response_code.CONTRACT_VALIDATE_ERROR); From fbcbd6ee98c26e04dcc5e9765e1cdbd6995954ca Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Apr 2023 15:57:50 +0800 Subject: [PATCH 130/142] fix(net):optimize BaseNet --- .../test/java/org/tron/core/net/BaseNet.java | 76 ++++++++++--------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/framework/src/test/java/org/tron/core/net/BaseNet.java b/framework/src/test/java/org/tron/core/net/BaseNet.java index 64d4b128543..6af079a0197 100644 --- a/framework/src/test/java/org/tron/core/net/BaseNet.java +++ b/framework/src/test/java/org/tron/core/net/BaseNet.java @@ -19,8 +19,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; -import org.junit.After; -import org.junit.Before; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; @@ -34,20 +34,20 @@ import org.tron.core.services.RpcApiService; @Slf4j -public abstract class BaseNet { +public class BaseNet { private static String dbPath = "output-net"; private static String dbDirectory = "net-database"; private static String indexDirectory = "net-index"; private static int port = 10000; - protected TronApplicationContext context; + protected static TronApplicationContext context; - private RpcApiService rpcApiService; - private Application appT; - private TronNetDelegate tronNetDelegate; + private static RpcApiService rpcApiService; + private static Application appT; + private static TronNetDelegate tronNetDelegate; - private ExecutorService executorService = Executors.newFixedThreadPool(1); + private static ExecutorService executorService = Executors.newFixedThreadPool(1); public static Channel connect(ByteToMessageDecoder decoder) throws InterruptedException { NioEventLoopGroup group = new NioEventLoopGroup(1); @@ -73,34 +73,36 @@ protected void initChannel(Channel ch) throws Exception { return b.connect(Constant.LOCAL_HOST, port).sync().channel(); } - @Before - public void init() throws Exception { - executorService.execute(new Runnable() { - @Override - public void run() { - logger.info("Full node running."); - Args.setParam( - new String[]{ - "--output-directory", dbPath, - "--storage-db-directory", dbDirectory, - "--storage-index-directory", indexDirectory - }, - "config.conf" - ); - CommonParameter parameter = Args.getInstance(); - parameter.setNodeListenPort(port); - parameter.getSeedNode().getAddressList().clear(); - parameter.setNodeExternalIp(Constant.LOCAL_HOST); - context = new TronApplicationContext(DefaultConfig.class); - appT = ApplicationFactory.create(context); - rpcApiService = context.getBean(RpcApiService.class); - appT.addService(rpcApiService); - appT.initServices(parameter); - appT.startServices(); - appT.startup(); - tronNetDelegate = context.getBean(TronNetDelegate.class); - rpcApiService.blockUntilShutdown(); + @BeforeClass + public static void init() throws Exception { + executorService.execute(() -> { + logger.info("Full node running."); + Args.setParam( + new String[]{ + "--output-directory", dbPath, + "--storage-db-directory", dbDirectory, + "--storage-index-directory", indexDirectory + }, + "config.conf" + ); + CommonParameter parameter = Args.getInstance(); + parameter.setNodeListenPort(port); + parameter.getSeedNode().getAddressList().clear(); + parameter.setNodeExternalIp(Constant.LOCAL_HOST); + context = new TronApplicationContext(DefaultConfig.class); + appT = ApplicationFactory.create(context); + rpcApiService = context.getBean(RpcApiService.class); + appT.addService(rpcApiService); + appT.initServices(parameter); + appT.startServices(); + appT.startup(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + //ignore } + tronNetDelegate = context.getBean(TronNetDelegate.class); + rpcApiService.blockUntilShutdown(); }); int tryTimes = 0; do { @@ -108,8 +110,8 @@ public void run() { } while (++tryTimes < 100 && tronNetDelegate == null); } - @After - public void destroy() { + @AfterClass + public static void destroy() { Collection peerConnections = ReflectUtils .invokeMethod(tronNetDelegate, "getActivePeer"); for (PeerConnection peer : peerConnections) { From 27f2255596ef335890a67af153b990b57c29fcdb Mon Sep 17 00:00:00 2001 From: Asuka Date: Fri, 14 Apr 2023 16:10:36 +0800 Subject: [PATCH 131/142] func(interface): remove the added field --- framework/src/main/java/org/tron/core/Wallet.java | 2 -- protocol/src/main/protos/api/api.proto | 2 -- 2 files changed, 4 deletions(-) diff --git a/framework/src/main/java/org/tron/core/Wallet.java b/framework/src/main/java/org/tron/core/Wallet.java index 02d1d1d2f9f..487d6aaa886 100755 --- a/framework/src/main/java/org/tron/core/Wallet.java +++ b/framework/src/main/java/org/tron/core/Wallet.java @@ -3034,8 +3034,6 @@ public Transaction callConstantContract(TransactionCapsule trxCap, TransactionResultCapsule ret = new TransactionResultCapsule(); builder.setEnergyUsed(result.getEnergyUsed()); - builder.setBlockNumber(headBlockCapsule.getNum()); - builder.setBlockHash(ByteString.copyFrom(headBlockCapsule.getBlockId().getBytes())); builder.setEnergyPenalty(result.getEnergyPenaltyTotal()); builder.addConstantResult(ByteString.copyFrom(result.getHReturn())); result.getLogInfoList().forEach(logInfo -> diff --git a/protocol/src/main/protos/api/api.proto b/protocol/src/main/protos/api/api.proto index 57bd5a4e748..70297d0959b 100644 --- a/protocol/src/main/protos/api/api.proto +++ b/protocol/src/main/protos/api/api.proto @@ -1201,8 +1201,6 @@ message TransactionExtention { repeated TransactionInfo.Log logs = 6; repeated InternalTransaction internal_transactions = 7; int64 energy_penalty = 8; - int64 block_number = 9; - bytes block_hash = 10; } message EstimateEnergyMessage { From 403da93b5c07b2994bd4cfbd4b62cd07bd7f45b0 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Fri, 14 Apr 2023 19:25:30 +0800 Subject: [PATCH 132/142] fix(net):optimize BaseNet --- framework/src/test/java/org/tron/core/net/BaseNet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/test/java/org/tron/core/net/BaseNet.java b/framework/src/test/java/org/tron/core/net/BaseNet.java index 6af079a0197..805f8aa76a4 100644 --- a/framework/src/test/java/org/tron/core/net/BaseNet.java +++ b/framework/src/test/java/org/tron/core/net/BaseNet.java @@ -97,7 +97,7 @@ public static void init() throws Exception { appT.startServices(); appT.startup(); try { - Thread.sleep(1000); + Thread.sleep(2000); } catch (InterruptedException e) { //ignore } From 66a646e6fa2bc609ed6e319acabe022a07b4978d Mon Sep 17 00:00:00 2001 From: "morgan.peng" Date: Thu, 30 Mar 2023 20:13:39 +0800 Subject: [PATCH 133/142] feat(db): prune lite node data automatically Prune lite node data automatically --- .../common/storage/prune/ChainDataPruner.java | 149 +++++++++++++ .../java/org/tron/core/ChainBaseManager.java | 12 +- .../org/tron/core/db2/core/SnapshotRoot.java | 4 + .../src/main/java/org/tron/core/Constant.java | 4 + .../org/tron/core/config/args/Storage.java | 77 +++++++ .../java/org/tron/core/config/args/Args.java | 1 + .../main/java/org/tron/core/db/Manager.java | 4 + .../net/message/handshake/HelloMessage.java | 21 +- framework/src/main/resources/config.conf | 11 + .../storage/prune/ChainDataPrunerTest.java | 202 ++++++++++++++++++ framework/src/test/resources/config-test.conf | 11 + 11 files changed, 492 insertions(+), 4 deletions(-) create mode 100644 chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java create mode 100644 framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java diff --git a/chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java b/chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java new file mode 100644 index 00000000000..ed6cc3c37d9 --- /dev/null +++ b/chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java @@ -0,0 +1,149 @@ +package org.tron.common.storage.prune; + +import com.google.common.primitives.Longs; +import com.google.common.util.concurrent.ThreadFactoryBuilder; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import javax.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.Commons; +import org.tron.core.ChainBaseManager; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.db2.common.Flusher; +import org.tron.core.db2.common.Value; +import org.tron.core.db2.common.WrappedByteArray; +import org.tron.core.db2.core.SnapshotRoot; + +@Slf4j(topic = "db") +@Component +public class ChainDataPruner { + + private static final String BLOCK_INDEX_STORE_NAME = "block-index"; + private static final String BLOCK_STORE_NAME = "block"; + private static final String TRANSACTION_STORE_NAME = "trans"; + private static final String TRANSACTION_RET_STORE_NAME = "transactionRetStore"; + private static final Set PRUNE_DBS = new HashSet<>(Arrays.asList(BLOCK_INDEX_STORE_NAME + , BLOCK_STORE_NAME, TRANSACTION_STORE_NAME, TRANSACTION_RET_STORE_NAME)); + private long blocksToRetain = CommonParameter.getInstance().getStorage(). + getDbAutoPruneRetain(); + private long blocksBatchFlush = CommonParameter.getInstance().getStorage().getDbAutoPruneBatch(); + private static Map snapshotRootMap = new ConcurrentHashMap<>(); + + private ScheduledExecutorService pruneExecutor = null; + + @Autowired + private ChainBaseManager chainBaseManager; + + @PostConstruct + public void init() { + if ((!chainBaseManager.isLiteNode()) || + (!CommonParameter.getInstance().getStorage().isDbAutoPrune())) { + return; + } + pruneExecutor = Executors.newSingleThreadScheduledExecutor( + new ThreadFactoryBuilder().setNameFormat("db-prune-thread-%d").build()); + pruneExecutor.scheduleWithFixedDelay(() -> { + try { + if (!shouldBeginPrune()) { + return; + } + prune(); + } catch (InterruptedException e) { + logger.warn("Prune chain data thread interrupted!"); + Thread.currentThread().interrupt(); + } + }, 60, + CommonParameter.getInstance().getStorage().getDbAutoPruneFrequency(), TimeUnit.SECONDS); + } + + private boolean shouldBeginPrune() { + OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC); + int currentHour = now.getHour(); + return currentHour >= 20 || currentHour < 2; + } + + public static void register(String dbName, SnapshotRoot snapshotRoot) { + if ((!CommonParameter.getInstance().getStorage().isDbAutoPrune()) + ||(!PRUNE_DBS.contains(dbName))) { + return; + } + snapshotRootMap.put(dbName, snapshotRoot); + } + + public void prune() throws InterruptedException { + long lowestBlockNumber = chainBaseManager.getBlockStore().getLimitNumber(1, 1). + stream().map(BlockCapsule::getNum).findFirst().get(); + long latestBlockNumber = chainBaseManager.getDynamicPropertiesStore(). + getLatestBlockHeaderNumberFromDB(); + if (latestBlockNumber - lowestBlockNumber + 1 > blocksToRetain) { + doPrune(lowestBlockNumber, latestBlockNumber); + } + } + + private void doPrune(long lowestBlockNumber, long latestBlockNumber) { + long toFetchCount = + Math.min((latestBlockNumber - lowestBlockNumber + 1 - blocksToRetain), blocksBatchFlush); + List blockCapsuleList = chainBaseManager.getBlockStore() + .getLimitNumber(lowestBlockNumber, toFetchCount); + Map blockIdBatch = new HashMap<>(); + Map blockNumBatch = new HashMap<>(); + Map transIdBatch = new HashMap<>(); + prepareWriteBatch(blockIdBatch, blockNumBatch, transIdBatch, blockCapsuleList); + flushDb(blockIdBatch, blockNumBatch, transIdBatch); + } + + private void flushDb(Map blockIdBatch, + Map blockNumBatch, + Map transIdBatch) { + SnapshotRoot transactionRoot = snapshotRootMap.get(TRANSACTION_STORE_NAME); + ((Flusher)transactionRoot.getDb()).flush(transIdBatch); + SnapshotRoot transactionRetRoot = snapshotRootMap.get(TRANSACTION_RET_STORE_NAME); + ((Flusher)transactionRetRoot.getDb()).flush(blockNumBatch); + SnapshotRoot blockIndexRoot = snapshotRootMap.get(BLOCK_INDEX_STORE_NAME); + ((Flusher)blockIndexRoot.getDb()).flush(blockNumBatch); + SnapshotRoot blockRoot = snapshotRootMap.get(BLOCK_STORE_NAME); + ((Flusher)blockRoot.getDb()).flush(blockIdBatch); + } + + private void prepareWriteBatch ( + Map blockIdBatch, + Map blockNumBatch, + Map transIdBatch, + List blockCapsuleList) { + for (BlockCapsule blockCapsule: blockCapsuleList) { + blockIdBatch.put(WrappedByteArray.of(blockCapsule.getBlockId().getBytes()), + WrappedByteArray.of(Value.of(Value.Operator.DELETE, null).getBytes())); + blockNumBatch.put(WrappedByteArray.of(Longs.toByteArray(blockCapsule.getNum())), + WrappedByteArray.of(Value.of(Value.Operator.DELETE, null).getBytes())); + blockCapsule.getTransactions().forEach(tx-> transIdBatch.put(WrappedByteArray.of(tx. + getTransactionId().getBytes()), WrappedByteArray.of(Value.of(Value.Operator.DELETE, + null).getBytes()))); + } + } + + public void shutdown() { + if (Objects.nonNull(pruneExecutor)) { + try { + pruneExecutor.shutdown(); + } catch (Exception e) { + logger.error("Chain pruner shutdown error: {}", e.getMessage()); + } + } + } + +} diff --git a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java index c9ced891ee6..9511735f22a 100644 --- a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java +++ b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java @@ -11,6 +11,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.tron.common.parameter.CommonParameter; import org.tron.common.storage.metric.DbStatService; import org.tron.common.utils.ForkController; import org.tron.common.utils.Sha256Hash; @@ -241,8 +242,6 @@ public class ChainBaseManager { @Setter private NodeType nodeType; - @Getter - @Setter private long lowestBlockNum = -1; // except num = 0. public void closeOneStore(ITronChainBase database) { @@ -431,6 +430,15 @@ private void init() { this.nodeType = getLowestBlockNum() > 1 ? NodeType.LITE : NodeType.FULL; } + public long getLowestBlockNum(){ + if(isLiteNode() && CommonParameter.getInstance().getStorage().isDbAutoPrune()) { + return this.blockIndexStore.getLimitNumber(1, 1).stream() + .map(BlockId::getNum).findFirst().orElseThrow( + () -> new IllegalArgumentException("LowestBlockNum not found!")); + } + return lowestBlockNum; + } + public boolean isLiteNode() { return getNodeType() == NodeType.LITE; } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java index 709e2ae1b62..66173ea45a1 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java @@ -2,17 +2,20 @@ import com.google.common.collect.Maps; import com.google.common.collect.Streams; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; import lombok.Getter; import org.tron.common.cache.CacheManager; import org.tron.common.cache.CacheType; import org.tron.common.cache.TronCache; import org.tron.common.parameter.CommonParameter; +import org.tron.common.storage.prune.ChainDataPruner; import org.tron.common.utils.ByteArray; import org.tron.core.ChainBaseManager; import org.tron.core.capsule.AccountCapsule; @@ -38,6 +41,7 @@ public SnapshotRoot(DB db) { if (CACHE_DBS.contains(this.db.getDbName())) { this.cache = CacheManager.allocate(CacheType.findByType(this.db.getDbName())); } + ChainDataPruner.register(this.db.getDbName(), this); } private boolean needOptAsset() { diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 2f08df3e931..9044af43ca4 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -1,5 +1,7 @@ package org.tron.core; +import org.tron.core.config.Parameter.ChainConstant; + public class Constant { //config for testnet, mainnet, beta @@ -39,6 +41,8 @@ public class Constant { public static final int ONE_HUNDRED = 100; public static final int ONE_THOUSAND = 1000; + public static final long ONE_DAY_BLOCKS_PREDICT = 24 * 60 * 60 * 1000 / ChainConstant.BLOCK_PRODUCED_INTERVAL; + public static final byte[] ZTRON_EXPANDSEED_PERSONALIZATION = {'Z', 't', 'r', 'o', 'n', '_', 'E', 'x', 'p', 'a', 'n', 'd', 'S', 'e', 'e', 'd'}; diff --git a/common/src/main/java/org/tron/core/config/args/Storage.java b/common/src/main/java/org/tron/core/config/args/Storage.java index 778d4d0141c..9f2182816f3 100644 --- a/common/src/main/java/org/tron/core/config/args/Storage.java +++ b/common/src/main/java/org/tron/core/config/args/Storage.java @@ -32,6 +32,7 @@ import org.tron.common.utils.DbOptionalsUtils; import org.tron.common.utils.FileUtil; import org.tron.common.utils.Property; +import org.tron.core.Constant; /** * Custom storage configurations @@ -54,6 +55,10 @@ public class Storage { private static final String ESTIMATED_TRANSACTIONS_CONFIG_KEY = "storage.txCache.estimatedTransactions"; private static final String SNAPSHOT_MAX_FLUSH_COUNT_CONFIG_KEY = "storage.snapshot.maxFlushCount"; + private static final String DB_AUTO_PRUNE_SWITCH_CONFIG_KEY = "storage.prune.enable"; + private static final String DB_AUTO_PRUNE_RETAIN_CONFIG_KEY = "storage.prune.retain"; + private static final String DB_AUTO_PRUNE_FREQUENCY_CONFIG_KEY = "storage.prune.frequency"; + private static final String DB_AUTO_PRUNE_BATCH_CONFIG_KEY = "storage.prune.batch"; private static final String PROPERTIES_CONFIG_KEY = "storage.properties"; private static final String PROPERTIES_CONFIG_DB_KEY = "storage"; private static final String PROPERTIES_CONFIG_DEFAULT_KEY = "default"; @@ -91,6 +96,11 @@ public class Storage { private static final boolean DEFAULT_CHECKPOINT_SYNC = true; private static final int DEFAULT_ESTIMATED_TRANSACTIONS = 1000; private static final int DEFAULT_SNAPSHOT_MAX_FLUSH_COUNT = 1; + private static final boolean DEFAULT_DB_AUTO_PRUNE_SWITCH = false; + private static final int DEFAULT_DB_AUTO_PRUNE_RETAIN = 864000; + private static final int DEFAULT_DB_AUTO_PRUNE_FREQUENCY = 3; + private static final int DEFAULT_DB_AUTO_PRUNE_BATCH = 50; + private Config storage; /** @@ -112,6 +122,22 @@ public class Storage { @Setter private int maxFlushCount; + @Getter + @Setter + private boolean dbAutoPrune; + + @Getter + @Setter + private int dbAutoPruneRetain; + + @Getter + @Setter + private int dbAutoPruneFrequency; + + @Getter + @Setter + private int dbAutoPruneBatch; + /** * Index storage directory: /path/to/{indexDirectory} */ @@ -182,6 +208,57 @@ public static int getSnapshotMaxFlushCountFromConfig(final Config config) { return maxFlushCountConfig; } + public void setDbAutoPruneInfo(final Config config) { + setDbAutoPrune(Storage.getDbAutoPruneSwitchFromConfig(config)); + setDbAutoPruneRetain(Storage.getDbAutoPruneRetainFromConfig(config)); + setDbAutoPruneFrequency( + Storage.getDbAutoPruneFrequencyFromConfig(config)); + setDbAutoPruneBatch(Storage.getDbAutoPruneBatchFromConfig(config)); + } + + public static boolean getDbAutoPruneSwitchFromConfig(final Config config) { + return config.hasPath(DB_AUTO_PRUNE_SWITCH_CONFIG_KEY) + ? config.getBoolean(DB_AUTO_PRUNE_SWITCH_CONFIG_KEY) : DEFAULT_DB_AUTO_PRUNE_SWITCH; + } + + public static int getDbAutoPruneRetainFromConfig(final Config config) { + if (!config.hasPath(DB_AUTO_PRUNE_RETAIN_CONFIG_KEY)) { + return DEFAULT_DB_AUTO_PRUNE_RETAIN; + } + int dbAutoPruneRetain = config.getInt(DB_AUTO_PRUNE_RETAIN_CONFIG_KEY); + if (dbAutoPruneRetain < 30 * Constant.ONE_DAY_BLOCKS_PREDICT) { + throw new IllegalArgumentException( + "[storage.prune.retain] value must not be less than 864000!"); + } + return dbAutoPruneRetain; + } + + public static int getDbAutoPruneFrequencyFromConfig(final Config config) { + if (!config.hasPath(DB_AUTO_PRUNE_FREQUENCY_CONFIG_KEY)) { + return DEFAULT_DB_AUTO_PRUNE_FREQUENCY; + } + int dbAutoPruneFrequency = config.getInt(DB_AUTO_PRUNE_FREQUENCY_CONFIG_KEY); + if (dbAutoPruneFrequency < 1) { + throw new IllegalArgumentException("[storage.prune.frequency] value must not be less than " + + "1!"); + } + return dbAutoPruneFrequency; + } + + public static int getDbAutoPruneBatchFromConfig(final Config config) { + if (!config.hasPath(DB_AUTO_PRUNE_BATCH_CONFIG_KEY)) { + return DEFAULT_DB_AUTO_PRUNE_BATCH; + } + int dbAutoPruneBatch = config.getInt(DB_AUTO_PRUNE_BATCH_CONFIG_KEY); + if (dbAutoPruneBatch < 1) { + throw new IllegalArgumentException("[storage.prune.batch] value must not be less than 1!"); + } + if (dbAutoPruneBatch > 50) { + throw new IllegalArgumentException("[storage.prune.batch] value must not be more than 50!"); + } + return dbAutoPruneBatch; + } + public static Boolean getContractParseSwitchFromConfig(final Config config) { return config.hasPath(EVENT_SUBSCRIBE_CONTRACT_PARSE) ? config.getBoolean(EVENT_SUBSCRIBE_CONTRACT_PARSE) 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 858f0d42d86..ace342771a1 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 @@ -522,6 +522,7 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.storage.setEstimatedBlockTransactions( Storage.getEstimatedTransactionsFromConfig(config)); PARAMETER.storage.setMaxFlushCount(Storage.getSnapshotMaxFlushCountFromConfig(config)); + PARAMETER.storage.setDbAutoPruneInfo(config); PARAMETER.storage.setDefaultDbOptions(config); PARAMETER.storage.setPropertyMapFromConfig(config); diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 8787c70aeb8..ac91b66bfac 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -68,6 +68,7 @@ import org.tron.common.prometheus.MetricLabels; import org.tron.common.prometheus.Metrics; import org.tron.common.runtime.RuntimeImpl; +import org.tron.common.storage.prune.ChainDataPruner; import org.tron.common.utils.ByteArray; import org.tron.common.utils.JsonUtil; import org.tron.common.utils.Pair; @@ -224,6 +225,8 @@ public class Manager { @Autowired @Getter private ChainBaseManager chainBaseManager; + @Autowired + private ChainDataPruner chainDataPruner; // transactions cache private BlockingQueue pendingTransactions; @Getter @@ -1911,6 +1914,7 @@ public NullifierStore getNullifierStore() { public void closeAllStore() { logger.info("******** Begin to close db. ********"); + chainDataPruner.shutdown(); chainBaseManager.closeAllStore(); logger.info("******** End to close db. ********"); } diff --git a/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java b/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java index 9efb223fdb7..40d6ff7f51b 100755 --- a/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java +++ b/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java @@ -3,9 +3,12 @@ import com.google.protobuf.ByteString; import lombok.Getter; import org.apache.commons.lang3.StringUtils; +import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.Commons; import org.tron.common.utils.StringUtil; import org.tron.core.ChainBaseManager; +import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; import org.tron.core.config.args.Args; import org.tron.core.net.message.MessageTypes; @@ -59,14 +62,28 @@ public HelloMessage(Node from, long timestamp, ChainBaseManager chainBaseManager builder.setSolidBlockId(sBlockId); builder.setHeadBlockId(hBlockId); builder.setNodeType(chainBaseManager.getNodeType().getType()); - builder.setLowestBlockNum(chainBaseManager.isLiteNode() - ? chainBaseManager.getLowestBlockNum() : 0); + builder.setLowestBlockNum(calculateLowestBlockNum(chainBaseManager)); this.helloMessage = builder.build(); this.type = MessageTypes.P2P_HELLO.asByte(); this.data = this.helloMessage.toByteArray(); } + public long calculateLowestBlockNum(ChainBaseManager chainBaseManager) { + if (!chainBaseManager.isLiteNode()) { + return 0; + } + if (!CommonParameter.getInstance().getStorage().isDbAutoPrune()) { + return chainBaseManager.getLowestBlockNum(); + } + long lowestBlockNum = chainBaseManager.getLowestBlockNum(); + long latestBlockNum = chainBaseManager.getDynamicPropertiesStore() + .getLatestBlockHeaderNumberFromDB(); + long retainBlocksSafeIn2Days = CommonParameter.getInstance().getStorage() + .getDbAutoPruneRetain() - 2 * Constant.ONE_DAY_BLOCKS_PREDICT; + return Math.max(latestBlockNum - retainBlocksSafeIn2Days + 1, lowestBlockNum); + } + public void setHelloMessage(Protocol.HelloMessage helloMessage) { this.helloMessage = helloMessage; this.data = this.helloMessage.toByteArray(); diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 47635540017..2caec06aaeb 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -95,6 +95,17 @@ storage { # the estimated number of block transactions (default 1000, min 100, max 10000). # so the total number of cached transactions is 65536 * txCache.estimatedTransactions # txCache.estimatedTransactions = 1000 + + # prune = { + # prune enable switch + # enable = true + # retain number of blocks after prune + # retain = 864000 + # seconds between two prune operations + # frequency = 3 + # the number of blocks prune once + # batch = 50 + # } } node.discovery = { diff --git a/framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java b/framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java new file mode 100644 index 00000000000..7d7c9d8ae56 --- /dev/null +++ b/framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java @@ -0,0 +1,202 @@ +package org.tron.common.storage.prune; + +import com.google.common.primitives.Longs; +import com.google.protobuf.ByteString; +import java.io.File; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.crypto.ECKey; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.common.utils.ReflectUtils; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.ChainBaseManager; +import org.tron.core.Constant; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.capsule.TransactionInfoCapsule; +import org.tron.core.capsule.TransactionRetCapsule; +import org.tron.core.capsule.utils.BlockUtil; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.core.consensus.ConsensusService; +import org.tron.core.db.BlockIndexStore; +import org.tron.core.db.BlockStore; +import org.tron.core.db.Manager; +import org.tron.core.db.TransactionStore; +import org.tron.core.db2.core.Chainbase; +import org.tron.core.exception.ItemNotFoundException; +import org.tron.core.store.DynamicPropertiesStore; +import org.tron.core.store.TransactionRetStore; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.contract.BalanceContract; + + + +@Slf4j +public class ChainDataPrunerTest { + + private static Manager dbManager; + private static ChainDataPruner chainDataPruner; + private static ChainBaseManager chainBaseManager; + private static ConsensusService consensusService; + private static TronApplicationContext context; + private static BlockCapsule blockCapsule1; + private static BlockCapsule blockCapsule2; + private static String dbPath = "output_pruner_test"; + private static AtomicInteger port = new AtomicInteger(0); + + @Before + public void init() { + Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); + Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); + context = new TronApplicationContext(DefaultConfig.class); + + dbManager = context.getBean(Manager.class); + chainDataPruner = context.getBean(ChainDataPruner.class); + consensusService = context.getBean(ConsensusService.class); + consensusService.start(); + chainBaseManager = dbManager.getChainBaseManager(); + } + + @Test + public void initTest() { + chainDataPruner.init(); + Assert.assertNull(ReflectUtils.getFieldValue(chainDataPruner, "pruneExecutor")); + Assert.assertEquals(0, chainBaseManager.getLowestBlockNum()); + } + + + @Test + public void pruneTest() { + try { + blockCapsule1 = BlockUtil.newGenesisBlockCapsule(); + blockCapsule2 = + new BlockCapsule( + 2, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + blockCapsule1.getBlockId().toString()))), + 0, + ByteString.copyFrom( + ECKey.fromPrivate( + ByteArray.fromHexString( + Args.getLocalWitnesses().getPrivateKey())) + .getAddress())); + BlockCapsule blockCapsule3 = + new BlockCapsule( + 3, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + blockCapsule2.getBlockId().toString()))), + 0, + ByteString.copyFrom( + ECKey.fromPrivate( + ByteArray.fromHexString( + Args.getLocalWitnesses().getPrivateKey())) + .getAddress())); + BlockCapsule blockCapsule4 = + new BlockCapsule( + 4, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + blockCapsule3.getBlockId().toString()))), + 0, + ByteString.copyFrom( + ECKey.fromPrivate( + ByteArray.fromHexString( + Args.getLocalWitnesses().getPrivateKey())) + .getAddress())); + BlockCapsule blockCapsule5 = + new BlockCapsule( + 5, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + blockCapsule4.getBlockId().toString()))), + 0, + ByteString.copyFrom( + ECKey.fromPrivate( + ByteArray.fromHexString( + Args.getLocalWitnesses().getPrivateKey())) + .getAddress())); + final BlockStore blockStore = chainBaseManager.getBlockStore(); + final TransactionStore trxStore = chainBaseManager.getTransactionStore(); + final BlockIndexStore blockIndexStore = chainBaseManager.getBlockIndexStore(); + final TransactionRetStore transactionRetStore = chainBaseManager.getTransactionRetStore(); + final DynamicPropertiesStore dynamicPropertiesStore = + chainBaseManager.getDynamicPropertiesStore(); + // save in database with block number + BalanceContract.TransferContract tc = + BalanceContract.TransferContract.newBuilder() + .setAmount(10) + .setOwnerAddress(ByteString.copyFromUtf8("aaa")) + .setToAddress(ByteString.copyFromUtf8("bbb")) + .build(); + TransactionCapsule trx = new TransactionCapsule(tc, ContractType.TransferContract); + trx.setBlockNum(blockCapsule2.getNum()); + TransactionInfoCapsule transactionInfoCapsule = new TransactionInfoCapsule(); + transactionInfoCapsule.setId(trx.getTransactionId().getBytes()); + transactionInfoCapsule.setFee(1000L); + transactionInfoCapsule.setBlockNumber(blockCapsule2.getNum()); + transactionInfoCapsule.setBlockTimeStamp(200L); + TransactionRetCapsule transactionRetCapsule = new TransactionRetCapsule(); + transactionRetCapsule.addTransactionInfo(transactionInfoCapsule.getInstance()); + blockCapsule2.addTransaction(trx); + blockCapsule2.setMerkleRoot(); + blockCapsule2.sign( + ByteArray.fromHexString(Args.getLocalWitnesses().getPrivateKey())); + trxStore.put(trx.getTransactionId().getBytes(), trx); + blockStore.put(blockCapsule1.getBlockId().getBytes(), blockCapsule1); + blockStore.put(blockCapsule2.getBlockId().getBytes(), blockCapsule2); + blockStore.put(blockCapsule3.getBlockId().getBytes(), blockCapsule3); + blockStore.put(blockCapsule4.getBlockId().getBytes(), blockCapsule4); + blockStore.put(blockCapsule5.getBlockId().getBytes(), blockCapsule5); + blockIndexStore.put(blockCapsule1.getBlockId()); + blockIndexStore.put(blockCapsule2.getBlockId()); + blockIndexStore.put(blockCapsule3.getBlockId()); + blockIndexStore.put(blockCapsule4.getBlockId()); + blockIndexStore.put(blockCapsule5.getBlockId()); + transactionRetStore.put(Longs.toByteArray(blockCapsule2.getNum()), transactionRetCapsule); + dynamicPropertiesStore.saveLatestBlockHeaderNumber(5L); + ReflectUtils.setFieldValue(chainDataPruner,"blocksToRetain",3); + List blockBytes = chainBaseManager.getBlockStore().getLimitNumber(2, + 1).stream().map(blockCapsule -> blockCapsule.getBlockId().getBytes()).collect( + Collectors.toList()); + chainDataPruner.prune(); + Thread.sleep(1000); + Boolean notFoundBlock2 = Boolean.FALSE; + try { + chainBaseManager.getBlockStore() + .getFromRoot(blockBytes.get(0)); + } catch (ItemNotFoundException e) { + notFoundBlock2 = Boolean.TRUE; + } + Assert.assertTrue(chainBaseManager.getBlockStore() + .getFromRoot(blockCapsule1.getBlockId().getBytes()) != null); + Assert.assertTrue(notFoundBlock2); + Assert.assertTrue(chainBaseManager.getBlockStore() + .getFromRoot(blockCapsule3.getBlockId().getBytes()) != null); + Assert.assertTrue(chainBaseManager.getBlockStore() + .getFromRoot(blockCapsule4.getBlockId().getBytes()) != null); + Assert.assertTrue(chainBaseManager.getBlockStore() + .getFromRoot(blockCapsule5.getBlockId().getBytes()) != null); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @After + public void removeDb() { + Args.clearParam(); + context.destroy(); + FileUtil.deleteDir(new File(dbPath)); + } + +} diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index 76e99c8d4a1..7e42a1283b1 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -63,6 +63,17 @@ storage { needToUpdateAsset = false snapshot.maxFlushCount = 200 + prune = { + # prune enable switch + enable = true + # retain number of blocks after prune + retain = 864000 + # seconds between two prune operations + frequency = 3 + # the number of blocks prune once + batch = 50 + } + # the estimated number of block transactions (default 1000, min 100, max 10000). # so the total number of cached transactions is 65536 * txCache.estimatedTransactions txCache.estimatedTransactions = 50 From 0c3dc83bc3382f78a629a24ccc7bc5c463dc1d5e Mon Sep 17 00:00:00 2001 From: halibobo1205 <82020050+halibobo1205@users.noreply.github.com> Date: Mon, 17 Apr 2023 16:30:05 +0800 Subject: [PATCH 134/142] Revert "feat(db): prune lite node data automatically" --- .../common/storage/prune/ChainDataPruner.java | 149 ------------- .../java/org/tron/core/ChainBaseManager.java | 12 +- .../org/tron/core/db2/core/SnapshotRoot.java | 4 - .../src/main/java/org/tron/core/Constant.java | 4 - .../org/tron/core/config/args/Storage.java | 77 ------- .../java/org/tron/core/config/args/Args.java | 1 - .../main/java/org/tron/core/db/Manager.java | 4 - .../net/message/handshake/HelloMessage.java | 21 +- framework/src/main/resources/config.conf | 11 - .../storage/prune/ChainDataPrunerTest.java | 202 ------------------ framework/src/test/resources/config-test.conf | 11 - 11 files changed, 4 insertions(+), 492 deletions(-) delete mode 100644 chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java delete mode 100644 framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java diff --git a/chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java b/chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java deleted file mode 100644 index ed6cc3c37d9..00000000000 --- a/chainbase/src/main/java/org/tron/common/storage/prune/ChainDataPruner.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.tron.common.storage.prune; - -import com.google.common.primitives.Longs; -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.tron.common.parameter.CommonParameter; -import org.tron.common.utils.Commons; -import org.tron.core.ChainBaseManager; -import org.tron.core.capsule.BlockCapsule; -import org.tron.core.db2.common.Flusher; -import org.tron.core.db2.common.Value; -import org.tron.core.db2.common.WrappedByteArray; -import org.tron.core.db2.core.SnapshotRoot; - -@Slf4j(topic = "db") -@Component -public class ChainDataPruner { - - private static final String BLOCK_INDEX_STORE_NAME = "block-index"; - private static final String BLOCK_STORE_NAME = "block"; - private static final String TRANSACTION_STORE_NAME = "trans"; - private static final String TRANSACTION_RET_STORE_NAME = "transactionRetStore"; - private static final Set PRUNE_DBS = new HashSet<>(Arrays.asList(BLOCK_INDEX_STORE_NAME - , BLOCK_STORE_NAME, TRANSACTION_STORE_NAME, TRANSACTION_RET_STORE_NAME)); - private long blocksToRetain = CommonParameter.getInstance().getStorage(). - getDbAutoPruneRetain(); - private long blocksBatchFlush = CommonParameter.getInstance().getStorage().getDbAutoPruneBatch(); - private static Map snapshotRootMap = new ConcurrentHashMap<>(); - - private ScheduledExecutorService pruneExecutor = null; - - @Autowired - private ChainBaseManager chainBaseManager; - - @PostConstruct - public void init() { - if ((!chainBaseManager.isLiteNode()) || - (!CommonParameter.getInstance().getStorage().isDbAutoPrune())) { - return; - } - pruneExecutor = Executors.newSingleThreadScheduledExecutor( - new ThreadFactoryBuilder().setNameFormat("db-prune-thread-%d").build()); - pruneExecutor.scheduleWithFixedDelay(() -> { - try { - if (!shouldBeginPrune()) { - return; - } - prune(); - } catch (InterruptedException e) { - logger.warn("Prune chain data thread interrupted!"); - Thread.currentThread().interrupt(); - } - }, 60, - CommonParameter.getInstance().getStorage().getDbAutoPruneFrequency(), TimeUnit.SECONDS); - } - - private boolean shouldBeginPrune() { - OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC); - int currentHour = now.getHour(); - return currentHour >= 20 || currentHour < 2; - } - - public static void register(String dbName, SnapshotRoot snapshotRoot) { - if ((!CommonParameter.getInstance().getStorage().isDbAutoPrune()) - ||(!PRUNE_DBS.contains(dbName))) { - return; - } - snapshotRootMap.put(dbName, snapshotRoot); - } - - public void prune() throws InterruptedException { - long lowestBlockNumber = chainBaseManager.getBlockStore().getLimitNumber(1, 1). - stream().map(BlockCapsule::getNum).findFirst().get(); - long latestBlockNumber = chainBaseManager.getDynamicPropertiesStore(). - getLatestBlockHeaderNumberFromDB(); - if (latestBlockNumber - lowestBlockNumber + 1 > blocksToRetain) { - doPrune(lowestBlockNumber, latestBlockNumber); - } - } - - private void doPrune(long lowestBlockNumber, long latestBlockNumber) { - long toFetchCount = - Math.min((latestBlockNumber - lowestBlockNumber + 1 - blocksToRetain), blocksBatchFlush); - List blockCapsuleList = chainBaseManager.getBlockStore() - .getLimitNumber(lowestBlockNumber, toFetchCount); - Map blockIdBatch = new HashMap<>(); - Map blockNumBatch = new HashMap<>(); - Map transIdBatch = new HashMap<>(); - prepareWriteBatch(blockIdBatch, blockNumBatch, transIdBatch, blockCapsuleList); - flushDb(blockIdBatch, blockNumBatch, transIdBatch); - } - - private void flushDb(Map blockIdBatch, - Map blockNumBatch, - Map transIdBatch) { - SnapshotRoot transactionRoot = snapshotRootMap.get(TRANSACTION_STORE_NAME); - ((Flusher)transactionRoot.getDb()).flush(transIdBatch); - SnapshotRoot transactionRetRoot = snapshotRootMap.get(TRANSACTION_RET_STORE_NAME); - ((Flusher)transactionRetRoot.getDb()).flush(blockNumBatch); - SnapshotRoot blockIndexRoot = snapshotRootMap.get(BLOCK_INDEX_STORE_NAME); - ((Flusher)blockIndexRoot.getDb()).flush(blockNumBatch); - SnapshotRoot blockRoot = snapshotRootMap.get(BLOCK_STORE_NAME); - ((Flusher)blockRoot.getDb()).flush(blockIdBatch); - } - - private void prepareWriteBatch ( - Map blockIdBatch, - Map blockNumBatch, - Map transIdBatch, - List blockCapsuleList) { - for (BlockCapsule blockCapsule: blockCapsuleList) { - blockIdBatch.put(WrappedByteArray.of(blockCapsule.getBlockId().getBytes()), - WrappedByteArray.of(Value.of(Value.Operator.DELETE, null).getBytes())); - blockNumBatch.put(WrappedByteArray.of(Longs.toByteArray(blockCapsule.getNum())), - WrappedByteArray.of(Value.of(Value.Operator.DELETE, null).getBytes())); - blockCapsule.getTransactions().forEach(tx-> transIdBatch.put(WrappedByteArray.of(tx. - getTransactionId().getBytes()), WrappedByteArray.of(Value.of(Value.Operator.DELETE, - null).getBytes()))); - } - } - - public void shutdown() { - if (Objects.nonNull(pruneExecutor)) { - try { - pruneExecutor.shutdown(); - } catch (Exception e) { - logger.error("Chain pruner shutdown error: {}", e.getMessage()); - } - } - } - -} diff --git a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java index 9511735f22a..c9ced891ee6 100644 --- a/chainbase/src/main/java/org/tron/core/ChainBaseManager.java +++ b/chainbase/src/main/java/org/tron/core/ChainBaseManager.java @@ -11,7 +11,6 @@ import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.tron.common.parameter.CommonParameter; import org.tron.common.storage.metric.DbStatService; import org.tron.common.utils.ForkController; import org.tron.common.utils.Sha256Hash; @@ -242,6 +241,8 @@ public class ChainBaseManager { @Setter private NodeType nodeType; + @Getter + @Setter private long lowestBlockNum = -1; // except num = 0. public void closeOneStore(ITronChainBase database) { @@ -430,15 +431,6 @@ private void init() { this.nodeType = getLowestBlockNum() > 1 ? NodeType.LITE : NodeType.FULL; } - public long getLowestBlockNum(){ - if(isLiteNode() && CommonParameter.getInstance().getStorage().isDbAutoPrune()) { - return this.blockIndexStore.getLimitNumber(1, 1).stream() - .map(BlockId::getNum).findFirst().orElseThrow( - () -> new IllegalArgumentException("LowestBlockNum not found!")); - } - return lowestBlockNum; - } - public boolean isLiteNode() { return getNodeType() == NodeType.LITE; } diff --git a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java index 66173ea45a1..709e2ae1b62 100644 --- a/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java +++ b/chainbase/src/main/java/org/tron/core/db2/core/SnapshotRoot.java @@ -2,20 +2,17 @@ import com.google.common.collect.Maps; import com.google.common.collect.Streams; -import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import lombok.Getter; import org.tron.common.cache.CacheManager; import org.tron.common.cache.CacheType; import org.tron.common.cache.TronCache; import org.tron.common.parameter.CommonParameter; -import org.tron.common.storage.prune.ChainDataPruner; import org.tron.common.utils.ByteArray; import org.tron.core.ChainBaseManager; import org.tron.core.capsule.AccountCapsule; @@ -41,7 +38,6 @@ public SnapshotRoot(DB db) { if (CACHE_DBS.contains(this.db.getDbName())) { this.cache = CacheManager.allocate(CacheType.findByType(this.db.getDbName())); } - ChainDataPruner.register(this.db.getDbName(), this); } private boolean needOptAsset() { diff --git a/common/src/main/java/org/tron/core/Constant.java b/common/src/main/java/org/tron/core/Constant.java index 799f8bcd42b..bcbfecb7904 100644 --- a/common/src/main/java/org/tron/core/Constant.java +++ b/common/src/main/java/org/tron/core/Constant.java @@ -1,7 +1,5 @@ package org.tron.core; -import org.tron.core.config.Parameter.ChainConstant; - public class Constant { //config for testnet, mainnet, beta @@ -41,8 +39,6 @@ public class Constant { public static final int ONE_HUNDRED = 100; public static final int ONE_THOUSAND = 1000; - public static final long ONE_DAY_BLOCKS_PREDICT = 24 * 60 * 60 * 1000 / ChainConstant.BLOCK_PRODUCED_INTERVAL; - public static final byte[] ZTRON_EXPANDSEED_PERSONALIZATION = {'Z', 't', 'r', 'o', 'n', '_', 'E', 'x', 'p', 'a', 'n', 'd', 'S', 'e', 'e', 'd'}; diff --git a/common/src/main/java/org/tron/core/config/args/Storage.java b/common/src/main/java/org/tron/core/config/args/Storage.java index 9f2182816f3..778d4d0141c 100644 --- a/common/src/main/java/org/tron/core/config/args/Storage.java +++ b/common/src/main/java/org/tron/core/config/args/Storage.java @@ -32,7 +32,6 @@ import org.tron.common.utils.DbOptionalsUtils; import org.tron.common.utils.FileUtil; import org.tron.common.utils.Property; -import org.tron.core.Constant; /** * Custom storage configurations @@ -55,10 +54,6 @@ public class Storage { private static final String ESTIMATED_TRANSACTIONS_CONFIG_KEY = "storage.txCache.estimatedTransactions"; private static final String SNAPSHOT_MAX_FLUSH_COUNT_CONFIG_KEY = "storage.snapshot.maxFlushCount"; - private static final String DB_AUTO_PRUNE_SWITCH_CONFIG_KEY = "storage.prune.enable"; - private static final String DB_AUTO_PRUNE_RETAIN_CONFIG_KEY = "storage.prune.retain"; - private static final String DB_AUTO_PRUNE_FREQUENCY_CONFIG_KEY = "storage.prune.frequency"; - private static final String DB_AUTO_PRUNE_BATCH_CONFIG_KEY = "storage.prune.batch"; private static final String PROPERTIES_CONFIG_KEY = "storage.properties"; private static final String PROPERTIES_CONFIG_DB_KEY = "storage"; private static final String PROPERTIES_CONFIG_DEFAULT_KEY = "default"; @@ -96,11 +91,6 @@ public class Storage { private static final boolean DEFAULT_CHECKPOINT_SYNC = true; private static final int DEFAULT_ESTIMATED_TRANSACTIONS = 1000; private static final int DEFAULT_SNAPSHOT_MAX_FLUSH_COUNT = 1; - private static final boolean DEFAULT_DB_AUTO_PRUNE_SWITCH = false; - private static final int DEFAULT_DB_AUTO_PRUNE_RETAIN = 864000; - private static final int DEFAULT_DB_AUTO_PRUNE_FREQUENCY = 3; - private static final int DEFAULT_DB_AUTO_PRUNE_BATCH = 50; - private Config storage; /** @@ -122,22 +112,6 @@ public class Storage { @Setter private int maxFlushCount; - @Getter - @Setter - private boolean dbAutoPrune; - - @Getter - @Setter - private int dbAutoPruneRetain; - - @Getter - @Setter - private int dbAutoPruneFrequency; - - @Getter - @Setter - private int dbAutoPruneBatch; - /** * Index storage directory: /path/to/{indexDirectory} */ @@ -208,57 +182,6 @@ public static int getSnapshotMaxFlushCountFromConfig(final Config config) { return maxFlushCountConfig; } - public void setDbAutoPruneInfo(final Config config) { - setDbAutoPrune(Storage.getDbAutoPruneSwitchFromConfig(config)); - setDbAutoPruneRetain(Storage.getDbAutoPruneRetainFromConfig(config)); - setDbAutoPruneFrequency( - Storage.getDbAutoPruneFrequencyFromConfig(config)); - setDbAutoPruneBatch(Storage.getDbAutoPruneBatchFromConfig(config)); - } - - public static boolean getDbAutoPruneSwitchFromConfig(final Config config) { - return config.hasPath(DB_AUTO_PRUNE_SWITCH_CONFIG_KEY) - ? config.getBoolean(DB_AUTO_PRUNE_SWITCH_CONFIG_KEY) : DEFAULT_DB_AUTO_PRUNE_SWITCH; - } - - public static int getDbAutoPruneRetainFromConfig(final Config config) { - if (!config.hasPath(DB_AUTO_PRUNE_RETAIN_CONFIG_KEY)) { - return DEFAULT_DB_AUTO_PRUNE_RETAIN; - } - int dbAutoPruneRetain = config.getInt(DB_AUTO_PRUNE_RETAIN_CONFIG_KEY); - if (dbAutoPruneRetain < 30 * Constant.ONE_DAY_BLOCKS_PREDICT) { - throw new IllegalArgumentException( - "[storage.prune.retain] value must not be less than 864000!"); - } - return dbAutoPruneRetain; - } - - public static int getDbAutoPruneFrequencyFromConfig(final Config config) { - if (!config.hasPath(DB_AUTO_PRUNE_FREQUENCY_CONFIG_KEY)) { - return DEFAULT_DB_AUTO_PRUNE_FREQUENCY; - } - int dbAutoPruneFrequency = config.getInt(DB_AUTO_PRUNE_FREQUENCY_CONFIG_KEY); - if (dbAutoPruneFrequency < 1) { - throw new IllegalArgumentException("[storage.prune.frequency] value must not be less than " + - "1!"); - } - return dbAutoPruneFrequency; - } - - public static int getDbAutoPruneBatchFromConfig(final Config config) { - if (!config.hasPath(DB_AUTO_PRUNE_BATCH_CONFIG_KEY)) { - return DEFAULT_DB_AUTO_PRUNE_BATCH; - } - int dbAutoPruneBatch = config.getInt(DB_AUTO_PRUNE_BATCH_CONFIG_KEY); - if (dbAutoPruneBatch < 1) { - throw new IllegalArgumentException("[storage.prune.batch] value must not be less than 1!"); - } - if (dbAutoPruneBatch > 50) { - throw new IllegalArgumentException("[storage.prune.batch] value must not be more than 50!"); - } - return dbAutoPruneBatch; - } - public static Boolean getContractParseSwitchFromConfig(final Config config) { return config.hasPath(EVENT_SUBSCRIBE_CONTRACT_PARSE) ? config.getBoolean(EVENT_SUBSCRIBE_CONTRACT_PARSE) 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 a24b872795a..19962fbac8e 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 @@ -523,7 +523,6 @@ public static void setParam(final String[] args, final String confFileName) { PARAMETER.storage.setEstimatedBlockTransactions( Storage.getEstimatedTransactionsFromConfig(config)); PARAMETER.storage.setMaxFlushCount(Storage.getSnapshotMaxFlushCountFromConfig(config)); - PARAMETER.storage.setDbAutoPruneInfo(config); PARAMETER.storage.setDefaultDbOptions(config); PARAMETER.storage.setPropertyMapFromConfig(config); diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index 3519ec528eb..b1127029b46 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -69,7 +69,6 @@ import org.tron.common.prometheus.MetricLabels; import org.tron.common.prometheus.Metrics; import org.tron.common.runtime.RuntimeImpl; -import org.tron.common.storage.prune.ChainDataPruner; import org.tron.common.utils.ByteArray; import org.tron.common.utils.JsonUtil; import org.tron.common.utils.Pair; @@ -226,8 +225,6 @@ public class Manager { @Autowired @Getter private ChainBaseManager chainBaseManager; - @Autowired - private ChainDataPruner chainDataPruner; // transactions cache private BlockingQueue pendingTransactions; @Getter @@ -1915,7 +1912,6 @@ public NullifierStore getNullifierStore() { public void closeAllStore() { logger.info("******** Begin to close db. ********"); - chainDataPruner.shutdown(); chainBaseManager.closeAllStore(); logger.info("******** End to close db. ********"); } diff --git a/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java b/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java index 40d6ff7f51b..9efb223fdb7 100755 --- a/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java +++ b/framework/src/main/java/org/tron/core/net/message/handshake/HelloMessage.java @@ -3,12 +3,9 @@ import com.google.protobuf.ByteString; import lombok.Getter; import org.apache.commons.lang3.StringUtils; -import org.tron.common.parameter.CommonParameter; import org.tron.common.utils.ByteArray; -import org.tron.common.utils.Commons; import org.tron.common.utils.StringUtil; import org.tron.core.ChainBaseManager; -import org.tron.core.Constant; import org.tron.core.capsule.BlockCapsule; import org.tron.core.config.args.Args; import org.tron.core.net.message.MessageTypes; @@ -62,28 +59,14 @@ public HelloMessage(Node from, long timestamp, ChainBaseManager chainBaseManager builder.setSolidBlockId(sBlockId); builder.setHeadBlockId(hBlockId); builder.setNodeType(chainBaseManager.getNodeType().getType()); - builder.setLowestBlockNum(calculateLowestBlockNum(chainBaseManager)); + builder.setLowestBlockNum(chainBaseManager.isLiteNode() + ? chainBaseManager.getLowestBlockNum() : 0); this.helloMessage = builder.build(); this.type = MessageTypes.P2P_HELLO.asByte(); this.data = this.helloMessage.toByteArray(); } - public long calculateLowestBlockNum(ChainBaseManager chainBaseManager) { - if (!chainBaseManager.isLiteNode()) { - return 0; - } - if (!CommonParameter.getInstance().getStorage().isDbAutoPrune()) { - return chainBaseManager.getLowestBlockNum(); - } - long lowestBlockNum = chainBaseManager.getLowestBlockNum(); - long latestBlockNum = chainBaseManager.getDynamicPropertiesStore() - .getLatestBlockHeaderNumberFromDB(); - long retainBlocksSafeIn2Days = CommonParameter.getInstance().getStorage() - .getDbAutoPruneRetain() - 2 * Constant.ONE_DAY_BLOCKS_PREDICT; - return Math.max(latestBlockNum - retainBlocksSafeIn2Days + 1, lowestBlockNum); - } - public void setHelloMessage(Protocol.HelloMessage helloMessage) { this.helloMessage = helloMessage; this.data = this.helloMessage.toByteArray(); diff --git a/framework/src/main/resources/config.conf b/framework/src/main/resources/config.conf index 2caec06aaeb..47635540017 100644 --- a/framework/src/main/resources/config.conf +++ b/framework/src/main/resources/config.conf @@ -95,17 +95,6 @@ storage { # the estimated number of block transactions (default 1000, min 100, max 10000). # so the total number of cached transactions is 65536 * txCache.estimatedTransactions # txCache.estimatedTransactions = 1000 - - # prune = { - # prune enable switch - # enable = true - # retain number of blocks after prune - # retain = 864000 - # seconds between two prune operations - # frequency = 3 - # the number of blocks prune once - # batch = 50 - # } } node.discovery = { diff --git a/framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java b/framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java deleted file mode 100644 index 7d7c9d8ae56..00000000000 --- a/framework/src/test/java/org/tron/common/storage/prune/ChainDataPrunerTest.java +++ /dev/null @@ -1,202 +0,0 @@ -package org.tron.common.storage.prune; - -import com.google.common.primitives.Longs; -import com.google.protobuf.ByteString; -import java.io.File; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.tron.common.application.TronApplicationContext; -import org.tron.common.crypto.ECKey; -import org.tron.common.utils.ByteArray; -import org.tron.common.utils.FileUtil; -import org.tron.common.utils.ReflectUtils; -import org.tron.common.utils.Sha256Hash; -import org.tron.core.ChainBaseManager; -import org.tron.core.Constant; -import org.tron.core.capsule.BlockCapsule; -import org.tron.core.capsule.TransactionCapsule; -import org.tron.core.capsule.TransactionInfoCapsule; -import org.tron.core.capsule.TransactionRetCapsule; -import org.tron.core.capsule.utils.BlockUtil; -import org.tron.core.config.DefaultConfig; -import org.tron.core.config.args.Args; -import org.tron.core.consensus.ConsensusService; -import org.tron.core.db.BlockIndexStore; -import org.tron.core.db.BlockStore; -import org.tron.core.db.Manager; -import org.tron.core.db.TransactionStore; -import org.tron.core.db2.core.Chainbase; -import org.tron.core.exception.ItemNotFoundException; -import org.tron.core.store.DynamicPropertiesStore; -import org.tron.core.store.TransactionRetStore; -import org.tron.protos.Protocol.Transaction.Contract.ContractType; -import org.tron.protos.contract.BalanceContract; - - - -@Slf4j -public class ChainDataPrunerTest { - - private static Manager dbManager; - private static ChainDataPruner chainDataPruner; - private static ChainBaseManager chainBaseManager; - private static ConsensusService consensusService; - private static TronApplicationContext context; - private static BlockCapsule blockCapsule1; - private static BlockCapsule blockCapsule2; - private static String dbPath = "output_pruner_test"; - private static AtomicInteger port = new AtomicInteger(0); - - @Before - public void init() { - Args.setParam(new String[] {"-d", dbPath, "-w"}, Constant.TEST_CONF); - Args.getInstance().setNodeListenPort(10000 + port.incrementAndGet()); - context = new TronApplicationContext(DefaultConfig.class); - - dbManager = context.getBean(Manager.class); - chainDataPruner = context.getBean(ChainDataPruner.class); - consensusService = context.getBean(ConsensusService.class); - consensusService.start(); - chainBaseManager = dbManager.getChainBaseManager(); - } - - @Test - public void initTest() { - chainDataPruner.init(); - Assert.assertNull(ReflectUtils.getFieldValue(chainDataPruner, "pruneExecutor")); - Assert.assertEquals(0, chainBaseManager.getLowestBlockNum()); - } - - - @Test - public void pruneTest() { - try { - blockCapsule1 = BlockUtil.newGenesisBlockCapsule(); - blockCapsule2 = - new BlockCapsule( - 2, - Sha256Hash.wrap(ByteString.copyFrom( - ByteArray.fromHexString( - blockCapsule1.getBlockId().toString()))), - 0, - ByteString.copyFrom( - ECKey.fromPrivate( - ByteArray.fromHexString( - Args.getLocalWitnesses().getPrivateKey())) - .getAddress())); - BlockCapsule blockCapsule3 = - new BlockCapsule( - 3, - Sha256Hash.wrap(ByteString.copyFrom( - ByteArray.fromHexString( - blockCapsule2.getBlockId().toString()))), - 0, - ByteString.copyFrom( - ECKey.fromPrivate( - ByteArray.fromHexString( - Args.getLocalWitnesses().getPrivateKey())) - .getAddress())); - BlockCapsule blockCapsule4 = - new BlockCapsule( - 4, - Sha256Hash.wrap(ByteString.copyFrom( - ByteArray.fromHexString( - blockCapsule3.getBlockId().toString()))), - 0, - ByteString.copyFrom( - ECKey.fromPrivate( - ByteArray.fromHexString( - Args.getLocalWitnesses().getPrivateKey())) - .getAddress())); - BlockCapsule blockCapsule5 = - new BlockCapsule( - 5, - Sha256Hash.wrap(ByteString.copyFrom( - ByteArray.fromHexString( - blockCapsule4.getBlockId().toString()))), - 0, - ByteString.copyFrom( - ECKey.fromPrivate( - ByteArray.fromHexString( - Args.getLocalWitnesses().getPrivateKey())) - .getAddress())); - final BlockStore blockStore = chainBaseManager.getBlockStore(); - final TransactionStore trxStore = chainBaseManager.getTransactionStore(); - final BlockIndexStore blockIndexStore = chainBaseManager.getBlockIndexStore(); - final TransactionRetStore transactionRetStore = chainBaseManager.getTransactionRetStore(); - final DynamicPropertiesStore dynamicPropertiesStore = - chainBaseManager.getDynamicPropertiesStore(); - // save in database with block number - BalanceContract.TransferContract tc = - BalanceContract.TransferContract.newBuilder() - .setAmount(10) - .setOwnerAddress(ByteString.copyFromUtf8("aaa")) - .setToAddress(ByteString.copyFromUtf8("bbb")) - .build(); - TransactionCapsule trx = new TransactionCapsule(tc, ContractType.TransferContract); - trx.setBlockNum(blockCapsule2.getNum()); - TransactionInfoCapsule transactionInfoCapsule = new TransactionInfoCapsule(); - transactionInfoCapsule.setId(trx.getTransactionId().getBytes()); - transactionInfoCapsule.setFee(1000L); - transactionInfoCapsule.setBlockNumber(blockCapsule2.getNum()); - transactionInfoCapsule.setBlockTimeStamp(200L); - TransactionRetCapsule transactionRetCapsule = new TransactionRetCapsule(); - transactionRetCapsule.addTransactionInfo(transactionInfoCapsule.getInstance()); - blockCapsule2.addTransaction(trx); - blockCapsule2.setMerkleRoot(); - blockCapsule2.sign( - ByteArray.fromHexString(Args.getLocalWitnesses().getPrivateKey())); - trxStore.put(trx.getTransactionId().getBytes(), trx); - blockStore.put(blockCapsule1.getBlockId().getBytes(), blockCapsule1); - blockStore.put(blockCapsule2.getBlockId().getBytes(), blockCapsule2); - blockStore.put(blockCapsule3.getBlockId().getBytes(), blockCapsule3); - blockStore.put(blockCapsule4.getBlockId().getBytes(), blockCapsule4); - blockStore.put(blockCapsule5.getBlockId().getBytes(), blockCapsule5); - blockIndexStore.put(blockCapsule1.getBlockId()); - blockIndexStore.put(blockCapsule2.getBlockId()); - blockIndexStore.put(blockCapsule3.getBlockId()); - blockIndexStore.put(blockCapsule4.getBlockId()); - blockIndexStore.put(blockCapsule5.getBlockId()); - transactionRetStore.put(Longs.toByteArray(blockCapsule2.getNum()), transactionRetCapsule); - dynamicPropertiesStore.saveLatestBlockHeaderNumber(5L); - ReflectUtils.setFieldValue(chainDataPruner,"blocksToRetain",3); - List blockBytes = chainBaseManager.getBlockStore().getLimitNumber(2, - 1).stream().map(blockCapsule -> blockCapsule.getBlockId().getBytes()).collect( - Collectors.toList()); - chainDataPruner.prune(); - Thread.sleep(1000); - Boolean notFoundBlock2 = Boolean.FALSE; - try { - chainBaseManager.getBlockStore() - .getFromRoot(blockBytes.get(0)); - } catch (ItemNotFoundException e) { - notFoundBlock2 = Boolean.TRUE; - } - Assert.assertTrue(chainBaseManager.getBlockStore() - .getFromRoot(blockCapsule1.getBlockId().getBytes()) != null); - Assert.assertTrue(notFoundBlock2); - Assert.assertTrue(chainBaseManager.getBlockStore() - .getFromRoot(blockCapsule3.getBlockId().getBytes()) != null); - Assert.assertTrue(chainBaseManager.getBlockStore() - .getFromRoot(blockCapsule4.getBlockId().getBytes()) != null); - Assert.assertTrue(chainBaseManager.getBlockStore() - .getFromRoot(blockCapsule5.getBlockId().getBytes()) != null); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - @After - public void removeDb() { - Args.clearParam(); - context.destroy(); - FileUtil.deleteDir(new File(dbPath)); - } - -} diff --git a/framework/src/test/resources/config-test.conf b/framework/src/test/resources/config-test.conf index ef5ba73e891..c9602ef977b 100644 --- a/framework/src/test/resources/config-test.conf +++ b/framework/src/test/resources/config-test.conf @@ -63,17 +63,6 @@ storage { needToUpdateAsset = false snapshot.maxFlushCount = 200 - prune = { - # prune enable switch - enable = true - # retain number of blocks after prune - retain = 864000 - # seconds between two prune operations - frequency = 3 - # the number of blocks prune once - batch = 50 - } - # the estimated number of block transactions (default 1000, min 100, max 10000). # so the total number of cached transactions is 65536 * txCache.estimatedTransactions txCache.estimatedTransactions = 50 From bc2c141c226d83cc1898bf3728d34bd8479a5cbd Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 18 Apr 2023 11:16:02 +0800 Subject: [PATCH 135/142] feat(backup): increase the unit test of the backup module --- .../tron/common/backup/BackupManagerTest.java | 90 +++++++++++++++++++ .../common/backup/KeepAliveMessageTest.java | 32 +++++++ .../common/backup/UdpMessageTypeEnumTest.java | 23 +++++ 3 files changed, 145 insertions(+) create mode 100644 framework/src/test/java/org/tron/common/backup/BackupManagerTest.java create mode 100644 framework/src/test/java/org/tron/common/backup/KeepAliveMessageTest.java create mode 100644 framework/src/test/java/org/tron/common/backup/UdpMessageTypeEnumTest.java diff --git a/framework/src/test/java/org/tron/common/backup/BackupManagerTest.java b/framework/src/test/java/org/tron/common/backup/BackupManagerTest.java new file mode 100644 index 00000000000..8a5ff4f4bc2 --- /dev/null +++ b/framework/src/test/java/org/tron/common/backup/BackupManagerTest.java @@ -0,0 +1,90 @@ +package org.tron.common.backup; + +import java.lang.reflect.Field; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import org.junit.Assert; +import org.junit.Test; +import org.tron.common.backup.message.KeepAliveMessage; +import org.tron.common.backup.socket.UdpEvent; +import org.tron.common.parameter.CommonParameter; +import org.tron.core.Constant; +import org.tron.core.config.args.Args; + +public class BackupManagerTest { + + @Test + public void test() throws Exception { + String[] a = new String[0]; + Args.setParam(a, Constant.TESTNET_CONF); + CommonParameter parameter = CommonParameter.getInstance(); + parameter.setBackupPriority(8); + List members = new ArrayList<>(); + members.add("127.0.0.2"); + parameter.setBackupMembers(members); + + BackupManager manager = new BackupManager(); + + Field field = manager.getClass().getDeclaredField("localIp"); + field.setAccessible(true); + field.set(manager, "127.0.0.1"); + + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.MASTER); + + field = manager.getClass().getDeclaredField("executorService"); + field.setAccessible(true); + ScheduledExecutorService executorService = (ScheduledExecutorService) field.get(manager); + manager.init(); + executorService.shutdown(); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.INIT); + + /* ip not in the members */ + manager.setStatus(BackupManager.BackupStatusEnum.INIT); + KeepAliveMessage message = new KeepAliveMessage(false, 6); + InetSocketAddress address = new InetSocketAddress("127.0.0.3", 1000); + UdpEvent event = new UdpEvent(message, address); + manager.handleEvent(event); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.INIT); + + /* ip not the member */ + address = new InetSocketAddress("127.0.0.3", 1000); + message = new KeepAliveMessage(false, 6); + event = new UdpEvent(message, address); + manager.handleEvent(event); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.INIT); + + /* keepAliveMessage.getFlag() || peerPriority > priority */ + address = new InetSocketAddress("127.0.0.2", 1000); + message = new KeepAliveMessage(false, 6); + event = new UdpEvent(message, address); + manager.handleEvent(event); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.INIT); + + /* keepAliveMessage.getFlag() || peerPriority > priority */ + message = new KeepAliveMessage(false, 10); + event = new UdpEvent(message, address); + manager.handleEvent(event); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.SLAVER); + + /* keepAliveMessage.getFlag() || peerPriority > priority */ + manager.setStatus(BackupManager.BackupStatusEnum.INIT); + message = new KeepAliveMessage(true, 6); + event = new UdpEvent(message, address); + manager.handleEvent(event); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.SLAVER); + + manager.setStatus(BackupManager.BackupStatusEnum.MASTER); + message = new KeepAliveMessage(false, 10); + event = new UdpEvent(message, address); + manager.handleEvent(event); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.MASTER); + + message = new KeepAliveMessage(true, 10); + event = new UdpEvent(message, address); + manager.handleEvent(event); + Assert.assertEquals(manager.getStatus(), BackupManager.BackupStatusEnum.SLAVER); + + } +} diff --git a/framework/src/test/java/org/tron/common/backup/KeepAliveMessageTest.java b/framework/src/test/java/org/tron/common/backup/KeepAliveMessageTest.java new file mode 100644 index 00000000000..a93e044db03 --- /dev/null +++ b/framework/src/test/java/org/tron/common/backup/KeepAliveMessageTest.java @@ -0,0 +1,32 @@ +package org.tron.common.backup; + +import static org.tron.common.backup.message.UdpMessageTypeEnum.BACKUP_KEEP_ALIVE; + +import org.junit.Test; +import org.testng.Assert; +import org.tron.common.backup.message.KeepAliveMessage; +import org.tron.protos.Discover; + +public class KeepAliveMessageTest { + + @Test + public void test() throws Exception { + KeepAliveMessage m1 = new KeepAliveMessage(true, 10); + Assert.assertTrue(m1.getFlag()); + Assert.assertEquals(m1.getPriority(), 10); + Assert.assertEquals(m1.getType(), BACKUP_KEEP_ALIVE); + Assert.assertEquals(m1.getFrom(), null); + Assert.assertEquals(m1.getTimestamp(), 0); + Assert.assertEquals(m1.getData().length + 1, m1.getSendData().length); + + + Discover.BackupMessage backupMessage = Discover.BackupMessage.newBuilder() + .setFlag(true).setPriority(10).build(); + KeepAliveMessage m2 = new KeepAliveMessage(backupMessage.toByteArray()); + Assert.assertTrue(m2.getFlag()); + Assert.assertEquals(m2.getPriority(), 10); + Assert.assertEquals(m2.getType(), BACKUP_KEEP_ALIVE); + + Assert.assertEquals(m2.getMessageId().getBytes(), m1.getMessageId().getBytes()); + } +} diff --git a/framework/src/test/java/org/tron/common/backup/UdpMessageTypeEnumTest.java b/framework/src/test/java/org/tron/common/backup/UdpMessageTypeEnumTest.java new file mode 100644 index 00000000000..e3ded4a23e5 --- /dev/null +++ b/framework/src/test/java/org/tron/common/backup/UdpMessageTypeEnumTest.java @@ -0,0 +1,23 @@ +package org.tron.common.backup; + +import static org.tron.common.backup.message.UdpMessageTypeEnum.BACKUP_KEEP_ALIVE; +import static org.tron.common.backup.message.UdpMessageTypeEnum.UNKNOWN; + +import org.junit.Test; +import org.testng.Assert; +import org.tron.common.backup.message.UdpMessageTypeEnum; + +public class UdpMessageTypeEnumTest { + + @Test + public void test() { + UdpMessageTypeEnum type = UdpMessageTypeEnum.fromByte((byte) 5); + Assert.assertEquals(type.getType(), (byte) 0x05); + Assert.assertEquals(type, BACKUP_KEEP_ALIVE); + + + type = UdpMessageTypeEnum.fromByte((byte) 1); + Assert.assertEquals(type.getType(), (byte) 0xFF); + Assert.assertEquals(type, UNKNOWN); + } +} From 9d5d0e022d11fdb98910181fa8f1deeed435d214 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 18 Apr 2023 11:57:48 +0800 Subject: [PATCH 136/142] feat(net): optimize validSignature function --- .../main/java/org/tron/core/net/TronNetDelegate.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 3e7381a0504..7ff02250eb5 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -315,14 +315,16 @@ public void pushTransaction(TransactionCapsule trx) throws P2pException { } public void validSignature(BlockCapsule block) throws P2pException { + boolean flag; try { - if (!block.validateSignature(dbManager.getDynamicPropertiesStore(), - dbManager.getAccountStore())) { - throw new P2pException(TypeEnum.BLOCK_SIGN_ERROR, "valid signature failed."); - } - } catch (ValidateSignatureException e) { + flag = block.validateSignature(dbManager.getDynamicPropertiesStore(), + dbManager.getAccountStore()); + } catch (Exception e) { throw new P2pException(TypeEnum.BLOCK_SIGN_ERROR, e); } + if (!flag) { + throw new P2pException(TypeEnum.BLOCK_SIGN_ERROR, "valid signature failed."); + } } public boolean validBlock(BlockCapsule block) throws P2pException { From 747757b0030ff341e2a8d70340780b70150ca995 Mon Sep 17 00:00:00 2001 From: wubin01 Date: Tue, 18 Apr 2023 16:23:46 +0800 Subject: [PATCH 137/142] feat(net): optimize getBlockChainSummary logic --- framework/src/main/java/org/tron/core/db/Manager.java | 8 +++++--- .../src/main/java/org/tron/core/net/TronNetDelegate.java | 4 ++++ .../java/org/tron/core/net/service/sync/SyncService.java | 6 ++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/framework/src/main/java/org/tron/core/db/Manager.java b/framework/src/main/java/org/tron/core/db/Manager.java index b1127029b46..e7aadc7f4aa 100644 --- a/framework/src/main/java/org/tron/core/db/Manager.java +++ b/framework/src/main/java/org/tron/core/db/Manager.java @@ -193,7 +193,8 @@ public class Manager { @Getter @Setter private boolean isSyncMode; - + @Getter + private Object forkLock = new Object(); // map @Getter @Setter @@ -1269,8 +1270,9 @@ public void pushBlock(final BlockCapsule block) chainBaseManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp(), khaosDb.getHead(), khaosDb.getMiniStore().size(), khaosDb.getMiniUnlinkedStore().size()); - - switchFork(newBlock); + synchronized (forkLock) { + switchFork(newBlock); + } logger.info(SAVE_BLOCK, newBlock); logger.warn( diff --git a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java index 7ff02250eb5..47e13de6109 100644 --- a/framework/src/main/java/org/tron/core/net/TronNetDelegate.java +++ b/framework/src/main/java/org/tron/core/net/TronNetDelegate.java @@ -349,4 +349,8 @@ public boolean allowPBFT() { return chainBaseManager.getDynamicPropertiesStore().allowPBFT(); } + public Object getForkLock() { + return dbManager.getForkLock(); + } + } diff --git a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java index 86b775df6f8..5f7ab11f6c9 100644 --- a/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java +++ b/framework/src/main/java/org/tron/core/net/service/sync/SyncService.java @@ -23,7 +23,6 @@ import org.tron.core.capsule.BlockCapsule.BlockId; import org.tron.core.config.Parameter.NetConstants; import org.tron.core.config.args.Args; -import org.tron.core.exception.BadBlockException; import org.tron.core.exception.P2pException; import org.tron.core.exception.P2pException.TypeEnum; import org.tron.core.net.TronNetDelegate; @@ -114,7 +113,10 @@ public void syncNext(PeerConnection peer) { logger.warn("Peer {} is in sync", peer.getInetSocketAddress()); return; } - LinkedList chainSummary = getBlockChainSummary(peer); + LinkedList chainSummary; + synchronized (tronNetDelegate.getForkLock()) { + chainSummary = getBlockChainSummary(peer); + } peer.setSyncChainRequested(new Pair<>(chainSummary, System.currentTimeMillis())); peer.sendMessage(new SyncBlockChainMessage(chainSummary)); } catch (Exception e) { From 4e8152677f3ee5f03e0cafe55fafb663304f5483 Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Tue, 18 Apr 2023 16:44:51 +0800 Subject: [PATCH 138/142] optimize test case --- .../common/logsfilter/EventParserTest.java | 3 +++ .../test/java/org/tron/core/WalletTest.java | 6 ++++++ .../java/org/tron/core/db/ManagerTest.java | 21 +++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/framework/src/test/java/org/tron/common/logsfilter/EventParserTest.java b/framework/src/test/java/org/tron/common/logsfilter/EventParserTest.java index a9b06c0e039..b5339156d9a 100644 --- a/framework/src/test/java/org/tron/common/logsfilter/EventParserTest.java +++ b/framework/src/test/java/org/tron/common/logsfilter/EventParserTest.java @@ -11,6 +11,7 @@ import org.tron.common.crypto.Hash; import org.tron.common.runtime.TvmTestUtils; import org.tron.common.utils.ByteArray; +import org.tron.common.utils.WalletUtil; import org.tron.core.Wallet; import org.tron.core.vm.LogInfoTriggerParser; import org.tron.protos.contract.SmartContractOuterClass.SmartContract.ABI; @@ -57,6 +58,8 @@ public synchronized void testEventParser() { + "000000000"; ABI abi = TvmTestUtils.jsonStr2Abi(abiStr); + Assert.assertFalse(WalletUtil.isConstant(abi, new byte[3])); + byte[] data = ByteArray.fromHexString(dataStr); List topicList = new LinkedList<>(); topicList.add(Hash.sha3(eventSign.getBytes())); diff --git a/framework/src/test/java/org/tron/core/WalletTest.java b/framework/src/test/java/org/tron/core/WalletTest.java index 1d8ae810dfd..bfbbbbf8e48 100644 --- a/framework/src/test/java/org/tron/core/WalletTest.java +++ b/framework/src/test/java/org/tron/core/WalletTest.java @@ -755,6 +755,12 @@ public void testGetDelegatedResourceV2() { Protocol.Account account = Protocol.Account.newBuilder() .setAddress(ByteString.copyFrom(ByteArray.fromHexString(OWNER_ADDRESS))).build(); + + AccountCapsule accountCapsule = dbManager.getAccountStore() + .get(ByteArray.fromHexString(OWNER_ADDRESS)); + accountCapsule.addAssetV2("testv2".getBytes(), 1L); + dbManager.getAccountStore().put(accountCapsule.createDbKey(), accountCapsule); + wallet.getAccount(account); wallet.getProposalList(); wallet.getWitnessList(); diff --git a/framework/src/test/java/org/tron/core/db/ManagerTest.java b/framework/src/test/java/org/tron/core/db/ManagerTest.java index b7b29f49930..5c4f10dc738 100755 --- a/framework/src/test/java/org/tron/core/db/ManagerTest.java +++ b/framework/src/test/java/org/tron/core/db/ManagerTest.java @@ -938,4 +938,25 @@ private BlockCapsule createTestBlockCapsuleError(long time, blockCapsule.sign(ByteArray.fromHexString(addressToProvateKeys.get(witnessAddress))); return blockCapsule; } + + @Test + public void testExpireTransaction() { + TransferContract tc = + TransferContract.newBuilder() + .setAmount(10) + .setOwnerAddress(ByteString.copyFromUtf8("aaa")) + .setToAddress(ByteString.copyFromUtf8("bbb")) + .build(); + TransactionCapsule trx = new TransactionCapsule(tc, ContractType.TransferContract); + long latestBlockTime = dbManager.getDynamicPropertiesStore().getLatestBlockHeaderTimestamp(); + trx.setExpiration(latestBlockTime - 100); + try { + dbManager.validateCommon(trx); + Assert.fail(); + } catch (TransactionExpirationException e) { + Assert.assertTrue(true); + } catch (TooBigTransactionException e) { + Assert.fail(); + } + } } From f2e064b5cdbb209b8aff4974e593c1d5a72ae922 Mon Sep 17 00:00:00 2001 From: "morgan.peng" Date: Fri, 10 Mar 2023 19:05:23 +0800 Subject: [PATCH 139/142] feat(db): check second cache config in unit tests 1. check second cache config in unit tests --- .../org/tron/core/db2/SnapshotRootTest.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/framework/src/test/java/org/tron/core/db2/SnapshotRootTest.java b/framework/src/test/java/org/tron/core/db2/SnapshotRootTest.java index f7985017285..a483be278ff 100644 --- a/framework/src/test/java/org/tron/core/db2/SnapshotRootTest.java +++ b/framework/src/test/java/org/tron/core/db2/SnapshotRootTest.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -11,9 +13,12 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.springframework.util.CollectionUtils; +import org.testng.collections.Sets; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; import org.tron.common.application.TronApplicationContext; +import org.tron.common.cache.CacheStrategies; import org.tron.common.utils.FileUtil; import org.tron.common.utils.SessionOptional; import org.tron.core.Constant; @@ -24,6 +29,7 @@ import org.tron.core.db2.core.Snapshot; import org.tron.core.db2.core.SnapshotManager; import org.tron.core.db2.core.SnapshotRoot; +import org.tron.core.exception.ItemNotFoundException; public class SnapshotRootTest { @@ -31,6 +37,15 @@ public class SnapshotRootTest { private TronApplicationContext context; private Application appT; private SnapshotManager revokingDatabase; + private final Set noSecondCacheDBs = Sets.newHashSet(Arrays.asList("trans-cache", + "exchange-v2","nullifier","accountTrie","transactionRetStore","accountid-index", + "market_account","market_pair_to_price","recent-transaction","block-index","block", + "market_pair_price_to_order","proposal","tree-block-index","IncrementalMerkleTree", + "asset-issue","balance-trace","transactionHistoryStore","account-index","section-bloom", + "exchange","market_order","account-trace","contract-state","trans")); + private Set allDBNames; + private Set allRevokingDBNames; + @Before public void init() { @@ -113,6 +128,52 @@ public synchronized void testMergeList() { tronDatabase.close(); } + @Test + public void testSecondCacheCheck() + throws ItemNotFoundException { + revokingDatabase = context.getBean(SnapshotManager.class); + allRevokingDBNames = parseRevokingDBNames(context); + allDBNames = Arrays.stream(new File("output_revokingStore_test/database").list()) + .collect(Collectors.toSet()); + if (CollectionUtils.isEmpty(allDBNames)) { + throw new ItemNotFoundException("No DBs found"); + } + allDBNames.removeAll(noSecondCacheDBs); + allDBNames.removeAll(CacheStrategies.CACHE_DBS); + allDBNames.retainAll(allRevokingDBNames); + org.junit.Assert.assertEquals(String.format("New added dbs %s " + + "shall consider to add second cache or add to noNeedCheckDBs!", + allDBNames.stream().collect(Collectors.joining(","))), allDBNames.size(), 0); + } + + @Test + public void testSecondCacheCheckAddDb() + throws ItemNotFoundException { + revokingDatabase = context.getBean(SnapshotManager.class); + allRevokingDBNames = parseRevokingDBNames(context); + allRevokingDBNames.add("secondCheckTestDB"); + FileUtil.createDirIfNotExists("output_revokingStore_test/database/secondCheckTestDB"); + allDBNames = Arrays.stream(new File("output_revokingStore_test/database").list()) + .collect(Collectors.toSet()); + FileUtil.deleteDir(new File("output_revokingStore_test/database/secondCheckTestDB")); + if (CollectionUtils.isEmpty(allDBNames)) { + throw new ItemNotFoundException("No DBs found"); + } + allDBNames.removeAll(noSecondCacheDBs); + allDBNames.removeAll(CacheStrategies.CACHE_DBS); + allDBNames.retainAll(allRevokingDBNames); + org.junit.Assert.assertTrue(String.format("New added dbs %s " + + "check second cache failed!", + allDBNames.stream().collect(Collectors.joining(","))), allDBNames.size() == 1); + } + + private Set parseRevokingDBNames(TronApplicationContext context) { + SnapshotManager snapshotManager = context.getBean(SnapshotManager.class); + return snapshotManager.getDbs().stream().map(chainbase -> + chainbase.getDbName()).collect(Collectors.toSet()); + } + + @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode From cd9e5347562b7369fa7d1a060b2160ee9b968e8b Mon Sep 17 00:00:00 2001 From: jiangyuanshu <317787106@qq.com> Date: Wed, 19 Apr 2023 16:50:51 +0800 Subject: [PATCH 140/142] fix(net):descrease memory cost of test cases --- framework/build.gradle | 4 + .../vm/BandWidthRuntimeOutOfTimeTest.java | 2 + ...andWidthRuntimeOutOfTimeWithCheckTest.java | 2 + .../tron/core/db/TransactionExpireTest.java | 89 +++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 framework/src/test/java/org/tron/core/db/TransactionExpireTest.java diff --git a/framework/build.gradle b/framework/build.gradle index f4f5134bf6e..85d01ed11b0 100644 --- a/framework/build.gradle +++ b/framework/build.gradle @@ -151,6 +151,10 @@ test { exclude 'org/tron/common/runtime/vm/WithdrawRewardTest.class' } maxHeapSize = "1024m" + doFirst { + forkEvery = 100 + jvmArgs "-XX:MetaspaceSize=128m","-XX:MaxMetaspaceSize=256m", "-XX:+UseG1GC" + } } task stest(type: Test) { diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java index f8a4f1ef0bb..bb751d56941 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeTest.java @@ -133,6 +133,8 @@ public static void destroy() { Args.clearParam(); context.destroy(); FileUtil.deleteDir(new File(dbPath)); + FileUtil.deleteDir(new File(dbDirectory)); + FileUtil.deleteDir(new File(indexDirectory)); } @Test diff --git a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java index 68fa9e12fa7..5d015aa9356 100644 --- a/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java +++ b/framework/src/test/java/org/tron/common/runtime/vm/BandWidthRuntimeOutOfTimeWithCheckTest.java @@ -135,6 +135,8 @@ public static void destroy() { Args.clearParam(); context.destroy(); FileUtil.deleteDir(new File(dbPath)); + FileUtil.deleteDir(new File(dbDirectory)); + FileUtil.deleteDir(new File(indexDirectory)); } @Test diff --git a/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java new file mode 100644 index 00000000000..26b1e7e7bc1 --- /dev/null +++ b/framework/src/test/java/org/tron/core/db/TransactionExpireTest.java @@ -0,0 +1,89 @@ +package org.tron.core.db; + +import com.google.protobuf.ByteString; +import java.io.File; +import lombok.extern.slf4j.Slf4j; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.tron.api.GrpcAPI; +import org.tron.api.GrpcAPI.Return.response_code; +import org.tron.common.application.TronApplicationContext; +import org.tron.common.parameter.CommonParameter; +import org.tron.common.utils.ByteArray; +import org.tron.common.utils.FileUtil; +import org.tron.common.utils.Sha256Hash; +import org.tron.core.Constant; +import org.tron.core.Wallet; +import org.tron.core.capsule.BlockCapsule; +import org.tron.core.capsule.TransactionCapsule; +import org.tron.core.config.DefaultConfig; +import org.tron.core.config.args.Args; +import org.tron.protos.Protocol.Transaction.Contract.ContractType; +import org.tron.protos.contract.BalanceContract.TransferContract; + +@Slf4j +public class TransactionExpireTest { + + private String dbPath = "output_expire_test"; + private TronApplicationContext context; + private Wallet wallet; + private Manager dbManager; + private BlockCapsule blockCapsule; + + @Before + public void init() { + Args.setParam(new String[] {"--output-directory", dbPath}, Constant.TEST_CONF); + CommonParameter.PARAMETER.setMinEffectiveConnection(0); + + context = new TronApplicationContext(DefaultConfig.class); + wallet = context.getBean(Wallet.class); + dbManager = context.getBean(Manager.class); + + blockCapsule = new BlockCapsule( + 1, + Sha256Hash.wrap(ByteString.copyFrom( + ByteArray.fromHexString( + "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b81"))), + 1, + ByteString.copyFromUtf8("testAddress")); + dbManager.getDynamicPropertiesStore().saveLatestBlockHeaderNumber(blockCapsule.getNum()); + dbManager.getDynamicPropertiesStore() + .saveLatestBlockHeaderTimestamp(blockCapsule.getTimeStamp()); + dbManager.updateRecentBlock(blockCapsule); + } + + @After + public void removeDb() { + Args.clearParam(); + context.destroy(); + if (FileUtil.deleteDir(new File(dbPath))) { + logger.info("Release resources successful."); + } else { + logger.info("Release resources failure."); + } + } + + @Test + public void testExpireTransaction() { + TransferContract transferContract = TransferContract.newBuilder() + .setAmount(1L) + .setOwnerAddress(ByteString.copyFrom(Args.getLocalWitnesses() + .getWitnessAccountAddress(CommonParameter.getInstance().isECKeyCryptoEngine()))) + .setToAddress(ByteString.copyFrom(ByteArray.fromHexString( + (Wallet.getAddressPreFixString() + "A389132D6639FBDA4FBC8B659264E6B7C90DB086")))) + .build(); + TransactionCapsule transactionCapsule = + new TransactionCapsule(transferContract, ContractType.TransferContract); + transactionCapsule.setReference(blockCapsule.getNum(), blockCapsule.getBlockId().getBytes()); + Assert.assertEquals(1, blockCapsule.getTimeStamp()); + + long blockTimeStamp = blockCapsule.getTimeStamp(); + transactionCapsule.setExpiration(blockTimeStamp - 1); + transactionCapsule.sign(ByteArray.fromHexString(Args.getLocalWitnesses().getPrivateKey())); + + GrpcAPI.Return result = wallet.broadcastTransaction(transactionCapsule.getInstance()); + Assert.assertEquals(response_code.TRANSACTION_EXPIRATION_ERROR, result.getCode()); + } +} From 45f0e016d7dcd66f34845aa93a6aa46e122dfa3e Mon Sep 17 00:00:00 2001 From: liukai Date: Thu, 20 Apr 2023 14:24:02 +0800 Subject: [PATCH 141/142] feat(version): update version --- framework/src/main/java/org/tron/program/Version.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/main/java/org/tron/program/Version.java b/framework/src/main/java/org/tron/program/Version.java index 88f87a68297..d3c9846d6e4 100644 --- a/framework/src/main/java/org/tron/program/Version.java +++ b/framework/src/main/java/org/tron/program/Version.java @@ -4,7 +4,7 @@ public class Version { public static final String VERSION_NAME = "GreatVoyage-v4.7.0.1-75-g36fc5063e9"; public static final String VERSION_CODE = "17673"; - private static final String VERSION = "4.7.1"; + private static final String VERSION = "4.7.2"; public static String getVersion() { return VERSION; From 73a7419c110c380b4b4f1a43ba2d280b98ac0538 Mon Sep 17 00:00:00 2001 From: liuxincheng Date: Thu, 20 Apr 2023 17:05:07 +0800 Subject: [PATCH 142/142] fix(test): optimize unit test --- .../common/client/DatabaseGrpcClient.java | 4 +- .../tron/common/client/WalletGrpcClient.java | 4 +- .../java/org/tron/program/SolidityNode.java | 17 +- .../services/http/BroadcastServletTest.java | 3 +- .../core/services/http/HttpServletTest.java | 531 +++++++++++++++ .../http/TriggerSmartContractServletTest.java | 10 +- ...GetTransactionByIdSolidityServletTest.java | 16 +- .../tron/core/zksnark/SendCoinShieldTest.java | 603 +++++++++--------- .../org/tron/program/SolidityNodeTest.java | 7 +- 9 files changed, 885 insertions(+), 310 deletions(-) create mode 100644 framework/src/test/java/org/tron/core/services/http/HttpServletTest.java diff --git a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java index b83c7235900..f3650bfd2be 100644 --- a/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java +++ b/framework/src/main/java/org/tron/common/client/DatabaseGrpcClient.java @@ -15,14 +15,14 @@ public class DatabaseGrpcClient { public DatabaseGrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) - .usePlaintext(true) + .usePlaintext() .build(); databaseBlockingStub = DatabaseGrpc.newBlockingStub(channel); } public DatabaseGrpcClient(String host) { channel = ManagedChannelBuilder.forTarget(host) - .usePlaintext(true) + .usePlaintext() .build(); databaseBlockingStub = DatabaseGrpc.newBlockingStub(channel); } diff --git a/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java b/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java index 9d3b5797e20..d28df0e7c77 100644 --- a/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java +++ b/framework/src/main/java/org/tron/common/client/WalletGrpcClient.java @@ -29,14 +29,14 @@ public class WalletGrpcClient { public WalletGrpcClient(String host, int port) { channel = ManagedChannelBuilder.forAddress(host, port) - .usePlaintext(true) + .usePlaintext() .build(); walletBlockingStub = WalletGrpc.newBlockingStub(channel); } public WalletGrpcClient(String host) { channel = ManagedChannelBuilder.forTarget(host) - .usePlaintext(true) + .usePlaintext() .build(); walletBlockingStub = WalletGrpc.newBlockingStub(channel); } diff --git a/framework/src/main/java/org/tron/program/SolidityNode.java b/framework/src/main/java/org/tron/program/SolidityNode.java index 9884a14a62b..0ca001da7bb 100644 --- a/framework/src/main/java/org/tron/program/SolidityNode.java +++ b/framework/src/main/java/org/tron/program/SolidityNode.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; import org.springframework.context.ApplicationContext; +import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import org.tron.common.application.Application; import org.tron.common.application.ApplicationFactory; @@ -37,7 +38,7 @@ public class SolidityNode { private AtomicLong remoteBlockNum = new AtomicLong(); - private LinkedBlockingDeque blockQueue = new LinkedBlockingDeque(100); + private LinkedBlockingDeque blockQueue = new LinkedBlockingDeque<>(100); private int exceptionSleepTime = 1000; @@ -48,7 +49,7 @@ public SolidityNode(Manager dbManager) { this.chainBaseManager = dbManager.getChainBaseManager(); resolveCompatibilityIssueIfUsingFullNodeDatabase(); ID.set(chainBaseManager.getDynamicPropertiesStore().getLatestSolidifiedBlockNum()); - databaseGrpcClient = new DatabaseGrpcClient(Args.getInstance().getTrustNodeAddr()); + databaseGrpcClient = new DatabaseGrpcClient(CommonParameter.getInstance().getTrustNodeAddr()); remoteBlockNum.set(getLastSolidityBlockNum()); } @@ -58,13 +59,13 @@ public SolidityNode(Manager dbManager) { public static void main(String[] args) { logger.info("Solidity node is running."); Args.setParam(args, Constant.TESTNET_CONF); - CommonParameter parameter = Args.getInstance(); + CommonParameter parameter = CommonParameter.getInstance(); logger.info("index switch is {}", BooleanUtils.toStringOnOff(BooleanUtils .toBoolean(parameter.getStorage().getIndexSwitch()))); - if (StringUtils.isEmpty(parameter.getTrustNodeAddr())) { + if (ObjectUtils.isEmpty(parameter.getTrustNodeAddr())) { logger.error("Trust node is not set."); return; } @@ -102,13 +103,13 @@ public static void main(String[] args) { private void start() { try { - new Thread(() -> getBlock()).start(); - new Thread(() -> processBlock()).start(); + new Thread(this::getBlock).start(); + new Thread(this::processBlock).start(); logger.info("Success to start solid node, ID: {}, remoteBlockNum: {}.", ID.get(), remoteBlockNum); } catch (Exception e) { - logger - .error("Failed to start solid node, address: {}.", Args.getInstance().getTrustNodeAddr()); + logger.error("Failed to start solid node, address: {}.", + CommonParameter.getInstance().getTrustNodeAddr()); System.exit(0); } } diff --git a/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java b/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java index 1d8f02910b3..24ec969c08b 100644 --- a/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/BroadcastServletTest.java @@ -81,7 +81,7 @@ public void tearDown() { } @Test - public void testDoPost() throws IOException { + public void doPostTest() throws IOException { URLStreamHandlerFactory urlStreamHandlerFactory = mock(URLStreamHandlerFactory.class); URL.setURLStreamHandlerFactory(urlStreamHandlerFactory); @@ -139,6 +139,7 @@ public void testDoPost() throws IOException { while ((line = in.readLine()) != null) { result.append(line).append("\n"); } + Assert.assertNotNull(result); in.close(); writer.flush(); FileInputStream fileInputStream = new FileInputStream("temp.txt"); diff --git a/framework/src/test/java/org/tron/core/services/http/HttpServletTest.java b/framework/src/test/java/org/tron/core/services/http/HttpServletTest.java new file mode 100644 index 00000000000..9775db0a954 --- /dev/null +++ b/framework/src/test/java/org/tron/core/services/http/HttpServletTest.java @@ -0,0 +1,531 @@ +package org.tron.core.services.http; + +import lombok.extern.slf4j.Slf4j; +import org.junit.Before; +import org.junit.Test; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; + +@Slf4j +public class HttpServletTest { + private AccountPermissionUpdateServlet accountPermissionUpdateServlet; + private BroadcastHexServlet broadcastHexServlet; + private BroadcastServlet broadcastServlet; + private ClearABIServlet clearABIServlet; + private CreateAccountServlet createAccountServlet; + private CreateAssetIssueServlet createAssetIssueServlet; + private CreateCommonTransactionServlet createCommonTransactionServlet; + private CreateShieldedContractParametersServlet createShieldedContractParametersServlet; + private CreateShieldedContractParametersWithoutAskServlet + createShieldedContractParametersWithoutAskServlet; + private CreateShieldedTransactionServlet createShieldedTransactionServlet; + private CreateShieldedTransactionWithoutSpendAuthSigServlet + createShieldedTransactionWithoutSpendAuthSigServlet; + private CreateShieldNullifierServlet createShieldNullifierServlet; + private CreateSpendAuthSigServlet createSpendAuthSigServlet; + private CreateWitnessServlet createWitnessServlet; + private DelegateResourceServlet delegateResourceServlet; + private DeployContractServlet deployContractServlet; + private EstimateEnergyServlet estimateEnergyServlet; + private ExchangeCreateServlet exchangeCreateServlet; + private ExchangeInjectServlet exchangeInjectServlet; + private ExchangeTransactionServlet exchangeTransactionServlet; + private ExchangeWithdrawServlet exchangeWithdrawServlet; + private FreezeBalanceServlet freezeBalanceServlet; + private FreezeBalanceV2Servlet freezeBalanceV2Servlet; + private GetAccountBalanceServlet getAccountBalanceServlet; + private GetAccountByIdServlet getAccountByIdServlet; + private GetAccountNetServlet getAccountNetServlet; + private GetAccountResourceServlet getAccountResourceServlet; + private GetAccountServlet getAccountServlet; + private GetAkFromAskServlet getAkFromAskServlet; + private GetAssetIssueByAccountServlet getAssetIssueByAccountServlet; + private GetAssetIssueByIdServlet getAssetIssueByIdServlet; + private GetAssetIssueByNameServlet getAssetIssueByNameServlet; + private GetAssetIssueListByNameServlet getAssetIssueListByNameServlet; + private GetAssetIssueListServlet getAssetIssueListServlet; + private GetAvailableUnfreezeCountServlet getAvailableUnfreezeCountServlet; + private GetBandwidthPricesServlet getBandwidthPricesServlet; + private GetBlockBalanceServlet getBlockBalanceServlet; + private GetBlockByIdServlet getBlockByIdServlet; + private GetBlockByLatestNumServlet getBlockByLatestNumServlet; + private GetBlockByLimitNextServlet getBlockByLimitNextServlet; + private GetBlockByNumServlet getBlockByNumServlet; + private GetBlockServlet getBlockServlet; + private GetBrokerageServlet getBrokerageServlet; + private GetBurnTrxServlet getBurnTrxServlet; + private GetCanDelegatedMaxSizeServlet getCanDelegatedMaxSizeServlet; + private GetCanWithdrawUnfreezeAmountServlet getCanWithdrawUnfreezeAmountServlet; + private GetChainParametersServlet getChainParametersServlet; + private GetContractInfoServlet getContractInfoServlet; + private GetContractServlet getContractServlet; + private GetDelegatedResourceAccountIndexServlet getDelegatedResourceAccountIndexServlet; + private GetDelegatedResourceAccountIndexV2Servlet getDelegatedResourceAccountIndexV2Servlet; + private GetDelegatedResourceServlet getDelegatedResourceServlet; + private GetDelegatedResourceV2Servlet getDelegatedResourceV2Servlet; + private GetDiversifierServlet getDiversifierServlet; + private GetEnergyPricesServlet getEnergyPricesServlet; + private GetExchangeByIdServlet getExchangeByIdServlet; + private GetExpandedSpendingKeyServlet getExpandedSpendingKeyServlet; + private GetIncomingViewingKeyServlet getIncomingViewingKeyServlet; + private GetMarketOrderByAccountServlet getMarketOrderByAccountServlet; + private GetMarketOrderByIdServlet getMarketOrderByIdServlet; + private GetMarketOrderListByPairServlet getMarketOrderListByPairServlet; + private GetMarketPairListServlet getMarketPairListServlet; + private GetMarketPriceByPairServlet getMarketPriceByPairServlet; + private GetMemoFeePricesServlet getMemoFeePricesServlet; + private GetMerkleTreeVoucherInfoServlet getMerkleTreeVoucherInfoServlet; + private GetNewShieldedAddressServlet getNewShieldedAddressServlet; + private GetNextMaintenanceTimeServlet getNextMaintenanceTimeServlet; + private GetNkFromNskServlet getNkFromNskServlet; + private GetNodeInfoServlet getNodeInfoServlet; + private GetNowBlockServlet getNowBlockServlet; + private GetPaginatedAssetIssueListServlet getPaginatedAssetIssueListServlet; + private GetPaginatedExchangeListServlet getPaginatedExchangeListServlet; + private GetPaginatedProposalListServlet getPaginatedProposalListServlet; + private GetPendingSizeServlet getPendingSizeServlet; + private GetProposalByIdServlet getProposalByIdServlet; + private GetRcmServlet getRcmServlet; + private GetRewardServlet getRewardServlet; + private GetShieldTransactionHashServlet getShieldTransactionHashServlet; + private GetSpendingKeyServlet getSpendingKeyServlet; + private GetTransactionApprovedListServlet getTransactionApprovedListServlet; + private GetTransactionByIdServlet getTransactionByIdServlet; + private GetTransactionCountByBlockNumServlet getTransactionCountByBlockNumServlet; + private GetTransactionFromPendingServlet getTransactionFromPendingServlet; + private GetTransactionInfoByBlockNumServlet getTransactionInfoByBlockNumServlet; + private GetTransactionInfoByIdServlet getTransactionInfoByIdServlet; + private GetTransactionListFromPendingServlet getTransactionListFromPendingServlet; + private GetTransactionReceiptByIdServlet getTransactionReceiptByIdServlet; + private GetTransactionSignWeightServlet getTransactionSignWeightServlet; + private GetTriggerInputForShieldedTRC20ContractServlet + getTriggerInputForShieldedTRC20ContractServlet; + private GetZenPaymentAddressServlet getZenPaymentAddressServlet; + private IsShieldedTRC20ContractNoteSpentServlet isShieldedTRC20ContractNoteSpentServlet; + private IsSpendServlet isSpendServlet; + private ListExchangesServlet listExchangesServlet; + private ListNodesServlet listNodesServlet; + private ListProposalsServlet listProposalsServlet; + private ListWitnessesServlet listWitnessesServlet; + private MarketCancelOrderServlet marketCancelOrderServlet; + private MarketSellAssetServlet marketSellAssetServlet; + private MetricsServlet metricsServlet; + private ParticipateAssetIssueServlet participateAssetIssueServlet; + private ProposalApproveServlet proposalApproveServlet; + private ProposalCreateServlet proposalCreateServlet; + private ProposalDeleteServlet proposalDeleteServlet; + private ScanAndMarkNoteByIvkServlet scanAndMarkNoteByIvkServlet; + private ScanNoteByIvkServlet scanNoteByIvkServlet; + private ScanNoteByOvkServlet scanNoteByOvkServlet; + private ScanShieldedTRC20NotesByIvkServlet scanShieldedTRC20NotesByIvkServlet; + private ScanShieldedTRC20NotesByOvkServlet scanShieldedTRC20NotesByOvkServlet; + private SetAccountIdServlet setAccountIdServlet; + private TotalTransactionServlet totalTransactionServlet; + private TransferAssetServlet transferAssetServlet; + private TransferServlet transferServlet; + private TriggerConstantContractServlet triggerConstantContractServlet; + private TriggerSmartContractServlet triggerSmartContractServlet; + private UnDelegateResourceServlet unDelegateResourceServlet; + private UnFreezeAssetServlet unFreezeAssetServlet; + private UnFreezeBalanceServlet unFreezeBalanceServlet; + private UnFreezeBalanceV2Servlet unFreezeBalanceV2Servlet; + private UpdateAccountServlet updateAccountServlet; + private UpdateAssetServlet updateAssetServlet; + private UpdateBrokerageServlet updateBrokerageServlet; + private UpdateEnergyLimitServlet updateEnergyLimitServlet; + private UpdateSettingServlet updateSettingServlet; + private UpdateWitnessServlet updateWitnessServlet; + private ValidateAddressServlet validateAddressServlet; + private VoteWitnessAccountServlet voteWitnessAccountServlet; + private WithdrawBalanceServlet withdrawBalanceServlet; + private WithdrawExpireUnfreezeServlet withdrawExpireUnfreezeServlet; + private MockHttpServletRequest request; + private MockHttpServletResponse response; + + @Before + public void setUp() { + accountPermissionUpdateServlet = new AccountPermissionUpdateServlet(); + broadcastHexServlet = new BroadcastHexServlet(); + broadcastServlet = new BroadcastServlet(); + clearABIServlet = new ClearABIServlet(); + createAccountServlet = new CreateAccountServlet(); + createAssetIssueServlet = new CreateAssetIssueServlet(); + createCommonTransactionServlet = new CreateCommonTransactionServlet(); + createShieldedContractParametersServlet = new CreateShieldedContractParametersServlet(); + createShieldedContractParametersWithoutAskServlet = + new CreateShieldedContractParametersWithoutAskServlet(); + createShieldedTransactionServlet = new CreateShieldedTransactionServlet(); + createShieldedTransactionWithoutSpendAuthSigServlet = + new CreateShieldedTransactionWithoutSpendAuthSigServlet(); + createShieldNullifierServlet = new CreateShieldNullifierServlet(); + createSpendAuthSigServlet = new CreateSpendAuthSigServlet(); + createWitnessServlet = new CreateWitnessServlet(); + delegateResourceServlet = new DelegateResourceServlet(); + deployContractServlet = new DeployContractServlet(); + estimateEnergyServlet = new EstimateEnergyServlet(); + exchangeCreateServlet = new ExchangeCreateServlet(); + exchangeInjectServlet = new ExchangeInjectServlet(); + exchangeTransactionServlet = new ExchangeTransactionServlet(); + exchangeWithdrawServlet = new ExchangeWithdrawServlet(); + freezeBalanceServlet = new FreezeBalanceServlet(); + freezeBalanceV2Servlet = new FreezeBalanceV2Servlet(); + getAccountBalanceServlet = new GetAccountBalanceServlet(); + getAccountByIdServlet = new GetAccountByIdServlet(); + getAccountNetServlet = new GetAccountNetServlet(); + getAccountResourceServlet = new GetAccountResourceServlet(); + getAccountServlet = new GetAccountServlet(); + getAkFromAskServlet = new GetAkFromAskServlet(); + getAssetIssueByAccountServlet = new GetAssetIssueByAccountServlet(); + getAssetIssueByIdServlet = new GetAssetIssueByIdServlet(); + getAssetIssueByNameServlet = new GetAssetIssueByNameServlet(); + getAssetIssueListByNameServlet = new GetAssetIssueListByNameServlet(); + getAssetIssueListServlet = new GetAssetIssueListServlet(); + getAvailableUnfreezeCountServlet = new GetAvailableUnfreezeCountServlet(); + getBandwidthPricesServlet = new GetBandwidthPricesServlet(); + getBlockBalanceServlet = new GetBlockBalanceServlet(); + getBlockByIdServlet = new GetBlockByIdServlet(); + getBlockByLatestNumServlet = new GetBlockByLatestNumServlet(); + getBlockByLimitNextServlet = new GetBlockByLimitNextServlet(); + getBlockByNumServlet = new GetBlockByNumServlet(); + getBlockServlet = new GetBlockServlet(); + getBrokerageServlet = new GetBrokerageServlet(); + getBurnTrxServlet = new GetBurnTrxServlet(); + getCanDelegatedMaxSizeServlet = new GetCanDelegatedMaxSizeServlet(); + getCanWithdrawUnfreezeAmountServlet = new GetCanWithdrawUnfreezeAmountServlet(); + getChainParametersServlet = new GetChainParametersServlet(); + getContractInfoServlet = new GetContractInfoServlet(); + getContractServlet = new GetContractServlet(); + getDelegatedResourceAccountIndexServlet = new GetDelegatedResourceAccountIndexServlet(); + getDelegatedResourceAccountIndexV2Servlet = new GetDelegatedResourceAccountIndexV2Servlet(); + getDelegatedResourceServlet = new GetDelegatedResourceServlet(); + getDelegatedResourceV2Servlet = new GetDelegatedResourceV2Servlet(); + getDiversifierServlet = new GetDiversifierServlet(); + getEnergyPricesServlet = new GetEnergyPricesServlet(); + getExchangeByIdServlet = new GetExchangeByIdServlet(); + getExpandedSpendingKeyServlet = new GetExpandedSpendingKeyServlet(); + getIncomingViewingKeyServlet = new GetIncomingViewingKeyServlet(); + getMarketOrderByAccountServlet = new GetMarketOrderByAccountServlet(); + getMarketOrderByIdServlet = new GetMarketOrderByIdServlet(); + getMarketOrderListByPairServlet = new GetMarketOrderListByPairServlet(); + getMarketPairListServlet = new GetMarketPairListServlet(); + getMarketPriceByPairServlet = new GetMarketPriceByPairServlet(); + getMemoFeePricesServlet = new GetMemoFeePricesServlet(); + getMerkleTreeVoucherInfoServlet = new GetMerkleTreeVoucherInfoServlet(); + getNewShieldedAddressServlet = new GetNewShieldedAddressServlet(); + getNextMaintenanceTimeServlet = new GetNextMaintenanceTimeServlet(); + getNkFromNskServlet = new GetNkFromNskServlet(); + getNodeInfoServlet = new GetNodeInfoServlet(); + getNowBlockServlet = new GetNowBlockServlet(); + getPaginatedAssetIssueListServlet = new GetPaginatedAssetIssueListServlet(); + getPaginatedExchangeListServlet = new GetPaginatedExchangeListServlet(); + getPaginatedProposalListServlet = new GetPaginatedProposalListServlet(); + getPendingSizeServlet = new GetPendingSizeServlet(); + getProposalByIdServlet = new GetProposalByIdServlet(); + getRcmServlet = new GetRcmServlet(); + getRewardServlet = new GetRewardServlet(); + getShieldTransactionHashServlet = new GetShieldTransactionHashServlet(); + getSpendingKeyServlet = new GetSpendingKeyServlet(); + getTransactionApprovedListServlet = new GetTransactionApprovedListServlet(); + getTransactionByIdServlet = new GetTransactionByIdServlet(); + getTransactionCountByBlockNumServlet = new GetTransactionCountByBlockNumServlet(); + getTransactionFromPendingServlet = new GetTransactionFromPendingServlet(); + getTransactionInfoByBlockNumServlet = new GetTransactionInfoByBlockNumServlet(); + getTransactionInfoByIdServlet = new GetTransactionInfoByIdServlet(); + getTransactionListFromPendingServlet = new GetTransactionListFromPendingServlet(); + getTransactionReceiptByIdServlet = new GetTransactionReceiptByIdServlet(); + getTransactionSignWeightServlet = new GetTransactionSignWeightServlet(); + getTriggerInputForShieldedTRC20ContractServlet = + new GetTriggerInputForShieldedTRC20ContractServlet(); + getZenPaymentAddressServlet = new GetZenPaymentAddressServlet(); + isShieldedTRC20ContractNoteSpentServlet = new IsShieldedTRC20ContractNoteSpentServlet(); + isSpendServlet = new IsSpendServlet(); + listExchangesServlet = new ListExchangesServlet(); + listNodesServlet = new ListNodesServlet(); + listProposalsServlet = new ListProposalsServlet(); + listWitnessesServlet = new ListWitnessesServlet(); + marketCancelOrderServlet = new MarketCancelOrderServlet(); + marketSellAssetServlet = new MarketSellAssetServlet(); + metricsServlet = new MetricsServlet(); + participateAssetIssueServlet = new ParticipateAssetIssueServlet(); + proposalApproveServlet = new ProposalApproveServlet(); + proposalCreateServlet = new ProposalCreateServlet(); + proposalDeleteServlet = new ProposalDeleteServlet(); + scanAndMarkNoteByIvkServlet = new ScanAndMarkNoteByIvkServlet(); + scanNoteByIvkServlet = new ScanNoteByIvkServlet(); + scanNoteByOvkServlet = new ScanNoteByOvkServlet(); + scanShieldedTRC20NotesByIvkServlet = new ScanShieldedTRC20NotesByIvkServlet(); + scanShieldedTRC20NotesByOvkServlet = new ScanShieldedTRC20NotesByOvkServlet(); + setAccountIdServlet = new SetAccountIdServlet(); + totalTransactionServlet = new TotalTransactionServlet(); + transferAssetServlet = new TransferAssetServlet(); + transferServlet = new TransferServlet(); + triggerConstantContractServlet = new TriggerConstantContractServlet(); + triggerSmartContractServlet = new TriggerSmartContractServlet(); + unDelegateResourceServlet = new UnDelegateResourceServlet(); + unFreezeAssetServlet = new UnFreezeAssetServlet(); + unFreezeBalanceServlet = new UnFreezeBalanceServlet(); + unFreezeBalanceV2Servlet = new UnFreezeBalanceV2Servlet(); + updateAccountServlet = new UpdateAccountServlet(); + updateAssetServlet = new UpdateAssetServlet(); + updateBrokerageServlet = new UpdateBrokerageServlet(); + updateEnergyLimitServlet = new UpdateEnergyLimitServlet(); + updateSettingServlet = new UpdateSettingServlet(); + updateWitnessServlet = new UpdateWitnessServlet(); + validateAddressServlet = new ValidateAddressServlet(); + voteWitnessAccountServlet = new VoteWitnessAccountServlet(); + withdrawBalanceServlet = new WithdrawBalanceServlet(); + withdrawExpireUnfreezeServlet = new WithdrawExpireUnfreezeServlet(); + request = new MockHttpServletRequest(); + request.setCharacterEncoding("UTF-8"); + response = new MockHttpServletResponse(); + } + + @Test + public void doGetTest() { + accountPermissionUpdateServlet.doGet(request, response); + clearABIServlet.doGet(request, response); + createAssetIssueServlet.doGet(request, response); + createShieldedContractParametersServlet.doGet(request, response); + createShieldedContractParametersWithoutAskServlet.doGet(request, response); + createShieldedTransactionServlet.doGet(request, response); + createShieldedTransactionWithoutSpendAuthSigServlet.doGet(request, response); + createShieldNullifierServlet.doGet(request, response); + createSpendAuthSigServlet.doGet(request, response); + createWitnessServlet.doGet(request, response); + deployContractServlet.doGet(request, response); + estimateEnergyServlet.doGet(request, response); + getAccountByIdServlet.doGet(request, response); + getAccountNetServlet.doGet(request, response); + getAccountResourceServlet.doGet(request, response); + getAccountServlet.doGet(request, response); + getAkFromAskServlet.doGet(request, response); + getAssetIssueByAccountServlet.doGet(request, response); + getAssetIssueByIdServlet.doGet(request, response); + getAssetIssueByNameServlet.doGet(request, response); + getAssetIssueListByNameServlet.doGet(request, response); + getAssetIssueListServlet.doGet(request, response); + getAvailableUnfreezeCountServlet.doGet(request, response); + getBandwidthPricesServlet.doGet(request, response); + getBlockByIdServlet.doGet(request, response); + getBlockByLatestNumServlet.doGet(request, response); + getBlockByLimitNextServlet.doGet(request, response); + getBlockByNumServlet.doGet(request, response); + getBlockServlet.doGet(request, response); + getBrokerageServlet.doGet(request, response); + getBurnTrxServlet.doGet(request, response); + getCanDelegatedMaxSizeServlet.doGet(request, response); + getCanWithdrawUnfreezeAmountServlet.doGet(request, response); + getChainParametersServlet.doGet(request, response); + getContractInfoServlet.doGet(request, response); + getContractServlet.doGet(request, response); + getDelegatedResourceAccountIndexServlet.doGet(request, response); + getDelegatedResourceAccountIndexV2Servlet.doGet(request, response); + getDelegatedResourceServlet.doGet(request, response); + getDelegatedResourceV2Servlet.doGet(request, response); + getDiversifierServlet.doGet(request, response); + getEnergyPricesServlet.doGet(request, response); + getExchangeByIdServlet.doGet(request, response); + getExpandedSpendingKeyServlet.doGet(request, response); + getIncomingViewingKeyServlet.doGet(request, response); + getMarketOrderByAccountServlet.doGet(request, response); + getMarketOrderByIdServlet.doGet(request, response); + getMarketOrderListByPairServlet.doGet(request, response); + getMarketPairListServlet.doGet(request, response); + getMarketPriceByPairServlet.doGet(request, response); + getMemoFeePricesServlet.doGet(request, response); + getMerkleTreeVoucherInfoServlet.doGet(request, response); + getNewShieldedAddressServlet.doGet(request, response); + getNextMaintenanceTimeServlet.doGet(request, response); + getNkFromNskServlet.doGet(request, response); + getNodeInfoServlet.doGet(request, response); + getNowBlockServlet.doGet(request, response); + getPaginatedAssetIssueListServlet.doGet(request, response); + getPaginatedExchangeListServlet.doGet(request, response); + getPaginatedProposalListServlet.doGet(request, response); + getPendingSizeServlet.doGet(request, response); + getProposalByIdServlet.doGet(request, response); + getRcmServlet.doGet(request, response); + getRewardServlet.doGet(request, response); + getShieldTransactionHashServlet.doGet(request, response); + getSpendingKeyServlet.doGet(request, response); + getTransactionApprovedListServlet.doGet(request, response); + getTransactionByIdServlet.doGet(request, response); + getTransactionCountByBlockNumServlet.doGet(request, response); + getTransactionFromPendingServlet.doGet(request, response); + getTransactionInfoByBlockNumServlet.doGet(request, response); + getTransactionInfoByIdServlet.doGet(request, response); + getTransactionListFromPendingServlet.doGet(request, response); + getTransactionReceiptByIdServlet.doGet(request, response); + getTransactionSignWeightServlet.doGet(request, response); + getTriggerInputForShieldedTRC20ContractServlet.doGet(request, response); + getZenPaymentAddressServlet.doGet(request, response); + isShieldedTRC20ContractNoteSpentServlet.doGet(request, response); + isSpendServlet.doGet(request, response); + listExchangesServlet.doGet(request, response); + listNodesServlet.doGet(request, response); + listProposalsServlet.doGet(request, response); + listWitnessesServlet.doGet(request, response); + marketCancelOrderServlet.doGet(request, response); + marketSellAssetServlet.doGet(request, response); + metricsServlet.doGet(request, response); + participateAssetIssueServlet.doGet(request, response); + proposalApproveServlet.doGet(request, response); + proposalCreateServlet.doGet(request, response); + proposalDeleteServlet.doGet(request, response); + scanAndMarkNoteByIvkServlet.doGet(request, response); + scanNoteByIvkServlet.doGet(request, response); + scanNoteByOvkServlet.doGet(request, response); + scanShieldedTRC20NotesByIvkServlet.doGet(request, response); + scanShieldedTRC20NotesByOvkServlet.doGet(request, response); + setAccountIdServlet.doGet(request, response); + totalTransactionServlet.doGet(request, response); + transferAssetServlet.doGet(request, response); + transferServlet.doGet(request, response); + triggerConstantContractServlet.doGet(request, response); + triggerSmartContractServlet.doGet(request, response); + unDelegateResourceServlet.doGet(request, response); + unFreezeAssetServlet.doGet(request, response); + unFreezeBalanceServlet.doGet(request, response); + unFreezeBalanceV2Servlet.doGet(request, response); + updateAccountServlet.doGet(request, response); + updateAssetServlet.doGet(request, response); + updateEnergyLimitServlet.doGet(request, response); + updateSettingServlet.doGet(request, response); + updateWitnessServlet.doGet(request, response); + validateAddressServlet.doGet(request, response); + voteWitnessAccountServlet.doGet(request, response); + withdrawBalanceServlet.doGet(request, response); + withdrawExpireUnfreezeServlet.doGet(request, response); + } + + + @Test + public void doPostTest() { + request.addParameter("owner_address", "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g"); + accountPermissionUpdateServlet.doPost(request, response); + broadcastHexServlet.doPost(request, response); + broadcastServlet.doPost(request, response); + clearABIServlet.doPost(request, response); + createAccountServlet.doPost(request, response); + createAssetIssueServlet.doPost(request, response); + createCommonTransactionServlet.doPost(request, response); + createShieldedContractParametersServlet.doPost(request, response); + createShieldedContractParametersWithoutAskServlet.doPost(request, response); + createShieldedTransactionServlet.doPost(request, response); + createShieldedTransactionWithoutSpendAuthSigServlet.doPost(request, response); + createShieldNullifierServlet.doPost(request, response); + createSpendAuthSigServlet.doPost(request, response); + createWitnessServlet.doPost(request, response); + delegateResourceServlet.doPost(request, response); + deployContractServlet.doPost(request, response); + exchangeCreateServlet.doPost(request, response); + exchangeInjectServlet.doPost(request, response); + exchangeTransactionServlet.doPost(request, response); + exchangeWithdrawServlet.doPost(request, response); + freezeBalanceServlet.doPost(request, response); + freezeBalanceV2Servlet.doPost(request, response); + getAccountBalanceServlet.doPost(request, response); + getAccountByIdServlet.doPost(request, response); + getAccountNetServlet.doPost(request, response); + getAccountResourceServlet.doPost(request, response); + getAccountServlet.doPost(request, response); + getAkFromAskServlet.doPost(request, response); + getAssetIssueByAccountServlet.doPost(request, response); + getAssetIssueByIdServlet.doPost(request, response); + getAssetIssueByNameServlet.doPost(request, response); + getAssetIssueListByNameServlet.doPost(request, response); + getAssetIssueListServlet.doPost(request, response); + getAvailableUnfreezeCountServlet.doPost(request, response); + getBandwidthPricesServlet.doPost(request, response); + getBlockBalanceServlet.doPost(request, response); + getBlockByIdServlet.doPost(request, response); + getBlockByLatestNumServlet.doPost(request, response); + getBlockByLimitNextServlet.doPost(request, response); + getBlockByNumServlet.doPost(request, response); + getBlockServlet.doPost(request, response); + getBrokerageServlet.doPost(request, response); + getBurnTrxServlet.doPost(request, response); + getCanDelegatedMaxSizeServlet.doPost(request, response); + getCanWithdrawUnfreezeAmountServlet.doPost(request, response); + getChainParametersServlet.doPost(request, response); + getContractInfoServlet.doPost(request, response); + getContractServlet.doPost(request, response); + getDelegatedResourceAccountIndexServlet.doPost(request, response); + getDelegatedResourceAccountIndexV2Servlet.doPost(request, response); + getDelegatedResourceServlet.doPost(request, response); + getDelegatedResourceV2Servlet.doPost(request, response); + getDiversifierServlet.doPost(request, response); + getEnergyPricesServlet.doPost(request, response); + getExchangeByIdServlet.doPost(request, response); + getExpandedSpendingKeyServlet.doPost(request, response); + getIncomingViewingKeyServlet.doPost(request, response); + getMarketOrderByAccountServlet.doPost(request, response); + getMarketOrderByIdServlet.doPost(request, response); + getMarketOrderListByPairServlet.doPost(request, response); + getMarketPairListServlet.doPost(request, response); + getMarketPriceByPairServlet.doPost(request, response); + getMemoFeePricesServlet.doPost(request, response); + getMerkleTreeVoucherInfoServlet.doPost(request, response); + getNewShieldedAddressServlet.doPost(request, response); + getNextMaintenanceTimeServlet.doPost(request, response); + getNkFromNskServlet.doPost(request, response); + getNodeInfoServlet.doPost(request, response); + getNowBlockServlet.doPost(request, response); + getPaginatedAssetIssueListServlet.doPost(request, response); + getPaginatedExchangeListServlet.doPost(request, response); + getPaginatedProposalListServlet.doPost(request, response); + getPendingSizeServlet.doPost(request, response); + getProposalByIdServlet.doPost(request, response); + getRcmServlet.doPost(request, response); + getRewardServlet.doPost(request, response); + getShieldTransactionHashServlet.doPost(request, response); + getSpendingKeyServlet.doPost(request, response); + getTransactionApprovedListServlet.doPost(request, response); + getTransactionByIdServlet.doPost(request, response); + getTransactionCountByBlockNumServlet.doPost(request, response); + getTransactionFromPendingServlet.doPost(request, response); + getTransactionInfoByBlockNumServlet.doPost(request, response); + getTransactionInfoByIdServlet.doPost(request, response); + getTransactionListFromPendingServlet.doPost(request, response); + getTransactionReceiptByIdServlet.doPost(request, response); + getTransactionSignWeightServlet.doPost(request, response); + getTriggerInputForShieldedTRC20ContractServlet.doPost(request, response); + getZenPaymentAddressServlet.doPost(request, response); + isShieldedTRC20ContractNoteSpentServlet.doPost(request, response); + isSpendServlet.doPost(request, response); + listExchangesServlet.doPost(request, response); + listNodesServlet.doPost(request, response); + listProposalsServlet.doPost(request, response); + listWitnessesServlet.doPost(request, response); + marketCancelOrderServlet.doPost(request, response); + marketSellAssetServlet.doPost(request, response); + participateAssetIssueServlet.doPost(request, response); + proposalApproveServlet.doPost(request, response); + proposalCreateServlet.doPost(request, response); + proposalDeleteServlet.doPost(request, response); + scanAndMarkNoteByIvkServlet.doPost(request, response); + scanNoteByIvkServlet.doPost(request, response); + scanNoteByOvkServlet.doPost(request, response); + scanShieldedTRC20NotesByIvkServlet.doPost(request, response); + scanShieldedTRC20NotesByOvkServlet.doPost(request, response); + setAccountIdServlet.doPost(request, response); + totalTransactionServlet.doPost(request, response); + transferAssetServlet.doPost(request, response); + transferServlet.doPost(request, response); + unDelegateResourceServlet.doPost(request, response); + unFreezeAssetServlet.doPost(request, response); + unFreezeBalanceServlet.doPost(request, response); + unFreezeBalanceV2Servlet.doPost(request, response); + updateAccountServlet.doPost(request, response); + updateAssetServlet.doPost(request, response); + updateBrokerageServlet.doPost(request, response); + updateEnergyLimitServlet.doPost(request, response); + updateSettingServlet.doPost(request, response); + updateWitnessServlet.doPost(request, response); + validateAddressServlet.doPost(request, response); + voteWitnessAccountServlet.doPost(request, response); + withdrawBalanceServlet.doPost(request, response); + withdrawExpireUnfreezeServlet.doPost(request, response); + } + +} diff --git a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java index ec9a1f91efa..4ba762d3340 100644 --- a/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/TriggerSmartContractServletTest.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.bouncycastle.util.encoders.Hex; +import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -80,9 +81,12 @@ public void testNormalCall() { parameter.addProperty("owner_address", ByteArray.toHexString(ownerAddr)); parameter.addProperty("contract_address", ByteArray.toHexString(contractAddr)); parameter.addProperty("function_selector", "test()"); - invokeToLocal("triggersmartcontract", parameter); - invokeToLocal("triggerconstantcontract", parameter); - invokeToLocal("estimateenergy", parameter); + HttpResponse triggersmartcontract1 = invokeToLocal("triggersmartcontract", parameter); + HttpResponse triggersmartcontract2 = invokeToLocal("triggerconstantcontract", parameter); + HttpResponse triggersmartcontract3 = invokeToLocal("estimateenergy", parameter); + Assert.assertNotNull(triggersmartcontract1); + Assert.assertNotNull(triggersmartcontract2); + Assert.assertNotNull(triggersmartcontract3); } public static HttpResponse invokeToLocal( diff --git a/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java b/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java index 64d44955536..06bc5f561c5 100644 --- a/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java +++ b/framework/src/test/java/org/tron/core/services/http/solidity/GetTransactionByIdSolidityServletTest.java @@ -59,7 +59,7 @@ public static void init() { */ @Before - public void setUp() throws InterruptedException { + public void setUp() { getTransactionByIdSolidityServlet = new GetTransactionByIdSolidityServlet(); this.request = mock(HttpServletRequest.class); this.response = mock(HttpServletResponse.class); @@ -96,7 +96,7 @@ public void doPostTest() throws IOException { httpUrlConnection.setDoOutput(true); String postData = "{\"value\": \"309b6fa3d01353e46f57dd8a8f27611f98e392b50d035cef21" + "3f2c55225a8bd2\"}"; - httpUrlConnection.setRequestProperty("Content-Length", "" + postData.length()); + httpUrlConnection.setRequestProperty("Content-Length", String.valueOf(postData.length())); when(httpUrlConnection.getOutputStream()).thenReturn(outContent); OutputStreamWriter out = new OutputStreamWriter(httpUrlConnection.getOutputStream(), @@ -121,14 +121,15 @@ public void doPostTest() throws IOException { while ((line = in.readLine()) != null) { result.append(line).append("\n"); } + Assert.assertNotNull(result); in.close(); writer.flush(); FileInputStream fileInputStream = new FileInputStream("temp.txt"); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - StringBuffer sb = new StringBuffer(); - String text = null; + StringBuilder sb = new StringBuilder(); + String text; while ((text = bufferedReader.readLine()) != null) { sb.append(text); } @@ -150,7 +151,7 @@ public void doGetTest() throws IOException { httpUrlConnection.setDoOutput(true); String postData = "{\"value\": \"309b6fa3d01353e46f57dd8a8f27611f98e392b50d035cef21" + "3f2c55225a8bd2\"}"; - httpUrlConnection.setRequestProperty("Content-Length", "" + postData.length()); + httpUrlConnection.setRequestProperty("Content-Length", String.valueOf(postData.length())); when(httpUrlConnection.getOutputStream()).thenReturn(outContent); OutputStreamWriter out = new OutputStreamWriter(httpUrlConnection.getOutputStream(), @@ -175,14 +176,15 @@ public void doGetTest() throws IOException { while ((line = in.readLine()) != null) { result.append(line).append("\n"); } + Assert.assertNotNull(result); in.close(); writer.flush(); FileInputStream fileInputStream = new FileInputStream("temp.txt"); InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); - StringBuffer sb = new StringBuffer(); - String text = null; + StringBuilder sb = new StringBuilder(); + String text; while ((text = bufferedReader.readLine()) != null) { sb.append(text); } 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 cbc657e02c9..cd7a36ab7a4 100644 --- a/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java +++ b/framework/src/test/java/org/tron/core/zksnark/SendCoinShieldTest.java @@ -10,10 +10,13 @@ import java.io.File; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.Optional; import javax.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.testng.collections.Lists; import org.tron.api.GrpcAPI; @@ -85,6 +88,7 @@ import org.tron.protos.contract.ShieldContract.ShieldedTransferContract; import org.tron.protos.contract.ShieldContract.SpendDescription; +@Slf4j public class SendCoinShieldTest extends BaseTest { public static final long totalBalance = 1000_0000_000_000L; @@ -133,11 +137,12 @@ public void init() { AssetIssueContract assetIssueContract = AssetIssueContract.newBuilder() .setOwnerAddress(ByteString.copyFrom(ByteArray.fromHexString(PUBLIC_ADDRESS_ONE))) - .setName(ByteString.copyFrom(ByteArray.fromString(ASSET_NAME))) + .setName(ByteString.copyFrom(Objects.requireNonNull(ByteArray.fromString(ASSET_NAME)))) .setId(Long.toString(tokenId)).setTotalSupply(OWNER_BALANCE).setTrxNum(TRX_NUM).setNum(NUM) .setStartTime(START_TIME).setEndTime(END_TIME).setVoteScore(VOTE_SCORE) - .setDescription(ByteString.copyFrom(ByteArray.fromString(DESCRIPTION))) - .setUrl(ByteString.copyFrom(ByteArray.fromString(URL))).build(); + .setDescription(ByteString.copyFrom( + Objects.requireNonNull(ByteArray.fromString(DESCRIPTION)))) + .setUrl(ByteString.copyFrom(Objects.requireNonNull(ByteArray.fromString(URL)))).build(); AssetIssueCapsule assetIssueCapsule = new AssetIssueCapsule(assetIssueContract); dbManager.getAssetIssueV2Store().put(assetIssueCapsule.createDbV2Key(), assetIssueCapsule); @@ -148,8 +153,11 @@ private void addZeroValueOutputNote(ZenTransactionBuilder builder) throws Zksnar SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); - builder.addOutput(DEFAULT_OVK, paymentAddress, 0, "just for decode for ovk".getBytes()); + Optional optional = incomingViewingKey.address(DiversifierT.random()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + builder.addOutput(DEFAULT_OVK, paymentAddress, 0, "just for decode for ovk".getBytes()); + } } @Test @@ -163,7 +171,9 @@ public void testPathMock() throws ZksnarkException { List index = Lists.newArrayList(Arrays.asList(indexArray)); MerklePath path = new MerklePath(authenticationPath, index); byte[] encode = path.encode(); - System.out.print(ByteArray.toHexString(encode)); + String hexString = ByteArray.toHexString(encode); + System.out.print(hexString); + Assert.assertNotNull(hexString); } private PedersenHash String2PedersenHash(String str) { @@ -207,20 +217,21 @@ private IncrementalMerkleVoucherContainer createSimpleMerkleVoucherContainer(byt compressCapsule1.setContent(ByteString.copyFrom(cm)); PedersenHash a = compressCapsule1.getInstance(); tree.append(a); - IncrementalMerkleVoucherContainer voucher = tree.toVoucher(); - return voucher; + return tree.toVoucher(); } - private void librustzcashInitZksnarkParams() throws ZksnarkException { + private void librustzcashInitZksnarkParams() { FullNodeHttpApiService.librustzcashInitZksnarkParams(); } @Test - public void testStringRevert() throws Exception { + public void testStringRevert() { byte[] bytes = ByteArray .fromHexString("6c030e6d7460f91668cc842ceb78cdb54470469e78cd59cf903d3a6e1aa03e7c"); ByteUtil.reverse(bytes); - System.out.println("testStringRevert------" + ByteArray.toHexString(bytes)); + String hexString = ByteArray.toHexString(bytes); + System.out.println("testStringRevert------" + hexString); + Assert.assertNotNull(hexString); } @Test @@ -233,12 +244,9 @@ public void testGenerateSpendProof() throws Exception { DiversifierT diversifierT = new DiversifierT(); byte[] d; - while (true) { + do { d = org.tron.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE); - if (JLibrustzcash.librustzcashCheckDiversifier(d)) { - break; - } - } + } while (!JLibrustzcash.librustzcashCheckDiversifier(d)); diversifierT.setData(d); FullViewingKey fullViewingKey = expsk.fullViewingKey(); @@ -246,17 +254,19 @@ public void testGenerateSpendProof() throws Exception { IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); Optional op = incomingViewingKey.address(diversifierT); + if (op.isPresent()) { + Note note = new Note(op.get(), 100); + note.setRcm(ByteArray + .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02")); - Note note = new Note(op.get(), 100); - note.setRcm(ByteArray - .fromHexString("bf4b2042e3e8c4a0b390e407a79a0b46e36eff4f7bb54b2349dbb0046ee21e02")); - - IncrementalMerkleVoucherContainer voucher = createComplexMerkleVoucherContainer(note.cm()); + IncrementalMerkleVoucherContainer voucher = createComplexMerkleVoucherContainer(note.cm()); - byte[] anchor = voucher.root().getContent().toByteArray(); - SpendDescriptionInfo spend = new SpendDescriptionInfo(expsk, note, anchor, voucher); - long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); - SpendDescriptionCapsule sdesc = builder.generateSpendProof(spend, ctx); + byte[] anchor = voucher.root().getContent().toByteArray(); + SpendDescriptionInfo spend = new SpendDescriptionInfo(expsk, note, anchor, voucher); + long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); + SpendDescriptionCapsule sdesc = builder.generateSpendProof(spend, ctx); + Assert.assertNotNull(sdesc); + } } @Test @@ -267,11 +277,15 @@ public void generateOutputProof() throws ZksnarkException { FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); - builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, new byte[512]); - builder.generateOutputProof(builder.getReceives().get(0), ctx); - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + Optional optional = incomingViewingKey.address(new DiversifierT()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + Assert.assertNotNull(paymentAddress); + long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); + builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, new byte[512]); + builder.generateOutputProof(builder.getReceives().get(0), ctx); + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + } } @Test @@ -281,24 +295,27 @@ public void verifyOutputProof() throws ZksnarkException { SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - - PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); - builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, new byte[512]); - ReceiveDescriptionCapsule capsule = builder - .generateOutputProof(builder.getReceives().get(0), ctx); - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - ReceiveDescription receiveDescription = capsule.getInstance(); - ctx = JLibrustzcash.librustzcashSaplingVerificationCtxInit(); - if (!JLibrustzcash.librustzcashSaplingCheckOutput( - new CheckOutputParams(ctx, receiveDescription.getValueCommitment().toByteArray(), - receiveDescription.getNoteCommitment().toByteArray(), - receiveDescription.getEpk().toByteArray(), - receiveDescription.getZkproof().toByteArray()))) { + Optional optional = incomingViewingKey.address(new DiversifierT()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + Assert.assertNotNull(paymentAddress); + long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); + builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, new byte[512]); + ReceiveDescriptionCapsule capsule = builder + .generateOutputProof(builder.getReceives().get(0), ctx); + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + ReceiveDescription receiveDescription = capsule.getInstance(); + ctx = JLibrustzcash.librustzcashSaplingVerificationCtxInit(); + if (!JLibrustzcash.librustzcashSaplingCheckOutput( + new CheckOutputParams(ctx, receiveDescription.getValueCommitment().toByteArray(), + receiveDescription.getNoteCommitment().toByteArray(), + receiveDescription.getEpk().toByteArray(), + receiveDescription.getZkproof().toByteArray()))) { + JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx); + throw new RuntimeException("librustzcashSaplingCheckOutput error"); + } JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx); - throw new RuntimeException("librustzcashSaplingCheckOutput error"); } - JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx); } @@ -312,49 +329,54 @@ public void testDecryptReceiveWithIvk() throws ZksnarkException { FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); + Optional optional = incomingViewingKey.address(new DiversifierT()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); - long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); - builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, memo); + long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); + byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000, memo); - ZenTransactionBuilder.ReceiveDescriptionInfo output = builder.getReceives().get(0); - ReceiveDescriptionCapsule receiveDescriptionCapsule = builder.generateOutputProof(output, ctx); - ReceiveDescription receiveDescription = receiveDescriptionCapsule.getInstance(); + ZenTransactionBuilder.ReceiveDescriptionInfo output = builder.getReceives().get(0); + ReceiveDescriptionCapsule receiveDescriptionCapsule = builder + .generateOutputProof(output, ctx); + ReceiveDescription receiveDescription = receiveDescriptionCapsule.getInstance(); - Optional ret1 = Note.decrypt(receiveDescription.getCEnc().toByteArray(),//ciphertext - fullViewingKey.inViewingKey().getValue(), receiveDescription.getEpk().toByteArray(),//epk - receiveDescription.getNoteCommitment().toByteArray() //cm - ); + Optional ret1 = Note.decrypt(receiveDescription.getCEnc().toByteArray(),//ciphertext + fullViewingKey.inViewingKey().getValue(), receiveDescription.getEpk().toByteArray(),//epk + receiveDescription.getNoteCommitment().toByteArray() //cm + ); - Assert.assertTrue(ret1.isPresent()); + Assert.assertTrue(ret1.isPresent()); - Note noteText = ret1.get(); - byte[] pkD = new byte[32]; - if (!JLibrustzcash.librustzcashIvkToPkd( - new IvkToPkdParams(incomingViewingKey.getValue(), noteText.getD().getData(), pkD))) { - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - return; - } + Note noteText = ret1.get(); + byte[] pkD = new byte[32]; + if (!JLibrustzcash.librustzcashIvkToPkd( + new IvkToPkdParams(incomingViewingKey.getValue(), noteText.getD().getData(), pkD))) { + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + return; + } - Assert.assertArrayEquals(paymentAddress.getPkD(), pkD); - Assert.assertEquals(noteText.getValue(), 4000); - Assert.assertArrayEquals(noteText.getMemo(), memo); + Assert.assertArrayEquals(paymentAddress.getPkD(), pkD); + Assert.assertEquals(4000, noteText.getValue()); + Assert.assertArrayEquals(noteText.getMemo(), memo); - String paymentAddressStr = KeyIo.encodePaymentAddress(new PaymentAddress(noteText.getD(), pkD)); + String paymentAddressStr = KeyIo.encodePaymentAddress( + new PaymentAddress(noteText.getD(), pkD)); - GrpcAPI.Note grpcAPINote = GrpcAPI.Note.newBuilder().setPaymentAddress(paymentAddressStr) - .setValue(noteText.getValue()).setRcm(ByteString.copyFrom(noteText.getRcm())) - .setMemo(ByteString.copyFrom(noteText.getMemo())).build(); + GrpcAPI.Note grpcAPINote = GrpcAPI.Note.newBuilder().setPaymentAddress(paymentAddressStr) + .setValue(noteText.getValue()).setRcm(ByteString.copyFrom(noteText.getRcm())) + .setMemo(ByteString.copyFrom(noteText.getMemo())).build(); - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + } } public String byte2intstring(byte[] input) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < input.length; i++) { - sb.append(String.valueOf((int) input[i]) + ", "); + sb.append(String.valueOf(input[i])).append(", "); if (i % 16 == 15) { sb.append("\n"); } @@ -391,48 +413,50 @@ public void testDecryptReceiveWithOvk() throws Exception { byte[] cmuOpt = note.cm(); Assert.assertNotNull(cmuOpt); - NotePlaintextEncryptionResult enc = note.encrypt(pkd).get(); - NoteEncryption encryptor = enc.getNoteEncryption(); - OutgoingPlaintext outgoingPlaintext = new OutgoingPlaintext(note.getPkD(), encryptor.getEsk()); - - // encrypt with ovk - Encryption.OutCiphertext outCiphertext = outgoingPlaintext - .encrypt(fullViewingKey.getOvk(), receiveDescription.getValueCommitment().toByteArray(), - receiveDescription.getNoteCommitment().toByteArray(), encryptor); - - // get pkD, esk from decryption of c_out with ovk - Optional ret2 = OutgoingPlaintext - .decrypt(outCiphertext, fullViewingKey.getOvk(), - receiveDescription.getValueCommitment().toByteArray(), - receiveDescription.getNoteCommitment().toByteArray(), encryptor.getEpk()); - - if (ret2.isPresent()) { - OutgoingPlaintext decryptedOutgoingPlaintext = ret2.get(); - Assert.assertArrayEquals(decryptedOutgoingPlaintext.getPkD(), outgoingPlaintext.getPkD()); - Assert.assertArrayEquals(decryptedOutgoingPlaintext.getEsk(), outgoingPlaintext.getEsk()); - - //decrypt c_enc with pkd、esk - Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext(); - ciphertext.setData(enc.getEncCiphertext()); - Optional foo = Note - .decrypt(ciphertext, encryptor.getEpk(), decryptedOutgoingPlaintext.getEsk(), - decryptedOutgoingPlaintext.getPkD(), cmuOpt); - - if (foo.isPresent()) { - Note bar = foo.get(); - //verify result - Assert.assertEquals(4000, bar.getValue()); - Assert.assertArrayEquals(memo, bar.getMemo()); + Optional optional = note.encrypt(pkd); + if (optional.isPresent()) { + NotePlaintextEncryptionResult enc = optional.get(); + NoteEncryption encryptor = enc.getNoteEncryption(); + OutgoingPlaintext outgoingPlaintext = new OutgoingPlaintext( + note.getPkD(), encryptor.getEsk()); + // encrypt with ovk + Encryption.OutCiphertext outCiphertext = outgoingPlaintext + .encrypt(fullViewingKey.getOvk(), receiveDescription.getValueCommitment().toByteArray(), + receiveDescription.getNoteCommitment().toByteArray(), encryptor); + + // get pkD, esk from decryption of c_out with ovk + Optional ret2 = OutgoingPlaintext + .decrypt(outCiphertext, fullViewingKey.getOvk(), + receiveDescription.getValueCommitment().toByteArray(), + receiveDescription.getNoteCommitment().toByteArray(), encryptor.getEpk()); + + if (ret2.isPresent()) { + OutgoingPlaintext decryptedOutgoingPlaintext = ret2.get(); + Assert.assertArrayEquals(decryptedOutgoingPlaintext.getPkD(), outgoingPlaintext.getPkD()); + Assert.assertArrayEquals(decryptedOutgoingPlaintext.getEsk(), outgoingPlaintext.getEsk()); + + //decrypt c_enc with pkd、esk + Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext(); + ciphertext.setData(enc.getEncCiphertext()); + Optional foo = Note + .decrypt(ciphertext, encryptor.getEpk(), decryptedOutgoingPlaintext.getEsk(), + decryptedOutgoingPlaintext.getPkD(), cmuOpt); + + if (foo.isPresent()) { + Note bar = foo.get(); + //verify result + Assert.assertEquals(4000, bar.getValue()); + Assert.assertArrayEquals(memo, bar.getMemo()); + } else { + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + Assert.fail(); + } } else { JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertFalse(true); + Assert.fail(); } - } else { JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertFalse(true); } - - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); } @Test @@ -466,53 +490,55 @@ public void pushShieldedTransactionAndDecryptWithIvk() SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); - builder - .addOutput(senderOvk, paymentAddress, 1000 * 1000000L - wallet.getShieldedTransactionFee(), - memo); - - TransactionCapsule transactionCap = builder.build(); + Optional optional = incomingViewingKey.address(new DiversifierT()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + builder.addOutput(senderOvk, paymentAddress, + 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo); - boolean ok = dbManager.pushTransaction(transactionCap); - Assert.assertTrue(ok); + TransactionCapsule transactionCap = builder.build(); - // add here - byte[] ivk = incomingViewingKey.getValue(); - Protocol.Transaction t = transactionCap.getInstance(); + boolean ok = dbManager.pushTransaction(transactionCap); + Assert.assertTrue(ok); - for (org.tron.protos.Protocol.Transaction.Contract c : t.getRawData().getContractList()) { - if (c.getType() != ContractType.ShieldedTransferContract) { - continue; - } - ShieldedTransferContract stContract = c.getParameter() - .unpack(ShieldedTransferContract.class); - ReceiveDescription receiveDescription = stContract.getReceiveDescription(0); + // add here + byte[] ivk = incomingViewingKey.getValue(); + Protocol.Transaction t = transactionCap.getInstance(); - Optional ret1 = Note.decrypt(receiveDescription.getCEnc().toByteArray(),//ciphertext - ivk, receiveDescription.getEpk().toByteArray(),//epk - receiveDescription.getNoteCommitment().toByteArray() //cm - ); - - if (ret1.isPresent()) { - Note noteText = ret1.get(); - byte[] pkD = new byte[32]; - if (!JLibrustzcash.librustzcashIvkToPkd( - new IvkToPkdParams(incomingViewingKey.getValue(), noteText.getD().getData(), pkD))) { - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - return; + for (org.tron.protos.Protocol.Transaction.Contract c : t.getRawData().getContractList()) { + if (c.getType() != ContractType.ShieldedTransferContract) { + continue; + } + ShieldedTransferContract stContract = c.getParameter() + .unpack(ShieldedTransferContract.class); + ReceiveDescription receiveDescription = stContract.getReceiveDescription(0); + + Optional ret1 = Note.decrypt(receiveDescription.getCEnc().toByteArray(),//ciphertext + ivk, receiveDescription.getEpk().toByteArray(),//epk + receiveDescription.getNoteCommitment().toByteArray() //cm + ); + + if (ret1.isPresent()) { + Note noteText = ret1.get(); + byte[] pkD = new byte[32]; + if (!JLibrustzcash.librustzcashIvkToPkd( + new IvkToPkdParams(incomingViewingKey.getValue(), noteText.getD().getData(), pkD))) { + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + return; + } + Assert.assertArrayEquals(paymentAddress.getPkD(), pkD); + Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(), + noteText.getValue()); + Assert.assertArrayEquals(memo, noteText.getMemo()); + } else { + Assert.fail(); } - Assert.assertArrayEquals(paymentAddress.getPkD(), pkD); - Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(), - noteText.getValue()); - Assert.assertArrayEquals(memo, noteText.getMemo()); - } else { - Assert.assertFalse(true); } + // end here + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + Assert.assertTrue(ok); } - // end here - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertTrue(ok); } @Test @@ -553,59 +579,61 @@ public void pushShieldedTransactionAndDecryptWithOvk() SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); - builder - .addOutput(senderOvk, paymentAddress, 1000 * 1000000L - wallet.getShieldedTransactionFee(), - memo); - - TransactionCapsule transactionCap = builder.build(); - boolean ok = dbManager.pushTransaction(transactionCap); - Assert.assertTrue(ok); - - // add here - Protocol.Transaction t = transactionCap.getInstance(); - for (org.tron.protos.Protocol.Transaction.Contract c : t.getRawData().getContractList()) { - if (c.getType() != Protocol.Transaction.Contract.ContractType.ShieldedTransferContract) { - continue; - } - ShieldedTransferContract stContract = c.getParameter() - .unpack(ShieldedTransferContract.class); - ReceiveDescription receiveDescription = stContract.getReceiveDescription(0); - - //first try to decrypt cOut with ovk, get pkd、esk - Encryption.OutCiphertext cOut = new Encryption.OutCiphertext(); - cOut.setData(receiveDescription.getCOut().toByteArray()); - Optional notePlaintext = OutgoingPlaintext.decrypt(cOut,//ciphertext - senderOvk, receiveDescription.getValueCommitment().toByteArray(), //cv - receiveDescription.getNoteCommitment().toByteArray(), //cmu - receiveDescription.getEpk().toByteArray() //epk - ); + Optional optional = incomingViewingKey.address(new DiversifierT()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + byte[] memo = org.tron.keystore.Wallet.generateRandomBytes(512); + builder.addOutput(senderOvk, paymentAddress, + 1000 * 1000000L - wallet.getShieldedTransactionFee(), memo); - //then decrypt c_enc with pkd、esk, get decoded note == ciphertext - if (notePlaintext.isPresent()) { - OutgoingPlaintext decryptedOutgoingPlaintext = notePlaintext.get(); - - Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext(); - ciphertext.setData(receiveDescription.getCEnc().toByteArray()); - Optional foo = Note.decrypt(ciphertext, receiveDescription.getEpk().toByteArray(), - decryptedOutgoingPlaintext.getEsk(), decryptedOutgoingPlaintext.getPkD(), - receiveDescription.getNoteCommitment().toByteArray()); - - if (foo.isPresent()) { - Note bar = foo.get(); - //verify result - Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(), bar.getValue()); - Assert.assertArrayEquals(memo, bar.getMemo()); - } else { - Assert.assertFalse(true); + TransactionCapsule transactionCap = builder.build(); + boolean ok = dbManager.pushTransaction(transactionCap); + Assert.assertTrue(ok); + + // add here + Protocol.Transaction t = transactionCap.getInstance(); + for (org.tron.protos.Protocol.Transaction.Contract c : t.getRawData().getContractList()) { + if (c.getType() != Protocol.Transaction.Contract.ContractType.ShieldedTransferContract) { + continue; + } + ShieldedTransferContract stContract = c.getParameter() + .unpack(ShieldedTransferContract.class); + ReceiveDescription receiveDescription = stContract.getReceiveDescription(0); + + //first try to decrypt cOut with ovk, get pkd、esk + Encryption.OutCiphertext cOut = new Encryption.OutCiphertext(); + cOut.setData(receiveDescription.getCOut().toByteArray()); + Optional notePlaintext = OutgoingPlaintext.decrypt(cOut,//ciphertext + senderOvk, receiveDescription.getValueCommitment().toByteArray(), //cv + receiveDescription.getNoteCommitment().toByteArray(), //cmu + receiveDescription.getEpk().toByteArray() //epk + ); + + //then decrypt c_enc with pkd、esk, get decoded note == ciphertext + if (notePlaintext.isPresent()) { + OutgoingPlaintext decryptedOutgoingPlaintext = notePlaintext.get(); + + Encryption.EncCiphertext ciphertext = new Encryption.EncCiphertext(); + ciphertext.setData(receiveDescription.getCEnc().toByteArray()); + Optional foo = Note.decrypt(ciphertext, receiveDescription.getEpk().toByteArray(), + decryptedOutgoingPlaintext.getEsk(), decryptedOutgoingPlaintext.getPkD(), + receiveDescription.getNoteCommitment().toByteArray()); + + if (foo.isPresent()) { + Note bar = foo.get(); + //verify result + Assert.assertEquals(1000 * 1000000L - wallet.getShieldedTransactionFee(), + bar.getValue()); + Assert.assertArrayEquals(memo, bar.getMemo()); + } else { + Assert.fail(); + } } } + // end here + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + Assert.assertTrue(ok); } - // end here - - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertTrue(ok); } private byte[] getHash() { @@ -613,6 +641,8 @@ private byte[] getHash() { .getInstance().isECKeyCryptoEngine(), "this is a test".getBytes()).getBytes(); } + @Ignore + @Test public void checkZksnark() throws BadItemException, ZksnarkException { librustzcashInitZksnarkParams(); long ctx = JLibrustzcash.librustzcashSaplingProvingCtxInit(); @@ -635,14 +665,17 @@ public void checkZksnark() throws BadItemException, ZksnarkException { SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); - builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]); - TransactionCapsule transactionCap = builder.build(); - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - boolean ret = ZksnarkClient.getInstance().checkZksnarkProof(transactionCap.getInstance(), - getShieldTransactionHashIgnoreTypeException(transactionCap.getInstance()), - 10 * 1000000); - Assert.assertTrue(ret); + Optional optional = incomingViewingKey.address(DiversifierT.random()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]); + TransactionCapsule transactionCap = builder.build(); + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + boolean ret = ZksnarkClient.getInstance().checkZksnarkProof(transactionCap.getInstance(), + getShieldTransactionHashIgnoreTypeException(transactionCap.getInstance()), + 10 * 1000000); + Assert.assertTrue(ret); + } } @Test @@ -678,7 +711,7 @@ public void testVerifySpendProof() throws BadItemException, ZksnarkException { spendDescriptionCapsule.getRk().toByteArray(), spendDescriptionCapsule.getZkproof().toByteArray(), result, getHash())); JLibrustzcash.librustzcashSaplingVerificationCtxFree(verifyContext); - Assert.assertEquals(ok, true); + Assert.assertTrue(ok); } @Test @@ -700,16 +733,19 @@ public void saplingBindingSig() throws BadItemException, ZksnarkException { SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]); - builder.generateOutputProof(builder.getReceives().get(0), ctx); - - // test create binding sig - byte[] bindingSig = new byte[64]; - boolean ret = JLibrustzcash.librustzcashSaplingBindingSig( - new BindingSigParams(ctx, builder.getValueBalance(), getHash(), bindingSig)); - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertTrue(ret); + Optional optional = incomingViewingKey.address(new DiversifierT()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]); + builder.generateOutputProof(builder.getReceives().get(0), ctx); + + // test create binding sig + byte[] bindingSig = new byte[64]; + boolean ret = JLibrustzcash.librustzcashSaplingBindingSig( + new BindingSigParams(ctx, builder.getValueBalance(), getHash(), bindingSig)); + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + Assert.assertTrue(ret); + } } @Test @@ -739,13 +775,16 @@ public void pushShieldedTransaction() SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(DiversifierT.random()).get(); - builder.addOutput(fullViewingKey.getOvk(), paymentAddress, - 4010 * 1000000L - wallet.getShieldedTransactionFee(), new byte[512]); - TransactionCapsule transactionCap = builder.build(); - boolean ok = dbManager.pushTransaction(transactionCap); - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertTrue(ok); + Optional optional = incomingViewingKey.address(DiversifierT.random()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + builder.addOutput(fullViewingKey.getOvk(), paymentAddress, + 4010 * 1000000L - wallet.getShieldedTransactionFee(), new byte[512]); + TransactionCapsule transactionCap = builder.build(); + boolean ok = dbManager.pushTransaction(transactionCap); + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + Assert.assertTrue(ok); + } } @Test @@ -768,46 +807,49 @@ public void finalCheck() throws BadItemException, ZksnarkException { SpendingKey spendingKey = SpendingKey.random(); FullViewingKey fullViewingKey = spendingKey.fullViewingKey(); IncomingViewingKey incomingViewingKey = fullViewingKey.inViewingKey(); - PaymentAddress paymentAddress = incomingViewingKey.address(new DiversifierT()).get(); - builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]); - ReceiveDescriptionCapsule receiveDescriptionCapsule = builder - .generateOutputProof(builder.getReceives().get(0), ctx); - - //create binding sig - byte[] bindingSig = new byte[64]; - boolean ret = JLibrustzcash.librustzcashSaplingBindingSig( - new BindingSigParams(ctx, builder.getValueBalance(), getHash(), bindingSig)); - JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); - Assert.assertTrue(ret); - // check spend - ctx = JLibrustzcash.librustzcashSaplingVerificationCtxInit(); - byte[] result = new byte[64]; - JLibrustzcash.librustzcashSaplingSpendSig( - new SpendSigParams(expsk.getAsk(), builder.getSpends().get(0).getAlpha(), getHash(), - result)); - - SpendDescription spendDescription = spendDescriptionCapsule.getInstance(); - boolean ok; - ok = JLibrustzcash.librustzcashSaplingCheckSpend( - new CheckSpendParams(ctx, spendDescription.getValueCommitment().toByteArray(), - spendDescription.getAnchor().toByteArray(), - spendDescription.getNullifier().toByteArray(), spendDescription.getRk().toByteArray(), - spendDescription.getZkproof().toByteArray(), result, getHash())); - Assert.assertTrue(ok); - - // check output - ReceiveDescription receiveDescription = receiveDescriptionCapsule.getInstance(); - ok = JLibrustzcash.librustzcashSaplingCheckOutput( - new CheckOutputParams(ctx, receiveDescription.getValueCommitment().toByteArray(), - receiveDescription.getNoteCommitment().toByteArray(), - receiveDescription.getEpk().toByteArray(), - receiveDescription.getZkproof().toByteArray())); - Assert.assertTrue(ok); - // final check - ok = JLibrustzcash.librustzcashSaplingFinalCheck( - new FinalCheckParams(ctx, builder.getValueBalance(), bindingSig, getHash())); - Assert.assertTrue(ok); - JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx); + Optional optional = incomingViewingKey.address(new DiversifierT()); + if (optional.isPresent()) { + PaymentAddress paymentAddress = optional.get(); + builder.addOutput(fullViewingKey.getOvk(), paymentAddress, 4000 * 1000000L, new byte[512]); + ReceiveDescriptionCapsule receiveDescriptionCapsule = builder + .generateOutputProof(builder.getReceives().get(0), ctx); + + //create binding sig + byte[] bindingSig = new byte[64]; + boolean ret = JLibrustzcash.librustzcashSaplingBindingSig( + new BindingSigParams(ctx, builder.getValueBalance(), getHash(), bindingSig)); + JLibrustzcash.librustzcashSaplingProvingCtxFree(ctx); + Assert.assertTrue(ret); + // check spend + ctx = JLibrustzcash.librustzcashSaplingVerificationCtxInit(); + byte[] result = new byte[64]; + JLibrustzcash.librustzcashSaplingSpendSig( + new SpendSigParams(expsk.getAsk(), builder.getSpends().get(0).getAlpha(), getHash(), + result)); + + SpendDescription spendDescription = spendDescriptionCapsule.getInstance(); + boolean ok; + ok = JLibrustzcash.librustzcashSaplingCheckSpend( + new CheckSpendParams(ctx, spendDescription.getValueCommitment().toByteArray(), + spendDescription.getAnchor().toByteArray(), + spendDescription.getNullifier().toByteArray(), spendDescription.getRk().toByteArray(), + spendDescription.getZkproof().toByteArray(), result, getHash())); + Assert.assertTrue(ok); + + // check output + ReceiveDescription receiveDescription = receiveDescriptionCapsule.getInstance(); + ok = JLibrustzcash.librustzcashSaplingCheckOutput( + new CheckOutputParams(ctx, receiveDescription.getValueCommitment().toByteArray(), + receiveDescription.getNoteCommitment().toByteArray(), + receiveDescription.getEpk().toByteArray(), + receiveDescription.getZkproof().toByteArray())); + Assert.assertTrue(ok); + // final check + ok = JLibrustzcash.librustzcashSaplingFinalCheck( + new FinalCheckParams(ctx, builder.getValueBalance(), bindingSig, getHash())); + Assert.assertTrue(ok); + JLibrustzcash.librustzcashSaplingVerificationCtxFree(ctx); + } } @Test @@ -830,11 +872,11 @@ public void testEmptyRoots() throws Exception { } private JSONArray readFile(String fileName) throws Exception { - String file1 = SendCoinShieldTest.class.getClassLoader() - .getResource("json" + File.separator + fileName).getFile(); + String file1 = Objects.requireNonNull(SendCoinShieldTest.class.getClassLoader() + .getResource("json" + File.separator + fileName)).getFile(); List readLines = Files.readLines(new File(file1), Charsets.UTF_8); - JSONArray array = JSONArray.parseArray(readLines.stream().reduce((s, s2) -> s + s2).get()); - return array; + Optional optional = readLines.stream().reduce((s, s2) -> s + s2); + return optional.map(JSONArray::parseArray).orElse(null); } @@ -847,9 +889,9 @@ public void testComputeCm() throws Exception { 9990000000L, ByteArray .fromHexString("08e3a2ff1101b628147125b786c757b483f1cf7c309f8a647055bfb1ca819c02"), result))) { - System.out.println(" error"); + Assert.fail(); } else { - System.out.println(" ok"); + Assert.assertTrue(true); } } @@ -880,12 +922,9 @@ public void getSpendingKey() throws Exception { DiversifierT diversifierT = new DiversifierT(); byte[] d; - while (true) { + do { d = org.tron.keystore.Wallet.generateRandomBytes(Constant.ZC_DIVERSIFIER_SIZE); - if (JLibrustzcash.librustzcashCheckDiversifier(d)) { - break; - } - } + } while (!JLibrustzcash.librustzcashCheckDiversifier(d)); diversifierT.setData(d); System.out.println("d is: " + ByteArray.toHexString(d)); @@ -1319,7 +1358,7 @@ public void TestCreateMultipleTxAtTheSameTime() throws Exception { executeTx(transactionCapsule); System.out.println("Success execute tx,num:" + transactionCapsule.getBlockNum()); } catch (Exception ex) { - System.out.println(ex); + logger.error("error", ex); } }); } @@ -1514,7 +1553,7 @@ public void TestGeneratesProofWithWrongRcm() throws Exception { builder.addSpend(expsk, note, anchor, voucher); SpendDescriptionCapsule spendDescriptionCapsule = builder .generateSpendProof(builder.getSpends().get(0), ctx); - + Assert.assertNotNull(spendDescriptionCapsule); } @Test @@ -1624,9 +1663,7 @@ private TransactionCapsule generateDefaultBuilder(ZenTransactionBuilder builder) String TO_ADDRESS = generateDefaultToAccount(); builder.setTransparentOutput(ByteArray.fromHexString(TO_ADDRESS), 1000 * 1000000L - wallet.getShieldedTransactionFee()); - - TransactionCapsule transactionCap = builder.build(); - return transactionCap; + return builder.build(); } @Test @@ -1753,7 +1790,6 @@ public SpendDescriptionCapsule generateSpendProof(SpendDescriptionInfo spend, lo throw e; } System.out.println("Done"); - return; } } } @@ -1790,7 +1826,6 @@ public SpendDescriptionCapsule generateSpendProof(SpendDescriptionInfo spend, lo throw e; } System.out.println("Done"); - return; } } } diff --git a/framework/src/test/java/org/tron/program/SolidityNodeTest.java b/framework/src/test/java/org/tron/program/SolidityNodeTest.java index 7cb3ac9823f..99d6a75adbe 100755 --- a/framework/src/test/java/org/tron/program/SolidityNodeTest.java +++ b/framework/src/test/java/org/tron/program/SolidityNodeTest.java @@ -75,11 +75,11 @@ public void testSolidityArgs() { @Test public void testSolidityGrpcCall() { DatabaseGrpcClient databaseGrpcClient = null; - String addr = Args.getInstance().getTrustNodeAddr(); + String address = Args.getInstance().getTrustNodeAddr(); try { - databaseGrpcClient = new DatabaseGrpcClient(addr); + databaseGrpcClient = new DatabaseGrpcClient(address); } catch (Exception e) { - logger.error("Failed to create database grpc client {}", addr); + logger.error("Failed to create database grpc client {}", address); } Assert.assertNotNull(databaseGrpcClient); @@ -89,6 +89,7 @@ public void testSolidityGrpcCall() { Block genesisBlock = databaseGrpcClient.getBlock(0); Assert.assertNotNull(genesisBlock); Assert.assertFalse(genesisBlock.getTransactionsList().isEmpty()); + databaseGrpcClient.shutdown(); } }