From 25439629af1aa570f26b2651787fdf538f330247 Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Mon, 14 May 2018 07:54:12 -0700 Subject: [PATCH] Speed up PoW verification hashing In a microbenchmark, this method of reversing hex bytes is an order of magnitude faster. (100 nanoseconds vs. 1 microsecond for 10 bytes on an Intel Core i7-5600U) --- .../java/com/samourai/wallet/JSONRPC/PoW.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/samourai/wallet/JSONRPC/PoW.java b/app/src/main/java/com/samourai/wallet/JSONRPC/PoW.java index d58532d3c..f7c1746d5 100644 --- a/app/src/main/java/com/samourai/wallet/JSONRPC/PoW.java +++ b/app/src/main/java/com/samourai/wallet/JSONRPC/PoW.java @@ -71,22 +71,22 @@ public String calcHash(JSONObject resultObj) { String hash = null; try { - strVersionHex = Hex.toHexString(reverse(Hex.decode(resultObj.getString("versionHex")))); + strVersionHex = reverseHexBytes(resultObj.getString("versionHex")); Log.i("PoW", "version:" + strVersionHex); - strPrevBlock = Hex.toHexString(reverse(Hex.decode(resultObj.getString("previousblockhash")))); + strPrevBlock = reverseHexBytes(resultObj.getString("previousblockhash")); Log.i("PoW", "prev block:" + strPrevBlock); - strMerkleRoot = Hex.toHexString(reverse(Hex.decode(resultObj.getString("merkleroot")))); + strMerkleRoot = reverseHexBytes(resultObj.getString("merkleroot")); Log.i("PoW", "merkle root:" + strMerkleRoot); ts = resultObj.getLong("time"); - strTS = Hex.toHexString(reverse(Hex.decode(String.format("%08X", ts)))); + strTS = reverseHexBytes(String.format("%08X", ts)); Log.i("PoW", "timestamp:" + strTS); - strBits = Hex.toHexString(reverse(Hex.decode(resultObj.getString("bits")))); + strBits = reverseHexBytes(resultObj.getString("bits")); Log.i("PoW", "bits:" + strBits); nonce = resultObj.getLong("nonce"); - strNonce = Hex.toHexString(reverse(Hex.decode(String.format("%08X", nonce)))); + strNonce = reverseHexBytes(String.format("%08X", nonce)); Log.i("PoW", "nonce:" + strNonce); String strHeader = strVersionHex + strPrevBlock + strMerkleRoot + strTS + strBits + strNonce; @@ -142,4 +142,11 @@ else if(new Sha256Hash(hash).toBigInteger().compareTo(target) > 0) { } + private static String reverseHexBytes(final String hex) { + final StringBuilder sb = new StringBuilder(hex.length()); + for (int i = hex.length(); i > 0; i -= 2) { + sb.append(hex.charAt(i - 2)).append(hex.charAt(i - 1)); + } + return sb.toString(); + } }