path) {
+ /**
+ * Convert BitcoinJ native type to List of Integers, BitcoinJ v16 compatible
+ *
+ *
+ * @param path path to deterministic key
+ * @return Array of Ints representing the keys position in the tree
+ * @since v4.7.2
+ */
+ private static List toIntegerList(HDPath path) {
+ return path.stream().map(ChildNumber::num).collect(Collectors.toList());
+ }
+ // BitcoinJ v15 compatible
+ private static List toIntegerList(ImmutableList path) {
return path.stream().map(ChildNumber::num).collect(Collectors.toList());
}
diff --git a/src/main/java/org/qortal/crosschain/BitcoinyTBD.java b/src/main/java/org/qortal/crosschain/BitcoinyTBD.java
index c25d2094..1312bf97 100644
--- a/src/main/java/org/qortal/crosschain/BitcoinyTBD.java
+++ b/src/main/java/org/qortal/crosschain/BitcoinyTBD.java
@@ -1,5 +1,6 @@
package org.qortal.crosschain;
+import org.bitcoinj.core.Block;
import org.bitcoinj.core.Coin;
import org.bitcoinj.core.Context;
import org.bitcoinj.core.NetworkParameters;
@@ -148,4 +149,16 @@ public class BitcoinyTBD extends Bitcoiny {
this.netTBD.setFeeCeiling( fee );
}
+
+ @Override
+ public String getPaymentProtocolId() {
+ return params.getId();
+ }
+
+ @Override
+ public Block getGenesisBlock() {
+ if(genesisBlock == null)
+ genesisBlock = params.getGenesisBlock();
+ return this.genesisBlock;
+ }
}
\ No newline at end of file
diff --git a/src/main/java/org/qortal/crosschain/DeterminedNetworkParams.java b/src/main/java/org/qortal/crosschain/DeterminedNetworkParams.java
index af7d19ac..90e7eb12 100644
--- a/src/main/java/org/qortal/crosschain/DeterminedNetworkParams.java
+++ b/src/main/java/org/qortal/crosschain/DeterminedNetworkParams.java
@@ -98,9 +98,10 @@ public class DeterminedNetworkParams extends NetworkParameters implements Altcoi
LOGGER.info( "Creating Genesis Block ...");
+ // BitcoinJ v16 has a new native method for this
//this.genesisBlock = CoinParamsUtil.createGenesisBlockFromRequest(this, request);
- LOGGER.info("Created Genesis Block: genesisBlock = " + genesisBlock );
+// LOGGER.info("Created Genesis Block: genesisBlock = " + genesisBlock );
// this is 100 for each coin from what I can tell
this.spendableCoinbaseDepth = 100;
@@ -113,8 +114,9 @@ public class DeterminedNetworkParams extends NetworkParameters implements Altcoi
//
// LOGGER.info("request = " + request);
//
-// checkState(genesisHash.equals(request.getExpectedGenesisHash()));
- this.alertSigningKey = Hex.decode(request.getPubKey());
+// checkState(genesisHash.equals(request.getExpectedGenesisHash()))
+// alertSigningKey is removed in v16
+// this.alertSigningKey = Hex.decode(request.getPubKey());
this.majorityEnforceBlockUpgrade = request.getMajorityEnforceBlockUpgrade();
this.majorityRejectBlockOutdated = request.getMajorityRejectBlockOutdated();
@@ -221,6 +223,12 @@ public class DeterminedNetworkParams extends NetworkParameters implements Altcoi
}
}
+ @Override
+ public Block getGenesisBlock() {
+ //ToDo: Finish
+ return null;
+ }
+
/**
* Get the difficulty target expected for the next block. This includes all
* the weird cases for Litecoin such as testnet blocks which can be maximum
diff --git a/src/main/java/org/qortal/crosschain/LegacyZcashAddress.java b/src/main/java/org/qortal/crosschain/LegacyZcashAddress.java
index 14958242..15f9b411 100644
--- a/src/main/java/org/qortal/crosschain/LegacyZcashAddress.java
+++ b/src/main/java/org/qortal/crosschain/LegacyZcashAddress.java
@@ -184,6 +184,11 @@ public class LegacyZcashAddress extends Address {
return p2sh ? ScriptType.P2SH : ScriptType.P2PKH;
}
+ @Override
+ public int compareTo(Address address) {
+ return this.toString().compareTo(address.toString());
+ }
+
/**
* Given an address, examines the version byte and attempts to find a matching NetworkParameters. If you aren't sure
* which network the address is intended for (eg, it was provided by a user), you can use this to decide if it is
diff --git a/src/main/java/org/qortal/network/Network.java b/src/main/java/org/qortal/network/Network.java
index f500b2e8..8258fd25 100644
--- a/src/main/java/org/qortal/network/Network.java
+++ b/src/main/java/org/qortal/network/Network.java
@@ -714,6 +714,7 @@ public class Network {
// We can't block here so use tryRepository(). We don't NEED to connect a new peer.
try (Repository repository = RepositoryManager.tryRepository()) {
if (repository == null) {
+ LOGGER.warn("Unable to get repository connection : Network.getConnectablePeer()");
return null;
}
@@ -1499,6 +1500,7 @@ public class Network {
// Pruning peers isn't critical so no need to block for a repository instance.
try (Repository repository = RepositoryManager.tryRepository()) {
if (repository == null) {
+ LOGGER.warn("Unable to get repository connection : Network.prunePeers()");
return;
}
@@ -1567,6 +1569,7 @@ public class Network {
// Merging peers isn't critical so don't block for a repository instance.
try (Repository repository = RepositoryManager.tryRepository()) {
if (repository == null) {
+ LOGGER.warn("Unable to get repository connection : Network.opportunisticMergePeers()");
return;
}
diff --git a/src/test/java/org/qortal/test/BootstrapTests.java b/src/test/java/org/qortal/test/BootstrapTests.java
index 58e1cfa2..cf6fe043 100644
--- a/src/test/java/org/qortal/test/BootstrapTests.java
+++ b/src/test/java/org/qortal/test/BootstrapTests.java
@@ -212,7 +212,9 @@ public class BootstrapTests extends Common {
@Test
public void testBootstrapHosts() throws IOException {
String[] bootstrapHosts = Settings.getInstance().getBootstrapHosts();
- String[] bootstrapTypes = { "archive" }; // , "toponly"
+ String[] bootstrapTypes = { "archive" }; // , "toponly", "full"
+ boolean invalidFile = false;
+ boolean invalidDate = false;
for (String host : bootstrapHosts) {
for (String type : bootstrapTypes) {
@@ -230,14 +232,20 @@ public class BootstrapTests extends Common {
// Ensure the bootstrap exists and has a size greated than 100MiB
System.out.println(String.format("%s %s size is %d bytes", host, type, fileSize));
- assertTrue("Bootstrap size must be at least 100MiB", fileSize > 100*1024*1024L);
+ if(fileSize < 100*1024*1024L)
+ invalidFile = true;
+ //assertTrue("Bootstrap size must be at least 100MiB", fileSize > 100*1024*1024L);
// Ensure the bootstrap has been published recently (in the last 3 days)
long minimumLastMofifiedTimestamp = NTP.getTime() - (3 * 24 * 60 * 60 * 1000L);
System.out.println(String.format("%s %s last modified timestamp is %d", host, type, lastModified));
- assertTrue("Bootstrap last modified date must be in the last 3 days", lastModified > minimumLastMofifiedTimestamp);
+ if(lastModified < minimumLastMofifiedTimestamp)
+ invalidDate = true;
+ //assertTrue("Bootstrap last modified date must be in the last 3 days", lastModified > minimumLastMofifiedTimestamp);
}
}
+ assertFalse("File size must be at least 100MiB", invalidFile);
+ assertFalse("Bootstrap last modified date must be in the last 3 days",invalidDate);
}
private void deleteBootstraps() throws IOException {
diff --git a/src/test/java/org/qortal/test/CryptoTests.java b/src/test/java/org/qortal/test/CryptoTests.java
index 75422ee7..13395d62 100644
--- a/src/test/java/org/qortal/test/CryptoTests.java
+++ b/src/test/java/org/qortal/test/CryptoTests.java
@@ -304,7 +304,7 @@ public class CryptoTests extends Common {
@Test
public void testAESFileEncryption() throws NoSuchAlgorithmException, IOException, IllegalBlockSizeException,
- InvalidKeyException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchPaddingException {
+ InvalidKeyException, BadPaddingException, InvalidAlgorithmParameterException, NoSuchPaddingException, InterruptedException {
// Create temporary directory and file paths
java.nio.file.Path tempDir = Files.createTempDirectory("qortal-tests");
@@ -320,6 +320,7 @@ public class CryptoTests extends Common {
// Write it to the input file
FileOutputStream outputStream = new FileOutputStream(inputFilePath);
outputStream.write(randomBytes);
+ outputStream.close();
// Make sure only the input file exists
assertTrue(Files.exists(Paths.get(inputFilePath)));
diff --git a/src/test/java/org/qortal/test/GuiTests.java b/src/test/java/org/qortal/test/GuiTests.java
index 016518f3..c391ef92 100644
--- a/src/test/java/org/qortal/test/GuiTests.java
+++ b/src/test/java/org/qortal/test/GuiTests.java
@@ -1,15 +1,22 @@
package org.qortal.test;
+import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.qortal.gui.SplashFrame;
import org.qortal.gui.SysTray;
+import org.qortal.repository.DataException;
+import org.qortal.test.common.Common;
import java.awt.TrayIcon.MessageType;
-@Ignore
public class GuiTests {
+ @Before
+ public void beforeTest() throws DataException {
+ Common.useDefaultSettings();
+ }
+
@Test
public void testSplashFrame() throws InterruptedException {
SplashFrame splashFrame = SplashFrame.getInstance();
diff --git a/src/test/java/org/qortal/test/MemoryPoWTests.java b/src/test/java/org/qortal/test/MemoryPoWTests.java
index f642c781..11a0a2b2 100644
--- a/src/test/java/org/qortal/test/MemoryPoWTests.java
+++ b/src/test/java/org/qortal/test/MemoryPoWTests.java
@@ -10,7 +10,7 @@ import java.util.Random;
import static org.junit.Assert.*;
-@Ignore
+@Ignore (value="Tests Work Fine - VERY Long Run time (1hr+)")
public class MemoryPoWTests {
private static final int workBufferLength = 8 * 1024 * 1024;
@@ -26,16 +26,16 @@ public class MemoryPoWTests {
long startTime = System.currentTimeMillis();
- int nonce = MemoryPoW.compute2(data, workBufferLength, difficulty);
+ Integer nonce = MemoryPoW.compute2(data, workBufferLength, difficulty);
long finishTime = System.currentTimeMillis();
assertNotNull(nonce);
- System.out.println(String.format("Memory-hard PoW (buffer size: %dKB, leading zeros: %d) took %dms, nonce: %d", workBufferLength / 1024,
+ System.out.printf("Memory-hard PoW (buffer size: %dKB, leading zeros: %d) took %dms, nonce: %d%n", workBufferLength / 1024,
difficulty,
finishTime - startTime,
- nonce));
+ nonce);
assertTrue(MemoryPoW.verify2(data, workBufferLength, difficulty, nonce));
}
@@ -73,12 +73,12 @@ public class MemoryPoWTests {
double stddev = (double) Math.sqrt( (sampleSize * timesS2 - timesS1 * timesS1) / stddevDivisor );
- System.out.println(String.format("Difficulty: %d, %d timings, mean: %d ms, stddev: %.2f ms, max nonce: %d",
+ System.out.printf("Difficulty: %d, %d timings, mean: %d ms, stddev: %.2f ms, max nonce: %d%n",
difficulty,
sampleSize,
timesS1 / sampleSize,
stddev,
- maxNonce));
+ maxNonce);
}
}
@@ -97,7 +97,7 @@ public class MemoryPoWTests {
expectedNonce = 11032;
nonce = MemoryPoW.compute2(data, workBufferLength, difficulty);
- System.out.println(String.format("Difficulty %d, nonce: %d", difficulty, nonce));
+ System.out.printf("Difficulty %d, nonce: %d%n", difficulty, nonce);
assertEquals(expectedNonce, nonce);
}
diff --git a/src/test/java/org/qortal/test/PenaltyFixTests.java b/src/test/java/org/qortal/test/PenaltyFixTests.java
deleted file mode 100644
index 6d06f5f1..00000000
--- a/src/test/java/org/qortal/test/PenaltyFixTests.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.qortal.test;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.qortal.account.Account;
-import org.qortal.account.PrivateKeyAccount;
-import org.qortal.block.Block;
-import org.qortal.controller.BlockMinter;
-import org.qortal.data.transaction.PaymentTransactionData;
-import org.qortal.data.transaction.TransactionData;
-import org.qortal.repository.DataException;
-import org.qortal.repository.Repository;
-import org.qortal.repository.RepositoryManager;
-import org.qortal.settings.Settings;
-import org.qortal.test.common.BlockUtils;
-import org.qortal.test.common.Common;
-import org.qortal.test.common.TransactionUtils;
-import org.qortal.test.common.transaction.TestTransaction;
-import org.qortal.utils.NTP;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import static org.junit.Assert.*;
-
-public class PenaltyFixTests extends Common {
-
- @Before
- public void beforeTest() throws DataException {
- Common.useSettings("test-settings-v2-penalty-fix.json");
- NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset());
- }
-
- @Test
- public void testSingleSponsor() throws DataException {
- try (final Repository repository = RepositoryManager.getRepository()) {
-
- // Alice self share online, and will be used to mint the blocks
- PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share");
- List onlineAccounts = new ArrayList<>();
- onlineAccounts.add(aliceSelfShare);
-
- PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob");
-
- // Test account from real penalty data (pen-revert.json)
- Account penaltyAccount = new Account(repository, "QLcAQpko5egwNjifueCAeAsT8CAj2Sr5qJ");
-
- // Bob sends a payment to the penalty account, so that it gets a row in the Accounts table
- TransactionData paymentData = new PaymentTransactionData(TestTransaction.generateBase(bobAccount), penaltyAccount.getAddress(), 1);
- TransactionUtils.signAndImportValid(repository, paymentData, bobAccount); // updates paymentData's signature
-
- // Mint blocks up to height 4
- Block block = null;
- for (int i = 2; i <= 4; i++)
- block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0]));
-
- assertEquals(4, (int)block.getBlockData().getHeight());
-
- // Check blocks minted penalty of penalty account
- assertEquals(0, (int) penaltyAccount.getBlocksMintedPenalty());
-
- // Penalty revert code runs at block 5
- block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0]));
- assertEquals(5, (int)block.getBlockData().getHeight());
-
- // +5000000 blocks minted penalty should be applied
- assertEquals(5000000, (int) penaltyAccount.getBlocksMintedPenalty());
-
- // Orphan the last block, to simulate a re-org
- BlockUtils.orphanLastBlock(repository);
-
- assertEquals(0, (int) penaltyAccount.getBlocksMintedPenalty());
-
- // Penalty revert code runs again
- block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0]));
- assertEquals(5, (int)block.getBlockData().getHeight());
-
- // Penalty should still be 5000000, rather than doubled up to 10000000
- assertEquals(5000000, (int) penaltyAccount.getBlocksMintedPenalty());
- }
- }
-}
\ No newline at end of file
diff --git a/src/test/java/org/qortal/test/crosschain/BitcoinyTestsUtils.java b/src/test/java/org/qortal/test/crosschain/BitcoinyTestsUtils.java
index a11b5b2f..1660ba9f 100644
--- a/src/test/java/org/qortal/test/crosschain/BitcoinyTestsUtils.java
+++ b/src/test/java/org/qortal/test/crosschain/BitcoinyTestsUtils.java
@@ -1,9 +1,8 @@
package org.qortal.test.crosschain;
-import com.google.common.collect.ImmutableList;
import org.bitcoinj.core.NetworkParameters;
-import org.bitcoinj.crypto.ChildNumber;
import org.bitcoinj.crypto.DeterministicKey;
+import org.bitcoinj.crypto.HDPath;
import org.bitcoinj.script.Script;
import org.bitcoinj.wallet.DeterministicKeyChain;
import org.bitcoinj.wallet.DeterministicSeed;
@@ -33,7 +32,7 @@ public class BitcoinyTestsUtils {
final Wallet wallet = Wallet.createDeterministic(networkParameters, Script.ScriptType.P2PKH);
final DeterministicSeed seed = wallet.getKeyChainSeed();
final DeterministicKeyChain keyChain = DeterministicKeyChain.builder().seed(seed).build();
- final ImmutableList path = keyChain.getAccountPath();
+ final HDPath path = keyChain.getAccountPath();
final DeterministicKey parent = keyChain.getKeyByPath(path, true);
final String rootKey = parent.serializePrivB58(networkParameters);