diff --git a/core/src/main/java/com/google/bitcoin/core/Sha256Hash.java b/core/src/main/java/com/google/bitcoin/core/Sha256Hash.java index c3b5ac6a3..04a03e154 100644 --- a/core/src/main/java/com/google/bitcoin/core/Sha256Hash.java +++ b/core/src/main/java/com/google/bitcoin/core/Sha256Hash.java @@ -31,42 +31,9 @@ import static com.google.common.base.Preconditions.checkArgument; * map. It also checks that the length is correct and provides a bit more type safety. */ public class Sha256Hash implements Serializable { - private static final long serialVersionUID = 3778897922647016546L; - private byte[] bytes; - private int hash = -1; - - /** - * @see setHashcodeByteLength(int hashcodeByteLength) - */ - private static int HASHCODE_BYTES_TO_CHECK = 5; - private static boolean HASHCODE_BYTES_TO_CHECK_CHANGED = false; - - public static final Sha256Hash ZERO_HASH = new Sha256Hash(new byte[32]); - /** - * Alters the number of bytes from the backing array to use when generating java hashCodes. - *

- * The default value of 5 gives approximately 1 trillion possible unique combinations. - * Given that an int hashcode only has 4 billion possible values it should be more than enough. - *

- * Changing this value after Sha256Hashes have been stored in hashed collections breaks the - * hashCode contract and will result in unpredictable behaviour. If this - * needs to be set to a different value it should be done once and only once - * and before any calls to hashCode() are made on any instance of Sha256Hash instances. - *
- * - * @param hashcodeByteLength the number of bytes in the hash to use for generating the hashcode. - * @throws IllegalStateException if called more than once. - */ - public static void setHashcodeByteLength(int hashcodeByteLength) { - if (HASHCODE_BYTES_TO_CHECK_CHANGED) - throw new IllegalStateException("setHashcodeByteLength can only be called once and should be called before any instances of Sha256Hash are constructed"); - HASHCODE_BYTES_TO_CHECK = hashcodeByteLength; - HASHCODE_BYTES_TO_CHECK_CHANGED = true; - } - /** * Creates a Sha256Hash by wrapping the given byte array. It must be 32 bytes long. */ @@ -76,12 +43,6 @@ public class Sha256Hash implements Serializable { } - private Sha256Hash(byte[] bytes, int hash) { - checkArgument(bytes.length == 32); - this.bytes = bytes; - this.hash = hash; - } - /** * Creates a Sha256Hash by decoding the given hex string. It must be 64 characters long. */ @@ -118,12 +79,8 @@ public class Sha256Hash implements Serializable { */ @Override public int hashCode() { - if (hash == -1) { - hash = 1; - for (int i = 0; i < HASHCODE_BYTES_TO_CHECK; i++) - hash = 31 * hash + bytes[i]; - } - return hash; + // Use the last 4 bytes, not the first 4 which are often zeros in Bitcoin. + return (bytes[31] & 0xFF) | ((bytes[30] & 0xFF) << 8) | ((bytes[29] & 0xFF) << 16) | ((bytes[28] & 0xFF) << 24); } @Override @@ -143,6 +100,6 @@ public class Sha256Hash implements Serializable { } public Sha256Hash duplicate() { - return new Sha256Hash(bytes, hash); + return new Sha256Hash(bytes); } } diff --git a/core/src/test/java/com/google/bitcoin/core/WalletTest.java b/core/src/test/java/com/google/bitcoin/core/WalletTest.java index 6262242f3..550ca561a 100644 --- a/core/src/test/java/com/google/bitcoin/core/WalletTest.java +++ b/core/src/test/java/com/google/bitcoin/core/WalletTest.java @@ -19,18 +19,13 @@ package com.google.bitcoin.core; import com.google.bitcoin.core.WalletTransaction.Pool; import com.google.bitcoin.store.BlockStore; import com.google.bitcoin.store.MemoryBlockStore; -import com.google.bitcoin.store.WalletProtobufSerializer; import com.google.bitcoin.utils.BriefLogFormatter; import org.junit.Before; import org.junit.Test; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; import java.math.BigInteger; import java.util.HashSet; import java.util.List; -import java.util.Set; import static com.google.bitcoin.core.TestUtils.*; import static com.google.bitcoin.core.Utils.bitcoinValueToFriendlyString; @@ -622,37 +617,6 @@ public class WalletTest { assertNull(tx1.appearsIn); } - @Test - public void oldWalletsDeserialize() throws Exception { - // Check that the Wallet class fills out tx confidences as best it can when loading old wallets. The new - // API provides a superset of the info that used to be available so it's impossible to do a complete - // migration but we can do some. - // - // TODO: This test does not check migration of dead or pending transactions. - InputStream stream = getClass().getResourceAsStream("old1.wallet"); - wallet = Wallet.loadFromFileStream(stream); - Set transactions = wallet.getTransactions(true, true); - assertEquals(91, transactions.size()); - Transaction tx = wallet.unspent.get(new Sha256Hash("5649c63ad55002ce2f39d1d4744996ebaccc1d15e0491c9e8d60eb3720dabebd")); - assertEquals(tx.getAppearsInHashes().iterator().next(), new Sha256Hash("00000000019380f5aef28393827737f55a1cf8abb51a36d46ab6f2db0a5b9cb8")); - assertEquals(TransactionConfidence.ConfidenceType.BUILDING, tx.getConfidence().getConfidenceType()); - assertEquals(42814, tx.getConfidence().getAppearedAtChainHeight()); - - // Re-serialize the wallet. Make sure it's all still there. - ByteArrayOutputStream bios = new ByteArrayOutputStream(); - wallet.saveToFileStream(bios); - wallet = Wallet.loadFromFileStream(new ByteArrayInputStream(bios.toByteArray())); - assertEquals(91, transactions.size()); - tx = wallet.unspent.get(new Sha256Hash("5649c63ad55002ce2f39d1d4744996ebaccc1d15e0491c9e8d60eb3720dabebd")); - assertEquals(tx.getAppearsInHashes().iterator().next(), new Sha256Hash("00000000019380f5aef28393827737f55a1cf8abb51a36d46ab6f2db0a5b9cb8")); - assertEquals(TransactionConfidence.ConfidenceType.BUILDING, tx.getConfidence().getConfidenceType()); - assertEquals(42814, tx.getConfidence().getAppearedAtChainHeight()); - - // Now check we can serialize old wallets to protocol buffers. Covers bug 134. - bios.reset(); - new WalletProtobufSerializer().writeWallet(wallet, bios); - } - @Test public void spendToSameWallet() throws Exception { // Test that a spend to the same wallet is dealt with correctly. diff --git a/core/src/test/resources/com/google/bitcoin/core/old1.wallet b/core/src/test/resources/com/google/bitcoin/core/old1.wallet deleted file mode 100644 index b1439bd8c..000000000 Binary files a/core/src/test/resources/com/google/bitcoin/core/old1.wallet and /dev/null differ