diff --git a/core/src/main/java/com/google/bitcoin/core/NetworkParameters.java b/core/src/main/java/com/google/bitcoin/core/NetworkParameters.java index 0182eb1f..17bef4f7 100644 --- a/core/src/main/java/com/google/bitcoin/core/NetworkParameters.java +++ b/core/src/main/java/com/google/bitcoin/core/NetworkParameters.java @@ -1,5 +1,6 @@ /** * Copyright 2011 Google Inc. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +21,6 @@ import com.google.bitcoin.params.*; import com.google.bitcoin.script.Script; import com.google.bitcoin.script.ScriptOpCodes; import com.google.common.base.Objects; -import org.spongycastle.util.encoders.Hex; import javax.annotation.Nullable; import java.io.ByteArrayOutputStream; @@ -48,7 +48,7 @@ public abstract class NetworkParameters implements Serializable { /** * The alert signing key originally owned by Satoshi, and now passed on to Gavin along with a few others. */ - public static final byte[] SATOSHI_KEY = Hex.decode("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284"); + public static final byte[] SATOSHI_KEY = Utils.HEX.decode("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284"); /** The string returned by getId() for the main, production network where people trade things. */ public static final String ID_MAINNET = "org.bitcoin.production"; @@ -103,11 +103,11 @@ public abstract class NetworkParameters implements Serializable { // A script containing the difficulty bits and the following message: // // "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks" - byte[] bytes = Hex.decode + byte[] bytes = Utils.HEX.decode ("04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"); t.addInput(new TransactionInput(n, t, bytes)); ByteArrayOutputStream scriptPubKeyBytes = new ByteArrayOutputStream(); - Script.writeBytes(scriptPubKeyBytes, Hex.decode + Script.writeBytes(scriptPubKeyBytes, Utils.HEX.decode ("04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f")); scriptPubKeyBytes.write(ScriptOpCodes.OP_CHECKSIG); t.addOutput(new TransactionOutput(n, t, FIFTY_COINS, scriptPubKeyBytes.toByteArray())); 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 a0aac6ea..96a47338 100644 --- a/core/src/main/java/com/google/bitcoin/core/Sha256Hash.java +++ b/core/src/main/java/com/google/bitcoin/core/Sha256Hash.java @@ -18,7 +18,6 @@ package com.google.bitcoin.core; import com.google.common.io.ByteStreams; -import org.spongycastle.util.encoders.Hex; import java.io.File; import java.io.FileInputStream; @@ -53,7 +52,7 @@ public class Sha256Hash implements Serializable, Comparable { */ public Sha256Hash(String hexString) { checkArgument(hexString.length() == 64); - this.bytes = Hex.decode(hexString); + this.bytes = Utils.HEX.decode(hexString); } /** diff --git a/core/src/main/java/com/google/bitcoin/core/Utils.java b/core/src/main/java/com/google/bitcoin/core/Utils.java index 4cc02207..b5cc8152 100644 --- a/core/src/main/java/com/google/bitcoin/core/Utils.java +++ b/core/src/main/java/com/google/bitcoin/core/Utils.java @@ -25,7 +25,6 @@ import com.google.common.primitives.Ints; import com.google.common.primitives.UnsignedLongs; import org.spongycastle.crypto.digests.RIPEMD160Digest; -import org.spongycastle.util.encoders.Hex; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -456,7 +455,7 @@ public class Utils { */ public static byte[] parseAsHexOrBase58(String data) { try { - return Hex.decode(data); + return HEX.decode(data); } catch (Exception e) { // Didn't decode as hex, try base58. try { 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 d18a322d..d9d673cc 100644 --- a/core/src/main/java/com/google/bitcoin/core/Wallet.java +++ b/core/src/main/java/com/google/bitcoin/core/Wallet.java @@ -44,7 +44,6 @@ import org.bitcoinj.wallet.Protos.Wallet.EncryptionType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongycastle.crypto.params.KeyParameter; -import org.spongycastle.util.encoders.Hex; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; @@ -1555,9 +1554,9 @@ public class Wallet extends BaseTaggableObject implements Serializable, BlockCha // so the exact nature of the mutation can be examined. log.warn("Saw two pending transactions double spend each other"); log.warn(" offending input is input {}", tx.getInputs().indexOf(input)); - log.warn("{}: {}", tx.getHash(), new String(Hex.encode(tx.unsafeBitcoinSerialize()))); + log.warn("{}: {}", tx.getHash(), Utils.HEX.encode(tx.unsafeBitcoinSerialize())); Transaction other = input.getConnectedOutput().getSpentBy().getParentTransaction(); - log.warn("{}: {}", other.getHash(), new String(Hex.encode(tx.unsafeBitcoinSerialize()))); + log.warn("{}: {}", other.getHash(), Utils.HEX.encode(tx.unsafeBitcoinSerialize())); } } else if (result == TransactionInput.ConnectionResult.SUCCESS) { // Otherwise we saw a transaction spend our coins, but we didn't try and spend them ourselves yet. diff --git a/core/src/main/java/com/google/bitcoin/crypto/DeterministicKey.java b/core/src/main/java/com/google/bitcoin/crypto/DeterministicKey.java index 855ec7d3..5bbc425b 100644 --- a/core/src/main/java/com/google/bitcoin/crypto/DeterministicKey.java +++ b/core/src/main/java/com/google/bitcoin/crypto/DeterministicKey.java @@ -1,5 +1,6 @@ /** * Copyright 2013 Matija Mazi. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,13 +20,13 @@ import com.google.bitcoin.core.*; import com.google.common.collect.ImmutableList; import org.spongycastle.crypto.params.KeyParameter; import org.spongycastle.math.ec.ECPoint; -import org.spongycastle.util.encoders.Hex; import javax.annotation.Nullable; import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.Arrays; +import static com.google.bitcoin.core.Utils.HEX; import static com.google.common.base.Preconditions.*; /** @@ -422,7 +423,7 @@ public class DeterministicKey extends ECKey { @Override public String toString() { - return String.format("pub:%s chaincode:%s path:%s", new String(Hex.encode(getPubKey())), - new String(Hex.encode(getChainCode())), getPathAsString()); + return String.format("pub:%s chaincode:%s path:%s", new String(HEX.encode(getPubKey())), + new String(HEX.encode(getChainCode())), getPathAsString()); } } diff --git a/core/src/main/java/com/google/bitcoin/crypto/MnemonicCode.java b/core/src/main/java/com/google/bitcoin/crypto/MnemonicCode.java index 179a68e1..3fd84058 100644 --- a/core/src/main/java/com/google/bitcoin/crypto/MnemonicCode.java +++ b/core/src/main/java/com/google/bitcoin/crypto/MnemonicCode.java @@ -19,7 +19,6 @@ package com.google.bitcoin.crypto; import com.google.bitcoin.core.Sha256Hash; import com.google.common.base.Joiner; -import org.spongycastle.util.encoders.Hex; import java.io.BufferedReader; import java.io.IOException; @@ -31,6 +30,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import static com.google.bitcoin.core.Utils.HEX; + /** * A MnemonicCode object may be used to convert between binary seed values and * lists of words per the BIP 39 @@ -77,7 +78,7 @@ public class MnemonicCode { // If a wordListDigest is supplied check to make sure it matches. if (wordListDigest != null) { byte[] digest = md.digest(); - String hexdigest = new String(Hex.encode(digest)); + String hexdigest = new String(HEX.encode(digest)); if (!hexdigest.equals(wordListDigest)) throw new IllegalArgumentException("wordlist digest mismatch"); } diff --git a/core/src/main/java/com/google/bitcoin/params/TestNet3Params.java b/core/src/main/java/com/google/bitcoin/params/TestNet3Params.java index 923c9a16..7964243e 100644 --- a/core/src/main/java/com/google/bitcoin/params/TestNet3Params.java +++ b/core/src/main/java/com/google/bitcoin/params/TestNet3Params.java @@ -1,5 +1,6 @@ /* * Copyright 2013 Google Inc. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +19,6 @@ package com.google.bitcoin.params; import com.google.bitcoin.core.NetworkParameters; import com.google.bitcoin.core.Utils; -import org.spongycastle.util.encoders.Hex; import static com.google.common.base.Preconditions.checkState; @@ -47,7 +47,7 @@ public class TestNet3Params extends NetworkParameters { subsidyDecreaseBlockCount = 210000; String genesisHash = genesisBlock.getHashAsString(); checkState(genesisHash.equals("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943")); - alertSigningKey = Hex.decode("04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a"); + alertSigningKey = Utils.HEX.decode("04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a"); dnsSeeds = new String[] { "testnet-seed.bitcoin.petertodd.org", diff --git a/core/src/main/java/com/google/bitcoin/wallet/DeterministicSeed.java b/core/src/main/java/com/google/bitcoin/wallet/DeterministicSeed.java index 15782969..9d470a6f 100644 --- a/core/src/main/java/com/google/bitcoin/wallet/DeterministicSeed.java +++ b/core/src/main/java/com/google/bitcoin/wallet/DeterministicSeed.java @@ -1,5 +1,6 @@ /** * Copyright 2014 Google Inc. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,12 +20,12 @@ package com.google.bitcoin.wallet; import com.google.bitcoin.crypto.*; import org.bitcoinj.wallet.Protos; import org.spongycastle.crypto.params.KeyParameter; -import org.spongycastle.util.encoders.Hex; import javax.annotation.Nullable; import java.io.IOException; import java.util.List; +import static com.google.bitcoin.core.Utils.HEX; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; @@ -92,7 +93,7 @@ public class DeterministicSeed implements EncryptableItem { @Nullable public String toHexString() { if (unencryptedSeed != null) - return new String(Hex.encode(unencryptedSeed)); + return new String(HEX.encode(unencryptedSeed)); else return null; } diff --git a/core/src/test/java/com/google/bitcoin/core/AddressTest.java b/core/src/test/java/com/google/bitcoin/core/AddressTest.java index bf556dac..097324cd 100644 --- a/core/src/test/java/com/google/bitcoin/core/AddressTest.java +++ b/core/src/test/java/com/google/bitcoin/core/AddressTest.java @@ -21,10 +21,10 @@ import com.google.bitcoin.params.MainNetParams; import com.google.bitcoin.params.TestNet3Params; import com.google.bitcoin.script.ScriptBuilder; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.util.Arrays; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.*; public class AddressTest { @@ -34,11 +34,11 @@ public class AddressTest { @Test public void stringification() throws Exception { // Test a testnet address. - Address a = new Address(testParams, Hex.decode("fda79a24e50ff70ff42f7d89585da5bd19d9e5cc")); + Address a = new Address(testParams, HEX.decode("fda79a24e50ff70ff42f7d89585da5bd19d9e5cc")); assertEquals("n4eA2nbYqErp7H6jebchxAN59DmNpksexv", a.toString()); assertFalse(a.isP2SHAddress()); - Address b = new Address(mainParams, Hex.decode("4a22c3c4cbb31e4d03b15550636762bda0baf85a")); + Address b = new Address(mainParams, HEX.decode("4a22c3c4cbb31e4d03b15550636762bda0baf85a")); assertEquals("17kzeh4N8g49GFvdDzSf8PjaPfyoD1MndL", b.toString()); assertFalse(b.isP2SHAddress()); } @@ -112,10 +112,10 @@ public class AddressTest { assertEquals(TestNet3Params.get().getId(), testNetParams.getId()); // Test that we can convert them from hashes - byte[] hex = Hex.decode("2ac4b0b501117cc8119c5797b519538d4942e90e"); + byte[] hex = HEX.decode("2ac4b0b501117cc8119c5797b519538d4942e90e"); Address a = Address.fromP2SHHash(mainParams, hex); assertEquals("35b9vsyH1KoFT5a5KtrKusaCcPLkiSo1tU", a.toString()); - Address b = Address.fromP2SHHash(testParams, Hex.decode("18a0e827269b5211eb51a4af1b2fa69333efa722")); + Address b = Address.fromP2SHHash(testParams, HEX.decode("18a0e827269b5211eb51a4af1b2fa69333efa722")); assertEquals("2MuVSxtfivPKJe93EC1Tb9UhJtGhsoWEHCe", b.toString()); Address c = Address.fromP2SHScript(mainParams, ScriptBuilder.createP2SHOutputScript(hex)); assertEquals("35b9vsyH1KoFT5a5KtrKusaCcPLkiSo1tU", c.toString()); diff --git a/core/src/test/java/com/google/bitcoin/core/AlertMessageTest.java b/core/src/test/java/com/google/bitcoin/core/AlertMessageTest.java index b549b2ee..90c3c14e 100644 --- a/core/src/test/java/com/google/bitcoin/core/AlertMessageTest.java +++ b/core/src/test/java/com/google/bitcoin/core/AlertMessageTest.java @@ -1,5 +1,6 @@ /* * Copyright 2011 Google Inc. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,13 +20,13 @@ package com.google.bitcoin.core; import com.google.bitcoin.params.UnitTestParams; import org.junit.Before; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class AlertMessageTest { - private static final byte[] TEST_KEY_PRIV = Hex.decode("6421e091445ade4b24658e96aa60959ce800d8ea9e7bd8613335aa65ba8d840b"); + private static final byte[] TEST_KEY_PRIV = HEX.decode("6421e091445ade4b24658e96aa60959ce800d8ea9e7bd8613335aa65ba8d840b"); private NetworkParameters params; @Before @@ -43,7 +44,7 @@ public class AlertMessageTest { public void deserialize() throws Exception { // A CAlert taken from the reference implementation. // TODO: This does not check the subVer or set fields. Support proper version matching. - final byte[] payload = Hex.decode("5c010000004544eb4e000000004192ec4e00000000eb030000e9030000000000000048ee00000088130000002f43416c6572742073797374656d20746573743a2020202020202020207665722e302e352e3120617661696c61626c6500473045022100ec799908c008b272d5e5cd5a824abaaac53d210cc1fa517d8e22a701ecdb9e7002206fa1e7e7c251d5ba0d7c1fe428fc1870662f2927531d1cad8d4581b45bc4f8a7"); + final byte[] payload = HEX.decode("5c010000004544eb4e000000004192ec4e00000000eb030000e9030000000000000048ee00000088130000002f43416c6572742073797374656d20746573743a2020202020202020207665722e302e352e3120617661696c61626c6500473045022100ec799908c008b272d5e5cd5a824abaaac53d210cc1fa517d8e22a701ecdb9e7002206fa1e7e7c251d5ba0d7c1fe428fc1870662f2927531d1cad8d4581b45bc4f8a7"); AlertMessage alert = new AlertMessage(params, payload); assertEquals(1324041285, alert.getRelayUntil().getTime() / 1000); assertEquals(1324126785, alert.getExpiration().getTime() / 1000); diff --git a/core/src/test/java/com/google/bitcoin/core/BitcoinSerializerTest.java b/core/src/test/java/com/google/bitcoin/core/BitcoinSerializerTest.java index c2552528..574bd2fa 100644 --- a/core/src/test/java/com/google/bitcoin/core/BitcoinSerializerTest.java +++ b/core/src/test/java/com/google/bitcoin/core/BitcoinSerializerTest.java @@ -19,38 +19,38 @@ package com.google.bitcoin.core; import com.google.bitcoin.params.MainNetParams; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.io.ByteArrayOutputStream; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import java.util.Arrays; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.*; public class BitcoinSerializerTest { - private final byte[] addrMessage = Hex.decode("f9beb4d96164647200000000000000001f000000" + + private final byte[] addrMessage = HEX.decode("f9beb4d96164647200000000000000001f000000" + "ed52399b01e215104d010000000000000000000000000000000000ffff0a000001208d"); - private final byte[] txMessage = Hex.decode( - "F9 BE B4 D9 74 78 00 00 00 00 00 00 00 00 00 00" + - "02 01 00 00 E2 93 CD BE 01 00 00 00 01 6D BD DB" + - "08 5B 1D 8A F7 51 84 F0 BC 01 FA D5 8D 12 66 E9" + - "B6 3B 50 88 19 90 E4 B4 0D 6A EE 36 29 00 00 00" + - "00 8B 48 30 45 02 21 00 F3 58 1E 19 72 AE 8A C7" + - "C7 36 7A 7A 25 3B C1 13 52 23 AD B9 A4 68 BB 3A" + - "59 23 3F 45 BC 57 83 80 02 20 59 AF 01 CA 17 D0" + - "0E 41 83 7A 1D 58 E9 7A A3 1B AE 58 4E DE C2 8D" + - "35 BD 96 92 36 90 91 3B AE 9A 01 41 04 9C 02 BF" + - "C9 7E F2 36 CE 6D 8F E5 D9 40 13 C7 21 E9 15 98" + - "2A CD 2B 12 B6 5D 9B 7D 59 E2 0A 84 20 05 F8 FC" + - "4E 02 53 2E 87 3D 37 B9 6F 09 D6 D4 51 1A DA 8F" + - "14 04 2F 46 61 4A 4C 70 C0 F1 4B EF F5 FF FF FF" + - "FF 02 40 4B 4C 00 00 00 00 00 19 76 A9 14 1A A0" + - "CD 1C BE A6 E7 45 8A 7A BA D5 12 A9 D9 EA 1A FB" + - "22 5E 88 AC 80 FA E9 C7 00 00 00 00 19 76 A9 14" + - "0E AB 5B EA 43 6A 04 84 CF AB 12 48 5E FD A0 B7" + - "8B 4E CC 52 88 AC 00 00 00 00"); + private final byte[] txMessage = HEX.withSeparator(" ", 2).decode( + "f9 be b4 d9 74 78 00 00 00 00 00 00 00 00 00 00" + + "02 01 00 00 e2 93 cd be 01 00 00 00 01 6d bd db" + + "08 5b 1d 8a f7 51 84 f0 bc 01 fa d5 8d 12 66 e9" + + "b6 3b 50 88 19 90 e4 b4 0d 6a ee 36 29 00 00 00" + + "00 8b 48 30 45 02 21 00 f3 58 1e 19 72 ae 8a c7" + + "c7 36 7a 7a 25 3b c1 13 52 23 ad b9 a4 68 bb 3a" + + "59 23 3f 45 bc 57 83 80 02 20 59 af 01 ca 17 d0" + + "0e 41 83 7a 1d 58 e9 7a a3 1b ae 58 4e de c2 8d" + + "35 bd 96 92 36 90 91 3b ae 9a 01 41 04 9c 02 bf" + + "c9 7e f2 36 ce 6d 8f e5 d9 40 13 c7 21 e9 15 98" + + "2a cd 2b 12 b6 5d 9b 7d 59 e2 0a 84 20 05 f8 fc" + + "4e 02 53 2e 87 3d 37 b9 6f 09 d6 d4 51 1a da 8f" + + "14 04 2f 46 61 4a 4c 70 c0 f1 4b ef f5 ff ff ff" + + "ff 02 40 4b 4c 00 00 00 00 00 19 76 a9 14 1a a0" + + "cd 1c be a6 e7 45 8a 7a ba d5 12 a9 d9 ea 1a fb" + + "22 5e 88 ac 80 fa e9 c7 00 00 00 00 19 76 a9 14" + + "0e ab 5b ea 43 6a 04 84 cf ab 12 48 5e fd a0 b7" + + "8b 4e cc 52 88 ac 00 00 00 00"); @Test public void testAddr() throws Exception { @@ -156,7 +156,7 @@ public class BitcoinSerializerTest { public void testHeaders1() throws Exception { BitcoinSerializer bs = new BitcoinSerializer(MainNetParams.get()); - HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(Hex.decode("f9beb4d9686561" + + HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(HEX.decode("f9beb4d9686561" + "646572730000000000520000005d4fab8101010000006fe28c0ab6f1b372c1a6a246ae6" + "3f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677b" + "a1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e3629900"))); @@ -181,7 +181,7 @@ public class BitcoinSerializerTest { public void testHeaders2() throws Exception { BitcoinSerializer bs = new BitcoinSerializer(MainNetParams.get()); - HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(Hex.decode("f9beb4d96865616465" + + HeadersMessage hm = (HeadersMessage) bs.deserialize(ByteBuffer.wrap(HEX.decode("f9beb4d96865616465" + "72730000000000e701000085acd4ea06010000006fe28c0ab6f1b372c1a6a246ae63f74f931e" + "8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1c" + "db606e857233e0e61bc6649ffff001d01e3629900010000004860eb18bf1b1620e37e9490fc8a" + @@ -228,7 +228,7 @@ public class BitcoinSerializerTest { } // Message with a Message size which is 1 too big, in little endian format. - byte[] wrongMessageLength = Hex.decode("000000000000000000000000010000020000000000"); + byte[] wrongMessageLength = HEX.decode("000000000000000000000000010000020000000000"); try { new BitcoinSerializer.BitcoinPacketHeader(ByteBuffer.wrap(wrongMessageLength)); fail(); @@ -240,7 +240,7 @@ public class BitcoinSerializerTest { @Test public void testSeekPastMagicBytes() { // Fail in another way, there is data in the stream but no magic bytes. - byte[] brokenMessage = Hex.decode("000000"); + byte[] brokenMessage = HEX.decode("000000"); try { new BitcoinSerializer(MainNetParams.get()).seekPastMagicBytes(ByteBuffer.wrap(brokenMessage)); fail(); diff --git a/core/src/test/java/com/google/bitcoin/core/BlockTest.java b/core/src/test/java/com/google/bitcoin/core/BlockTest.java index 187e9c4c..8ec81661 100644 --- a/core/src/test/java/com/google/bitcoin/core/BlockTest.java +++ b/core/src/test/java/com/google/bitcoin/core/BlockTest.java @@ -1,5 +1,6 @@ /** * Copyright 2011 Google Inc. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +21,6 @@ import com.google.bitcoin.params.TestNet2Params; import com.google.bitcoin.params.UnitTestParams; import com.google.bitcoin.script.ScriptOpCodes; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -29,6 +29,7 @@ import java.io.ObjectOutputStream; import java.math.BigInteger; import java.util.Arrays; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.*; public class BlockTest { @@ -39,7 +40,7 @@ public class BlockTest { static { // Block 00000000a6e5eb79dcec11897af55e90cd571a4335383a3ccfbc12ec81085935 // One with lots of transactions in, so a good test of the merkle tree hashing. - blockBytes = Hex.decode("0100000040f11b68435988807d64dff20261f7d9827825fbb37542601fb94d45000000000f28f7c69e2669981f92ff081c129e196200c60f4fad7911d93a682de0b49ea2ecd9d24c1844011d00d361050c01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07041844011d0142ffffffff0100f2052a01000000434104a313febd5f91b6a13bd9c5317030518fee96d1319a0eb10076917294933d09c17dc1588a06953a264738f2acea0c66b99e796caa4f28158e0dd5f6fed69a185bac000000000100000001aa18a952c3f73e5d7440bc570b2aa78f72059887b25b6a1790514b7feedec090000000008b483045022100a970ee6e96fa8bea1cf76d3bda3fb70441a6ec50014d4ea3adcdeae9fbfb5129022025ce9e090366dd6175071a0a5b4a4727571b9bd7bdd5a74d3d3bad7f63eb5dd4014104ac44bdf511477465cb70fef1d06b9241e74d26047ccbdfa641ec9a0115ad35594cbb58a61a6fd56893a405bcffbf6555995ddedc7e6cd4e5ceb83a37e1cf8f98ffffffff02004d92d86a0000001976a914b8083945473bc8289efb681f94de7b07a5b851ad88ac00743ba40b0000001976a914ef01911c9efec6799d1ee5f7c6fb072d9669da8088ac000000000100000001438bd97cb2172e0dd6f341e455e00b7d089747bd4e7f54bd802afe6a6d006c7c000000008a47304402207db94026c96572519101a08e2c864bbe51c987eda6266079a35286df68f123ca02202d7d24c616776a70cce6cb2f97a424e47c30d466e96b750ca03564810249073c014104880286646dab4c894a5ff1bf62bd80047a50b86446b326f2155de94a54d01f9058d4cbc7452563a7c18b2bfb353262fc5adac6307a9446e8c4669daa58e97071ffffffff0200743ba40b0000001976a914fce443c743b456606d1e70ff0d98c4609addc10688ac00ba1dd2050000001976a91411e3e67c08e5d791c97b3d49a8d52025d3f78d3a88ac000000000100000001dc4a6300b6eca8d7ab8e119e9fc4b18890c0e26ec950e681b8d5e46c214aee24010000008b48304502202bcf8632a11192f6b4998343c13589771e6715a080236087dcb1771cbab01809022100edcc38488dd70cd38c058994f143ca5d259071b8fe54c66bf67e55d4468dcacb01410475106e33e14e9cf35bc359dd4120b580ecf5412bb8803f2a927aecd4218d1346e242c7056dca2e4c114fcf2f60799bc5e79107bd1a8b8d5135c92f02bdb59834ffffffff0200f2052a010000001976a9146c9715e09fb00ba84af1ff916ff409b4a5dc9ae288ac00c817a8040000001976a914f7be161206700eb7be1bca5768232c61e4694f4788ac000000000100000001b6cc12ff76247895cb7a604d888012136f06bba64654262044ecb93ff7762c2f000000008b48304502206d795045622c7cdfb4a211c5b41d477920437c21e69214ab4a14f10fe0306b78022100840e55114d6922f3c5e44c7cdcf85dc800d1caef64e7846998423e4ba86714e6014104f88ae9067bc05136cb53a8c18f8549f544ff55ab87ada8f3ba7e2aea773ec73585b61f18ade1c0ddd6c447788578be5fb785c245a64d29b7ff5d28b85cbec58cffffffff0200743ba40b0000001976a914c8081083a8b741da2da260bc0656b88c7bfa6fbf88ac00743ba40b0000001976a914fce443c743b456606d1e70ff0d98c4609addc10688ac0000000001000000019a8d70c7a27560b28dfe778db9ce7f2ff235faf98d5123c07991682be90a4c16000000008b483045022100a118c34f63854ee03d15cca2918d592c295035c42e03be7b0c7e86e66d40ea790220558336d2583a1da00ed5bcad2de5d3b9d485431f702bf2f002267b35ab0b41a0014104f88ae9067bc05136cb53a8c18f8549f544ff55ab87ada8f3ba7e2aea773ec73585b61f18ade1c0ddd6c447788578be5fb785c245a64d29b7ff5d28b85cbec58cffffffff0200743ba40b0000001976a914a440ef00c2e1d39be93607da66568caa26e0501888ac00743ba40b0000001976a914e1d3e65f78f962c4e9dfd04db2119aeefa4e111088ac000000000100000001883acd4bff920f19c4e570e6b3e2d7503d1072d3ca098a124e23534ecdc879d5000000008a473044022040677305de69fd8c18e2c54d5b3c67c5c05735cf6b73d420ccd306762c4bfda2022032cd32ac15ac1820265ffce82654a6008cda22a79fb619ebb65e0af806e14f9b0141044423ef78a2859eb57c4a59dc0878141cf5a4b1fdef71d649d3fb5cf8ea6b1114f4086e5d684a0999d4435db99217a994cc3cf7ad435c8f4e44613d9d160916c4ffffffff0100743ba40b0000001976a914fce443c743b456606d1e70ff0d98c4609addc10688ac000000000100000001ceb27fb142ce3bf9a1f263653dc3971332c71dd10e0e83d647037f608c459f12000000008b4830450220389218287e87d0d7b7113eb20cc1cbf1a00d7acdca32bba7f184cd066db74d6a022100b0998058e5a242699a48f931004cf5550f4e8802b866ce1baf1a0b2616861f27014104255a048d416984101c17514a89289a7d5d3dc8c562850c7a3599f0c7c39bcf9c3a43df75e1e614e51d70c5f85212c99298a21f087be93ecba7ef3900d02c0e8bffffffff0200743ba40b0000001976a914211fd13b614521ed566ddd42738381e42c3c2b2088ac00d956345f0000001976a914d3cc345ba8bdf51d7097955f0f259731f4c34f4388ac000000000100000001703701493f08e82bf6d8cb7c517070eee9f62d14904e14636a7b4af4f34180c7010000008a4730440220061a61eae90ffcf13c10c88a88c085b02954f488823c2f5c81e83a5a833e9f3b02204a61498a9668b2793e77fe3b68585f2daff4dd5daf6097a82615035325ada4730141040db6308d6170333e2c50dee4c9f18f0ab84a7a5c4c88a6836a91f39cb8f4712e08bd72979c542d4b3b60e8dc2021c1b3cc45ffaa83f36a9dec3c4473ea2aa2f3ffffffff0200f2052a010000001976a9143e7e087b9b09149e0266b7a416da2709b4ccf58788ac00d6117e030000001976a914777af71a3b2a48e48f2e467f65028d85c1b5eb5288ac0000000001000000014bdc82abc7db9c06613a712e488685c6feb4522d25017b856222171c17d144e0000000008b4830450221009eb7edcbf8d6be63529264b07bb9f40cf1a0ca779235999e40f5311d70706f1102207f65c5f66982519e6d82e13ca3e61f4f071c73da6c5830b3c4461252012b474e0141045af9665878e6696fd069669951acc54a87c5e3b256a9e20cd8858e0dc5a8c53624e0c979096c00af8a8c60136eef9ffa3d511309417b8315b7f9e3e41e805e8fffffffff0100743ba40b0000001976a914e1d3e65f78f962c4e9dfd04db2119aeefa4e111088ac000000000100000001a854b2b84a76e43de59db647121cdfe481bd8ae9623a345c2188369775b533f7010000008c493046022100c4db6ecf679264c9b525628ec5a983710ff45a1d2d4aa0b54ee218ca9a1ad4df022100dc2e0077cfdd3cbeb28f7463632902ad5306f6d5c77c8149e5b9249bfea8060e014104f9a476b612bb9788c64b9b1e4c9d2deaae1ef0baf6eb593a95d00e2ef8a2beb897ea1fb7c3832e842dd6307fd162816c19c8f458fd8dae331dbc9062fb02e5d8ffffffff0200651b90530000001976a914d5c7c9aec292a807005f013c4d2122f7126e257788ac00743ba40b0000001976a914211fd13b614521ed566ddd42738381e42c3c2b2088ac0000000001000000012908482e9f7d31e9dd392bb6e788a329458a3bc95230b468e4b8c578d27a63b3000000008a4730440220549a7b422fc2020671acabfb937349bd87d985b2e4b9698e4ccacc985f61aee102204dc272322079e9114746db2f8d035d82b64523a69cd7be674173e063090cc8ac014104011a6c220a5549ff112c92c6c38dec93f66ef1f0a21d1409b92f0ccf0fb159aa8173a5b2413a45140fc02b45d63775bae03691d9dc87fd7a10d709a04922900cffffffff0200743ba40b0000001976a914211fd13b614521ed566ddd42738381e42c3c2b2088ac00f1dfeb470000001976a9140adcb4e90cc87f53d7618294222a8a4e193ae9f088ac00000000"); + blockBytes = HEX.decode("0100000040f11b68435988807d64dff20261f7d9827825fbb37542601fb94d45000000000f28f7c69e2669981f92ff081c129e196200c60f4fad7911d93a682de0b49ea2ecd9d24c1844011d00d361050c01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07041844011d0142ffffffff0100f2052a01000000434104a313febd5f91b6a13bd9c5317030518fee96d1319a0eb10076917294933d09c17dc1588a06953a264738f2acea0c66b99e796caa4f28158e0dd5f6fed69a185bac000000000100000001aa18a952c3f73e5d7440bc570b2aa78f72059887b25b6a1790514b7feedec090000000008b483045022100a970ee6e96fa8bea1cf76d3bda3fb70441a6ec50014d4ea3adcdeae9fbfb5129022025ce9e090366dd6175071a0a5b4a4727571b9bd7bdd5a74d3d3bad7f63eb5dd4014104ac44bdf511477465cb70fef1d06b9241e74d26047ccbdfa641ec9a0115ad35594cbb58a61a6fd56893a405bcffbf6555995ddedc7e6cd4e5ceb83a37e1cf8f98ffffffff02004d92d86a0000001976a914b8083945473bc8289efb681f94de7b07a5b851ad88ac00743ba40b0000001976a914ef01911c9efec6799d1ee5f7c6fb072d9669da8088ac000000000100000001438bd97cb2172e0dd6f341e455e00b7d089747bd4e7f54bd802afe6a6d006c7c000000008a47304402207db94026c96572519101a08e2c864bbe51c987eda6266079a35286df68f123ca02202d7d24c616776a70cce6cb2f97a424e47c30d466e96b750ca03564810249073c014104880286646dab4c894a5ff1bf62bd80047a50b86446b326f2155de94a54d01f9058d4cbc7452563a7c18b2bfb353262fc5adac6307a9446e8c4669daa58e97071ffffffff0200743ba40b0000001976a914fce443c743b456606d1e70ff0d98c4609addc10688ac00ba1dd2050000001976a91411e3e67c08e5d791c97b3d49a8d52025d3f78d3a88ac000000000100000001dc4a6300b6eca8d7ab8e119e9fc4b18890c0e26ec950e681b8d5e46c214aee24010000008b48304502202bcf8632a11192f6b4998343c13589771e6715a080236087dcb1771cbab01809022100edcc38488dd70cd38c058994f143ca5d259071b8fe54c66bf67e55d4468dcacb01410475106e33e14e9cf35bc359dd4120b580ecf5412bb8803f2a927aecd4218d1346e242c7056dca2e4c114fcf2f60799bc5e79107bd1a8b8d5135c92f02bdb59834ffffffff0200f2052a010000001976a9146c9715e09fb00ba84af1ff916ff409b4a5dc9ae288ac00c817a8040000001976a914f7be161206700eb7be1bca5768232c61e4694f4788ac000000000100000001b6cc12ff76247895cb7a604d888012136f06bba64654262044ecb93ff7762c2f000000008b48304502206d795045622c7cdfb4a211c5b41d477920437c21e69214ab4a14f10fe0306b78022100840e55114d6922f3c5e44c7cdcf85dc800d1caef64e7846998423e4ba86714e6014104f88ae9067bc05136cb53a8c18f8549f544ff55ab87ada8f3ba7e2aea773ec73585b61f18ade1c0ddd6c447788578be5fb785c245a64d29b7ff5d28b85cbec58cffffffff0200743ba40b0000001976a914c8081083a8b741da2da260bc0656b88c7bfa6fbf88ac00743ba40b0000001976a914fce443c743b456606d1e70ff0d98c4609addc10688ac0000000001000000019a8d70c7a27560b28dfe778db9ce7f2ff235faf98d5123c07991682be90a4c16000000008b483045022100a118c34f63854ee03d15cca2918d592c295035c42e03be7b0c7e86e66d40ea790220558336d2583a1da00ed5bcad2de5d3b9d485431f702bf2f002267b35ab0b41a0014104f88ae9067bc05136cb53a8c18f8549f544ff55ab87ada8f3ba7e2aea773ec73585b61f18ade1c0ddd6c447788578be5fb785c245a64d29b7ff5d28b85cbec58cffffffff0200743ba40b0000001976a914a440ef00c2e1d39be93607da66568caa26e0501888ac00743ba40b0000001976a914e1d3e65f78f962c4e9dfd04db2119aeefa4e111088ac000000000100000001883acd4bff920f19c4e570e6b3e2d7503d1072d3ca098a124e23534ecdc879d5000000008a473044022040677305de69fd8c18e2c54d5b3c67c5c05735cf6b73d420ccd306762c4bfda2022032cd32ac15ac1820265ffce82654a6008cda22a79fb619ebb65e0af806e14f9b0141044423ef78a2859eb57c4a59dc0878141cf5a4b1fdef71d649d3fb5cf8ea6b1114f4086e5d684a0999d4435db99217a994cc3cf7ad435c8f4e44613d9d160916c4ffffffff0100743ba40b0000001976a914fce443c743b456606d1e70ff0d98c4609addc10688ac000000000100000001ceb27fb142ce3bf9a1f263653dc3971332c71dd10e0e83d647037f608c459f12000000008b4830450220389218287e87d0d7b7113eb20cc1cbf1a00d7acdca32bba7f184cd066db74d6a022100b0998058e5a242699a48f931004cf5550f4e8802b866ce1baf1a0b2616861f27014104255a048d416984101c17514a89289a7d5d3dc8c562850c7a3599f0c7c39bcf9c3a43df75e1e614e51d70c5f85212c99298a21f087be93ecba7ef3900d02c0e8bffffffff0200743ba40b0000001976a914211fd13b614521ed566ddd42738381e42c3c2b2088ac00d956345f0000001976a914d3cc345ba8bdf51d7097955f0f259731f4c34f4388ac000000000100000001703701493f08e82bf6d8cb7c517070eee9f62d14904e14636a7b4af4f34180c7010000008a4730440220061a61eae90ffcf13c10c88a88c085b02954f488823c2f5c81e83a5a833e9f3b02204a61498a9668b2793e77fe3b68585f2daff4dd5daf6097a82615035325ada4730141040db6308d6170333e2c50dee4c9f18f0ab84a7a5c4c88a6836a91f39cb8f4712e08bd72979c542d4b3b60e8dc2021c1b3cc45ffaa83f36a9dec3c4473ea2aa2f3ffffffff0200f2052a010000001976a9143e7e087b9b09149e0266b7a416da2709b4ccf58788ac00d6117e030000001976a914777af71a3b2a48e48f2e467f65028d85c1b5eb5288ac0000000001000000014bdc82abc7db9c06613a712e488685c6feb4522d25017b856222171c17d144e0000000008b4830450221009eb7edcbf8d6be63529264b07bb9f40cf1a0ca779235999e40f5311d70706f1102207f65c5f66982519e6d82e13ca3e61f4f071c73da6c5830b3c4461252012b474e0141045af9665878e6696fd069669951acc54a87c5e3b256a9e20cd8858e0dc5a8c53624e0c979096c00af8a8c60136eef9ffa3d511309417b8315b7f9e3e41e805e8fffffffff0100743ba40b0000001976a914e1d3e65f78f962c4e9dfd04db2119aeefa4e111088ac000000000100000001a854b2b84a76e43de59db647121cdfe481bd8ae9623a345c2188369775b533f7010000008c493046022100c4db6ecf679264c9b525628ec5a983710ff45a1d2d4aa0b54ee218ca9a1ad4df022100dc2e0077cfdd3cbeb28f7463632902ad5306f6d5c77c8149e5b9249bfea8060e014104f9a476b612bb9788c64b9b1e4c9d2deaae1ef0baf6eb593a95d00e2ef8a2beb897ea1fb7c3832e842dd6307fd162816c19c8f458fd8dae331dbc9062fb02e5d8ffffffff0200651b90530000001976a914d5c7c9aec292a807005f013c4d2122f7126e257788ac00743ba40b0000001976a914211fd13b614521ed566ddd42738381e42c3c2b2088ac0000000001000000012908482e9f7d31e9dd392bb6e788a329458a3bc95230b468e4b8c578d27a63b3000000008a4730440220549a7b422fc2020671acabfb937349bd87d985b2e4b9698e4ccacc985f61aee102204dc272322079e9114746db2f8d035d82b64523a69cd7be674173e063090cc8ac014104011a6c220a5549ff112c92c6c38dec93f66ef1f0a21d1409b92f0ccf0fb159aa8173a5b2413a45140fc02b45d63775bae03691d9dc87fd7a10d709a04922900cffffffff0200743ba40b0000001976a914211fd13b614521ed566ddd42738381e42c3c2b2088ac00f1dfeb470000001976a9140adcb4e90cc87f53d7618294222a8a4e193ae9f088ac00000000"); } @Test 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 d0ed0693..c19f5a9a 100644 --- a/core/src/test/java/com/google/bitcoin/core/BloomFilterTest.java +++ b/core/src/test/java/com/google/bitcoin/core/BloomFilterTest.java @@ -1,11 +1,28 @@ +/* + * Copyright 2012 Matt Corallo + * Copyright 2014 Andreas Schildbach + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.bitcoin.core; import com.google.bitcoin.params.MainNetParams; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.util.Arrays; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.*; public class BloomFilterTest { @@ -13,38 +30,38 @@ public class BloomFilterTest { public void insertSerializeTest() { BloomFilter filter = new BloomFilter(3, 0.01, 0, BloomFilter.BloomUpdate.UPDATE_ALL); - filter.insert(Hex.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8")); - assertTrue (filter.contains(Hex.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8"))); + filter.insert(HEX.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8")); + assertTrue (filter.contains(HEX.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8"))); // One bit different in first byte - assertFalse(filter.contains(Hex.decode("19108ad8ed9bb6274d3980bab5a85c048f0950c8"))); + assertFalse(filter.contains(HEX.decode("19108ad8ed9bb6274d3980bab5a85c048f0950c8"))); - filter.insert(Hex.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")); - assertTrue(filter.contains(Hex.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"))); + filter.insert(HEX.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")); + assertTrue(filter.contains(HEX.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"))); - filter.insert(Hex.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5")); - assertTrue(filter.contains(Hex.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5"))); + filter.insert(HEX.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5")); + assertTrue(filter.contains(HEX.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5"))); // Value generated by the reference client - assertTrue(Arrays.equals(Hex.decode("03614e9b050000000000000001"), filter.bitcoinSerialize())); + assertTrue(Arrays.equals(HEX.decode("03614e9b050000000000000001"), filter.bitcoinSerialize())); } @Test public void insertSerializeTestWithTweak() { BloomFilter filter = new BloomFilter(3, 0.01, 2147483649L); - filter.insert(Hex.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8")); - assertTrue (filter.contains(Hex.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8"))); + filter.insert(HEX.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8")); + assertTrue (filter.contains(HEX.decode("99108ad8ed9bb6274d3980bab5a85c048f0950c8"))); // One bit different in first byte - assertFalse(filter.contains(Hex.decode("19108ad8ed9bb6274d3980bab5a85c048f0950c8"))); + assertFalse(filter.contains(HEX.decode("19108ad8ed9bb6274d3980bab5a85c048f0950c8"))); - filter.insert(Hex.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")); - assertTrue(filter.contains(Hex.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"))); + filter.insert(HEX.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee")); + assertTrue(filter.contains(HEX.decode("b5a2c786d9ef4658287ced5914b37a1b4aa32eee"))); - filter.insert(Hex.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5")); - assertTrue(filter.contains(Hex.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5"))); + filter.insert(HEX.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5")); + assertTrue(filter.contains(HEX.decode("b9300670b4c5366e95b2699e8b18bc75e5f729c5"))); // Value generated by the reference client - assertTrue(Arrays.equals(Hex.decode("03ce4299050000000100008002"), filter.bitcoinSerialize())); + assertTrue(Arrays.equals(HEX.decode("03ce4299050000000100008002"), filter.bitcoinSerialize())); } @Test @@ -59,8 +76,8 @@ public class BloomFilterTest { Wallet wallet = new Wallet(params); wallet.importKey(privKey.getKey()); // Add a random key which happens to have been used in a recent generation - wallet.importKey(ECKey.fromPublicOnly(Hex.decode("03cb219f69f1b49468bd563239a86667e74a06fcba69ac50a08a5cbc42a5808e99"))); - wallet.commitTx(new Transaction(params, Hex.decode("01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0d038754030114062f503253482fffffffff01c05e559500000000232103cb219f69f1b49468bd563239a86667e74a06fcba69ac50a08a5cbc42a5808e99ac00000000"))); + wallet.importKey(ECKey.fromPublicOnly(HEX.decode("03cb219f69f1b49468bd563239a86667e74a06fcba69ac50a08a5cbc42a5808e99"))); + wallet.commitTx(new Transaction(params, HEX.decode("01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0d038754030114062f503253482fffffffff01c05e559500000000232103cb219f69f1b49468bd563239a86667e74a06fcba69ac50a08a5cbc42a5808e99ac00000000"))); // We should have 2 per pubkey, and one for the pay-2-pubkey output we have assertEquals(5, wallet.getBloomFilterElementCount()); @@ -68,6 +85,6 @@ public class BloomFilterTest { BloomFilter filter = wallet.getBloomFilter(wallet.getBloomFilterElementCount(), 0.001, 0); // Value generated by the reference client - assertTrue(Arrays.equals(Hex.decode("082ae5edc8e51d4a03080000000000000002"), filter.bitcoinSerialize())); + assertTrue(Arrays.equals(HEX.decode("082ae5edc8e51d4a03080000000000000002"), filter.bitcoinSerialize())); } } diff --git a/core/src/test/java/com/google/bitcoin/core/ECKeyTest.java b/core/src/test/java/com/google/bitcoin/core/ECKeyTest.java index 79bb353a..07795ed1 100644 --- a/core/src/test/java/com/google/bitcoin/core/ECKeyTest.java +++ b/core/src/test/java/com/google/bitcoin/core/ECKeyTest.java @@ -38,8 +38,6 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongycastle.crypto.params.KeyParameter; -import org.spongycastle.util.encoders.DecoderException; -import org.spongycastle.util.encoders.Hex; import java.io.InputStream; import java.math.BigInteger; @@ -51,6 +49,7 @@ import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.Executors; +import static com.google.bitcoin.core.Utils.HEX; import static com.google.bitcoin.core.Utils.reverseBytes; import static com.google.common.base.Preconditions.checkNotNull; import static org.junit.Assert.*; @@ -108,20 +107,20 @@ public class ECKeyTest { public void testSignatures() throws Exception { // Test that we can construct an ECKey from a private key (deriving the public from the private), then signing // a message with it. - BigInteger privkey = new BigInteger(1, Hex.decode("180cb41c7c600be951b5d3d0a7334acc7506173875834f7a6c4c786a28fcbb19")); + BigInteger privkey = new BigInteger(1, HEX.decode("180cb41c7c600be951b5d3d0a7334acc7506173875834f7a6c4c786a28fcbb19")); ECKey key = ECKey.fromPrivate(privkey); byte[] output = key.sign(Sha256Hash.ZERO_HASH).encodeToDER(); assertTrue(key.verify(Sha256Hash.ZERO_HASH.getBytes(), output)); // Test interop with a signature from elsewhere. - byte[] sig = Hex.decode( + byte[] sig = HEX.decode( "3046022100dffbc26774fc841bbe1c1362fd643609c6e42dcb274763476d87af2c0597e89e022100c59e3c13b96b316cae9fa0ab0260612c7a133a6fe2b3445b6bf80b3123bf274d"); assertTrue(key.verify(Sha256Hash.ZERO_HASH.getBytes(), sig)); } @Test public void testASN1Roundtrip() throws Exception { - byte[] privkeyASN1 = Hex.decode( + byte[] privkeyASN1 = HEX.decode( "3082011302010104205c0b98e524ad188ddef35dc6abba13c34a351a05409e5d285403718b93336a4aa081a53081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101a144034200042af7a2aafe8dafd7dc7f9cfb58ce09bda7dce28653ab229b98d1d3d759660c672dd0db18c8c2d76aa470448e876fc2089ab1354c01a6e72cefc50915f4a963ee"); ECKey decodedKey = ECKey.fromASN1(privkeyASN1); @@ -132,18 +131,18 @@ public class ECKeyTest { assertArrayEquals(decodedKey.getPrivKeyBytes(), roundtripKey.getPrivKeyBytes()); for (ECKey key : new ECKey[] {decodedKey, roundtripKey}) { - byte[] message = reverseBytes(Hex.decode( + byte[] message = reverseBytes(HEX.decode( "11da3761e86431e4a54c176789e41f1651b324d240d599a7067bee23d328ec2a")); byte[] output = key.sign(new Sha256Hash(message)).encodeToDER(); assertTrue(key.verify(message, output)); - output = Hex.decode( + output = HEX.decode( "304502206faa2ebc614bf4a0b31f0ce4ed9012eb193302ec2bcaccc7ae8bb40577f47549022100c73a1a1acc209f3f860bf9b9f5e13e9433db6f8b7bd527a088a0e0cd0a4c83e9"); assertTrue(key.verify(message, output)); } // Try to sign with one key and verify with the other. - byte[] message = reverseBytes(Hex.decode( + byte[] message = reverseBytes(HEX.decode( "11da3761e86431e4a54c176789e41f1651b324d240d599a7067bee23d328ec2a")); assertTrue(roundtripKey.verify(message, decodedKey.sign(new Sha256Hash(message)).encodeToDER())); assertTrue(decodedKey.verify(message, roundtripKey.sign(new Sha256Hash(message)).encodeToDER())); @@ -151,7 +150,7 @@ public class ECKeyTest { @Test public void testKeyPairRoundtrip() throws Exception { - byte[] privkeyASN1 = Hex.decode( + byte[] privkeyASN1 = HEX.decode( "3082011302010104205c0b98e524ad188ddef35dc6abba13c34a351a05409e5d285403718b93336a4aa081a53081a2020101302c06072a8648ce3d0101022100fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f300604010004010704410479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8022100fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141020101a144034200042af7a2aafe8dafd7dc7f9cfb58ce09bda7dce28653ab229b98d1d3d759660c672dd0db18c8c2d76aa470448e876fc2089ab1354c01a6e72cefc50915f4a963ee"); ECKey decodedKey = ECKey.fromASN1(privkeyASN1); @@ -161,18 +160,18 @@ public class ECKeyTest { ECKey.fromPrivateAndPrecalculatedPublic(decodedKey.getPrivKey(), decodedKey.getPubKeyPoint()); for (ECKey key : new ECKey[] {decodedKey, roundtripKey}) { - byte[] message = reverseBytes(Hex.decode( + byte[] message = reverseBytes(HEX.decode( "11da3761e86431e4a54c176789e41f1651b324d240d599a7067bee23d328ec2a")); byte[] output = key.sign(new Sha256Hash(message)).encodeToDER(); assertTrue(key.verify(message, output)); - output = Hex.decode( + output = HEX.decode( "304502206faa2ebc614bf4a0b31f0ce4ed9012eb193302ec2bcaccc7ae8bb40577f47549022100c73a1a1acc209f3f860bf9b9f5e13e9433db6f8b7bd527a088a0e0cd0a4c83e9"); assertTrue(key.verify(message, output)); } // Try to sign with one key and verify with the other. - byte[] message = reverseBytes(Hex.decode( + byte[] message = reverseBytes(HEX.decode( "11da3761e86431e4a54c176789e41f1651b324d240d599a7067bee23d328ec2a")); assertTrue(roundtripKey.verify(message, decodedKey.sign(new Sha256Hash(message)).encodeToDER())); assertTrue(decodedKey.verify(message, roundtripKey.sign(new Sha256Hash(message)).encodeToDER())); @@ -388,7 +387,7 @@ public class ECKeyTest { while (in.available() > 0 && (c = in.read()) != '"') sig.append((char)c); - assertTrue(TransactionSignature.isEncodingCanonical(Hex.decode(sig.toString()))); + assertTrue(TransactionSignature.isEncodingCanonical(HEX.decode(sig.toString()))); } in.close(); } @@ -411,8 +410,8 @@ public class ECKeyTest { try { final String sigStr = sig.toString(); - assertFalse(TransactionSignature.isEncodingCanonical(Hex.decode(sigStr))); - } catch (DecoderException e) { + assertFalse(TransactionSignature.isEncodingCanonical(HEX.decode(sigStr))); + } catch (IllegalArgumentException e) { // Expected for non-hex strings in the JSON that we should ignore } } diff --git a/core/src/test/java/com/google/bitcoin/core/FilteredBlockAndPartialMerkleTreeTests.java b/core/src/test/java/com/google/bitcoin/core/FilteredBlockAndPartialMerkleTreeTests.java index 5602c0a5..c2c6661f 100644 --- a/core/src/test/java/com/google/bitcoin/core/FilteredBlockAndPartialMerkleTreeTests.java +++ b/core/src/test/java/com/google/bitcoin/core/FilteredBlockAndPartialMerkleTreeTests.java @@ -25,7 +25,6 @@ import com.google.bitcoin.testing.TestWithPeerGroup; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.spongycastle.util.encoders.Hex; import java.math.BigInteger; import java.util.Arrays; @@ -33,6 +32,7 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -55,7 +55,7 @@ public class FilteredBlockAndPartialMerkleTreeTests extends TestWithPeerGroup { // Random real block (000000000000dab0130bbcc991d3d7ae6b81aa6f50a798888dfe62337458dc45) // With one tx - FilteredBlock block = new FilteredBlock(params, Hex.decode("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101")); + FilteredBlock block = new FilteredBlock(params, HEX.decode("0100000079cda856b143d9db2c1caff01d1aecc8630d30625d10e8b4b8b0000000000000b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f196367291b4d4c86041b8fa45d630100000001b50cc069d6a3e33e3ff84a5c41d9d3febe7c770fdcc96b2c3ff60abe184f19630101")); // Check that the header was properly deserialized assertTrue(block.getBlockHeader().getHash().equals(new Sha256Hash("000000000000dab0130bbcc991d3d7ae6b81aa6f50a798888dfe62337458dc45"))); @@ -72,8 +72,8 @@ public class FilteredBlockAndPartialMerkleTreeTests extends TestWithPeerGroup { // First we create all the neccessary objects, including lots of serialization and double-checks // Note that all serialized forms here are generated by the reference client/pulled from block explorer - Block block = new Block(unitTestParams, Hex.decode("0100000006e533fd1ada86391f3f6c343204b0d278d4aaec1c0b20aa27ba0300000000006abbb3eb3d733a9fe18967fd7d4c117e4ccbbac5bec4d910d900b3ae0793e77f54241b4d4c86041b4089cc9b0c01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b010dffffffff0100f2052a01000000434104b27f7e9475ccf5d9a431cb86d665b8302c140144ec2397fce792f4a4e7765fecf8128534eaa71df04f93c74676ae8279195128a1506ebf7379d23dab8fca0f63ac000000000100000001d992e5a888a86d4c7a6a69167a4728ee69497509740fc5f456a24528c340219a000000008b483045022100f0519bdc9282ff476da1323b8ef7ffe33f495c1a8d52cc522b437022d83f6a230220159b61d197fbae01b4a66622a23bc3f1def65d5fa24efd5c26fa872f3a246b8e014104839f9023296a1fabb133140128ca2709f6818c7d099491690bd8ac0fd55279def6a2ceb6ab7b5e4a71889b6e739f09509565eec789e86886f6f936fa42097adeffffffff02000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac00e32321000000001976a9140c34f4e29ab5a615d5ea28d4817f12b137d62ed588ac0000000001000000059daf0abe7a92618546a9dbcfd65869b6178c66ec21ccfda878c1175979cfd9ef000000004a493046022100c2f7f25be5de6ce88ac3c1a519514379e91f39b31ddff279a3db0b1a229b708b022100b29efbdbd9837cc6a6c7318aa4900ed7e4d65662c34d1622a2035a3a5534a99a01ffffffffd516330ebdf075948da56db13d22632a4fb941122df2884397dda45d451acefb0000000048473044022051243debe6d4f2b433bee0cee78c5c4073ead0e3bde54296dbed6176e128659c022044417bfe16f44eb7b6eb0cdf077b9ce972a332e15395c09ca5e4f602958d266101ffffffffe1f5aa33961227b3c344e57179417ce01b7ccd421117fe2336289b70489883f900000000484730440220593252bb992ce3c85baf28d6e3aa32065816271d2c822398fe7ee28a856bc943022066d429dd5025d3c86fd8fd8a58e183a844bd94aa312cefe00388f57c85b0ca3201ffffffffe207e83718129505e6a7484831442f668164ae659fddb82e9e5421a081fb90d50000000049483045022067cf27eb733e5bcae412a586b25a74417c237161a084167c2a0b439abfebdcb2022100efcc6baa6824b4c5205aa967e0b76d31abf89e738d4b6b014e788c9a8cccaf0c01ffffffffe23b8d9d80a9e9d977fab3c94dbe37befee63822443c3ec5ae5a713ede66c3940000000049483045022020f2eb35036666b1debe0d1d2e77a36d5d9c4e96c1dba23f5100f193dbf524790221008ce79bc1321fb4357c6daee818038d41544749127751726e46b2b320c8b565a201ffffffff0200ba1dd2050000001976a914366a27645806e817a6cd40bc869bdad92fe5509188ac40420f00000000001976a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac0000000001000000010abad2dc0c9b4b1dbb023077da513f81e5a71788d8680fca98ef1c37356c459c000000004a493046022100a894e521c87b3dbe23007079db4ac2896e9e791f8b57317ba6c0d99a7becd27a022100bc40981393eafeb33e89079f857c728701a9af4523c3f857cd96a500f240780901ffffffff024026ee22010000001976a914d28f9cefb58c1f7a5f97aa6b79047585f58fbd4388acc0cb1707000000001976a9142229481696e417aa5f51ad751d8cd4c6a669e4fe88ac000000000100000001f66d89b3649e0b18d84db056930676cb81c0168042fc4324c3682e252ea9410d0000000048473044022038e0b55b37c9253bfeda59c76c0134530f91fb586d6eb21738a77a984f370a44022048d4d477aaf97ef9c8275bbc5cb19b9c8a0e9b1f9fdafdd39bc85bf6c2f04a4d01ffffffff024041a523010000001976a914955f70ac8792b48b7bd52b15413bd8500ecf32c888ac00f36f06000000001976a91486116d15f3dbb23a2b58346f36e6ec2d867eba2b88ac00000000010000000126c384984f63446a4f2be8dd6531ba9837bd5f2c3d37403c5f51fb9192ee754e010000008b48304502210083af8324456f052ff1b2597ff0e6a8cce8b006e379a410cf781be7874a2691c2022072259e2f7292960dea0ffc361bbad0b861f719beb8550476f22ce0f82c023449014104f3ed46a81cba02af0593e8572a9130adb0d348b538c829ccaaf8e6075b78439b2746a76891ce7ba71abbcbb7ca76e8a220782738a6789562827c1065b0ce911dffffffff02c0dd9107000000001976a91463d4dd1b29d95ed601512b487bfc1c49d84d057988ac00a0491a010000001976a91465746bef92511df7b34abf71c162efb7ae353de388ac0000000001000000011b56cf3aab3286d582c055a42af3a911ee08423f276da702bb67f1222ac1a5b6000000008c4930460221009e9fba682e162c9627b96b7df272006a727988680b956c61baff869f0907b8fb022100a9c19adc7c36144bafe526630783845e5cb9554d30d3edfb56f0740274d507f30141046e0efbfac7b1615ad553a6f097615bc63b7cdb3b8e1cb3263b619ba63740012f51c7c5b09390e3577e377b7537e61226e315f95f926444fc5e5f2978c112e448ffffffff02c0072b11010000001976a914b73e9e01933351ca076faf8e0d94dd58079d0b1f88ac80b63908000000001976a9141aca0bdf0d2cee63db19aa4a484f45a4e26a880c88ac000000000100000001251b187504ea873b2c3915fad401f7a7734cc13567e0417708e86294a29f4f68010000008b4830450221009bef423141ed1ae60d0a5bcaa57b1673fc96001f0d4e105535cca817ba5a7724022037c399bd30374f22481ffc81327cfca4951c7264b227f765fcd6a429f3d9d2080141044d0d1b4f194c31a73dbce41c42b4b3946849117c5bb320467e014bad3b1532f28a9a1568ba7108f188e7823b6e618e91d974306701379a27b9339e646e156e7bffffffff02c00fd103010000001976a914ef7f5d9e1bc6ed68cfe0b1db9d8f09cef0f3ba4a88ac004dd208000000001976a914c22420641cea028c9e06c4d9104c1646f8b1769088ac0000000001000000013486dd5f0a2f3efcc04f64cb03872c021f98ee39f514747ce5336b874bbe47a7010000008b48304502201cadddc2838598fee7dc35a12b340c6bde8b389f7bfd19a1252a17c4b5ed2d71022100c1a251bbecb14b058a8bd77f65de87e51c47e95904f4c0e9d52eddc21c1415ac014104fe7df86d58aafa9246ca6fd30c905714533c25f700e2329b8ecec8aa52083b844baa3a8acd5d6b9732dcb39079bb56ba2711a3580dec824955fce0596a460c11ffffffff02c011f6e1000000001976a91490fac83c9adde91d670dde8755f8b475ab9e427d88acc0f9df15000000001976a91437f691b3e8ee5dcb56c2e31af4c80caa2df3b09b88ac00000000010000000170016bd1274b795b262f32a53003a4714b22b62f9057adf5fbe6ed939003b5190100000089463043022061456499582170a94d6b54308f792e37dad28bf0ed7aa61021f0301d2774d378021f4224b33f707efd810a01dd34ea86d6069cd599cc435513a0eef8c83c137bf7014104a2c95d6b98e745448eb45ed0ba95cf24dd7c3b16386e1028e24a0358ee4afc33e2f0199139853edaf32845d8a42254c75f7dc8add3286c682c650fbd93f0a4a1ffffffff02001bd2b7000000001976a9141b11c6acaa5223013f3a3240fdb024ecd9f8135488ac8023ad18000000001976a914ada27ca87bbaa1ee6fb1cb61bb0a29baaf6da2c988ac000000000100000001c8ff91f031ec6a5aba4baee6549e61dd01f26f61b70e2f1574f24cd680f464ad000000008b48304502210082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3022024bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724014104174f9eef1157dc1ad5eac198250b70d1c3b04b2fca12ad1483f07358486f02909b088bbc83f4de55f767f6cdf9d424aa02b5eeaffa08394d39b717895fc08d0affffffff0200ea3b43000000001976a914fb32df708f0610901f6d1b6df8c9c368fe0d981c88ac800f1777000000001976a914462c501c70fb996d15ac0771e7fc8d3ca3f7201888ac000000000100000001c67323867de802402e780a70e0deba3c708c4d87497e17590afee9c321f1c680010000008a473044022042734b25f54845d662e6499b75ff8529ff47f42fd224498a9f752d212326dbfa0220523e4b7b570bbb1f3af02baa2c04ea8eb7b0fccb1522cced130b666ae9a9d014014104b5a23b922949877e9eaf7512897ed091958e2e8cf05b0d0eb9064e7976043fde6023b4e2c188b7e38ef94eec6845dc4933f5e8635f1f6a3702290956aa9e284bffffffff0280041838030000001976a91436e5884215f7d3044be5d37bdd8c987d9d942c8488ac404b4c00000000001976a91460085d6838f8a44a21a0de56ff963cfa6242a96188ac00000000")); - FilteredBlock filteredBlock = new FilteredBlock(unitTestParams, Hex.decode("0100000006e533fd1ada86391f3f6c343204b0d278d4aaec1c0b20aa27ba0300000000006abbb3eb3d733a9fe18967fd7d4c117e4ccbbac5bec4d910d900b3ae0793e77f54241b4d4c86041b4089cc9b0c000000084c30b63cfcdc2d35e3329421b9805ef0c6565d35381ca857762ea0b3a5a128bbca5065ff9617cbcba45eb23726df6498a9b9cafed4f54cbab9d227b0035ddefbbb15ac1d57d0182aaee61c74743a9c4f785895e563909bafec45c9a2b0ff3181d77706be8b1dcc91112eada86d424e2d0a8907c3488b6e44fda5a74a25cbc7d6bb4fa04245f4ac8a1a571d5537eac24adca1454d65eda446055479af6c6d4dd3c9ab658448c10b6921b7a4ce3021eb22ed6bb6a7fde1e5bcc4b1db6615c6abc5ca042127bfaf9f44ebce29cb29c6df9d05b47f35b2edff4f0064b578ab741fa78276222651209fe1a2c4c0fa1c58510aec8b090dd1eb1f82f9d261b8273b525b02ff1a")); + Block block = new Block(unitTestParams, HEX.decode("0100000006e533fd1ada86391f3f6c343204b0d278d4aaec1c0b20aa27ba0300000000006abbb3eb3d733a9fe18967fd7d4c117e4ccbbac5bec4d910d900b3ae0793e77f54241b4d4c86041b4089cc9b0c01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b010dffffffff0100f2052a01000000434104b27f7e9475ccf5d9a431cb86d665b8302c140144ec2397fce792f4a4e7765fecf8128534eaa71df04f93c74676ae8279195128a1506ebf7379d23dab8fca0f63ac000000000100000001d992e5a888a86d4c7a6a69167a4728ee69497509740fc5f456a24528c340219a000000008b483045022100f0519bdc9282ff476da1323b8ef7ffe33f495c1a8d52cc522b437022d83f6a230220159b61d197fbae01b4a66622a23bc3f1def65d5fa24efd5c26fa872f3a246b8e014104839f9023296a1fabb133140128ca2709f6818c7d099491690bd8ac0fd55279def6a2ceb6ab7b5e4a71889b6e739f09509565eec789e86886f6f936fa42097adeffffffff02000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac00e32321000000001976a9140c34f4e29ab5a615d5ea28d4817f12b137d62ed588ac0000000001000000059daf0abe7a92618546a9dbcfd65869b6178c66ec21ccfda878c1175979cfd9ef000000004a493046022100c2f7f25be5de6ce88ac3c1a519514379e91f39b31ddff279a3db0b1a229b708b022100b29efbdbd9837cc6a6c7318aa4900ed7e4d65662c34d1622a2035a3a5534a99a01ffffffffd516330ebdf075948da56db13d22632a4fb941122df2884397dda45d451acefb0000000048473044022051243debe6d4f2b433bee0cee78c5c4073ead0e3bde54296dbed6176e128659c022044417bfe16f44eb7b6eb0cdf077b9ce972a332e15395c09ca5e4f602958d266101ffffffffe1f5aa33961227b3c344e57179417ce01b7ccd421117fe2336289b70489883f900000000484730440220593252bb992ce3c85baf28d6e3aa32065816271d2c822398fe7ee28a856bc943022066d429dd5025d3c86fd8fd8a58e183a844bd94aa312cefe00388f57c85b0ca3201ffffffffe207e83718129505e6a7484831442f668164ae659fddb82e9e5421a081fb90d50000000049483045022067cf27eb733e5bcae412a586b25a74417c237161a084167c2a0b439abfebdcb2022100efcc6baa6824b4c5205aa967e0b76d31abf89e738d4b6b014e788c9a8cccaf0c01ffffffffe23b8d9d80a9e9d977fab3c94dbe37befee63822443c3ec5ae5a713ede66c3940000000049483045022020f2eb35036666b1debe0d1d2e77a36d5d9c4e96c1dba23f5100f193dbf524790221008ce79bc1321fb4357c6daee818038d41544749127751726e46b2b320c8b565a201ffffffff0200ba1dd2050000001976a914366a27645806e817a6cd40bc869bdad92fe5509188ac40420f00000000001976a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac0000000001000000010abad2dc0c9b4b1dbb023077da513f81e5a71788d8680fca98ef1c37356c459c000000004a493046022100a894e521c87b3dbe23007079db4ac2896e9e791f8b57317ba6c0d99a7becd27a022100bc40981393eafeb33e89079f857c728701a9af4523c3f857cd96a500f240780901ffffffff024026ee22010000001976a914d28f9cefb58c1f7a5f97aa6b79047585f58fbd4388acc0cb1707000000001976a9142229481696e417aa5f51ad751d8cd4c6a669e4fe88ac000000000100000001f66d89b3649e0b18d84db056930676cb81c0168042fc4324c3682e252ea9410d0000000048473044022038e0b55b37c9253bfeda59c76c0134530f91fb586d6eb21738a77a984f370a44022048d4d477aaf97ef9c8275bbc5cb19b9c8a0e9b1f9fdafdd39bc85bf6c2f04a4d01ffffffff024041a523010000001976a914955f70ac8792b48b7bd52b15413bd8500ecf32c888ac00f36f06000000001976a91486116d15f3dbb23a2b58346f36e6ec2d867eba2b88ac00000000010000000126c384984f63446a4f2be8dd6531ba9837bd5f2c3d37403c5f51fb9192ee754e010000008b48304502210083af8324456f052ff1b2597ff0e6a8cce8b006e379a410cf781be7874a2691c2022072259e2f7292960dea0ffc361bbad0b861f719beb8550476f22ce0f82c023449014104f3ed46a81cba02af0593e8572a9130adb0d348b538c829ccaaf8e6075b78439b2746a76891ce7ba71abbcbb7ca76e8a220782738a6789562827c1065b0ce911dffffffff02c0dd9107000000001976a91463d4dd1b29d95ed601512b487bfc1c49d84d057988ac00a0491a010000001976a91465746bef92511df7b34abf71c162efb7ae353de388ac0000000001000000011b56cf3aab3286d582c055a42af3a911ee08423f276da702bb67f1222ac1a5b6000000008c4930460221009e9fba682e162c9627b96b7df272006a727988680b956c61baff869f0907b8fb022100a9c19adc7c36144bafe526630783845e5cb9554d30d3edfb56f0740274d507f30141046e0efbfac7b1615ad553a6f097615bc63b7cdb3b8e1cb3263b619ba63740012f51c7c5b09390e3577e377b7537e61226e315f95f926444fc5e5f2978c112e448ffffffff02c0072b11010000001976a914b73e9e01933351ca076faf8e0d94dd58079d0b1f88ac80b63908000000001976a9141aca0bdf0d2cee63db19aa4a484f45a4e26a880c88ac000000000100000001251b187504ea873b2c3915fad401f7a7734cc13567e0417708e86294a29f4f68010000008b4830450221009bef423141ed1ae60d0a5bcaa57b1673fc96001f0d4e105535cca817ba5a7724022037c399bd30374f22481ffc81327cfca4951c7264b227f765fcd6a429f3d9d2080141044d0d1b4f194c31a73dbce41c42b4b3946849117c5bb320467e014bad3b1532f28a9a1568ba7108f188e7823b6e618e91d974306701379a27b9339e646e156e7bffffffff02c00fd103010000001976a914ef7f5d9e1bc6ed68cfe0b1db9d8f09cef0f3ba4a88ac004dd208000000001976a914c22420641cea028c9e06c4d9104c1646f8b1769088ac0000000001000000013486dd5f0a2f3efcc04f64cb03872c021f98ee39f514747ce5336b874bbe47a7010000008b48304502201cadddc2838598fee7dc35a12b340c6bde8b389f7bfd19a1252a17c4b5ed2d71022100c1a251bbecb14b058a8bd77f65de87e51c47e95904f4c0e9d52eddc21c1415ac014104fe7df86d58aafa9246ca6fd30c905714533c25f700e2329b8ecec8aa52083b844baa3a8acd5d6b9732dcb39079bb56ba2711a3580dec824955fce0596a460c11ffffffff02c011f6e1000000001976a91490fac83c9adde91d670dde8755f8b475ab9e427d88acc0f9df15000000001976a91437f691b3e8ee5dcb56c2e31af4c80caa2df3b09b88ac00000000010000000170016bd1274b795b262f32a53003a4714b22b62f9057adf5fbe6ed939003b5190100000089463043022061456499582170a94d6b54308f792e37dad28bf0ed7aa61021f0301d2774d378021f4224b33f707efd810a01dd34ea86d6069cd599cc435513a0eef8c83c137bf7014104a2c95d6b98e745448eb45ed0ba95cf24dd7c3b16386e1028e24a0358ee4afc33e2f0199139853edaf32845d8a42254c75f7dc8add3286c682c650fbd93f0a4a1ffffffff02001bd2b7000000001976a9141b11c6acaa5223013f3a3240fdb024ecd9f8135488ac8023ad18000000001976a914ada27ca87bbaa1ee6fb1cb61bb0a29baaf6da2c988ac000000000100000001c8ff91f031ec6a5aba4baee6549e61dd01f26f61b70e2f1574f24cd680f464ad000000008b48304502210082235e21a2300022738dabb8e1bbd9d19cfb1e7ab8c30a23b0afbb8d178abcf3022024bf68e256c534ddfaf966bf908deb944305596f7bdcc38d69acad7f9c868724014104174f9eef1157dc1ad5eac198250b70d1c3b04b2fca12ad1483f07358486f02909b088bbc83f4de55f767f6cdf9d424aa02b5eeaffa08394d39b717895fc08d0affffffff0200ea3b43000000001976a914fb32df708f0610901f6d1b6df8c9c368fe0d981c88ac800f1777000000001976a914462c501c70fb996d15ac0771e7fc8d3ca3f7201888ac000000000100000001c67323867de802402e780a70e0deba3c708c4d87497e17590afee9c321f1c680010000008a473044022042734b25f54845d662e6499b75ff8529ff47f42fd224498a9f752d212326dbfa0220523e4b7b570bbb1f3af02baa2c04ea8eb7b0fccb1522cced130b666ae9a9d014014104b5a23b922949877e9eaf7512897ed091958e2e8cf05b0d0eb9064e7976043fde6023b4e2c188b7e38ef94eec6845dc4933f5e8635f1f6a3702290956aa9e284bffffffff0280041838030000001976a91436e5884215f7d3044be5d37bdd8c987d9d942c8488ac404b4c00000000001976a91460085d6838f8a44a21a0de56ff963cfa6242a96188ac00000000")); + FilteredBlock filteredBlock = new FilteredBlock(unitTestParams, HEX.decode("0100000006e533fd1ada86391f3f6c343204b0d278d4aaec1c0b20aa27ba0300000000006abbb3eb3d733a9fe18967fd7d4c117e4ccbbac5bec4d910d900b3ae0793e77f54241b4d4c86041b4089cc9b0c000000084c30b63cfcdc2d35e3329421b9805ef0c6565d35381ca857762ea0b3a5a128bbca5065ff9617cbcba45eb23726df6498a9b9cafed4f54cbab9d227b0035ddefbbb15ac1d57d0182aaee61c74743a9c4f785895e563909bafec45c9a2b0ff3181d77706be8b1dcc91112eada86d424e2d0a8907c3488b6e44fda5a74a25cbc7d6bb4fa04245f4ac8a1a571d5537eac24adca1454d65eda446055479af6c6d4dd3c9ab658448c10b6921b7a4ce3021eb22ed6bb6a7fde1e5bcc4b1db6615c6abc5ca042127bfaf9f44ebce29cb29c6df9d05b47f35b2edff4f0064b578ab741fa78276222651209fe1a2c4c0fa1c58510aec8b090dd1eb1f82f9d261b8273b525b02ff1a")); // Block 100001 assertTrue(block.getHash().equals(new Sha256Hash("00000000000080b66c911bd5ba14a74260057311eaeb1982802f7010f1a9f090"))); @@ -82,37 +82,37 @@ public class FilteredBlockAndPartialMerkleTreeTests extends TestWithPeerGroup { List txHashList = filteredBlock.getTransactionHashes(); assertTrue(txHashList.size() == 4); // Four transactions (0, 1, 2, 6) from block 100001 - Transaction tx0 = new Transaction(unitTestParams, Hex.decode("01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b010dffffffff0100f2052a01000000434104b27f7e9475ccf5d9a431cb86d665b8302c140144ec2397fce792f4a4e7765fecf8128534eaa71df04f93c74676ae8279195128a1506ebf7379d23dab8fca0f63ac00000000")); + Transaction tx0 = new Transaction(unitTestParams, HEX.decode("01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff07044c86041b010dffffffff0100f2052a01000000434104b27f7e9475ccf5d9a431cb86d665b8302c140144ec2397fce792f4a4e7765fecf8128534eaa71df04f93c74676ae8279195128a1506ebf7379d23dab8fca0f63ac00000000")); assertTrue(tx0.getHash().equals(new Sha256Hash("bb28a1a5b3a02e7657a81c38355d56c6f05e80b9219432e3352ddcfc3cb6304c"))); assertEquals(tx0.getHash(), txHashList.get(0)); - Transaction tx1 = new Transaction(unitTestParams, Hex.decode("0100000001d992e5a888a86d4c7a6a69167a4728ee69497509740fc5f456a24528c340219a000000008b483045022100f0519bdc9282ff476da1323b8ef7ffe33f495c1a8d52cc522b437022d83f6a230220159b61d197fbae01b4a66622a23bc3f1def65d5fa24efd5c26fa872f3a246b8e014104839f9023296a1fabb133140128ca2709f6818c7d099491690bd8ac0fd55279def6a2ceb6ab7b5e4a71889b6e739f09509565eec789e86886f6f936fa42097adeffffffff02000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac00e32321000000001976a9140c34f4e29ab5a615d5ea28d4817f12b137d62ed588ac00000000")); + Transaction tx1 = new Transaction(unitTestParams, HEX.decode("0100000001d992e5a888a86d4c7a6a69167a4728ee69497509740fc5f456a24528c340219a000000008b483045022100f0519bdc9282ff476da1323b8ef7ffe33f495c1a8d52cc522b437022d83f6a230220159b61d197fbae01b4a66622a23bc3f1def65d5fa24efd5c26fa872f3a246b8e014104839f9023296a1fabb133140128ca2709f6818c7d099491690bd8ac0fd55279def6a2ceb6ab7b5e4a71889b6e739f09509565eec789e86886f6f936fa42097adeffffffff02000fe208010000001976a914948c765a6914d43f2a7ac177da2c2f6b52de3d7c88ac00e32321000000001976a9140c34f4e29ab5a615d5ea28d4817f12b137d62ed588ac00000000")); assertTrue(tx1.getHash().equals(new Sha256Hash("fbde5d03b027d2b9ba4cf5d4fecab9a99864df2637b25ea4cbcb1796ff6550ca"))); assertEquals(tx1.getHash(), txHashList.get(1)); - Transaction tx2 = new Transaction(unitTestParams, Hex.decode("01000000059daf0abe7a92618546a9dbcfd65869b6178c66ec21ccfda878c1175979cfd9ef000000004a493046022100c2f7f25be5de6ce88ac3c1a519514379e91f39b31ddff279a3db0b1a229b708b022100b29efbdbd9837cc6a6c7318aa4900ed7e4d65662c34d1622a2035a3a5534a99a01ffffffffd516330ebdf075948da56db13d22632a4fb941122df2884397dda45d451acefb0000000048473044022051243debe6d4f2b433bee0cee78c5c4073ead0e3bde54296dbed6176e128659c022044417bfe16f44eb7b6eb0cdf077b9ce972a332e15395c09ca5e4f602958d266101ffffffffe1f5aa33961227b3c344e57179417ce01b7ccd421117fe2336289b70489883f900000000484730440220593252bb992ce3c85baf28d6e3aa32065816271d2c822398fe7ee28a856bc943022066d429dd5025d3c86fd8fd8a58e183a844bd94aa312cefe00388f57c85b0ca3201ffffffffe207e83718129505e6a7484831442f668164ae659fddb82e9e5421a081fb90d50000000049483045022067cf27eb733e5bcae412a586b25a74417c237161a084167c2a0b439abfebdcb2022100efcc6baa6824b4c5205aa967e0b76d31abf89e738d4b6b014e788c9a8cccaf0c01ffffffffe23b8d9d80a9e9d977fab3c94dbe37befee63822443c3ec5ae5a713ede66c3940000000049483045022020f2eb35036666b1debe0d1d2e77a36d5d9c4e96c1dba23f5100f193dbf524790221008ce79bc1321fb4357c6daee818038d41544749127751726e46b2b320c8b565a201ffffffff0200ba1dd2050000001976a914366a27645806e817a6cd40bc869bdad92fe5509188ac40420f00000000001976a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac00000000")); + Transaction tx2 = new Transaction(unitTestParams, HEX.decode("01000000059daf0abe7a92618546a9dbcfd65869b6178c66ec21ccfda878c1175979cfd9ef000000004a493046022100c2f7f25be5de6ce88ac3c1a519514379e91f39b31ddff279a3db0b1a229b708b022100b29efbdbd9837cc6a6c7318aa4900ed7e4d65662c34d1622a2035a3a5534a99a01ffffffffd516330ebdf075948da56db13d22632a4fb941122df2884397dda45d451acefb0000000048473044022051243debe6d4f2b433bee0cee78c5c4073ead0e3bde54296dbed6176e128659c022044417bfe16f44eb7b6eb0cdf077b9ce972a332e15395c09ca5e4f602958d266101ffffffffe1f5aa33961227b3c344e57179417ce01b7ccd421117fe2336289b70489883f900000000484730440220593252bb992ce3c85baf28d6e3aa32065816271d2c822398fe7ee28a856bc943022066d429dd5025d3c86fd8fd8a58e183a844bd94aa312cefe00388f57c85b0ca3201ffffffffe207e83718129505e6a7484831442f668164ae659fddb82e9e5421a081fb90d50000000049483045022067cf27eb733e5bcae412a586b25a74417c237161a084167c2a0b439abfebdcb2022100efcc6baa6824b4c5205aa967e0b76d31abf89e738d4b6b014e788c9a8cccaf0c01ffffffffe23b8d9d80a9e9d977fab3c94dbe37befee63822443c3ec5ae5a713ede66c3940000000049483045022020f2eb35036666b1debe0d1d2e77a36d5d9c4e96c1dba23f5100f193dbf524790221008ce79bc1321fb4357c6daee818038d41544749127751726e46b2b320c8b565a201ffffffff0200ba1dd2050000001976a914366a27645806e817a6cd40bc869bdad92fe5509188ac40420f00000000001976a914ee8bd501094a7d5ca318da2506de35e1cb025ddc88ac00000000")); assertTrue(tx2.getHash().equals(new Sha256Hash("8131ffb0a2c945ecaf9b9063e59558784f9c3a74741ce6ae2a18d0571dac15bb"))); assertEquals(tx2.getHash(), txHashList.get(2)); - Transaction tx3 = new Transaction(unitTestParams, Hex.decode("01000000011b56cf3aab3286d582c055a42af3a911ee08423f276da702bb67f1222ac1a5b6000000008c4930460221009e9fba682e162c9627b96b7df272006a727988680b956c61baff869f0907b8fb022100a9c19adc7c36144bafe526630783845e5cb9554d30d3edfb56f0740274d507f30141046e0efbfac7b1615ad553a6f097615bc63b7cdb3b8e1cb3263b619ba63740012f51c7c5b09390e3577e377b7537e61226e315f95f926444fc5e5f2978c112e448ffffffff02c0072b11010000001976a914b73e9e01933351ca076faf8e0d94dd58079d0b1f88ac80b63908000000001976a9141aca0bdf0d2cee63db19aa4a484f45a4e26a880c88ac00000000")); + Transaction tx3 = new Transaction(unitTestParams, HEX.decode("01000000011b56cf3aab3286d582c055a42af3a911ee08423f276da702bb67f1222ac1a5b6000000008c4930460221009e9fba682e162c9627b96b7df272006a727988680b956c61baff869f0907b8fb022100a9c19adc7c36144bafe526630783845e5cb9554d30d3edfb56f0740274d507f30141046e0efbfac7b1615ad553a6f097615bc63b7cdb3b8e1cb3263b619ba63740012f51c7c5b09390e3577e377b7537e61226e315f95f926444fc5e5f2978c112e448ffffffff02c0072b11010000001976a914b73e9e01933351ca076faf8e0d94dd58079d0b1f88ac80b63908000000001976a9141aca0bdf0d2cee63db19aa4a484f45a4e26a880c88ac00000000")); assertTrue(tx3.getHash().equals(new Sha256Hash("c5abc61566dbb1c4bce5e1fda7b66bed22eb2130cea4b721690bc1488465abc9"))); assertEquals(tx3.getHash(),txHashList.get(3)); // A wallet which contains a pubkey used in each transaction from above Wallet wallet = new Wallet(unitTestParams); - wallet.importKey(ECKey.fromPublicOnly(Hex.decode("04b27f7e9475ccf5d9a431cb86d665b8302c140144ec2397fce792f4a4e7765fecf8128534eaa71df04f93c74676ae8279195128a1506ebf7379d23dab8fca0f63"))); - wallet.importKey(ECKey.fromPublicOnly(Hex.decode("04732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ec"))); - wallet.importKey(ECKey.fromPublicOnly(Hex.decode("04cfb4113b3387637131ebec76871fd2760fc430dd16de0110f0eb07bb31ffac85e2607c189cb8582ea1ccaeb64ffd655409106589778f3000fdfe3263440b0350"))); - wallet.importKey(ECKey.fromPublicOnly(Hex.decode("04b2f30018908a59e829c1534bfa5010d7ef7f79994159bba0f534d863ef9e4e973af6a8de20dc41dbea50bc622263ec8a770b2c9406599d39e4c9afe61f8b1613"))); + wallet.importKey(ECKey.fromPublicOnly(HEX.decode("04b27f7e9475ccf5d9a431cb86d665b8302c140144ec2397fce792f4a4e7765fecf8128534eaa71df04f93c74676ae8279195128a1506ebf7379d23dab8fca0f63"))); + wallet.importKey(ECKey.fromPublicOnly(HEX.decode("04732012cb962afa90d31b25d8fb0e32c94e513ab7a17805c14ca4c3423e18b4fb5d0e676841733cb83abaf975845c9f6f2a8097b7d04f4908b18368d6fc2d68ec"))); + wallet.importKey(ECKey.fromPublicOnly(HEX.decode("04cfb4113b3387637131ebec76871fd2760fc430dd16de0110f0eb07bb31ffac85e2607c189cb8582ea1ccaeb64ffd655409106589778f3000fdfe3263440b0350"))); + wallet.importKey(ECKey.fromPublicOnly(HEX.decode("04b2f30018908a59e829c1534bfa5010d7ef7f79994159bba0f534d863ef9e4e973af6a8de20dc41dbea50bc622263ec8a770b2c9406599d39e4c9afe61f8b1613"))); BloomFilter filter = wallet.getBloomFilter(wallet.getKeychainSize()*2, 0.001, 0xDEADBEEF); // Compare the serialized bloom filter to a known-good value - assertTrue(Arrays.equals(filter.bitcoinSerialize(), Hex.decode("0e1b091ca195e45a9164889b6bc46a09000000efbeadde02"))); + assertTrue(Arrays.equals(filter.bitcoinSerialize(), HEX.decode("0e1b091ca195e45a9164889b6bc46a09000000efbeadde02"))); // Cheat and place the previous block (block 100000) at the head of the block store without supporting blocks blockStore = new MemoryBlockStore(UnitTestParams.get()); - blockStore.put(new StoredBlock(new Block(unitTestParams, Hex.decode("0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b5710")), + blockStore.put(new StoredBlock(new Block(unitTestParams, HEX.decode("0100000050120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd00200000000006657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f337221b4d4c86041b0f2b5710")), BigInteger.valueOf(1), 100000)); blockStore.setChainHead(blockStore.get(new Sha256Hash("000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506"))); super.setUp(blockStore); diff --git a/core/src/test/java/com/google/bitcoin/core/LazyParseByteCacheTest.java b/core/src/test/java/com/google/bitcoin/core/LazyParseByteCacheTest.java index 48d79bf6..3756f26b 100644 --- a/core/src/test/java/com/google/bitcoin/core/LazyParseByteCacheTest.java +++ b/core/src/test/java/com/google/bitcoin/core/LazyParseByteCacheTest.java @@ -23,44 +23,44 @@ import com.google.bitcoin.store.BlockStore; import com.google.bitcoin.store.MemoryBlockStore; import org.junit.Before; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.io.ByteArrayOutputStream; import java.nio.ByteBuffer; import java.util.Arrays; import static com.google.bitcoin.core.Coin.*; +import static com.google.bitcoin.core.Utils.HEX; import static com.google.bitcoin.testing.FakeTxBuilder.createFakeBlock; import static com.google.bitcoin.testing.FakeTxBuilder.createFakeTx; import static org.junit.Assert.*; public class LazyParseByteCacheTest { - private final byte[] txMessage = Hex.decode( - "F9 BE B4 D9 74 78 00 00 00 00 00 00 00 00 00 00" + - "02 01 00 00 E2 93 CD BE 01 00 00 00 01 6D BD DB" + - "08 5B 1D 8A F7 51 84 F0 BC 01 FA D5 8D 12 66 E9" + - "B6 3B 50 88 19 90 E4 B4 0D 6A EE 36 29 00 00 00" + - "00 8B 48 30 45 02 21 00 F3 58 1E 19 72 AE 8A C7" + - "C7 36 7A 7A 25 3B C1 13 52 23 AD B9 A4 68 BB 3A" + - "59 23 3F 45 BC 57 83 80 02 20 59 AF 01 CA 17 D0" + - "0E 41 83 7A 1D 58 E9 7A A3 1B AE 58 4E DE C2 8D" + - "35 BD 96 92 36 90 91 3B AE 9A 01 41 04 9C 02 BF" + - "C9 7E F2 36 CE 6D 8F E5 D9 40 13 C7 21 E9 15 98" + - "2A CD 2B 12 B6 5D 9B 7D 59 E2 0A 84 20 05 F8 FC" + - "4E 02 53 2E 87 3D 37 B9 6F 09 D6 D4 51 1A DA 8F" + - "14 04 2F 46 61 4A 4C 70 C0 F1 4B EF F5 FF FF FF" + - "FF 02 40 4B 4C 00 00 00 00 00 19 76 A9 14 1A A0" + - "CD 1C BE A6 E7 45 8A 7A BA D5 12 A9 D9 EA 1A FB" + - "22 5E 88 AC 80 FA E9 C7 00 00 00 00 19 76 A9 14" + - "0E AB 5B EA 43 6A 04 84 CF AB 12 48 5E FD A0 B7" + - "8B 4E CC 52 88 AC 00 00 00 00"); + private final byte[] txMessage = HEX.withSeparator(" ", 2).decode( + "f9 be b4 d9 74 78 00 00 00 00 00 00 00 00 00 00" + + "02 01 00 00 e2 93 cd be 01 00 00 00 01 6d bd db" + + "08 5b 1d 8a f7 51 84 f0 bc 01 fa d5 8d 12 66 e9" + + "b6 3b 50 88 19 90 e4 b4 0d 6a ee 36 29 00 00 00" + + "00 8b 48 30 45 02 21 00 f3 58 1e 19 72 ae 8a c7" + + "c7 36 7a 7a 25 3b c1 13 52 23 ad b9 a4 68 bb 3a" + + "59 23 3f 45 bc 57 83 80 02 20 59 af 01 ca 17 d0" + + "0e 41 83 7a 1d 58 e9 7a a3 1b ae 58 4e de c2 8d" + + "35 bd 96 92 36 90 91 3b ae 9a 01 41 04 9c 02 bf" + + "c9 7e f2 36 ce 6d 8f e5 d9 40 13 c7 21 e9 15 98" + + "2a cd 2b 12 b6 5d 9b 7d 59 e2 0a 84 20 05 f8 fc" + + "4e 02 53 2e 87 3d 37 b9 6f 09 d6 d4 51 1a da 8f" + + "14 04 2f 46 61 4a 4c 70 c0 f1 4b ef f5 ff ff ff" + + "ff 02 40 4b 4c 00 00 00 00 00 19 76 a9 14 1a a0" + + "cd 1c be a6 e7 45 8a 7a ba d5 12 a9 d9 ea 1a fb" + + "22 5e 88 ac 80 fa e9 c7 00 00 00 00 19 76 a9 14" + + "0e ab 5b ea 43 6a 04 84 cf ab 12 48 5e fd a0 b7" + + "8b 4e cc 52 88 ac 00 00 00 00"); - private final byte[] txMessagePart = Hex.decode( - "08 5B 1D 8A F7 51 84 F0 BC 01 FA D5 8D 12 66 E9" + - "B6 3B 50 88 19 90 E4 B4 0D 6A EE 36 29 00 00 00" + - "00 8B 48 30 45 02 21 00 F3 58 1E 19 72 AE 8A C7" + - "C7 36 7A 7A 25 3B C1 13 52 23 AD B9 A4 68 BB 3A"); + private final byte[] txMessagePart = HEX.withSeparator(" ", 2).decode( + "08 5b 1d 8a f7 51 84 f0 bc 01 fa d5 8d 12 66 e9" + + "b6 3b 50 88 19 90 e4 b4 0d 6a ee 36 29 00 00 00" + + "00 8b 48 30 45 02 21 00 f3 58 1e 19 72 ae 8a c7" + + "c7 36 7a 7a 25 3b c1 13 52 23 ad b9 a4 68 bb 3a"); private Wallet wallet; private BlockStore blockStore; diff --git a/core/src/test/java/com/google/bitcoin/core/PeerAddressTest.java b/core/src/test/java/com/google/bitcoin/core/PeerAddressTest.java index 60af6211..a1efacde 100644 --- a/core/src/test/java/com/google/bitcoin/core/PeerAddressTest.java +++ b/core/src/test/java/com/google/bitcoin/core/PeerAddressTest.java @@ -19,10 +19,10 @@ package com.google.bitcoin.core; import com.google.bitcoin.params.MainNetParams; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.net.InetAddress; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.assertEquals; public class PeerAddressTest @@ -32,7 +32,7 @@ public class PeerAddressTest // copied verbatim from https://en.bitcoin.it/wiki/Protocol_specification#Network_address String fromSpec = "010000000000000000000000000000000000ffff0a000001208d"; PeerAddress pa = new PeerAddress(MainNetParams.get(), - Hex.decode(fromSpec), 0, 0); + HEX.decode(fromSpec), 0, 0); String reserialized = Utils.HEX.encode(pa.bitcoinSerialize()); assertEquals(reserialized,fromSpec ); } diff --git a/core/src/test/java/com/google/bitcoin/core/VersionMessageTest.java b/core/src/test/java/com/google/bitcoin/core/VersionMessageTest.java index 473ddc0e..d03f64f8 100644 --- a/core/src/test/java/com/google/bitcoin/core/VersionMessageTest.java +++ b/core/src/test/java/com/google/bitcoin/core/VersionMessageTest.java @@ -1,9 +1,26 @@ +/* + * Copyright 2012 Matt Corallo + * Copyright 2014 Andreas Schildbach + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.bitcoin.core; import com.google.bitcoin.params.UnitTestParams; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.assertTrue; public class VersionMessageTest { @@ -12,22 +29,22 @@ public class VersionMessageTest { public void testDecode() throws Exception { NetworkParameters params = UnitTestParams.get(); - VersionMessage ver = new VersionMessage(params, Hex.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000172f426974436f696e4a3a302e372d534e415053484f542f0004000000")); + VersionMessage ver = new VersionMessage(params, HEX.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000172f426974436f696e4a3a302e372d534e415053484f542f0004000000")); assertTrue(!ver.relayTxesBeforeFilter); assertTrue(ver.bestHeight == 1024); assertTrue(ver.subVer.equals("/BitCoinJ:0.7-SNAPSHOT/")); - ver = new VersionMessage(params, Hex.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000172f426974436f696e4a3a302e372d534e415053484f542f00040000")); + ver = new VersionMessage(params, HEX.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000172f426974436f696e4a3a302e372d534e415053484f542f00040000")); assertTrue(ver.relayTxesBeforeFilter); assertTrue(ver.bestHeight == 1024); assertTrue(ver.subVer.equals("/BitCoinJ:0.7-SNAPSHOT/")); - ver = new VersionMessage(params, Hex.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000172f426974436f696e4a3a302e372d534e415053484f542f")); + ver = new VersionMessage(params, HEX.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000172f426974436f696e4a3a302e372d534e415053484f542f")); assertTrue(ver.relayTxesBeforeFilter); assertTrue(ver.bestHeight == 0); assertTrue(ver.subVer.equals("/BitCoinJ:0.7-SNAPSHOT/")); - ver = new VersionMessage(params, Hex.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000")); + ver = new VersionMessage(params, HEX.decode("71110100000000000000000048e5e95000000000000000000000000000000000000000000000ffff7f000001479d000000000000000000000000000000000000ffff7f000001479d0000000000000000")); assertTrue(ver.relayTxesBeforeFilter); assertTrue(ver.bestHeight == 0); assertTrue(ver.subVer.equals("")); 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 3d39e593..b647d96d 100644 --- a/core/src/test/java/com/google/bitcoin/core/WalletTest.java +++ b/core/src/test/java/com/google/bitcoin/core/WalletTest.java @@ -41,7 +41,6 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongycastle.crypto.params.KeyParameter; -import org.spongycastle.util.encoders.Hex; import java.io.File; import java.io.IOException; @@ -58,6 +57,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import static com.google.bitcoin.core.Coin.*; +import static com.google.bitcoin.core.Utils.HEX; import static com.google.bitcoin.testing.FakeTxBuilder.*; import static com.google.common.base.Preconditions.checkNotNull; import static org.junit.Assert.*; @@ -108,7 +108,7 @@ public class WalletTest extends TestWithWallet { @Test public void basicSpendingToP2SH() throws Exception { - Address destination = new Address(params, params.getP2SHHeader(), Hex.decode("4a22c3c4cbb31e4d03b15550636762bda0baf85a")); + Address destination = new Address(params, params.getP2SHHeader(), HEX.decode("4a22c3c4cbb31e4d03b15550636762bda0baf85a")); basicSpendingCommon(wallet, myAddress, destination, false); } diff --git a/core/src/test/java/com/google/bitcoin/crypto/BIP32Test.java b/core/src/test/java/com/google/bitcoin/crypto/BIP32Test.java index 315c736a..8419ffd6 100644 --- a/core/src/test/java/com/google/bitcoin/crypto/BIP32Test.java +++ b/core/src/test/java/com/google/bitcoin/crypto/BIP32Test.java @@ -1,5 +1,6 @@ /** * Copyright 2013 Matija Mazi. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,11 +25,11 @@ import com.google.common.collect.Iterables; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.spongycastle.util.encoders.Hex; import java.util.Arrays; import java.util.List; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.assertEquals; /** @@ -127,7 +128,7 @@ public class BIP32Test { private void testVector(int testCase) throws AddressFormatException { log.info("======= Test vector {}", testCase); HDWTestVector tv = tvs[testCase]; - DeterministicKey masterPrivateKey = HDKeyDerivation.createMasterPrivateKey(Hex.decode(tv.seed)); + DeterministicKey masterPrivateKey = HDKeyDerivation.createMasterPrivateKey(HEX.decode(tv.seed)); assertEquals(testEncode(tv.priv), testEncode(masterPrivateKey.serializePrivB58())); assertEquals(testEncode(tv.pub), testEncode(masterPrivateKey.serializePubB58())); DeterministicHierarchy dh = new DeterministicHierarchy(masterPrivateKey); @@ -143,7 +144,7 @@ public class BIP32Test { } private String testEncode(String what) throws AddressFormatException { - return new String(Hex.encode(Base58.decodeChecked(what))); + return new String(HEX.encode(Base58.decodeChecked(what))); } static class HDWTestVector { diff --git a/core/src/test/java/com/google/bitcoin/crypto/ChildKeyDerivationTest.java b/core/src/test/java/com/google/bitcoin/crypto/ChildKeyDerivationTest.java index 97d2f8b6..e008c3c3 100644 --- a/core/src/test/java/com/google/bitcoin/crypto/ChildKeyDerivationTest.java +++ b/core/src/test/java/com/google/bitcoin/crypto/ChildKeyDerivationTest.java @@ -1,5 +1,6 @@ /** * Copyright 2013 Matija Mazi. + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +21,8 @@ import com.google.bitcoin.core.ECKey; import com.google.bitcoin.core.Sha256Hash; import org.junit.Test; import org.spongycastle.crypto.params.KeyParameter; -import org.spongycastle.util.encoders.Hex; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.*; /** @@ -50,9 +51,9 @@ public class ChildKeyDerivationTest { }; for(int i = 0; i < 1; i++) { - byte[] priv = Hex.decode(ckdTestVectors[3 * i]); - byte[] pub = Hex.decode(ckdTestVectors[3 * i + 1]); - byte[] chain = Hex.decode(ckdTestVectors[3 * i + 2]); // chain code + byte[] priv = HEX.decode(ckdTestVectors[3 * i]); + byte[] pub = HEX.decode(ckdTestVectors[3 * i + 1]); + byte[] chain = HEX.decode(ckdTestVectors[3 * i + 2]); // chain code ////////////////////////////////////////////////////////////////////////// // Start with an extended PRIVATE key @@ -184,10 +185,6 @@ public class ChildKeyDerivationTest { } private static String hexEncodePub(DeterministicKey pubKey) { - return hexEncode(pubKey.getPubKey()); - } - - private static String hexEncode(byte[] bytes) { - return new String(Hex.encode(bytes)); + return HEX.encode(pubKey.getPubKey()); } } diff --git a/core/src/test/java/com/google/bitcoin/crypto/HDUtilsTest.java b/core/src/test/java/com/google/bitcoin/crypto/HDUtilsTest.java index a624be80..7bfbf0ad 100644 --- a/core/src/test/java/com/google/bitcoin/crypto/HDUtilsTest.java +++ b/core/src/test/java/com/google/bitcoin/crypto/HDUtilsTest.java @@ -1,8 +1,26 @@ +/* + * Copyright 2013 Matija Mazi + * Copyright 2014 Andreas Schildbach + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.google.bitcoin.crypto; import org.junit.Assert; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; + +import static com.google.bitcoin.core.Utils.HEX; /** * @author Matija Mazi
@@ -98,12 +116,12 @@ public class HDUtilsTest { } private static byte[] getBytes(String[] hmacTestVectors, int i) { - return Hex.decode(hmacTestVectors[i]); + return HEX.decode(hmacTestVectors[i]); } @Test public void testLongToByteArray() throws Exception { byte[] bytes = HDUtils.longTo4ByteArray(1026); - Assert.assertEquals("00000402", new String(Hex.encode(bytes))); + Assert.assertEquals("00000402", new String(HEX.encode(bytes))); } } diff --git a/core/src/test/java/com/google/bitcoin/crypto/MnemonicCodeTest.java b/core/src/test/java/com/google/bitcoin/crypto/MnemonicCodeTest.java index 074547b8..803d4360 100644 --- a/core/src/test/java/com/google/bitcoin/crypto/MnemonicCodeTest.java +++ b/core/src/test/java/com/google/bitcoin/crypto/MnemonicCodeTest.java @@ -1,5 +1,6 @@ /* * Copyright 2013 Ken Sedgwick + * Copyright 2014 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,13 +20,13 @@ package com.google.bitcoin.crypto; import com.google.common.base.Joiner; import org.junit.Before; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static com.google.bitcoin.core.Utils.HEX; import static org.junit.Assert.assertEquals; public class MnemonicCodeTest { @@ -164,19 +165,19 @@ public class MnemonicCodeTest { String vecCode = vectors[ii+1]; String vecSeed = vectors[ii+2]; - List code = mc.toMnemonic(Hex.decode(vecData)); + List code = mc.toMnemonic(HEX.decode(vecData)); byte[] seed = MnemonicCode.toSeed(code, "TREZOR"); byte[] entropy = mc.toEntropy(split(vecCode)); - assertEquals(vecData, new String(Hex.encode(entropy))); + assertEquals(vecData, new String(HEX.encode(entropy))); assertEquals(vecCode, Joiner.on(' ').join(code)); - assertEquals(vecSeed, new String(Hex.encode(seed))); + assertEquals(vecSeed, new String(HEX.encode(seed))); } } @Test(expected = MnemonicException.MnemonicLengthException.class) public void testBadEntropyLength() throws Exception { - byte[] entropy = Hex.decode("7f7f7f7f7f7f7f7f7f7f7f7f7f7f"); + byte[] entropy = HEX.decode("7f7f7f7f7f7f7f7f7f7f7f7f7f7f"); mc.toMnemonic(entropy); } diff --git a/core/src/test/java/com/google/bitcoin/script/ScriptTest.java b/core/src/test/java/com/google/bitcoin/script/ScriptTest.java index 1c40a375..7334a1ac 100644 --- a/core/src/test/java/com/google/bitcoin/script/ScriptTest.java +++ b/core/src/test/java/com/google/bitcoin/script/ScriptTest.java @@ -29,7 +29,6 @@ import org.hamcrest.core.IsEqual; import org.hamcrest.core.IsNot; import org.junit.Assert; import org.junit.Test; -import org.spongycastle.util.encoders.Hex; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -41,13 +40,14 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; +import static com.google.bitcoin.core.Utils.HEX; import static com.google.bitcoin.script.ScriptOpCodes.OP_INVALIDOPCODE; import static org.junit.Assert.*; public class ScriptTest { // From tx 05e04c26c12fe408a3c1b71aa7996403f6acad1045252b1c62e055496f4d2cb1 on the testnet. - static final String sigProg = "473 04402202b4da291cc39faf8433911988f9f49fc5c995812ca2f94db61468839c228c3e90220628bff3ff32ec95825092fa051cba28558a981fcf59ce184b14f2e215e69106701410414b38f4be3bb9fa0f4f32b74af07152b2f2f630bc02122a491137b6c523e46f18a0d5034418966f93dfc37cc3739ef7b2007213a302b7fba161557f4ad644a1c"; + static final String sigProg = "47304402202b4da291cc39faf8433911988f9f49fc5c995812ca2f94db61468839c228c3e90220628bff3ff32ec95825092fa051cba28558a981fcf59ce184b14f2e215e69106701410414b38f4be3bb9fa0f4f32b74af07152b2f2f630bc02122a491137b6c523e46f18a0d5034418966f93dfc37cc3739ef7b2007213a302b7fba161557f4ad644a1c"; static final String pubkeyProg = "76a91433e81a941e64cda12c6a299ed322ddbdd03f8d0e88ac"; @@ -56,7 +56,7 @@ public class ScriptTest { @Test public void testScriptSig() throws Exception { - byte[] sigProgBytes = Hex.decode(sigProg); + byte[] sigProgBytes = HEX.decode(sigProg); Script script = new Script(sigProgBytes); // Test we can extract the from address. byte[] hash160 = Utils.sha256hash160(script.getPubKey()); @@ -67,7 +67,7 @@ public class ScriptTest { @Test public void testScriptPubKey() throws Exception { // Check we can extract the to address - byte[] pubkeyBytes = Hex.decode(pubkeyProg); + byte[] pubkeyBytes = HEX.decode(pubkeyProg); Script pubkey = new Script(pubkeyBytes); assertEquals("DUP HASH160 PUSHDATA(20)[33e81a941e64cda12c6a299ed322ddbdd03f8d0e] EQUALVERIFY CHECKSIG", pubkey.toString()); Address toAddr = new Address(params, pubkey.getPubKeyHash()); @@ -104,7 +104,7 @@ public class ScriptTest { @Test public void testIp() throws Exception { - byte[] bytes = Hex.decode("41043e96222332ea7848323c08116dddafbfa917b8e37f0bdf63841628267148588a09a43540942d58d49717ad3fabfe14978cf4f0a8b84d2435dad16e9aa4d7f935ac"); + byte[] bytes = HEX.decode("41043e96222332ea7848323c08116dddafbfa917b8e37f0bdf63841628267148588a09a43540942d58d49717ad3fabfe14978cf4f0a8b84d2435dad16e9aa4d7f935ac"); Script s = new Script(bytes); assertTrue(s.isSentToRawPubKey()); } @@ -116,7 +116,7 @@ public class ScriptTest { ECKey key2 = new DumpedPrivateKey(params, "cTine92s8GLpVqvebi8rYce3FrUYq78ZGQffBYCS1HmDPJdSTxUo").getKey(); ECKey key3 = new DumpedPrivateKey(params, "cVHwXSPRZmL9adctwBwmn4oTZdZMbaCsR5XF6VznqMgcvt1FDDxg").getKey(); Script multisigScript = ScriptBuilder.createMultiSigOutputScript(2, Arrays.asList(key1, key2, key3)); - byte[] bytes = Hex.decode("01000000013df681ff83b43b6585fa32dd0e12b0b502e6481e04ee52ff0fdaf55a16a4ef61000000006b483045022100a84acca7906c13c5895a1314c165d33621cdcf8696145080895cbf301119b7cf0220730ff511106aa0e0a8570ff00ee57d7a6f24e30f592a10cae1deffac9e13b990012102b8d567bcd6328fd48a429f9cf4b315b859a58fd28c5088ef3cb1d98125fc4e8dffffffff02364f1c00000000001976a91439a02793b418de8ec748dd75382656453dc99bcb88ac40420f000000000017a9145780b80be32e117f675d6e0ada13ba799bf248e98700000000"); + byte[] bytes = HEX.decode("01000000013df681ff83b43b6585fa32dd0e12b0b502e6481e04ee52ff0fdaf55a16a4ef61000000006b483045022100a84acca7906c13c5895a1314c165d33621cdcf8696145080895cbf301119b7cf0220730ff511106aa0e0a8570ff00ee57d7a6f24e30f592a10cae1deffac9e13b990012102b8d567bcd6328fd48a429f9cf4b315b859a58fd28c5088ef3cb1d98125fc4e8dffffffff02364f1c00000000001976a91439a02793b418de8ec748dd75382656453dc99bcb88ac40420f000000000017a9145780b80be32e117f675d6e0ada13ba799bf248e98700000000"); Transaction transaction = new Transaction(params, bytes); TransactionOutput output = transaction.getOutput(1); Transaction spendTx = new Transaction(params); @@ -170,7 +170,7 @@ public class ScriptTest { Script.writeBytes(out, Utils.reverseBytes(Utils.encodeMPI(BigInteger.valueOf(val), false))); } else if (w.matches("^0x[0-9a-fA-F]*$")) { // Raw hex data, inserted NOT pushed onto stack: - out.write(Hex.decode(w.substring(2))); + out.write(HEX.decode(w.substring(2).toLowerCase())); } else if (w.length() >= 2 && w.startsWith("'") && w.endsWith("'")) { // Single-quoted string, pushed as data. NOTE: this is poor-man's // parsing, spaces/tabs/newlines in single-quoted strings won't work. @@ -383,12 +383,11 @@ public class ScriptTest { String hash = input.list.get(0).string; int index = input.list.get(1).integer; String script = input.list.get(2).string; - Sha256Hash sha256Hash = new Sha256Hash(Hex.decode(hash.getBytes(Charset.forName("UTF-8")))); + Sha256Hash sha256Hash = new Sha256Hash(HEX.decode(hash)); scriptPubKeys.put(new TransactionOutPoint(params, index, sha256Hash), parseScriptString(script)); } - byte[] bytes = tx.get(0).list.get(1).string.getBytes(Charset.forName("UTF-8")); - transaction = new Transaction(params, Hex.decode(bytes)); + transaction = new Transaction(params, HEX.decode(tx.get(0).list.get(1).string.toLowerCase())); boolean enforceP2SH = tx.get(0).list.get(2).booleanValue; assertTrue(tx.get(0).list.get(2).isBoolean()); @@ -440,12 +439,11 @@ public class ScriptTest { String hash = input.list.get(0).string; int index = input.list.get(1).integer; String script = input.list.get(2).string; - Sha256Hash sha256Hash = new Sha256Hash(Hex.decode(hash.getBytes(Charset.forName("UTF-8")))); + Sha256Hash sha256Hash = new Sha256Hash(HEX.decode(hash)); scriptPubKeys.put(new TransactionOutPoint(params, index, sha256Hash), parseScriptString(script)); } - byte[] bytes = tx.get(0).list.get(1).string.getBytes(Charset.forName("UTF-8")); - Transaction transaction = new Transaction(params, Hex.decode(bytes)); + Transaction transaction = new Transaction(params, HEX.decode(tx.get(0).list.get(1).string)); boolean enforceP2SH = tx.get(0).list.get(2).booleanValue; assertTrue(tx.get(0).list.get(2).isBoolean());