Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down
2 changes: 2 additions & 0 deletions framework/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,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")
Expand Down
6 changes: 3 additions & 3 deletions framework/src/main/java/org/tron/core/capsule/utils/RLP.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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;
Expand Down
1 change: 1 addition & 0 deletions framework/src/main/java/org/tron/core/db/Manager.java
Original file line number Diff line number Diff line change
Expand Up @@ -1913,6 +1913,7 @@ public NullifierStore getNullifierStore() {
public void closeAllStore() {
logger.info("******** Begin to close db. ********");
chainBaseManager.closeAllStore();
validateSignService.shutdown();
logger.info("******** End to close db. ********");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public void init() {
}

public void close() {
trxHandlePool.shutdown();
smartContractExecutor.shutdown();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,34 @@
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Timer;
import java.util.TimerTask;
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.ByteArray;
import org.tron.common.utils.JsonUtil;
import org.tron.core.ChainBaseManager;
import org.tron.core.capsule.BytesCapsule;
import org.tron.core.config.args.Args;
import org.tron.core.db.CommonStore;
import org.tron.core.net.TronNetService;
import org.tron.p2p.discover.Node;

@Slf4j(topic = "net")
@Component
public class NodePersistService {
private static final byte[] DB_KEY_PEERS = "peers".getBytes();
private static final long DB_COMMIT_RATE = 1 * 60 * 1000L;
private static final long DB_COMMIT_RATE = 60 * 1000L;
private static final int MAX_NODES_WRITE_TO_DB = 30;

private boolean isNodePersist = Args.getInstance().isNodeDiscoveryPersist();

private ChainBaseManager chainBaseManager = ChainBaseManager.getInstance();

private Timer nodePersistTaskTimer = new Timer("NodePersistTaskTimer");
private final boolean isNodePersist = CommonParameter.getInstance().isNodeDiscoveryPersist();
@Autowired
private CommonStore commonStore;
private Timer nodePersistTaskTimer;

public void init() {
if (isNodePersist) {
nodePersistTaskTimer = new Timer("NodePersistTaskTimer");
nodePersistTaskTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Expand All @@ -41,6 +42,9 @@ public void run() {
}

public void close() {
if (Objects.isNull(nodePersistTaskTimer)) {
return;
}
try {
nodePersistTaskTimer.cancel();
} catch (Exception e) {
Expand All @@ -51,7 +55,7 @@ public void close() {
public List<InetSocketAddress> dbRead() {
List<InetSocketAddress> nodes = new ArrayList<>();
try {
byte[] nodeBytes = chainBaseManager.getCommonStore().get(DB_KEY_PEERS).getData();
byte[] nodeBytes = commonStore.get(DB_KEY_PEERS).getData();
if (ByteArray.isEmpty(nodeBytes)) {
return nodes;
}
Expand Down Expand Up @@ -83,8 +87,7 @@ private void dbWrite() {

logger.info("Write nodes to store: {}/{} nodes", batch.size(), tableNodes.size());

chainBaseManager.getCommonStore()
.put(DB_KEY_PEERS, new BytesCapsule(JsonUtil.obj2Json(dbNodes).getBytes()));
commonStore.put(DB_KEY_PEERS, new BytesCapsule(JsonUtil.obj2Json(dbNodes).getBytes()));
} catch (Exception e) {
logger.warn("DB write nodes failed, {}", e.getMessage());
}
Expand Down
84 changes: 84 additions & 0 deletions framework/src/test/java/org/tron/common/BaseTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package org.tron.common;

import com.google.protobuf.ByteString;
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;
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 (StringUtils.isNotEmpty(dbPath) && 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();
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -25,54 +18,36 @@
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;
private static boolean init;

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() {
if (init) {
return;
}
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.");
}
init = true;
}

/**
* 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;} }
*/
Expand Down Expand Up @@ -119,7 +94,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);

Expand Down
Loading