diff --git a/core/src/main/java/org/bitcoinj/script/Script.java b/core/src/main/java/org/bitcoinj/script/Script.java index 892cd151..a9d16a61 100644 --- a/core/src/main/java/org/bitcoinj/script/Script.java +++ b/core/src/main/java/org/bitcoinj/script/Script.java @@ -233,7 +233,7 @@ public class Script { * useful more exotic types of transaction, but today most payments are to addresses. */ public boolean isSentToRawPubKey() { - return ScriptPattern.isPayToPubKey(chunks); + return ScriptPattern.isPayToPubKey(this); } /** @@ -243,7 +243,7 @@ public class Script { * way to make payments due to the short and recognizable base58 form addresses come in. */ public boolean isSentToAddress() { - return ScriptPattern.isPayToPubKeyHash(chunks); + return ScriptPattern.isPayToPubKeyHash(this); } /** @@ -680,18 +680,18 @@ public class Script { * Bitcoin system).

*/ public boolean isPayToScriptHash() { - return ScriptPattern.isPayToScriptHash(chunks); + return ScriptPattern.isPayToScriptHash(this); } /** * Returns whether this script matches the format used for multisig outputs: [n] [keys...] [m] CHECKMULTISIG */ public boolean isSentToMultiSig() { - return ScriptPattern.isSentToMultisig(chunks); + return ScriptPattern.isSentToMultisig(this); } public boolean isSentToCLTVPaymentChannel() { - return ScriptPattern.isSentToCltvPaymentChannel(chunks); + return ScriptPattern.isSentToCltvPaymentChannel(this); } private static boolean equalsRange(byte[] a, int start, byte[] b) { @@ -804,7 +804,7 @@ public class Script { } public boolean isOpReturn() { - return ScriptPattern.isOpReturn(chunks); + return ScriptPattern.isOpReturn(this); } /** diff --git a/core/src/main/java/org/bitcoinj/script/ScriptPattern.java b/core/src/main/java/org/bitcoinj/script/ScriptPattern.java index d46f6010..92d86f63 100644 --- a/core/src/main/java/org/bitcoinj/script/ScriptPattern.java +++ b/core/src/main/java/org/bitcoinj/script/ScriptPattern.java @@ -1,5 +1,6 @@ /* * Copyright 2017 John L. Jegutanis + * Copyright 2018 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +28,8 @@ import static org.bitcoinj.script.ScriptOpCodes.*; * This is a Script pattern matcher with some typical script patterns */ public class ScriptPattern { - public static boolean isPayToPubKeyHash(List chunks) { + public static boolean isPayToPubKeyHash(Script script) { + List chunks = script.chunks; return chunks.size() == 5 && chunks.get(0).equalsOpCode(OP_DUP) && chunks.get(1).equalsOpCode(OP_HASH160) && @@ -37,7 +39,8 @@ public class ScriptPattern { chunks.get(4).equalsOpCode(OP_CHECKSIG); } - public static boolean isPayToScriptHash(List chunks) { + public static boolean isPayToScriptHash(Script script) { + List chunks = script.chunks; // We check for the effective serialized form because BIP16 defines a P2SH output using an exact byte // template, not the logical program structure. Thus you can have two programs that look identical when // printed out but one is a P2SH script and the other isn't! :( @@ -51,7 +54,8 @@ public class ScriptPattern { chunks.get(2).equalsOpCode(OP_EQUAL); } - public static boolean isPayToPubKey(List chunks) { + public static boolean isPayToPubKey(Script script) { + List chunks = script.chunks; return chunks.size() == 2 && chunks.get(1).equalsOpCode(OP_CHECKSIG) && !chunks.get(0).isOpCode() && @@ -59,7 +63,8 @@ public class ScriptPattern { chunks.get(0).data.length > 1; } - public static boolean isSentToMultisig(List chunks) { + public static boolean isSentToMultisig(Script script) { + List chunks = script.chunks; if (chunks.size() < 4) return false; ScriptChunk chunk = chunks.get(chunks.size() - 1); // Must end in OP_CHECKMULTISIG[VERIFY]. @@ -82,7 +87,8 @@ public class ScriptPattern { return true; } - public static boolean isSentToCltvPaymentChannel(List chunks) { + public static boolean isSentToCltvPaymentChannel(Script script) { + List chunks = script.chunks; if (chunks.size() != 10) return false; // Check that opcodes match the pre-determined format. if (!chunks.get(0).equalsOpCode(OP_IF)) return false; @@ -98,7 +104,8 @@ public class ScriptPattern { return true; } - public static boolean isOpReturn(List chunks) { + public static boolean isOpReturn(Script script) { + List chunks = script.chunks; return chunks.size() > 0 && chunks.get(0).equalsOpCode(ScriptOpCodes.OP_RETURN); } } diff --git a/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java b/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java index bb1525e5..b42f5528 100644 --- a/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java +++ b/core/src/test/java/org/bitcoinj/script/ScriptPatternTest.java @@ -1,5 +1,6 @@ /* * Copyright 2017 John L. Jegutanis + * Copyright 2018 Andreas Schildbach * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,22 +33,22 @@ public class ScriptPatternTest { @Test public void testCommonScripts() { assertTrue(ScriptPattern.isPayToPubKeyHash( - ScriptBuilder.createOutputScript(keys.get(0).toAddress(MainNetParams.get())).getChunks() + ScriptBuilder.createOutputScript(keys.get(0).toAddress(MainNetParams.get())) )); assertTrue(ScriptPattern.isPayToScriptHash( - ScriptBuilder.createP2SHOutputScript(2, keys).getChunks() + ScriptBuilder.createP2SHOutputScript(2, keys) )); assertTrue(ScriptPattern.isSentToMultisig( - ScriptBuilder.createMultiSigOutputScript(2, keys).getChunks() + ScriptBuilder.createMultiSigOutputScript(2, keys) )); assertTrue(ScriptPattern.isPayToPubKey( - ScriptBuilder.createOutputScript(keys.get(0)).getChunks() + ScriptBuilder.createOutputScript(keys.get(0)) )); assertTrue(ScriptPattern.isSentToCltvPaymentChannel( - ScriptBuilder.createCLTVPaymentChannelOutput(BigInteger.ONE, keys.get(0), keys.get(1)).getChunks() + ScriptBuilder.createCLTVPaymentChannelOutput(BigInteger.ONE, keys.get(0), keys.get(1)) )); assertTrue(ScriptPattern.isOpReturn( - ScriptBuilder.createOpReturnScript(new byte[10]).getChunks() + ScriptBuilder.createOpReturnScript(new byte[10]) )); } }