diff --git a/core/src/test/java/org/bitcoinj/core/BitcoindComparisonTool.java b/core/src/test/java/org/bitcoinj/core/BitcoindComparisonTool.java index ef399d95..a03f2e03 100644 --- a/core/src/test/java/org/bitcoinj/core/BitcoindComparisonTool.java +++ b/core/src/test/java/org/bitcoinj/core/BitcoindComparisonTool.java @@ -287,9 +287,14 @@ public class BitcoindComparisonTool { } // bitcoind doesn't request blocks inline so we can't rely on a ping for synchronization for (int i = 0; !shouldntRequest && !blocksRequested.contains(nextBlock.getHash()); i++) { - if (i % 100 == 99) + int SLEEP_TIME = 10; + if (i % 1000/SLEEP_TIME == 1000/SLEEP_TIME - 1) log.error("bitcoind still hasn't requested block " + block.ruleName + " with hash " + nextBlock.getHash()); - Thread.sleep(10); + Thread.sleep(SLEEP_TIME); + if (i > 60000/SLEEP_TIME) { + log.error("bitcoind failed to request block " + block.ruleName); + System.exit(1); + } } if (shouldntRequest) { Thread.sleep(100); diff --git a/core/src/test/java/org/bitcoinj/core/FullBlockTestGenerator.java b/core/src/test/java/org/bitcoinj/core/FullBlockTestGenerator.java index 02ebd5ca..5023edc2 100644 --- a/core/src/test/java/org/bitcoinj/core/FullBlockTestGenerator.java +++ b/core/src/test/java/org/bitcoinj/core/FullBlockTestGenerator.java @@ -435,16 +435,16 @@ public class FullBlockTestGenerator { Block b23 = createNextBlock(b15, chainHeadHeight + 7, out6, null); { Transaction tx = new Transaction(params); - // Signature size is non-deterministic, so it may take several runs before finding any off-by-one errors - byte[] outputScript = new byte[Block.MAX_BLOCK_SIZE - b23.getMessageSize() - 138]; + byte[] outputScript = new byte[Block.MAX_BLOCK_SIZE - b23.getMessageSize() - 65]; Arrays.fill(outputScript, (byte) OP_FALSE); - tx.addOutput(new TransactionOutput(params, tx, SATOSHI, outputScript)); + tx.addOutput(new TransactionOutput(params, tx, ZERO, outputScript)); addOnlyInputToTransaction(tx, new TransactionOutPointWithValue( - new TransactionOutPoint(params, 1, b23.getTransactions().get(1).getHash()), - SATOSHI, b23.getTransactions().get(1).getOutputs().get(1).getScriptPubKey())); + new TransactionOutPoint(params, 2, b23.getTransactions().get(1).getHash()), + ZERO, b23.getTransactions().get(1).getOutputs().get(2).getScriptPubKey())); b23.addTransaction(tx); } b23.solve(); + checkState(b23.getMessageSize() == Block.MAX_BLOCK_SIZE); blocks.add(new BlockAndValidity(blockToHeightMap, hashHeaderMap, b23, true, false, b23.getHash(), chainHeadHeight + 7, "b23")); spendableOutputs.offer(new TransactionOutPointWithValue( new TransactionOutPoint(params, 0, b23.getTransactions().get(0).getHash()), @@ -454,16 +454,16 @@ public class FullBlockTestGenerator { Block b24 = createNextBlock(b15, chainHeadHeight + 7, out6, null); { Transaction tx = new Transaction(params); - // Signature size is non-deterministic, so it may take several runs before finding any off-by-one errors - byte[] outputScript = new byte[Block.MAX_BLOCK_SIZE - b24.getMessageSize() - 135]; + byte[] outputScript = new byte[Block.MAX_BLOCK_SIZE - b24.getMessageSize() - 64]; Arrays.fill(outputScript, (byte) OP_FALSE); - tx.addOutput(new TransactionOutput(params, tx, SATOSHI, outputScript)); + tx.addOutput(new TransactionOutput(params, tx, ZERO, outputScript)); addOnlyInputToTransaction(tx, new TransactionOutPointWithValue( - new TransactionOutPoint(params, 1, b24.getTransactions().get(1).getHash()), - SATOSHI, b24.getTransactions().get(1).getOutputs().get(1).getScriptPubKey())); + new TransactionOutPoint(params, 2, b24.getTransactions().get(1).getHash()), + ZERO, b24.getTransactions().get(1).getOutputs().get(2).getScriptPubKey())); b24.addTransaction(tx); } b24.solve(); + checkState(b24.getMessageSize() == Block.MAX_BLOCK_SIZE + 1); blocks.add(new BlockAndValidity(blockToHeightMap, hashHeaderMap, b24, false, true, b23.getHash(), chainHeadHeight + 7, "b24")); // Extend the b24 chain to make sure bitcoind isn't accepting b24 @@ -1262,15 +1262,15 @@ public class FullBlockTestGenerator { { Block b64Created = createNextBlock(b60, chainHeadHeight + 19, out18, null); Transaction tx = new Transaction(params); - // Signature size is non-deterministic, so it may take several runs before finding any off-by-one errors - byte[] outputScript = new byte[Block.MAX_BLOCK_SIZE - b64Created.getMessageSize() - 138]; + byte[] outputScript = new byte[Block.MAX_BLOCK_SIZE - b64Created.getMessageSize() - 65]; Arrays.fill(outputScript, (byte) OP_FALSE); - tx.addOutput(new TransactionOutput(params, tx, SATOSHI, outputScript)); + tx.addOutput(new TransactionOutput(params, tx, ZERO, outputScript)); addOnlyInputToTransaction(tx, new TransactionOutPointWithValue( - new TransactionOutPoint(params, 1, b64Created.getTransactions().get(1).getHash()), - SATOSHI, b64Created.getTransactions().get(1).getOutputs().get(1).getScriptPubKey())); + new TransactionOutPoint(params, 2, b64Created.getTransactions().get(1).getHash()), + ZERO, b64Created.getTransactions().get(1).getOutputs().get(2).getScriptPubKey())); b64Created.addTransaction(tx); b64Created.solve(); + checkState(b64Created.getMessageSize() == Block.MAX_BLOCK_SIZE); UnsafeByteArrayOutputStream stream = new UnsafeByteArrayOutputStream(b64Created.getMessageSize() + 8); b64Created.writeHeader(stream); @@ -1843,11 +1843,11 @@ public class FullBlockTestGenerator { if (prevOut != null) { Transaction t = new Transaction(params); // Entirely invalid scriptPubKey to ensure we aren't pre-verifying too much - t.addOutput(new TransactionOutput(params, t, ZERO, new byte[] {OP_PUSHDATA1 - 1 })); + t.addOutput(new TransactionOutput(params, t, ZERO, new byte[] {OP_PUSHDATA1 - 1, uniquenessCounter++})); t.addOutput(new TransactionOutput(params, t, SATOSHI, ScriptBuilder.createOutputScript(ECKey.fromPublicOnly(coinbaseOutKeyPubKey)).getProgram())); // Spendable output - t.addOutput(new TransactionOutput(params, t, ZERO, new byte[] {OP_1, uniquenessCounter++})); + t.addOutput(new TransactionOutput(params, t, ZERO, new byte[] {OP_1})); addOnlyInputToTransaction(t, prevOut); block.addTransaction(t); block.solve();