diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 8ca5dd98..3d5fab0e 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -19,11 +19,15 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-java@v3 - with: - distribution: 'temurin' - java-version: '17' - cache: 'maven' - - name: Build with Maven - run: mvn -B package --file pom.xml + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + cache: 'maven' + + - name: Build with Maven + run: mvn clean package diff --git a/pom.xml b/pom.xml index e72dc8cf..f6fb30a7 100644 --- a/pom.xml +++ b/pom.xml @@ -17,40 +17,41 @@ package ${project.basedir}/dist - 4.1.111.Final + 0.1.8 + 4.1.115.Final 2.4.2 - 2.17.1 + 2.18.2 5.5.0 - 1.18.32 + 1.18.36 3.1.8 - 3.26.2 + 3.26.3 4.13.2 - 5.11.0 + 5.14.2 1.2.1 - 2.23.1 - 3.14.0 - 1.5 - 4.5.0-M1 - 1.17.0 - 2.16.1 - 1.8.0 - 33.2.1-jre - 9.2.1 + 2.24.2 + 3.17.0 + 1.6 + 4.5.0-M2 + 1.17.1 + 2.18.0 + 1.9.0 + 33.3.1-jre + 9.7.3 4.12.0 3.26.0 23.1.3 - 1.78 - 1.78 - 4.5.7 + 1.79 + 1.79 + 4.5.11 1.6 4.0.2 1.4.3 1.21.2 - 1.1.10.4 - 1.2.23 + 1.1.10.7 + 1.2.24 8.4.0 - 2.2.224 - 2.10 + 2.3.232 + 2.11.0 2.1.0 **/*RandomXSyncTest.java,**/*SyncTest.java,**/*SnapshotJTest.java @@ -113,7 +114,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.13.0 ${maven.compiler.source} ${maven.compiler.target} @@ -128,7 +129,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0 + 3.5.2 -Xmx2048m @@ -141,7 +142,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.4.2 true @@ -154,11 +155,25 @@ + + org.apache.maven.plugins + maven-source-plugin + 3.3.1 + + + attach-sources + + jar-no-fork + + + + + com.mycila license-maven-plugin - 4.2 + 4.6 @@ -182,7 +197,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.6.0 package @@ -228,8 +243,7 @@ true shaded - + .SF NOTICE AL2.0 @@ -237,8 +251,7 @@ LICENSE.txt NOTICE.txt - + LICENSE en-mnemonic-word-list.txt @@ -246,10 +259,8 @@ implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> io.xdag.Bootstrap - ${maven.compiler.source} - - ${maven.compiler.target} - + ${maven.compiler.source} + ${maven.compiler.target} true @@ -306,70 +317,18 @@ ${dist.phase} - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - + + @@ -399,7 +358,7 @@ io.xdag xdagj-native-randomx - 0.1.7 + ${xdagj-native-randomx.version} diff --git a/src/main/java/io/xdag/Kernel.java b/src/main/java/io/xdag/Kernel.java index 7c3ec59b..773ae448 100644 --- a/src/main/java/io/xdag/Kernel.java +++ b/src/main/java/io/xdag/Kernel.java @@ -425,9 +425,6 @@ public synchronized void testStop() { dbFactory.getDB(name).close(); } - // release - randomx.randomXPoolReleaseMem(); - log.info("Release randomx"); webSocketServer.stop(); log.info("WebSocket server stop."); poolAwardManager.stop(); diff --git a/src/main/java/io/xdag/cli/Shell.java b/src/main/java/io/xdag/cli/Shell.java index 25969f61..882583bd 100644 --- a/src/main/java/io/xdag/cli/Shell.java +++ b/src/main/java/io/xdag/cli/Shell.java @@ -47,6 +47,7 @@ import org.jline.reader.impl.DefaultParser; import org.jline.terminal.Terminal; +import java.io.PrintWriter; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -164,8 +165,10 @@ private void processOldBalance(CommandInput input) { } private void println(final String msg) { - reader.getTerminal().writer().println(msg); - reader.getTerminal().writer().flush(); + try(PrintWriter writer = reader.getTerminal().writer()) { + writer.println(msg); + writer.flush(); + } } private void processAccount(CommandInput input) { diff --git a/src/main/java/io/xdag/consensus/XdagPow.java b/src/main/java/io/xdag/consensus/XdagPow.java index 167b5b96..d6f80505 100644 --- a/src/main/java/io/xdag/consensus/XdagPow.java +++ b/src/main/java/io/xdag/consensus/XdagPow.java @@ -267,8 +267,7 @@ protected void onNewShare(Bytes32 share) { taskData.set(0, task.getTask()[0].getData());// preHash taskData.set(32, share);// share // Calculate hash - hash = Bytes32.wrap(kernel.getRandomx() - .randomXPoolCalcHash(taskData, taskData.size(), task.getTaskTime()).reverse()); + hash = Bytes32.wrap(kernel.getRandomx().randomXPoolCalcHash(taskData, task.getTaskTime()).reverse()); } else { XdagSha256Digest digest = new XdagSha256Digest(task.getDigest()); hash = Bytes32.wrap(digest.sha256Final(share.reverse())); diff --git a/src/main/java/io/xdag/core/BlockchainImpl.java b/src/main/java/io/xdag/core/BlockchainImpl.java index 5c859dd6..71cf8ad2 100644 --- a/src/main/java/io/xdag/core/BlockchainImpl.java +++ b/src/main/java/io/xdag/core/BlockchainImpl.java @@ -1212,7 +1212,7 @@ public BigInteger getDiffByRandomXHash(Block block) { Bytes32 rxHash = Hash.sha256(block.getXdagBlock().getData().slice(0, 512 - 32)); data.set(0, rxHash); data.set(32, block.getXdagBlock().getField(15).getData()); - byte[] blockHash = randomx.randomXBlockHash(data.toArray(), data.size(), epoch); + byte[] blockHash = randomx.randomXBlockHash(data.toArray(), epoch); BigInteger diff; if (blockHash != null) { Bytes32 hash = Bytes32.wrap(Arrays.reverse(blockHash)); diff --git a/src/main/java/io/xdag/crypto/RandomX.java b/src/main/java/io/xdag/crypto/RandomX.java index d2ade820..09154b9c 100644 --- a/src/main/java/io/xdag/crypto/RandomX.java +++ b/src/main/java/io/xdag/crypto/RandomX.java @@ -31,29 +31,20 @@ import static io.xdag.config.RandomXConstants.SEEDHASH_EPOCH_TESTNET_BLOCKS; import static io.xdag.config.RandomXConstants.SEEDHASH_EPOCH_TESTNET_LAG; import static io.xdag.config.RandomXConstants.XDAG_RANDOMX; -import static io.xdag.utils.BytesUtils.bytesToPointer; import static io.xdag.utils.BytesUtils.equalBytes; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.Set; +import io.xdag.crypto.randomx.*; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.Bytes32; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.encoders.Hex; -import com.sun.jna.Memory; -import com.sun.jna.NativeLong; -import com.sun.jna.Pointer; - import io.xdag.config.Config; import io.xdag.config.MainnetConfig; import io.xdag.core.Block; import io.xdag.core.Blockchain; -import io.xdag.crypto.randomx.NativeSize; -import io.xdag.crypto.randomx.RandomXFlag; -import io.xdag.crypto.randomx.RandomXJNA; -import io.xdag.crypto.randomx.RandomXUtils; import io.xdag.utils.XdagTime; import lombok.Data; import lombok.Setter; @@ -65,11 +56,10 @@ public class RandomX { protected final RandomXMemory[] globalMemory = new RandomXMemory[2]; - protected final ReadWriteLock[] globalMemoryLock = new ReentrantReadWriteLock[2]; protected final Config config; protected boolean isTestNet = true; protected int mineType; - protected int flags; + protected Set flagSet; protected long randomXForkSeedHeight; protected long randomXForkLag; @@ -92,11 +82,11 @@ public RandomX(Config config) { isTestNet = false; } this.mineType = XDAG_RANDOMX; - // get randomx flags + + flagSet = RandomXUtils.getFlagsSet(); if (config.getRandomxSpec().getRandomxFlag()) { - flags = RandomXJNA.INSTANCE.randomx_get_flags() + RandomXFlag.LARGE_PAGES.getValue() + RandomXFlag.FULL_MEM.getValue(); - } else { - flags = RandomXJNA.INSTANCE.randomx_get_flags(); + flagSet.add(RandomXFlag.LARGE_PAGES); + flagSet.add(RandomXFlag.FULL_MEM); } } @@ -177,46 +167,28 @@ public void init() { // init memory and lock for (int i = 0; i < 2; i++) { - globalMemoryLock[i] = new ReentrantReadWriteLock(); globalMemory[i] = new RandomXMemory(); } } - - // 矿池初始化dataset - public void randomXPoolInitDataset(Pointer rxCache, Pointer rxDataset) { - RandomXJNA.INSTANCE.randomx_init_dataset(rxDataset, rxCache, new NativeLong(0), RandomXJNA.INSTANCE.randomx_dataset_item_count()); - } - - - // 计算出hash - public Bytes32 randomXPoolCalcHash(Bytes data, int dataSize, long taskTime) { + public Bytes32 randomXPoolCalcHash(Bytes data, long taskTime) { Bytes32 hash; RandomXMemory memory = globalMemory[(int) (randomXPoolMemIndex) & 1]; - ReadWriteLock readWriteLock; + if (taskTime < memory.switchTime) { - readWriteLock = globalMemoryLock[(int) (randomXPoolMemIndex - 1) & 1]; memory = globalMemory[(int) (randomXPoolMemIndex - 1) & 1]; - } else { - readWriteLock = globalMemoryLock[(int) (randomXPoolMemIndex) & 1]; } - readWriteLock.writeLock().lock(); - try { - Pointer hashPointer = new Memory(RandomXUtils.HASH_SIZE); - RandomXJNA.INSTANCE.randomx_calculate_hash(memory.poolVm, bytesToPointer(data.toArray()), new NativeSize(dataSize), hashPointer); - hash = Bytes32.wrap(hashPointer.getByteArray(0, RandomXUtils.HASH_SIZE)); - } finally { - readWriteLock.writeLock().unlock(); - } + + byte[] bytes = memory.poolTemplate.calculateHash(data.toArray()); + hash = Bytes32.wrap(bytes); return hash; } - public byte[] randomXBlockHash(byte[] data, int dataSize, long blockTime) { + public byte[] randomXBlockHash(byte[] data, long blockTime) { byte[] hash; - ReadWriteLock readWriteLock; RandomXMemory memory; // no seed if (randomXHashEpochIndex == 0) { @@ -228,118 +200,26 @@ public byte[] randomXBlockHash(byte[] data, int dataSize, long blockTime) { log.debug("Block time {} less then switchtime {}", Long.toHexString(blockTime), Long.toHexString(memory.switchTime)); return null; - } else { - readWriteLock = globalMemoryLock[(int) (randomXHashEpochIndex) & 1]; } } else { memory = globalMemory[(int) (randomXHashEpochIndex) & 1]; if (blockTime < memory.switchTime) { - readWriteLock = globalMemoryLock[(int) (randomXHashEpochIndex - 1) & 1]; memory = globalMemory[(int) (randomXHashEpochIndex - 1) & 1]; - } else { - readWriteLock = globalMemoryLock[(int) (randomXHashEpochIndex) & 1]; } } - readWriteLock.writeLock().lock(); - try { - log.debug("Use seed {}", Hex.toHexString(Arrays.reverse(memory.seed))); - Pointer hashPointer = new Memory(RandomXUtils.HASH_SIZE); - RandomXJNA.INSTANCE.randomx_calculate_hash(memory.blockVm, bytesToPointer(data), new NativeSize(dataSize), hashPointer); - hash = hashPointer.getByteArray(0, RandomXUtils.HASH_SIZE); - } finally { - readWriteLock.writeLock().unlock(); - } + log.debug("Use seed {}", Hex.toHexString(Arrays.reverse(memory.seed))); + hash = memory.blockTemplate.calculateHash(data); return hash; } - public Pointer randomXUpdateVm(RandomXMemory randomXMemory, boolean isPoolVm) { - if (isPoolVm) { - randomXMemory.poolVm = RandomXJNA.INSTANCE.randomx_create_vm(flags, randomXMemory.rxCache, randomXMemory.rxDataset); - return randomXMemory.poolVm; - } else { - randomXMemory.blockVm = RandomXJNA.INSTANCE.randomx_create_vm(flags, randomXMemory.rxCache, randomXMemory.rxDataset); - return randomXMemory.blockVm; - } - } - - public void randomXPoolUpdateSeed(long memIndex) { - ReadWriteLock readWriteLock = globalMemoryLock[(int) (memIndex) & 1]; - readWriteLock.writeLock().lock(); - try { - RandomXMemory rx_memory = globalMemory[(int) (memIndex) & 1]; - if (rx_memory.rxCache == null) { - rx_memory.rxCache = RandomXJNA.INSTANCE.randomx_alloc_cache(flags); - if (rx_memory.rxCache == null) { - // fail alloc - log.debug("Failed alloc cache"); - return; - } - } - // 分配成功 - RandomXJNA.INSTANCE.randomx_init_cache(rx_memory.rxCache, bytesToPointer(rx_memory.seed), new NativeSize(rx_memory.seed.length)); - - if (config.getRandomxSpec().getRandomxFlag()) { - if (rx_memory.rxDataset == null) { - // 分配dataset - rx_memory.rxDataset = RandomXJNA.INSTANCE.randomx_alloc_dataset(flags); - if (rx_memory.rxDataset == null) { - //分配失败 - log.debug("Failed alloc dataset"); - return; - } - } - - randomXPoolInitDataset(rx_memory.rxCache, rx_memory.rxDataset); - } else { - rx_memory.rxDataset = null; - } - - - if (randomXUpdateVm(rx_memory, true) == null) { - // update failed - log.debug("Update pool vm failed"); - return; - } - - // update finished - if (randomXUpdateVm(rx_memory, false) == null) { - // update failed - log.debug("Update block vm failed"); - } - - // update finished - - } finally { - readWriteLock.writeLock().unlock(); - } - } - - // 释放 ,用于程序关闭时 - public void randomXPoolReleaseMem() { - for (int i = 0; i < 2; i++) { - globalMemoryLock[i].writeLock().lock(); - try { - RandomXMemory rx_memory = globalMemory[i]; - if (rx_memory.poolVm != null) { - RandomXJNA.INSTANCE.randomx_destroy_vm(rx_memory.poolVm); - } - if (rx_memory.blockVm != null) { - RandomXJNA.INSTANCE.randomx_destroy_vm(rx_memory.blockVm); - } - if (rx_memory.rxCache != null) { - RandomXJNA.INSTANCE.randomx_release_cache(rx_memory.rxCache); - } - if (rx_memory.rxDataset != null) { - RandomXJNA.INSTANCE.randomx_release_dataset(rx_memory.rxDataset); - } - } finally { - globalMemoryLock[i].writeLock().unlock(); - } - } + RandomXMemory rx_memory = globalMemory[(int) (memIndex) & 1]; + // TODO changeKey should be re-init dataset + rx_memory.getPoolTemplate().changeKey(rx_memory.seed); + rx_memory.getBlockTemplate().changeKey(rx_memory.seed); } public void randomXLoadingSnapshot(byte[] preseed, long forkTime) { @@ -419,7 +299,6 @@ public void randomXLoadingSnapshot(){ randomXPoolUpdateSeed(memoryIndex); randomXHashEpochIndex = memoryIndex; -// memory.isSwitched = 0; if (XdagTime.getEpoch(blockchain.getBlockByHeight(blockchain.getXdagStats().nmain).getTimestamp()) >= memory.getSwitchTime()) { memory.isSwitched = 1; @@ -474,7 +353,6 @@ public void randomXLoadingSnapshotJ(){ randomXPoolUpdateSeed(memoryIndex); randomXHashEpochIndex = memoryIndex; -// memory.isSwitched = 0; if (XdagTime.getEpoch(blockchain.getBlockByHeight(blockchain.getXdagStats().nmain).getTimestamp()) >= memory.getSwitchTime()) { memory.isSwitched = 1; @@ -526,7 +404,6 @@ public void randomXLoadingForkTime() { randomXPoolUpdateSeed(memoryIndex); randomXHashEpochIndex = memoryIndex; -// memory.isSwitched = 0; if (XdagTime.getEpoch(blockchain.getBlockByHeight(blockchain.getXdagStats().nmain).getTimestamp()) >= memory.getSwitchTime()) { memory.isSwitched = 1; diff --git a/src/main/java/io/xdag/crypto/RandomXMemory.java b/src/main/java/io/xdag/crypto/RandomXMemory.java index 8887e9c6..374702bb 100644 --- a/src/main/java/io/xdag/crypto/RandomXMemory.java +++ b/src/main/java/io/xdag/crypto/RandomXMemory.java @@ -24,8 +24,7 @@ package io.xdag.crypto; -import com.sun.jna.Pointer; - +import io.xdag.crypto.randomx.RandomXTemplate; import lombok.Getter; import lombok.Setter; @@ -38,10 +37,9 @@ public class RandomXMemory { protected long seedTime; protected long switchTime; protected int isSwitched; - protected Pointer rxCache; - protected Pointer rxDataset; - protected Pointer poolVm; - protected Pointer blockVm; + + protected RandomXTemplate poolTemplate; + protected RandomXTemplate blockTemplate; public RandomXMemory() { this.switchTime = -1; diff --git a/src/main/java/io/xdag/net/CapabilityTreeSet.java b/src/main/java/io/xdag/net/CapabilityTreeSet.java index 4df9dcc4..b2fbed66 100644 --- a/src/main/java/io/xdag/net/CapabilityTreeSet.java +++ b/src/main/java/io/xdag/net/CapabilityTreeSet.java @@ -26,7 +26,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.Objects; import java.util.TreeSet; import java.util.stream.Collectors; @@ -87,13 +86,6 @@ public int size() { return capabilities.size(); } - /** - * Converts the capability set to an list of String. - */ - public List toList() { - return capabilities.stream().map(Capability::name).collect(Collectors.toList()); - } - /** * Converts the capability set to an array of String. */ diff --git a/src/main/java/io/xdag/net/ChannelManager.java b/src/main/java/io/xdag/net/ChannelManager.java index f2be1eca..6f72d290 100644 --- a/src/main/java/io/xdag/net/ChannelManager.java +++ b/src/main/java/io/xdag/net/ChannelManager.java @@ -205,24 +205,8 @@ private void newBlocksDistributeLoop() { } } - // TODO:怎么发送 目前是发给除receive的节点 public void sendNewBlock(BlockWrapper blockWrapper) { -// Node receive; -// Peer blockPeer = blockWrapper.getRemotePeer(); -// Node node = kernel.getClient().getNode(); -// // 说明是自己产生的 -// if (blockPeer == null || (StringUtils.equals(blockPeer.getIp(), node.getIp()) && blockPeer.getPort() == node.getPort())) { -// receive = node; -// } else { -// Channel channel = activeChannels.get(blockWrapper.getRemotePeer().getPeerId()); -// receive = channel != null ? new Node(channel.getRemoteIp(), channel.getRemotePort()) : null; -// } for (Channel channel : activeChannels.values()) { -// Peer remotePeer = channel.getRemotePeer(); -// if (StringUtils.equals(remotePeer.getIp(), receive.getIp()) && remotePeer.getPort() == receive.getPort()) { -// log.debug("not send to sender node"); -// continue; -// } channel.getP2pHandler().sendNewBlock(blockWrapper.getBlock(), blockWrapper.getTtl()); } } diff --git a/src/main/java/io/xdag/net/XdagChannelInitializer.java b/src/main/java/io/xdag/net/XdagChannelInitializer.java index 9920f5d3..9154ad20 100644 --- a/src/main/java/io/xdag/net/XdagChannelInitializer.java +++ b/src/main/java/io/xdag/net/XdagChannelInitializer.java @@ -70,9 +70,7 @@ protected void initChannel(SocketChannel ch) { ch.config().setOption(ChannelOption.TCP_NODELAY, true); // notify disconnection to channel manager - ch.closeFuture().addListener(future -> { - channelMgr.remove(channel); - }); + ch.closeFuture().addListener(future -> channelMgr.remove(channel)); } catch (Exception e) { log.error("Unexpected error: [{}]", e.getMessage(), e); } diff --git a/src/main/java/io/xdag/net/XdagP2pHandler.java b/src/main/java/io/xdag/net/XdagP2pHandler.java index ed972566..bbe38475 100644 --- a/src/main/java/io/xdag/net/XdagP2pHandler.java +++ b/src/main/java/io/xdag/net/XdagP2pHandler.java @@ -331,17 +331,6 @@ private ReasonCode checkPeer(Peer peer, boolean newHandShake) { return ReasonCode.BAD_NETWORK_VERSION; } - // not connected -// if (client.getPeerId().equals(peer.getPeerId()) || channelMgr.isActivePeer(peer.getPeerId())) { -// return ReasonCode.DUPLICATED_PEER_ID; -// } - - // validator can't share IP address -// if (channelMgr.isActiveIP(channel.getRemoteIp()) // already connected -// && nodeSpec.getNetwork() == Network.MAINNET) { // on main net -// return ReasonCode.VALIDATOR_IP_LIMITED; -// } - return null; } diff --git a/src/main/java/io/xdag/net/message/ReasonCode.java b/src/main/java/io/xdag/net/message/ReasonCode.java index 28af0199..894a8396 100644 --- a/src/main/java/io/xdag/net/message/ReasonCode.java +++ b/src/main/java/io/xdag/net/message/ReasonCode.java @@ -23,6 +23,9 @@ */ package io.xdag.net.message; +import lombok.Getter; + +@Getter public enum ReasonCode { /** @@ -70,7 +73,7 @@ public enum ReasonCode { */ BAD_PEER(0x08); - private int code; + private final int code; private static final ReasonCode[] intToCode = new ReasonCode[256]; @@ -88,10 +91,6 @@ public static ReasonCode of(int code) { this.code = code; } - public int getCode() { - return code; - } - public byte toByte() { return (byte) code; } diff --git a/src/main/java/io/xdag/net/node/NodeManager.java b/src/main/java/io/xdag/net/node/NodeManager.java index 18ff7d41..23b2a9dc 100644 --- a/src/main/java/io/xdag/net/node/NodeManager.java +++ b/src/main/java/io/xdag/net/node/NodeManager.java @@ -29,7 +29,6 @@ import com.github.benmanes.caffeine.cache.Caffeine; import io.xdag.Kernel; import io.xdag.config.Config; -import io.xdag.net.Channel; import io.xdag.net.PeerClient; import io.xdag.net.XdagChannelInitializer; import io.xdag.net.NetDBManager; diff --git a/src/main/java/io/xdag/utils/BytesUtils.java b/src/main/java/io/xdag/utils/BytesUtils.java index d10695ed..c7b71154 100644 --- a/src/main/java/io/xdag/utils/BytesUtils.java +++ b/src/main/java/io/xdag/utils/BytesUtils.java @@ -26,8 +26,6 @@ import com.google.common.io.BaseEncoding; import com.google.common.primitives.UnsignedLong; -import com.sun.jna.Memory; -import com.sun.jna.Pointer; import org.apache.tuweni.bytes.Bytes; import org.apache.tuweni.bytes.MutableBytes32; @@ -102,12 +100,6 @@ public static short bytesToShort(byte[] input, int offset, boolean littleEndian) return buffer.getShort(); } - public static Pointer bytesToPointer(byte[] bytes) { - Pointer pointer = new Memory(bytes.length); - pointer.write(0, bytes, 0, bytes.length); - return pointer; - } - public static String toHexString(byte[] data) { return data == null ? "" : BaseEncoding.base16().lowerCase().encode(data); } @@ -199,7 +191,7 @@ public static byte[] subArray(byte[] arrays, int index, int length) { * @return 转换后的byte[] */ public static byte[] hexStringToBytes(String hexString) { - if (hexString == null || "".equals(hexString)) { + if (hexString == null || hexString.isEmpty()) { return null; } hexString = hexString.toUpperCase(); diff --git a/src/main/java/io/xdag/utils/XdagTime.java b/src/main/java/io/xdag/utils/XdagTime.java index fbaa3b9d..f275551a 100644 --- a/src/main/java/io/xdag/utils/XdagTime.java +++ b/src/main/java/io/xdag/utils/XdagTime.java @@ -34,8 +34,7 @@ public class XdagTime { */ public static long getCurrentTimestamp() { long time_ms = System.currentTimeMillis(); - double ms_tmp = (double) (time_ms << 10); - return (long) Math.ceil(ms_tmp / 1000 + 0.5); + return msToXdagtimestamp(time_ms); } /** diff --git a/src/main/resources/xdag-devnet.conf b/src/main/resources/xdag-devnet.conf index f18cac54..290f62a1 100644 --- a/src/main/resources/xdag-devnet.conf +++ b/src/main/resources/xdag-devnet.conf @@ -3,6 +3,9 @@ admin.telnet.ip = 127.0.0.1 admin.telnet.port = 6001 admin.telnet.password = root +# Pool Config +pool.ws.port = 7001 + # Node config node.ip = 127.0.0.1 node.port = 8001 diff --git a/src/test/java/io/xdag/core/RandomXSyncTest.java b/src/test/java/io/xdag/core/RandomXSyncTest.java index d828f991..45dc31f3 100644 --- a/src/test/java/io/xdag/core/RandomXSyncTest.java +++ b/src/test/java/io/xdag/core/RandomXSyncTest.java @@ -102,9 +102,6 @@ public void syncTest() throws Exception { String kernel2Diff = kernel2.getBlockchain().getBlockByHeight(nmain - 1).getInfo().getDifficulty().toString(16); assertEquals(expected, kernel2Diff); - - kernel1.getRandomx().randomXPoolReleaseMem(); - kernel2.getRandomx().randomXPoolReleaseMem(); } public void sync(Kernel kernel1, Kernel kernel2, long startTime, long endTime, String syncName) {