From 2f2d9a664de38fa01990a27fe7f449da106cde0c Mon Sep 17 00:00:00 2001 From: catbref Date: Tue, 2 Jul 2019 15:34:01 +0100 Subject: [PATCH] Replaced all NTP.getTime with System.currentTimeMillis. Clocks handled by O/S --- .../org/qora/api/resource/PeersResource.java | 3 +- .../org/qora/api/resource/UtilsResource.java | 3 +- src/main/java/org/qora/block/Block.java | 3 +- .../java/org/qora/controller/AutoUpdate.java | 3 +- .../java/org/qora/controller/Controller.java | 15 +++-- src/main/java/org/qora/network/Network.java | 17 +++--- src/main/java/org/qora/network/Peer.java | 3 +- .../org/qora/transaction/Transaction.java | 5 +- src/main/java/org/qora/utils/NTP.java | 60 ------------------- .../java/org/qora/test/SignatureTests.java | 3 +- .../common/transaction/TestTransaction.java | 3 +- 11 files changed, 24 insertions(+), 94 deletions(-) delete mode 100644 src/main/java/org/qora/utils/NTP.java diff --git a/src/main/java/org/qora/api/resource/PeersResource.java b/src/main/java/org/qora/api/resource/PeersResource.java index e6280e11..953c1edb 100644 --- a/src/main/java/org/qora/api/resource/PeersResource.java +++ b/src/main/java/org/qora/api/resource/PeersResource.java @@ -31,7 +31,6 @@ import org.qora.network.PeerAddress; import org.qora.repository.DataException; import org.qora.repository.Repository; import org.qora.repository.RepositoryManager; -import org.qora.utils.NTP; @Path("/peers") @Tag(name = "Peers") @@ -146,7 +145,7 @@ public class PeersResource { try (final Repository repository = RepositoryManager.getRepository()) { PeerAddress peerAddress = PeerAddress.fromString(address); - PeerData peerData = new PeerData(peerAddress, NTP.getTime(), "API"); + PeerData peerData = new PeerData(peerAddress, System.currentTimeMillis(), "API"); repository.getNetworkRepository().save(peerData); repository.saveChanges(); diff --git a/src/main/java/org/qora/api/resource/UtilsResource.java b/src/main/java/org/qora/api/resource/UtilsResource.java index 26169495..8e75172c 100644 --- a/src/main/java/org/qora/api/resource/UtilsResource.java +++ b/src/main/java/org/qora/api/resource/UtilsResource.java @@ -35,7 +35,6 @@ import org.qora.transform.transaction.TransactionTransformer; import org.qora.transform.transaction.TransactionTransformer.Transformation; import org.qora.utils.BIP39; import org.qora.utils.Base58; -import org.qora.utils.NTP; import com.google.common.hash.HashCode; import com.google.common.primitives.Bytes; @@ -424,7 +423,7 @@ public class UtilsResource { } ) public long getTimestamp() { - return NTP.getTime(); + return System.currentTimeMillis(); } @GET diff --git a/src/main/java/org/qora/block/Block.java b/src/main/java/org/qora/block/Block.java index 2dbe0441..2adb5f54 100644 --- a/src/main/java/org/qora/block/Block.java +++ b/src/main/java/org/qora/block/Block.java @@ -40,7 +40,6 @@ import org.qora.transform.TransformationException; import org.qora.transform.block.BlockTransformer; import org.qora.transform.transaction.TransactionTransformer; import org.qora.utils.Base58; -import org.qora.utils.NTP; import com.google.common.primitives.Bytes; @@ -799,7 +798,7 @@ public class Block { return ValidationResult.TIMESTAMP_OLDER_THAN_PARENT; // Check timestamp is not in the future (within configurable ~500ms margin) - if (this.blockData.getTimestamp() - BlockChain.getInstance().getBlockTimestampMargin() > NTP.getTime()) + if (this.blockData.getTimestamp() - BlockChain.getInstance().getBlockTimestampMargin() > System.currentTimeMillis()) return ValidationResult.TIMESTAMP_IN_FUTURE; // Legacy gen1 test: check timestamp milliseconds is the same as parent timestamp milliseconds? diff --git a/src/main/java/org/qora/controller/AutoUpdate.java b/src/main/java/org/qora/controller/AutoUpdate.java index 61eaf71f..124b988b 100644 --- a/src/main/java/org/qora/controller/AutoUpdate.java +++ b/src/main/java/org/qora/controller/AutoUpdate.java @@ -28,7 +28,6 @@ import org.qora.settings.Settings; import org.qora.transaction.ArbitraryTransaction; import org.qora.transaction.Transaction.TransactionType; import org.qora.transform.Transformer; -import org.qora.utils.NTP; import com.google.common.hash.HashCode; @@ -132,7 +131,7 @@ public class AutoUpdate extends Thread { for (String repo : autoUpdateRepos) if (attemptUpdate(commitHash, downloadHash, repo)) { // Consider ourselves updated so don't re-re-re-download - buildTimestamp = NTP.getTime(); + buildTimestamp = System.currentTimeMillis(); attemptedUpdate = true; break; } diff --git a/src/main/java/org/qora/controller/Controller.java b/src/main/java/org/qora/controller/Controller.java index d0151b68..1ac62177 100644 --- a/src/main/java/org/qora/controller/Controller.java +++ b/src/main/java/org/qora/controller/Controller.java @@ -67,7 +67,6 @@ import org.qora.transaction.Transaction.TransactionType; import org.qora.transaction.Transaction.ValidationResult; import org.qora.ui.UiService; import org.qora.utils.Base58; -import org.qora.utils.NTP; import org.qora.utils.Triple; public class Controller extends Thread { @@ -77,7 +76,7 @@ public class Controller extends Thread { System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); } - /** Controller start-up time (ms) taken using System.currentTimeMillis(), NOT NTP.getTime(). */ + /** Controller start-up time (ms) taken using System.currentTimeMillis(). */ public static final long startTime = System.currentTimeMillis(); public static final String VERSION_PREFIX = "qora-core-"; @@ -295,7 +294,7 @@ public class Controller extends Thread { } // Clean up arbitrary data request cache - final long requestMinimumTimestamp = NTP.getTime() - ARBITRARY_REQUEST_TIMEOUT; + final long requestMinimumTimestamp = System.currentTimeMillis() - ARBITRARY_REQUEST_TIMEOUT; arbitraryDataRequests.entrySet().removeIf(entry -> entry.getValue().getC() < requestMinimumTimestamp); } } catch (InterruptedException e) { @@ -339,7 +338,7 @@ public class Controller extends Thread { // Don't use this peer again for a while PeerData peerData = peer.getPeerData(); - peerData.setLastMisbehaved(NTP.getTime()); + peerData.setLastMisbehaved(System.currentTimeMillis()); // Only save to repository if outbound peer if (peer.isOutbound()) @@ -831,7 +830,7 @@ public class Controller extends Thread { byte[] signature = getArbitraryDataMessage.getSignature(); String signature58 = Base58.encode(signature); - Long timestamp = NTP.getTime(); + Long timestamp = System.currentTimeMillis(); Triple newEntry = new Triple<>(signature58, peer, timestamp); // If we've seen this request recently, then ignore @@ -941,7 +940,7 @@ public class Controller extends Thread { // Save our request into requests map String signature58 = Base58.encode(signature); - Triple requestEntry = new Triple<>(signature58, null, NTP.getTime()); + Triple requestEntry = new Triple<>(signature58, null, System.currentTimeMillis()); // Assign random ID to this message int id; @@ -982,7 +981,7 @@ public class Controller extends Thread { public static final Predicate hasPeerMisbehaved = peer -> { Long lastMisbehaved = peer.getPeerData().getLastMisbehaved(); - return lastMisbehaved != null && lastMisbehaved > NTP.getTime() - MISBEHAVIOUR_COOLOFF; + return lastMisbehaved != null && lastMisbehaved > System.currentTimeMillis() - MISBEHAVIOUR_COOLOFF; }; /** Returns whether we think our node has up-to-date blockchain based on our info about other peers. */ @@ -1011,7 +1010,7 @@ public class Controller extends Thread { } public static long getMinimumLatestBlockTimestamp() { - return NTP.getTime() - BlockChain.getInstance().getMaxBlockTime() * 1000L * MAX_BLOCKCHAIN_TIP_AGE; + return System.currentTimeMillis() - BlockChain.getInstance().getMaxBlockTime() * 1000L * MAX_BLOCKCHAIN_TIP_AGE; } } diff --git a/src/main/java/org/qora/network/Network.java b/src/main/java/org/qora/network/Network.java index a5ceced1..78165172 100644 --- a/src/main/java/org/qora/network/Network.java +++ b/src/main/java/org/qora/network/Network.java @@ -47,7 +47,6 @@ import org.qora.repository.DataException; import org.qora.repository.Repository; import org.qora.repository.RepositoryManager; import org.qora.settings.Settings; -import org.qora.utils.NTP; // For managing peers public class Network extends Thread { @@ -94,7 +93,7 @@ public class Network extends Thread { private ExecutorService peerExecutor; private ExecutorService mergePeersExecutor; private ExecutorService broadcastExecutor; - /** Timestamp (ms) for next general info broadcast to all connected peers. Based on System.currentTimeMillis() NOT NTP.getTime(). */ + /** Timestamp (ms) for next general info broadcast to all connected peers. Based on System.currentTimeMillis(). */ private long nextBroadcast; private Lock mergePeersLock; @@ -237,7 +236,7 @@ public class Network extends Thread { for (String address : INITIAL_PEERS) { PeerAddress peerAddress = PeerAddress.fromString(address); - PeerData peerData = new PeerData(peerAddress, NTP.getTime(), "INIT"); + PeerData peerData = new PeerData(peerAddress, System.currentTimeMillis(), "INIT"); repository.getNetworkRepository().save(peerData); } @@ -328,7 +327,7 @@ public class Network extends Thread { // "Old" peers: // we have attempted to connect within the last day // we last managed to connect over a week ago - final long now = NTP.getTime(); + final long now = System.currentTimeMillis(); Predicate isNotOldPeer = peerData -> { if (peerData.getLastAttempted() == null || peerData.getLastAttempted() < now - OLD_PEER_ATTEMPTED_PERIOD) return true; @@ -371,7 +370,7 @@ public class Network extends Thread { List peers = repository.getNetworkRepository().getAllPeers(); // Don't consider peers with recent connection failures - final long lastAttemptedThreshold = NTP.getTime() - CONNECT_FAILURE_BACKOFF; + final long lastAttemptedThreshold = System.currentTimeMillis() - CONNECT_FAILURE_BACKOFF; peers.removeIf(peerData -> peerData.getLastAttempted() != null && peerData.getLastAttempted() > lastAttemptedThreshold); // Don't consider peers that we know loop back to ourself @@ -422,7 +421,7 @@ public class Network extends Thread { // Update connection attempt info repository.discardChanges(); - peerData.setLastAttempted(NTP.getTime()); + peerData.setLastAttempted(System.currentTimeMillis()); repository.getNetworkRepository().save(peerData); repository.saveChanges(); } @@ -626,7 +625,7 @@ public class Network extends Thread { LOGGER.debug(String.format("Handshake completed with peer %s", peer)); // Make a note that we've successfully completed handshake (and when) - peer.getPeerData().setLastConnected(NTP.getTime()); + peer.getPeerData().setLastConnected(System.currentTimeMillis()); // Update connection info for outbound peers only if (peer.isOutbound()) @@ -669,7 +668,7 @@ public class Network extends Thread { List knownPeers = repository.getNetworkRepository().getAllPeers(); // Filter out peers that we've not connected to ever or within X milliseconds - final long connectionThreshold = NTP.getTime() - RECENT_CONNECTION_THRESHOLD; + final long connectionThreshold = System.currentTimeMillis() - RECENT_CONNECTION_THRESHOLD; Predicate notRecentlyConnected = peerData -> { final Long lastAttempted = peerData.getLastAttempted(); final Long lastConnected = peerData.getLastConnected(); @@ -836,7 +835,7 @@ public class Network extends Thread { try { mergePeersLock.lockInterruptibly(); - final long addedWhen = NTP.getTime(); + final long addedWhen = System.currentTimeMillis(); try { try (final Repository repository = RepositoryManager.getRepository()) { diff --git a/src/main/java/org/qora/network/Peer.java b/src/main/java/org/qora/network/Peer.java index 10bd9cdc..5e530d18 100644 --- a/src/main/java/org/qora/network/Peer.java +++ b/src/main/java/org/qora/network/Peer.java @@ -32,7 +32,6 @@ import org.qora.network.message.Message.MessageType; import org.qora.settings.Settings; import org.qora.network.message.PingMessage; import org.qora.network.message.VersionMessage; -import org.qora.utils.NTP; import com.google.common.net.HostAndPort; import com.google.common.net.InetAddresses; @@ -294,7 +293,7 @@ public class Peer extends Thread { private void setup() throws IOException { this.socket.setSoTimeout(SOCKET_TIMEOUT); this.out = this.socket.getOutputStream(); - this.connectionTimestamp = NTP.getTime(); + this.connectionTimestamp = System.currentTimeMillis(); this.replyQueues = Collections.synchronizedMap(new HashMap>()); this.unsolicitedQueue = new ArrayBlockingQueue<>(UNSOLICITED_MESSAGE_QUEUE_CAPACITY); diff --git a/src/main/java/org/qora/transaction/Transaction.java b/src/main/java/org/qora/transaction/Transaction.java index f8bf7ca2..a585dbec 100644 --- a/src/main/java/org/qora/transaction/Transaction.java +++ b/src/main/java/org/qora/transaction/Transaction.java @@ -30,7 +30,6 @@ import org.qora.repository.Repository; import org.qora.settings.Settings; import org.qora.transform.TransformationException; import org.qora.transform.transaction.TransactionTransformer; -import org.qora.utils.NTP; import static java.util.Arrays.stream; import static java.util.stream.Collectors.toMap; @@ -518,7 +517,7 @@ public abstract class Transaction { return ValidationResult.TIMESTAMP_TOO_OLD; // Transactions with a timestamp too far into future are too new - long maxTimestamp = NTP.getTime() + Settings.getInstance().getMaxTransactionTimestampFuture(); + long maxTimestamp = System.currentTimeMillis() + Settings.getInstance().getMaxTransactionTimestampFuture(); if (this.transactionData.getTimestamp() > maxTimestamp) return ValidationResult.TIMESTAMP_TOO_NEW; @@ -738,7 +737,7 @@ public abstract class Transaction { Transaction transaction = Transaction.fromData(repository, transactionData); // Check transaction has not expired - if (transaction.getDeadline() <= blockTimestamp || transaction.getDeadline() < NTP.getTime()) + if (transaction.getDeadline() <= blockTimestamp || transaction.getDeadline() < System.currentTimeMillis()) return false; // Is transaction is past max approval period? diff --git a/src/main/java/org/qora/utils/NTP.java b/src/main/java/org/qora/utils/NTP.java deleted file mode 100644 index c0a9f07e..00000000 --- a/src/main/java/org/qora/utils/NTP.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.qora.utils; - -import java.net.InetAddress; - -import org.apache.commons.net.ntp.NTPUDPClient; -import org.apache.commons.net.ntp.TimeInfo; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public final class NTP { - - private static final Logger LOGGER = LogManager.getLogger(NTP.class); - private static final long TIME_TILL_UPDATE = 1000 * 60 * 10; - private static final String NTP_SERVER = "pool.ntp.org"; - - private static long lastUpdate = 0; - private static long offset = 0; - - /** Returns NTP-synced current time from unix epoch, in milliseconds. */ - public static long getTime() { - // Every so often use NTP to find out offset between this system's time and internet time - if (System.currentTimeMillis() > lastUpdate + TIME_TILL_UPDATE) { - updateOffset(); - lastUpdate = System.currentTimeMillis(); - - // Log new value of offset - LOGGER.info("Adjusting time with %offset% milliseconds.".replace("%offset%", String.valueOf(offset))); - } - - // Return time that is nearer internet time - return System.currentTimeMillis() + offset; - } - - private static void updateOffset() { - // Create NTP client - NTPUDPClient client = new NTPUDPClient(); - - // Set communications timeout - client.setDefaultTimeout(10000); - try { - // Open client (create socket, etc.) - client.open(); - - // Get time info from NTP server - InetAddress hostAddr = InetAddress.getByName(NTP_SERVER); - TimeInfo info = client.getTime(hostAddr); - info.computeDetails(); - - // Cache offset between this system's time and internet time - if (info.getOffset() != null) - offset = info.getOffset(); - } catch (Exception e) { - // Error while communicating with NTP server - ignored - } - - // We're done with NTP client - client.close(); - } - -} diff --git a/src/test/java/org/qora/test/SignatureTests.java b/src/test/java/org/qora/test/SignatureTests.java index f667c241..28553ce9 100644 --- a/src/test/java/org/qora/test/SignatureTests.java +++ b/src/test/java/org/qora/test/SignatureTests.java @@ -10,7 +10,6 @@ import org.qora.repository.Repository; import org.qora.repository.RepositoryManager; import org.qora.test.common.Common; import org.qora.utils.Base58; -import org.qora.utils.NTP; import static org.junit.Assert.*; @@ -48,7 +47,7 @@ public class SignatureTests extends Common { BigDecimal totalFees = BigDecimal.ZERO.setScale(8); byte[] transactionsSignature = null; int height = 0; - long timestamp = NTP.getTime() - 5000; + long timestamp = System.currentTimeMillis() - 5000; BigDecimal generatingBalance = BigDecimal.valueOf(10_000_000L).setScale(8); byte[] generatorPublicKey = generator.getPublicKey(); byte[] generatorSignature = null; diff --git a/src/test/java/org/qora/test/common/transaction/TestTransaction.java b/src/test/java/org/qora/test/common/transaction/TestTransaction.java index 9a6efa74..1da41851 100644 --- a/src/test/java/org/qora/test/common/transaction/TestTransaction.java +++ b/src/test/java/org/qora/test/common/transaction/TestTransaction.java @@ -7,7 +7,6 @@ import org.qora.block.BlockChain; import org.qora.data.transaction.BaseTransactionData; import org.qora.group.Group; import org.qora.repository.DataException; -import org.qora.utils.NTP; public abstract class TestTransaction { @@ -18,7 +17,7 @@ public abstract class TestTransaction { if (lastReference == null) lastReference = account.getLastReference(); - return new BaseTransactionData(NTP.getTime(), Group.NO_GROUP, lastReference, account.getPublicKey(), BlockChain.getInstance().getUnitFee(), null); + return new BaseTransactionData(System.currentTimeMillis(), Group.NO_GROUP, lastReference, account.getPublicKey(), BlockChain.getInstance().getUnitFee(), null); } }