From 5d36a644ead2a4dd7e16741f55a6f066784c0f1e Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Fri, 16 Oct 2015 19:49:49 +0100 Subject: [PATCH] Add unit tests to verify how current and previous block time and difficulty are extracted from blocks --- .../params/AbstractDogecoinParams.java | 15 ++++++-- .../params/AbstractDogecoinParamsTest.java | 34 +++++++++++++----- .../org/libdohj/params/dogecoin_block239.bin | Bin 0 -> 190 bytes .../org/libdohj/params/dogecoin_block479.bin | Bin 0 -> 190 bytes 4 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 src/test/resources/org/libdohj/params/dogecoin_block239.bin create mode 100644 src/test/resources/org/libdohj/params/dogecoin_block479.bin diff --git a/src/main/java/org/libdohj/params/AbstractDogecoinParams.java b/src/main/java/org/libdohj/params/AbstractDogecoinParams.java index 17785afc..01a8fcb7 100644 --- a/src/main/java/org/libdohj/params/AbstractDogecoinParams.java +++ b/src/main/java/org/libdohj/params/AbstractDogecoinParams.java @@ -210,14 +210,25 @@ public abstract class AbstractDogecoinParams extends NetworkParameters implement Block blockIntervalAgo = cursor.getHeader(); long receivedTargetCompact = nextBlock.getDifficultyTarget(); - long newTargetCompact = this.getNewDifficultyTarget(previousHeight, prev.getTimeSeconds(), - prev.getDifficultyTarget(), blockIntervalAgo.getTimeSeconds()); + long newTargetCompact = this.getNewDifficultyTarget(previousHeight, prev, blockIntervalAgo); if (newTargetCompact != receivedTargetCompact) throw new VerificationException("Network provided difficulty bits do not match what was calculated: " + newTargetCompact + " vs " + receivedTargetCompact); } + /** + * + * @param prev the block immediately before the retarget block. + * @param blockIntervalAgo The last retarget block. + * @return New difficulty target as compact bytes. + */ + public long getNewDifficultyTarget(int previousHeight, final Block prev, + final Block blockIntervalAgo) { + return this.getNewDifficultyTarget(previousHeight, prev.getTimeSeconds(), + blockIntervalAgo.getDifficultyTarget(), blockIntervalAgo.getTimeSeconds()); + } + /** * * @param previousHeight Height of the block immediately previous to the one we're calculating difficulty of. diff --git a/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java b/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java index 1f6510b4..e2b4d6f0 100644 --- a/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java +++ b/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java @@ -15,10 +15,14 @@ */ package org.libdohj.params; -import org.libdohj.params.AbstractDogecoinParams; -import org.libdohj.params.DogecoinMainNetParams; +import java.io.IOException; +import org.bitcoinj.core.AltcoinBlock; +import org.bitcoinj.core.Context; +import org.bitcoinj.core.Util; import static org.junit.Assert.assertEquals; +import org.junit.Before; import org.junit.Test; +import org.libdohj.core.AltcoinSerializer; /** * @@ -27,6 +31,11 @@ import org.junit.Test; public class AbstractDogecoinParamsTest { private static final AbstractDogecoinParams params = DogecoinMainNetParams.get(); + @Before + public void setUp() throws Exception { + Context context = new Context(params); + } + @Test public void shouldCalculateBitcoinLikeDifficulty() { int previousHeight = 239; @@ -36,13 +45,6 @@ public class AbstractDogecoinParamsTest { long newDifficulty = params.getNewDifficultyTarget(previousHeight, previousBlockTime, lastRetargetDifficulty, lastRetargetTime); assertEquals(newDifficulty, 0x1e00ffff); - previousHeight = 479; - previousBlockTime = 1386475840; - lastRetargetDifficulty = 0x1e0fffff; - lastRetargetTime = 1386475638; // Block 239 - newDifficulty = params.getNewDifficultyTarget(previousHeight, previousBlockTime, lastRetargetDifficulty, lastRetargetTime); - assertEquals(newDifficulty, 0x1e00ffff); - previousHeight = 9599; previousBlockTime = 1386954113; lastRetargetDifficulty = 0x1c1a1206; @@ -71,4 +73,18 @@ public class AbstractDogecoinParamsTest { long newDifficulty = params.getNewDifficultyTarget(previousHeight, previousBlockTime, lastRetargetDifficulty, lastRetargetTime); assertEquals(newDifficulty, 0x1b6558a4); } + + @Test + public void shouldCalculateFirstRetarget() throws IOException { + // Do a more in-depth test for the first retarget + byte[] payload = Util.getBytes(getClass().getResourceAsStream("dogecoin_block239.bin")); + AltcoinSerializer serializer = (AltcoinSerializer)params.getDefaultSerializer(); + final AltcoinBlock block239 = (AltcoinBlock)serializer.makeBlock(payload); + final AltcoinBlock block479; + + payload = Util.getBytes(getClass().getResourceAsStream("dogecoin_block479.bin")); + block479 = (AltcoinBlock)serializer.makeBlock(payload); + + assertEquals(0x1e00ffff, params.getNewDifficultyTarget(479, block239, block479)); + } } diff --git a/src/test/resources/org/libdohj/params/dogecoin_block239.bin b/src/test/resources/org/libdohj/params/dogecoin_block239.bin new file mode 100644 index 0000000000000000000000000000000000000000..48b918de8efce869a7e6c558638b238ff879ff86 GIT binary patch literal 190 zcmZQ%U|`6REp7j5CpBTwgQ%MF@aIv!d?yRPooM~~y=rn|pR$TIsW zHsABMm+!k literal 0 HcmV?d00001 diff --git a/src/test/resources/org/libdohj/params/dogecoin_block479.bin b/src/test/resources/org/libdohj/params/dogecoin_block479.bin new file mode 100644 index 0000000000000000000000000000000000000000..4adcd7cdf2cd3ed7a066c07f0e9e15e5932ba515 GIT binary patch literal 190 zcmZQ%U|?VjIDYn|fV!LE-)0xb`ViOGVQU)?KAiV{#SF)tv+nLQzBT*gry1^yS@&<7 zH5n!s@6OAO=ehZHjqU!uzg1=x>MJ^YTpaZOKffFU<6ad;Mv#F(j2HX|0zMXyK1M+{ z{Q#q24}FjjBZKTWj^n%x49bd3e>zw2Np4YZS@yt9W6hQwyK83YsoKRfg>L((zVVh3 J$CNc73jhe8M6v(? literal 0 HcmV?d00001