From f5216b1d496f051209a7fc0843fd0e7e6f0e411a Mon Sep 17 00:00:00 2001 From: Mike Hearn Date: Tue, 28 Oct 2014 15:36:04 +0000 Subject: [PATCH] Implement some missed Bloom filter application logic (does not impact existing apps). --- core/src/main/java/org/bitcoinj/core/Block.java | 4 +++- .../src/main/java/org/bitcoinj/core/BloomFilter.java | 12 +++++++++++- .../java/org/bitcoinj/testing/FakeTxBuilder.java | 5 ++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/bitcoinj/core/Block.java b/core/src/main/java/org/bitcoinj/core/Block.java index 22b9effb3..ef4a6b25c 100644 --- a/core/src/main/java/org/bitcoinj/core/Block.java +++ b/core/src/main/java/org/bitcoinj/core/Block.java @@ -961,6 +961,7 @@ public class Block extends Message { static private int txCounter; /** Adds a coinbase transaction to the block. This exists for unit tests. */ + @VisibleForTesting void addCoinbaseTransaction(byte[] pubKeyTo, Coin value) { unCacheTransactions(); transactions = new ArrayList(); @@ -970,7 +971,8 @@ public class Block extends Message { // // Here we will do things a bit differently so a new address isn't needed every time. We'll put a simple // counter in the scriptSig so every transaction has a different hash. - coinbase.addInput(new TransactionInput(params, coinbase, new byte[]{(byte) txCounter, (byte) (txCounter++ >> 8)})); + coinbase.addInput(new TransactionInput(params, coinbase, + new ScriptBuilder().data(new byte[]{(byte) txCounter, (byte) (txCounter++ >> 8)}).build().getProgram())); coinbase.addOutput(new TransactionOutput(params, coinbase, value, ScriptBuilder.createOutputScript(ECKey.fromPublicOnly(pubKeyTo)).getProgram())); transactions.add(coinbase); diff --git a/core/src/main/java/org/bitcoinj/core/BloomFilter.java b/core/src/main/java/org/bitcoinj/core/BloomFilter.java index 715d77269..a67db6c2d 100644 --- a/core/src/main/java/org/bitcoinj/core/BloomFilter.java +++ b/core/src/main/java/org/bitcoinj/core/BloomFilter.java @@ -339,7 +339,17 @@ public class BloomFilter extends Message { } } } - return found; + if (found) return true; + for (TransactionInput input : tx.getInputs()) { + if (contains(input.getOutpoint().bitcoinSerialize())) { + return true; + } + for (ScriptChunk chunk : input.getScriptSig().getChunks()) { + if (chunk.isPushData() && contains(chunk.data)) + return true; + } + } + return false; } @Override diff --git a/core/src/main/java/org/bitcoinj/testing/FakeTxBuilder.java b/core/src/main/java/org/bitcoinj/testing/FakeTxBuilder.java index 9a72877b4..01f2b4f15 100644 --- a/core/src/main/java/org/bitcoinj/testing/FakeTxBuilder.java +++ b/core/src/main/java/org/bitcoinj/testing/FakeTxBuilder.java @@ -17,6 +17,8 @@ package org.bitcoinj.testing; import org.bitcoinj.core.*; +import org.bitcoinj.crypto.TransactionSignature; +import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.store.BlockStore; import org.bitcoinj.store.BlockStoreException; @@ -43,7 +45,8 @@ public class FakeTxBuilder { TransactionOutput prevOut = new TransactionOutput(params, prevTx, value, to); prevTx.addOutput(prevOut); // Connect it. - t.addInput(prevOut); + t.addInput(prevOut).setScriptSig(ScriptBuilder.createInputScript(TransactionSignature.dummy())); + // Fake signature. // Serialize/deserialize to ensure internal state is stripped, as if it had been read from the wire. return roundTripTransaction(params, t); }