3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-02-11 17:55:53 +00:00

Add unit tests to verify how current and previous block time and difficulty are extracted from blocks

This commit is contained in:
Ross Nicoll 2015-10-16 19:49:49 +01:00
parent a2499cb31a
commit 5d36a644ea
4 changed files with 38 additions and 11 deletions

View File

@ -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.

View File

@ -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));
}
}