[bisq-network/bisq] Provide ASIC resistant PoW scheme for BSQ swaps (PR #5858)
chimp1984
notifications at github.com
Fri Nov 26 18:39:15 CET 2021
```
Index: common/src/main/java/bisq/common/crypto/HashCashService.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/common/src/main/java/bisq/common/crypto/HashCashService.java b/common/src/main/java/bisq/common/crypto/HashCashService.java
--- a/common/src/main/java/bisq/common/crypto/HashCashService.java (revision e0e70bd804fec36844987bc1a29051a24e3cbdc4)
+++ b/common/src/main/java/bisq/common/crypto/HashCashService.java (revision d54f1aafc04601ec350b083d06b24b4774a08d6b)
@@ -22,24 +22,18 @@
import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
-import java.util.function.BiPredicate;
import lombok.extern.slf4j.Slf4j;
/**
* HashCash implementation for proof of work
- * It doubles required work by difficulty increase (adding one leading zero).
+ * It doubles required work by log2Difficulty increase (adding one leading zero).
*
* See https://www.hashcash.org/papers/hashcash.pdf
*/
@Slf4j
public class HashCashService extends ProofOfWorkService {
- // Default validations. Custom implementations might use tolerance.
- private static final BiPredicate<byte[], byte[]> isChallengeValid = Arrays::equals;
- private static final BiPredicate<Integer, Integer> isDifficultyValid = Integer::equals;
-
HashCashService() {
super(0);
}
@@ -50,105 +44,35 @@
return mint(payload, challenge, difficulty);
}
- @Override
- public byte[] getChallenge(String itemId, String ownerId) {
- return getBytes(itemId + ownerId);
- }
-
- static CompletableFuture<ProofOfWork> mint(byte[] payload,
+ public CompletableFuture<ProofOfWork> mint(byte[] payload,
byte[] challenge,
double difficulty) {
- return HashCashService.mint(payload,
- challenge,
- difficulty,
- HashCashService::testDifficulty);
- }
-
- @Override
- boolean verify(ProofOfWork proofOfWork) {
- return verify(proofOfWork,
- proofOfWork.getChallenge(),
- toNumLeadingZeros(proofOfWork.getDifficulty()));
- }
-
- static boolean verify(ProofOfWork proofOfWork,
- byte[] controlChallenge,
- int controlLog2Difficulty) {
- return HashCashService.verify(proofOfWork,
- controlChallenge,
- controlLog2Difficulty,
- HashCashService::testDifficulty);
- }
-
- static boolean verify(ProofOfWork proofOfWork,
- byte[] controlChallenge,
- int controlLog2Difficulty,
- BiPredicate<byte[], byte[]> challengeValidation,
- BiPredicate<Integer, Integer> difficultyValidation) {
- return HashCashService.verify(proofOfWork,
- controlChallenge,
- controlLog2Difficulty,
- challengeValidation,
- difficultyValidation,
- HashCashService::testDifficulty);
- }
-
- private static boolean testDifficulty(byte[] result, int log2Difficulty) {
- return HashCashService.numberOfLeadingZeros(result) > log2Difficulty;
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////////////////
- // Generic
- ///////////////////////////////////////////////////////////////////////////////////////////
-
- static CompletableFuture<ProofOfWork> mint(byte[] payload,
- byte[] challenge,
- double difficulty,
- BiPredicate<byte[], Integer> testDifficulty) {
return CompletableFuture.supplyAsync(() -> {
long ts = System.currentTimeMillis();
int log2Difficulty = toNumLeadingZeros(difficulty);
- byte[] result;
+ byte[] hash;
long counter = 0;
do {
- result = toSha256Hash(payload, challenge, ++counter);
+ hash = toSha256Hash(payload, challenge, ++counter);
}
- while (!testDifficulty.test(result, log2Difficulty));
+ while (numberOfLeadingZeros(hash) <= log2Difficulty);
ProofOfWork proofOfWork = new ProofOfWork(payload, counter, challenge, difficulty, System.currentTimeMillis() - ts, 0);
log.info("Completed minting proofOfWork: {}", proofOfWork);
return proofOfWork;
});
}
- static boolean verify(ProofOfWork proofOfWork,
- byte[] controlChallenge,
- int controlLog2Difficulty,
- BiPredicate<byte[], Integer> testDifficulty) {
- return verify(proofOfWork,
- controlChallenge,
- controlLog2Difficulty,
- HashCashService.isChallengeValid,
- HashCashService.isDifficultyValid,
- testDifficulty);
- }
-
- static boolean verify(ProofOfWork proofOfWork,
- byte[] controlChallenge,
- int controlLog2Difficulty,
- BiPredicate<byte[], byte[]> challengeValidation,
- BiPredicate<Integer, Integer> difficultyValidation,
- BiPredicate<byte[], Integer> testDifficulty) {
- return challengeValidation.test(proofOfWork.getChallenge(), controlChallenge) &&
- difficultyValidation.test(toNumLeadingZeros(proofOfWork.getDifficulty()), controlLog2Difficulty) &&
- verify(proofOfWork, testDifficulty);
- }
-
- private static boolean verify(ProofOfWork proofOfWork, BiPredicate<byte[], Integer> testDifficulty) {
- byte[] hash = HashCashService.toSha256Hash(proofOfWork.getPayload(),
+ @Override
+ boolean verify(ProofOfWork proofOfWork) {
+ byte[] hash = toSha256Hash(proofOfWork.getPayload(),
proofOfWork.getChallenge(),
proofOfWork.getCounter());
- return testDifficulty.test(hash, toNumLeadingZeros(proofOfWork.getDifficulty()));
+ return numberOfLeadingZeros(hash) > toNumLeadingZeros(proofOfWork.getDifficulty());
+ }
+
+ @Override
+ public byte[] getChallenge(String itemId, String ownerId) {
+ return getBytes(itemId + ownerId);
}
Index: common/src/test/java/bisq/common/crypto/HashCashServiceTest.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/common/src/test/java/bisq/common/crypto/HashCashServiceTest.java b/common/src/test/java/bisq/common/crypto/HashCashServiceTest.java
--- a/common/src/test/java/bisq/common/crypto/HashCashServiceTest.java (revision e0e70bd804fec36844987bc1a29051a24e3cbdc4)
+++ b/common/src/test/java/bisq/common/crypto/HashCashServiceTest.java (revision d54f1aafc04601ec350b083d06b24b4774a08d6b)
@@ -77,7 +77,7 @@
List<ProofOfWork> tokens = new ArrayList<>();
for (int i = 0; i < numTokens; i++) {
byte[] challenge = UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8);
- tokens.add(HashCashService.mint(payload, challenge, difficulty).get());
+ tokens.add(new HashCashService().mint(payload, challenge, difficulty).get());
}
double size = tokens.size();
long ts2 = System.currentTimeMillis();
```
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/bisq-network/bisq/pull/5858#issuecomment-980209103
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.bisq.network/pipermail/bisq-github/attachments/20211126/dad9642e/attachment-0001.htm>
More information about the bisq-github
mailing list