3
0
mirror of https://github.com/Qortal/altcoinj.git synced 2025-02-14 19:25:51 +00:00

ScriptPattern: For all matcher methods, take Script as an argument rather than List<ScriptChunk>.

This commit is contained in:
Andreas Schildbach 2018-02-25 22:31:21 +01:00
parent caf9e52940
commit fc4a29e3cb
3 changed files with 26 additions and 18 deletions

View File

@ -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).</p>
*/
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);
}
/**

View File

@ -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<ScriptChunk> chunks) {
public static boolean isPayToPubKeyHash(Script script) {
List<ScriptChunk> 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<ScriptChunk> chunks) {
public static boolean isPayToScriptHash(Script script) {
List<ScriptChunk> 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<ScriptChunk> chunks) {
public static boolean isPayToPubKey(Script script) {
List<ScriptChunk> 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<ScriptChunk> chunks) {
public static boolean isSentToMultisig(Script script) {
List<ScriptChunk> 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<ScriptChunk> chunks) {
public static boolean isSentToCltvPaymentChannel(Script script) {
List<ScriptChunk> 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<ScriptChunk> chunks) {
public static boolean isOpReturn(Script script) {
List<ScriptChunk> chunks = script.chunks;
return chunks.size() > 0 && chunks.get(0).equalsOpCode(ScriptOpCodes.OP_RETURN);
}
}

View File

@ -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])
));
}
}