From 4b4eb7b6231918eefa6cb16eca78471403ddb3f5 Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Tue, 19 Feb 2013 17:44:41 +0100 Subject: [PATCH] Clear some more FindBugs warnings, including a real bugfix to the bloom filter calculations. --- .../java/com/google/bitcoin/core/AbstractBlockChain.java | 2 +- .../java/com/google/bitcoin/core/BitcoinSerializer.java | 2 +- .../main/java/com/google/bitcoin/core/BloomFilter.java | 8 ++++---- .../java/com/google/bitcoin/core/PartialMerkleTree.java | 2 +- .../src/main/java/com/google/bitcoin/core/PeerGroup.java | 2 +- core/src/main/java/com/google/bitcoin/core/Wallet.java | 4 ++-- .../google/bitcoin/store/MemoryFullPrunedBlockStore.java | 2 +- .../java/com/google/bitcoin/core/BloomFilterTest.java | 9 +++++---- .../bitcoin/store/WalletProtobufSerializerTest.java | 4 ++-- 9 files changed, 18 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/com/google/bitcoin/core/AbstractBlockChain.java b/core/src/main/java/com/google/bitcoin/core/AbstractBlockChain.java index d7f0a904..d0d587cb 100644 --- a/core/src/main/java/com/google/bitcoin/core/AbstractBlockChain.java +++ b/core/src/main/java/com/google/bitcoin/core/AbstractBlockChain.java @@ -96,7 +96,7 @@ public abstract class AbstractBlockChain { private final List listeners; // Holds a block header and, optionally, a list of tx hashes or block's transactions - class OrphanBlock { + protected static class OrphanBlock { Block block; Set filteredTxHashes; List filteredTxn; diff --git a/core/src/main/java/com/google/bitcoin/core/BitcoinSerializer.java b/core/src/main/java/com/google/bitcoin/core/BitcoinSerializer.java index 61636413..55e31ae6 100644 --- a/core/src/main/java/com/google/bitcoin/core/BitcoinSerializer.java +++ b/core/src/main/java/com/google/bitcoin/core/BitcoinSerializer.java @@ -302,7 +302,7 @@ public class BitcoinSerializer { } - public class BitcoinPacketHeader { + public static class BitcoinPacketHeader { public final byte[] header; public final String command; public final int size; diff --git a/core/src/main/java/com/google/bitcoin/core/BloomFilter.java b/core/src/main/java/com/google/bitcoin/core/BloomFilter.java index c2d01a42..4fb5f1ba 100644 --- a/core/src/main/java/com/google/bitcoin/core/BloomFilter.java +++ b/core/src/main/java/com/google/bitcoin/core/BloomFilter.java @@ -35,7 +35,7 @@ import java.util.Arrays; public class BloomFilter extends Message { /** The BLOOM_UPDATE_* constants control when the bloom filter is auto-updated by the peer using it as a filter, either never, for all outputs or only for pay-2-pubkey outputs (default) */ - public enum bloomUpdate { + public enum BloomUpdate { UPDATE_NONE, // 0 UPDATE_ALL, // 1 /** Only adds outpoints to the filter if the output is a pay-to-pubkey/pay-to-multisig script */ @@ -64,7 +64,7 @@ public class BloomFilter extends Message { * Constructs a filter with the given parameters which is updated on pay2pubkey outputs only. */ public BloomFilter(int elements, double falsePositiveRate, long randomNonce) { - this(elements, falsePositiveRate, randomNonce, bloomUpdate.UPDATE_P2PUBKEY_ONLY); + this(elements, falsePositiveRate, randomNonce, BloomUpdate.UPDATE_P2PUBKEY_ONLY); } /** @@ -98,14 +98,14 @@ public class BloomFilter extends Message { * *

updateFlag is used to control filter behavior

*/ - public BloomFilter(int elements, double falsePositiveRate, long randomNonce, bloomUpdate updateFlag) { + public BloomFilter(int elements, double falsePositiveRate, long randomNonce, BloomUpdate updateFlag) { // The following formulas were stolen from Wikipedia's page on Bloom Filters (with the addition of min(..., MAX_...)) // Size required for a given number of elements and false-positive rate int size = Math.min((int)(-1 / (Math.pow(Math.log(2), 2)) * elements * Math.log(falsePositiveRate)), (int)MAX_FILTER_SIZE * 8) / 8; data = new byte[size <= 0 ? 1 : size]; // Optimal number of hash functions for a given filter size and element count. - hashFuncs = Math.min((int)(data.length * 8 / elements * Math.log(2)), MAX_HASH_FUNCS); + hashFuncs = Math.min((int)(data.length * 8 / (double)elements * Math.log(2)), MAX_HASH_FUNCS); this.nTweak = randomNonce; this.nFlags = (byte)(0xff & updateFlag.ordinal()); } diff --git a/core/src/main/java/com/google/bitcoin/core/PartialMerkleTree.java b/core/src/main/java/com/google/bitcoin/core/PartialMerkleTree.java index 18e29788..a10711bd 100644 --- a/core/src/main/java/com/google/bitcoin/core/PartialMerkleTree.java +++ b/core/src/main/java/com/google/bitcoin/core/PartialMerkleTree.java @@ -92,7 +92,7 @@ public class PartialMerkleTree extends Message { return (transactionCount+(1 << height)-1) >> height; } - class ValuesUsed { + private static class ValuesUsed { public int bitsUsed = 0, hashesUsed = 0; } diff --git a/core/src/main/java/com/google/bitcoin/core/PeerGroup.java b/core/src/main/java/com/google/bitcoin/core/PeerGroup.java index 9d6292af..98a12af6 100644 --- a/core/src/main/java/com/google/bitcoin/core/PeerGroup.java +++ b/core/src/main/java/com/google/bitcoin/core/PeerGroup.java @@ -139,7 +139,7 @@ public class PeerGroup extends AbstractIdleService { // The false positive rate for bloomFilter private double bloomFilterFPRate = DEFAULT_BLOOM_FILTER_FP_RATE; // We use a constant tweak to avoid giving up privacy when we regenerate our filter with new keys - private final long bloomFilterTweak = new Random().nextLong(); + private final long bloomFilterTweak = (long) (Math.random() * Long.MAX_VALUE); private int lastBloomFilterElementCount; /** diff --git a/core/src/main/java/com/google/bitcoin/core/Wallet.java b/core/src/main/java/com/google/bitcoin/core/Wallet.java index f9f07b0f..104612e8 100644 --- a/core/src/main/java/com/google/bitcoin/core/Wallet.java +++ b/core/src/main/java/com/google/bitcoin/core/Wallet.java @@ -286,7 +286,7 @@ public class Wallet implements Serializable, BlockChainListener { createTransientState(); } - private void createTransientState() { + private synchronized void createTransientState() { eventListeners = new ArrayList(); ignoreNextNewBlock = new HashSet(); txConfidenceListener = new TransactionConfidence.Listener() { @@ -2392,7 +2392,7 @@ public class Wallet implements Serializable, BlockChainListener { * See the docs for {@link BloomFilter#BloomFilter(int, double)} for a brief explanation of anonymity when using bloom filters. */ public BloomFilter getBloomFilter(double falsePositiveRate) { - return getBloomFilter(getBloomFilterElementCount(), falsePositiveRate, new Random().nextLong()); + return getBloomFilter(getBloomFilterElementCount(), falsePositiveRate, (long)(Math.random()*Long.MAX_VALUE)); } /** diff --git a/core/src/main/java/com/google/bitcoin/store/MemoryFullPrunedBlockStore.java b/core/src/main/java/com/google/bitcoin/store/MemoryFullPrunedBlockStore.java index 6a46a03a..d613a3e8 100644 --- a/core/src/main/java/com/google/bitcoin/store/MemoryFullPrunedBlockStore.java +++ b/core/src/main/java/com/google/bitcoin/store/MemoryFullPrunedBlockStore.java @@ -308,7 +308,7 @@ class TransactionalMultiKeyHashMap { * Used primarily for unit testing. */ public class MemoryFullPrunedBlockStore implements FullPrunedBlockStore { - class StoredBlockAndWasUndoableFlag { + protected static class StoredBlockAndWasUndoableFlag { public StoredBlock block; public boolean wasUndoable; public StoredBlockAndWasUndoableFlag(StoredBlock block, boolean wasUndoable) { this.block = block; this.wasUndoable = wasUndoable; } diff --git a/core/src/test/java/com/google/bitcoin/core/BloomFilterTest.java b/core/src/test/java/com/google/bitcoin/core/BloomFilterTest.java index a2dedcfa..ecec7c9a 100644 --- a/core/src/test/java/com/google/bitcoin/core/BloomFilterTest.java +++ b/core/src/test/java/com/google/bitcoin/core/BloomFilterTest.java @@ -1,15 +1,16 @@ package com.google.bitcoin.core; -import static org.junit.Assert.*; - -import java.util.Arrays; import org.junit.Test; import org.spongycastle.util.encoders.Hex; +import java.util.Arrays; + +import static org.junit.Assert.*; + public class BloomFilterTest { @Test public void insertSerializeTest() { - BloomFilter filter = new BloomFilter(3, 0.01, 0, BloomFilter.bloomUpdate.UPDATE_ALL); + BloomFilter filter = new BloomFilter(3, 0.01, 0, BloomFilter.BloomUpdate.UPDATE_ALL); filter.insert(Hex.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8")); assertTrue (filter.contains(Hex.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8"))); diff --git a/core/src/test/java/com/google/bitcoin/store/WalletProtobufSerializerTest.java b/core/src/test/java/com/google/bitcoin/store/WalletProtobufSerializerTest.java index e105e166..4361cc14 100644 --- a/core/src/test/java/com/google/bitcoin/store/WalletProtobufSerializerTest.java +++ b/core/src/test/java/com/google/bitcoin/store/WalletProtobufSerializerTest.java @@ -290,7 +290,7 @@ public class WalletProtobufSerializerTest { /** * An extension of a wallet that stores a number. */ - public class WalletExtension extends Wallet { + public static class WalletExtension extends Wallet { public byte[] random_bytes; public WalletExtension(NetworkParameters params) { @@ -298,7 +298,7 @@ public class WalletProtobufSerializerTest { } } - public class WalletExtensionSerializerRandom extends WalletExtensionSerializer { + public static class WalletExtensionSerializerRandom extends WalletExtensionSerializer { @Override public Collection getExtensionsToWrite(Wallet wallet) { List lst = new LinkedList();