From 59ef47a1284bab23630bdbfb92b7767f5f5fe03b Mon Sep 17 00:00:00 2001 From: Ross Nicoll Date: Sun, 9 Jan 2022 21:18:14 +0000 Subject: [PATCH 1/2] Add tests around cloneAsHeader() --- .../java/org/bitcoinj/core/AltcoinBlock.java | 1 + .../params/AbstractDogecoinParamsTest.java | 45 ++++----- .../java/org/libdohj/params/BlockLoader.java | 36 +++++++ .../params/DogecoinMainNetParamsTest.java | 45 +++++++++ .../params/LitecoinMainNetParamsTest.java | 94 ++++++++++++++++++ .../org/libdohj/params/litecoin_block1.bin | Bin 0 -> 80 bytes 6 files changed, 194 insertions(+), 27 deletions(-) create mode 100644 core/src/test/java/org/libdohj/params/BlockLoader.java create mode 100644 core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java create mode 100644 core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java create mode 100644 core/src/test/resources/org/libdohj/params/litecoin_block1.bin diff --git a/core/src/main/java/org/bitcoinj/core/AltcoinBlock.java b/core/src/main/java/org/bitcoinj/core/AltcoinBlock.java index 1118cf2ee..8c5d93ffd 100644 --- a/core/src/main/java/org/bitcoinj/core/AltcoinBlock.java +++ b/core/src/main/java/org/bitcoinj/core/AltcoinBlock.java @@ -146,6 +146,7 @@ public String getScryptHashAsString() { } @Override + @Deprecated public Coin getBlockInflation(int height) { final AltcoinNetworkParameters altParams = (AltcoinNetworkParameters) params; return altParams.getBlockSubsidy(height); diff --git a/core/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java b/core/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java index 9b570eaee..d2e636aa1 100644 --- a/core/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java +++ b/core/src/test/java/org/libdohj/params/AbstractDogecoinParamsTest.java @@ -15,13 +15,14 @@ */ package org.libdohj.params; -import org.bitcoinj.core.*; +import org.bitcoinj.core.AltcoinBlock; +import org.bitcoinj.core.Coin; +import org.bitcoinj.core.Context; import org.junit.Before; import org.junit.Test; -import org.libdohj.core.AltcoinSerializer; import java.io.IOException; - +import java.util.Map; import static org.junit.Assert.assertEquals; @@ -107,30 +108,20 @@ public void shouldCalculateDigishieldDifficultyRounding() { @Test public void shouldCalculateRetarget() throws IOException { // Do a more in-depth test for the first retarget - byte[] payload; - AltcoinSerializer serializer = (AltcoinSerializer)params.getDefaultSerializer(); - final AltcoinBlock block239; - final AltcoinBlock block479; - final AltcoinBlock block480; - final AltcoinBlock block719; - final AltcoinBlock block720; - - payload = Util.getBytes(getClass().getResourceAsStream("dogecoin_block239.bin")); - block239 = (AltcoinBlock)serializer.makeBlock(payload); - payload = Util.getBytes(getClass().getResourceAsStream("dogecoin_block479.bin")); - block479 = (AltcoinBlock)serializer.makeBlock(payload); - payload = Util.getBytes(getClass().getResourceAsStream("dogecoin_block480.bin")); - block480 = (AltcoinBlock)serializer.makeBlock(payload); - payload = Util.getBytes(getClass().getResourceAsStream("dogecoin_block719.bin")); - block719 = (AltcoinBlock)serializer.makeBlock(payload); - payload = Util.getBytes(getClass().getResourceAsStream("dogecoin_block720.bin")); - block720 = (AltcoinBlock)serializer.makeBlock(payload); - - assertEquals(Sha256Hash.wrap("f9533416310fc4484cf43405a858b06afc9763ad401d267c1835d77e7d225a4e"), block239.getHash()); - assertEquals(Sha256Hash.wrap("ed83c923b532835f6597f70def42910aa9e06880e8a19b68f6b4a787f2b4b69f"), block479.getHash()); - assertEquals(Sha256Hash.wrap("a0e6d1cdef02b394d31628c3281f67e8534bec74fda1a4294b58be80c3fdf3f3"), block480.getHash()); - assertEquals(Sha256Hash.wrap("82e56e141ccfe019d475382d9a108ef86afeb297d95443dfd7250e57af805696"), block719.getHash()); - assertEquals(Sha256Hash.wrap("6b34f1a7de1954beb0ddf100bb2b618ff0183b6ae2b4a9376721ef8e04ab3b39"), block720.getHash()); + final String[][] blocks = { + {"dogecoin_block239.bin", "f9533416310fc4484cf43405a858b06afc9763ad401d267c1835d77e7d225a4e"}, + {"dogecoin_block479.bin", "ed83c923b532835f6597f70def42910aa9e06880e8a19b68f6b4a787f2b4b69f"}, + {"dogecoin_block480.bin", "a0e6d1cdef02b394d31628c3281f67e8534bec74fda1a4294b58be80c3fdf3f3"}, + {"dogecoin_block719.bin", "82e56e141ccfe019d475382d9a108ef86afeb297d95443dfd7250e57af805696"}, + {"dogecoin_block720.bin", "6b34f1a7de1954beb0ddf100bb2b618ff0183b6ae2b4a9376721ef8e04ab3b39"} + }; + final BlockLoader loader = new BlockLoader(params); + final Map loadedBlocks = loader.loadBlocks(blocks); + final AltcoinBlock block239 = loadedBlocks.get("f9533416310fc4484cf43405a858b06afc9763ad401d267c1835d77e7d225a4e"); + final AltcoinBlock block479 = loadedBlocks.get("ed83c923b532835f6597f70def42910aa9e06880e8a19b68f6b4a787f2b4b69f"); + final AltcoinBlock block480 = loadedBlocks.get("a0e6d1cdef02b394d31628c3281f67e8534bec74fda1a4294b58be80c3fdf3f3"); + final AltcoinBlock block719 = loadedBlocks.get("82e56e141ccfe019d475382d9a108ef86afeb297d95443dfd7250e57af805696"); + final AltcoinBlock block720 = loadedBlocks.get("6b34f1a7de1954beb0ddf100bb2b618ff0183b6ae2b4a9376721ef8e04ab3b39"); assertEquals(block480.getDifficultyTarget(), params.calculateNewDifficultyTargetInner(479, block479, block480, block239)); assertEquals(block720.getDifficultyTarget(), params.calculateNewDifficultyTargetInner(719, block719, block720, block479)); diff --git a/core/src/test/java/org/libdohj/params/BlockLoader.java b/core/src/test/java/org/libdohj/params/BlockLoader.java new file mode 100644 index 000000000..688d24d23 --- /dev/null +++ b/core/src/test/java/org/libdohj/params/BlockLoader.java @@ -0,0 +1,36 @@ +package org.libdohj.params; + +import org.bitcoinj.core.AltcoinBlock; +import org.bitcoinj.core.NetworkParameters; +import org.bitcoinj.core.Util; +import org.libdohj.core.AltcoinSerializer; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +class BlockLoader { + private final NetworkParameters params; + public BlockLoader(final NetworkParameters params) { + this.params = params; + } + + protected Map loadBlocks(final String[][] blocks) throws IOException { + final AltcoinSerializer serializer = (AltcoinSerializer)params.getDefaultSerializer(); + final Map loadedBlocks = new HashMap<>(); + for (String[] row: blocks) { + final InputStream stream = getClass().getResourceAsStream(row[0]); + if (stream == null) { + throw new IOException("Failed to find resource " + row[0]); + } + final byte[] payload = Util.getBytes(stream); + final AltcoinBlock block = (AltcoinBlock)serializer.makeBlock(payload); + assertEquals(row[1], block.getHashAsString()); + loadedBlocks.put(block.getHashAsString(), block); + } + return loadedBlocks; + } +} \ No newline at end of file diff --git a/core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java b/core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java new file mode 100644 index 000000000..25d965aef --- /dev/null +++ b/core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java @@ -0,0 +1,45 @@ +/* + * Copyright 2015, 2021 J. Ross Nicoll + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.libdohj.params; + +import org.bitcoinj.core.Block; +import org.bitcoinj.core.Context; +import org.bitcoinj.core.Sha256Hash; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * + * @author Ross Nicoll + */ +public class DogecoinMainNetParamsTest { + private static final DogecoinMainNetParams params = DogecoinMainNetParams.get(); + + @Before + public void setUp() throws Exception { + Context context = new Context(params); + } + + @Test + public void shouldHaveCorrectGenesisBlock() { + final Block genesis = params.getGenesisBlock(); + final Sha256Hash expected = Sha256Hash.wrap("1a91e3dace36e2be3bf030a65679fe821aa1d6ef92e7c9902eb318182c355691"); + final Sha256Hash actual = genesis.getHash(); + assertEquals(expected, actual); + } +} diff --git a/core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java b/core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java new file mode 100644 index 000000000..a36b3f72a --- /dev/null +++ b/core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2015, 2021 J. Ross Nicoll + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.libdohj.params; + +import org.bitcoinj.core.*; +import org.bitcoinj.script.Script; +import org.bitcoinj.store.BlockStore; +import org.bitcoinj.store.BlockStoreException; +import org.bitcoinj.store.MemoryBlockStore; +import org.bitcoinj.wallet.Wallet; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.math.BigInteger; +import java.util.Map; +import java.util.Objects; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author Ross Nicoll + */ +public class LitecoinMainNetParamsTest { + private static final LitecoinMainNetParams params = LitecoinMainNetParams.get(); + private static final BlockLoader loader = new BlockLoader(params); + public static final String GENESIS_BLOCK_HASH = "12a765e31ffd4059bada1e25190f6e98c99d9714d334efa41a195a7e7e04bfe2"; + public static final String BLOCK_1_HASH = "80ca095ed10b02e53d769eb6eaf92cd04e9e0759e5be4a8477b42911ba49c78f"; + + @Before + public void setUp() throws Exception { + Context context = new Context(params); + } + + @Test + public void shouldCloneAsHeader() { + final Block genesis = params.getGenesisBlock(); + final Block header = genesis.cloneAsHeader(); + final Sha256Hash expected = genesis.getHash(); + final Sha256Hash actual = header.getHash(); + assertEquals(genesis.getVersion(), header.getVersion()); + assertEquals(genesis.getPrevBlockHash(), header.getPrevBlockHash()); + assertEquals(genesis.getMerkleRoot(), header.getMerkleRoot()); + assertEquals(genesis.getTime(), header.getTime()); + assertEquals(genesis.getDifficultyTarget(), header.getDifficultyTarget()); + assertEquals(genesis.getNonce(), header.getNonce()); + + assertEquals(expected, actual); + } + + @Test + public void shouldHaveCorrectGenesisBlock() { + final Block genesis = params.getGenesisBlock(); + final Sha256Hash expected = Sha256Hash.wrap(GENESIS_BLOCK_HASH); + final Sha256Hash actual = genesis.getHash(); + assertEquals(expected, actual); + } + + @Test + public void shouldConnectBlock1() throws BlockStoreException, PrunedException, IOException { + final BlockStore store = new MemoryBlockStore(params); + final Wallet wallet = Wallet.createDeterministic(params, Script.ScriptType.P2PKH); + final StoredBlock storedGenesis = new StoredBlock(params.getGenesisBlock(), params.genesisBlock.getWork(), 0); + store.put(storedGenesis); + + // Verify we actually saved the genesis block correctly + assertEquals(params.getGenesisBlock().cloneAsHeader(), store.get(Sha256Hash.wrap(GENESIS_BLOCK_HASH)).getHeader()); + + final String[][] blocks = { + {"litecoin_block1.bin", BLOCK_1_HASH}, + }; + final Map loadedBlocks = loader.loadBlocks(blocks); + final BlockChain blockChain = new BlockChain(params, wallet, store); + final Block block1 = Objects.requireNonNull(loadedBlocks.get(BLOCK_1_HASH)); + + assertEquals(Sha256Hash.wrap(GENESIS_BLOCK_HASH), block1.getPrevBlockHash()); + assertTrue(blockChain.add(params.getGenesisBlock())); + assertTrue(blockChain.add(block1)); + } +} diff --git a/core/src/test/resources/org/libdohj/params/litecoin_block1.bin b/core/src/test/resources/org/libdohj/params/litecoin_block1.bin new file mode 100644 index 0000000000000000000000000000000000000000..9986d00d29ec547832b2b7fcea4c132a324de095 GIT binary patch literal 80 zcmV-W0I&Z60002uzXX1MS{WLo?=;gCmz~L&ZVwqH9@@HDK>Z)%Wv3GMP@5N5x~Ch* mM&W$4(Cs4VlV5S-&~igIc#t8a208k_?T=3I{|_F2Cj Date: Sat, 15 Jan 2022 10:55:13 +0000 Subject: [PATCH 2/2] Add tests to verify the first 240 blocks of Doge & Lite --- .../java/org/libdohj/params/BlockLoader.java | 19 ++++++++++ .../params/DogecoinMainNetParamsTest.java | 34 ++++++++++++++++-- .../params/LitecoinMainNetParamsTest.java | 22 ++++++++++++ .../libdohj/params/dogecoin_block1-240.bin | Bin 0 -> 19200 bytes .../libdohj/params/litecoin_block1-240.bin | Bin 0 -> 19200 bytes 5 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 core/src/test/resources/org/libdohj/params/dogecoin_block1-240.bin create mode 100644 core/src/test/resources/org/libdohj/params/litecoin_block1-240.bin diff --git a/core/src/test/java/org/libdohj/params/BlockLoader.java b/core/src/test/java/org/libdohj/params/BlockLoader.java index 688d24d23..4f30b718d 100644 --- a/core/src/test/java/org/libdohj/params/BlockLoader.java +++ b/core/src/test/java/org/libdohj/params/BlockLoader.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import static org.junit.Assert.assertEquals; @@ -33,4 +34,22 @@ protected Map loadBlocks(final String[][] blocks) throws I } return loadedBlocks; } + + /** + * Load all the block headers found in the given filename. + */ + protected LinkedHashMap loadAllHeaders(final String filename, final int headerSize) throws IOException { + final AltcoinSerializer serializer = (AltcoinSerializer)params.getDefaultSerializer(); + final LinkedHashMap loadedBlocks = new LinkedHashMap<>(); + final InputStream stream = getClass().getResourceAsStream(filename); + if (stream == null) { + throw new IOException("Failed to find resource " + filename); + } + final byte[] payload = new byte[headerSize]; + while (stream.read(payload) == headerSize) { + final AltcoinBlock block = (AltcoinBlock) serializer.makeBlock(payload); + loadedBlocks.put(block.getHashAsString(), block); + } + return loadedBlocks; + } } \ No newline at end of file diff --git a/core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java b/core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java index 25d965aef..ef4b2e042 100644 --- a/core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java +++ b/core/src/test/java/org/libdohj/params/DogecoinMainNetParamsTest.java @@ -15,13 +15,20 @@ */ package org.libdohj.params; -import org.bitcoinj.core.Block; -import org.bitcoinj.core.Context; -import org.bitcoinj.core.Sha256Hash; +import org.bitcoinj.core.*; +import org.bitcoinj.script.Script; +import org.bitcoinj.store.BlockStore; +import org.bitcoinj.store.BlockStoreException; +import org.bitcoinj.store.MemoryBlockStore; +import org.bitcoinj.wallet.Wallet; import org.junit.Before; import org.junit.Test; +import java.io.IOException; +import java.util.Map; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; /** * @@ -29,6 +36,8 @@ */ public class DogecoinMainNetParamsTest { private static final DogecoinMainNetParams params = DogecoinMainNetParams.get(); + private static final BlockLoader loader = new BlockLoader(params); + private static final String BLOCK_240_HASH = "3752567a4c6085970f5b726feee3b8fc0f37ca95bb2a8daf497683b5168ec8d1"; @Before public void setUp() throws Exception { @@ -42,4 +51,23 @@ public void shouldHaveCorrectGenesisBlock() { final Sha256Hash actual = genesis.getHash(); assertEquals(expected, actual); } + + /** + * This connects the first n blocks - this is more of a functional test than the single block + * test, and should handle cases such as difficulty recalculation. + */ + @Test + public void shouldConnectBlocks() throws BlockStoreException, PrunedException, IOException { + final BlockStore store = new MemoryBlockStore(params); + final Wallet wallet = Wallet.createDeterministic(params, Script.ScriptType.P2PKH); + final StoredBlock storedGenesis = new StoredBlock(params.getGenesisBlock(), params.genesisBlock.getWork(), 0); + store.put(storedGenesis); + final Map loadedBlocks = loader.loadAllHeaders("dogecoin_block1-240.bin", 80); + final BlockChain blockChain = new BlockChain(params, wallet, store); + assertTrue(blockChain.add(params.getGenesisBlock())); + for (Block block: loadedBlocks.values()) { + assertTrue(blockChain.add(block)); + } + assertEquals(BLOCK_240_HASH, blockChain.getChainHead().getHeader().getHashAsString()); + } } diff --git a/core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java b/core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java index a36b3f72a..60b8737de 100644 --- a/core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java +++ b/core/src/test/java/org/libdohj/params/LitecoinMainNetParamsTest.java @@ -70,6 +70,10 @@ public void shouldHaveCorrectGenesisBlock() { assertEquals(expected, actual); } + /** + * Test connecting just block 1, while verifying progress at a number of steps. This is designed to expose if any + * of the more fundamental functionality is broken before we try connecting several hundred headers. + */ @Test public void shouldConnectBlock1() throws BlockStoreException, PrunedException, IOException { final BlockStore store = new MemoryBlockStore(params); @@ -91,4 +95,22 @@ public void shouldConnectBlock1() throws BlockStoreException, PrunedException, I assertTrue(blockChain.add(params.getGenesisBlock())); assertTrue(blockChain.add(block1)); } + + /** + * This connects the first n blocks - this is more of a functional test than the single block + * test, and should handle cases such as difficulty recalculation. + */ + @Test + public void shouldConnectBlocks() throws BlockStoreException, PrunedException, IOException { + final BlockStore store = new MemoryBlockStore(params); + final Wallet wallet = Wallet.createDeterministic(params, Script.ScriptType.P2PKH); + final StoredBlock storedGenesis = new StoredBlock(params.getGenesisBlock(), params.genesisBlock.getWork(), 0); + store.put(storedGenesis); + final Map loadedBlocks = loader.loadAllHeaders("litecoin_block1-240.bin", 80); + final BlockChain blockChain = new BlockChain(params, wallet, store); + assertTrue(blockChain.add(params.getGenesisBlock())); + for (Block block: loadedBlocks.values()) { + assertTrue(blockChain.add(block)); + } + } } diff --git a/core/src/test/resources/org/libdohj/params/dogecoin_block1-240.bin b/core/src/test/resources/org/libdohj/params/dogecoin_block1-240.bin new file mode 100644 index 0000000000000000000000000000000000000000..9567f38af64eece1aed9ba8ffc7d31237beecda7 GIT binary patch literal 19200 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 IfBEnK0ogpivj6}9 literal 0 HcmV?d00001