From 5c607d3367620fff52321935406aa46d6e5c5900 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 1 Apr 2022 11:26:54 +0100 Subject: [PATCH] Added optional "timeout" feature to MemoryPoW.compute2(), to give up after a specified amount of time. --- .../java/org/qortal/crypto/MemoryPoW.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/org/qortal/crypto/MemoryPoW.java b/src/main/java/org/qortal/crypto/MemoryPoW.java index 01f4f6fd..c4a59066 100644 --- a/src/main/java/org/qortal/crypto/MemoryPoW.java +++ b/src/main/java/org/qortal/crypto/MemoryPoW.java @@ -1,10 +1,25 @@ package org.qortal.crypto; +import org.qortal.utils.NTP; + import java.nio.ByteBuffer; +import java.util.concurrent.TimeoutException; public class MemoryPoW { public static Integer compute2(byte[] data, int workBufferLength, long difficulty) { + try { + return MemoryPoW.compute2(data, workBufferLength, difficulty, null); + + } catch (TimeoutException e) { + // This won't happen, because above timeout is null + return null; + } + } + + public static Integer compute2(byte[] data, int workBufferLength, long difficulty, Long timeout) throws TimeoutException { + long startTime = NTP.getTime(); + // Hash data with SHA256 byte[] hash = Crypto.digest(data); @@ -33,6 +48,13 @@ public class MemoryPoW { if (Thread.currentThread().isInterrupted()) return -1; + if (timeout != null) { + long now = NTP.getTime(); + if (now > startTime + timeout) { + throw new TimeoutException("Timeout reached"); + } + } + seed *= seedMultiplier; // per nonce state[0] = longHash[0] ^ seed;