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

Refactored the huge switch. Replaced it with a HashMap which contains OpCode -> String instead; less lines

Implemented getOpCode method and added a HashMap which contains String -> OpCode for the lookup
This commit is contained in:
Alexander Lolis 2013-04-27 00:05:17 +03:00 committed by Mike Hearn
parent aa883b48b1
commit 52cec7f6be

View File

@ -16,6 +16,9 @@
package com.google.bitcoin.script;
import java.util.HashMap;
import java.util.Map;
/**
* Various constants that define the assembly-like scripting language that forms part of the Bitcoin protocol.
* See {@link com.google.bitcoin.script.Script} for details. Also provides a method to convert them to a string.
@ -151,236 +154,253 @@ public class ScriptOpCodes {
public static final int OP_NOP10 = 0xb9;
public static final int OP_INVALIDOPCODE = 0xff;
private static final HashMap<Integer, String> opCodeMap = new HashMap<Integer, String>() {{
put(OP_0, "0");
put(OP_PUSHDATA1, "PUSHDATA1");
put(OP_PUSHDATA2, "PUSHDATA2");
put(OP_PUSHDATA4, "PUSHDATA4");
put(OP_1NEGATE, "1NEGATE");
put(OP_RESERVED, "RESERVED");
put(OP_1, "1");
put(OP_2, "2");
put(OP_3, "3");
put(OP_4, "4");
put(OP_5, "5");
put(OP_6, "6");
put(OP_7, "7");
put(OP_8, "8");
put(OP_9, "9");
put(OP_10, "10");
put(OP_11, "11");
put(OP_12, "12");
put(OP_13, "13");
put(OP_14, "14");
put(OP_15, "15");
put(OP_16, "16");
put(OP_NOP, "NOP");
put(OP_VER, "VER");
put(OP_IF, "IF");
put(OP_NOTIF, "NOTIF");
put(OP_VERIF, "VERIF");
put(OP_VERNOTIF, "VERNOTIF");
put(OP_ELSE, "ELSE");
put(OP_ENDIF, "ENDIF");
put(OP_VERIFY, "VERIFY");
put(OP_RETURN, "RETURN");
put(OP_TOALTSTACK, "TOALTSTACK");
put(OP_FROMALTSTACK, "FROMALTSTACK");
put(OP_2DROP, "2DROP");
put(OP_2DUP, "2DUP");
put(OP_3DUP, "3DUP");
put(OP_2OVER, "2OVER");
put(OP_2ROT, "2ROT");
put(OP_2SWAP, "2SWAP");
put(OP_IFDUP, "IFDUP");
put(OP_DEPTH, "DEPTH");
put(OP_DROP, "DROP");
put(OP_DUP, "DUP");
put(OP_NIP, "NIP");
put(OP_OVER, "OVER");
put(OP_PICK, "PICK");
put(OP_ROLL, "ROLL");
put(OP_ROT, "ROT");
put(OP_SWAP, "SWAP");
put(OP_TUCK, "TUCK");
put(OP_CAT, "CAT");
put(OP_SUBSTR, "SUBSTR");
put(OP_LEFT, "LEFT");
put(OP_RIGHT, "RIGHT");
put(OP_SIZE, "SIZE");
put(OP_INVERT, "INVERT");
put(OP_AND, "AND");
put(OP_OR, "OR");
put(OP_XOR, "XOR");
put(OP_EQUAL, "EQUAL");
put(OP_EQUALVERIFY, "EQUALVERIFY");
put(OP_RESERVED1, "RESERVED1");
put(OP_RESERVED2, "RESERVED2");
put(OP_1ADD, "1ADD");
put(OP_1SUB, "1SUB");
put(OP_2MUL, "2MUL");
put(OP_2DIV, "2DIV");
put(OP_NEGATE, "NEGATE");
put(OP_ABS, "ABS");
put(OP_NOT, "NOT");
put(OP_0NOTEQUAL, "0NOTEQUAL");
put(OP_ADD, "ADD");
put(OP_SUB, "SUB");
put(OP_MUL, "MUL");
put(OP_DIV, "DIV");
put(OP_MOD, "MOD");
put(OP_LSHIFT, "LSHIFT");
put(OP_RSHIFT, "RSHIFT");
put(OP_BOOLAND, "BOOLAND");
put(OP_BOOLOR, "BOOLOR");
put(OP_NUMEQUAL, "NUMEQUAL");
put(OP_NUMEQUALVERIFY, "NUMEQUALVERIFY");
put(OP_NUMNOTEQUAL, "NUMNOTEQUAL");
put(OP_LESSTHAN, "LESSTHAN");
put(OP_GREATERTHAN, "GREATERTHAN");
put(OP_LESSTHANOREQUAL, "LESSTHANOREQUAL");
put(OP_GREATERTHANOREQUAL, "GREATERTHANOREQUAL");
put(OP_MIN, "MIN");
put(OP_MAX, "MAX");
put(OP_WITHIN, "WITHIN");
put(OP_RIPEMD160, "RIPEMD160");
put(OP_SHA1, "SHA1");
put(OP_SHA256, "SHA256");
put(OP_HASH160, "HASH160");
put(OP_HASH256, "HASH256");
put(OP_CODESEPARATOR, "CODESEPARATOR");
put(OP_CHECKSIG, "CHECKSIG");
put(OP_CHECKSIGVERIFY, "CHECKSIGVERIFY");
put(OP_CHECKMULTISIG, "CHECKMULTISIG");
put(OP_CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY");
put(OP_NOP1, "NOP1");
put(OP_NOP2, "NOP2");
put(OP_NOP3, "NOP3");
put(OP_NOP4, "NOP4");
put(OP_NOP5, "NOP5");
put(OP_NOP6, "NOP6");
put(OP_NOP7, "NOP7");
put(OP_NOP8, "NOP8");
put(OP_NOP9, "NOP9");
put(OP_NOP10, "NOP10");
}};
private static final HashMap<String, Integer> opCodeNameMap = new HashMap<String, Integer>() {{
put("0", OP_0);
put("PUSHDATA1", OP_PUSHDATA1);
put("PUSHDATA2", OP_PUSHDATA2);
put("PUSHDATA4", OP_PUSHDATA4);
put("1NEGATE", OP_1NEGATE);
put("RESERVED", OP_RESERVED);
put("1", OP_1);
put("2", OP_2);
put("3", OP_3);
put("4", OP_4);
put("5", OP_5);
put("6", OP_6);
put("7", OP_7);
put("8", OP_8);
put("9", OP_9);
put("10", OP_10);
put("11", OP_11);
put("12", OP_12);
put("13", OP_13);
put("14", OP_14);
put("15", OP_15);
put("16", OP_16);
put("NOP", OP_NOP);
put("VER", OP_VER);
put("IF", OP_IF);
put("NOTIF", OP_NOTIF);
put("VERIF", OP_VERIF);
put("VERNOTIF", OP_VERNOTIF);
put("ELSE", OP_ELSE);
put("ENDIF", OP_ENDIF);
put("VERIFY", OP_VERIFY);
put("RETURN", OP_RETURN);
put("TOALTSTACK", OP_TOALTSTACK);
put("FROMALTSTACK", OP_FROMALTSTACK);
put("2DROP", OP_2DROP);
put("2DUP", OP_2DUP);
put("3DUP", OP_3DUP);
put("2OVER", OP_2OVER);
put("2ROT", OP_2ROT);
put("2SWAP", OP_2SWAP);
put("IFDUP", OP_IFDUP);
put("DEPTH", OP_DEPTH);
put("DROP", OP_DROP);
put("DUP", OP_DUP);
put("NIP", OP_NIP);
put("OVER", OP_OVER);
put("PICK", OP_PICK);
put("ROLL", OP_ROLL);
put("ROT", OP_ROT);
put("SWAP", OP_SWAP);
put("TUCK", OP_TUCK);
put("CAT", OP_CAT);
put("SUBSTR", OP_SUBSTR);
put("LEFT", OP_LEFT);
put("RIGHT", OP_RIGHT);
put("SIZE", OP_SIZE);
put("INVERT", OP_INVERT);
put("AND", OP_AND);
put("OR", OP_OR);
put("XOR", OP_XOR);
put("EQUAL", OP_EQUAL);
put("EQUALVERIFY", OP_EQUALVERIFY);
put("RESERVED1", OP_RESERVED1);
put("RESERVED2", OP_RESERVED2);
put("1ADD", OP_1ADD);
put("1SUB", OP_1SUB);
put("2MUL", OP_2MUL);
put("2DIV", OP_2DIV);
put("NEGATE", OP_NEGATE);
put("ABS", OP_ABS);
put("NOT", OP_NOT);
put("0NOTEQUAL", OP_0NOTEQUAL);
put("ADD", OP_ADD);
put("SUB", OP_SUB);
put("MUL", OP_MUL);
put("DIV", OP_DIV);
put("MOD", OP_MOD);
put("LSHIFT", OP_LSHIFT);
put("RSHIFT", OP_RSHIFT);
put("BOOLAND", OP_BOOLAND);
put("BOOLOR", OP_BOOLOR);
put("NUMEQUAL", OP_NUMEQUAL);
put("NUMEQUALVERIFY", OP_NUMEQUALVERIFY);
put("NUMNOTEQUAL", OP_NUMNOTEQUAL);
put("LESSTHAN", OP_LESSTHAN);
put("GREATERTHAN", OP_GREATERTHAN);
put("LESSTHANOREQUAL", OP_LESSTHANOREQUAL);
put("GREATERTHANOREQUAL", OP_GREATERTHANOREQUAL);
put("MIN", OP_MIN);
put("MAX", OP_MAX);
put("WITHIN", OP_WITHIN);
put("RIPEMD160", OP_RIPEMD160);
put("SHA1", OP_SHA1);
put("SHA256", OP_SHA256);
put("HASH160", OP_HASH160);
put("HASH256", OP_HASH256);
put("CODESEPARATOR", OP_CODESEPARATOR);
put("CHECKSIG", OP_CHECKSIG);
put("CHECKSIGVERIFY", OP_CHECKSIGVERIFY);
put("CHECKMULTISIG", OP_CHECKMULTISIG);
put("CHECKMULTISIGVERIFY", OP_CHECKMULTISIGVERIFY);
put("NOP1", OP_NOP1);
put("NOP2", OP_NOP2);
put("NOP3", OP_NOP3);
put("NOP4", OP_NOP4);
put("NOP5", OP_NOP5);
put("NOP6", OP_NOP6);
put("NOP7", OP_NOP7);
put("NOP8", OP_NOP8);
put("NOP9", OP_NOP9);
put("NOP10", OP_NOP10);
}};
/**
* Converts the given OpCode into a string (eg "0", "PUSHDATA", or "NON_OP(10)")
*/
public static String getOpCodeName(byte opCode) {
int opcode = opCode & 0xff;
switch (opcode) {
case OP_0:
return "0";
case OP_PUSHDATA1:
return "PUSHDATA1";
case OP_PUSHDATA2:
return "PUSHDATA2";
case OP_PUSHDATA4:
return "PUSHDATA4";
case OP_1NEGATE:
return "1NEGATE";
case OP_RESERVED:
return "RESERVED";
case OP_1:
return "1";
case OP_2:
return "2";
case OP_3:
return "3";
case OP_4:
return "4";
case OP_5:
return "5";
case OP_6:
return "6";
case OP_7:
return "7";
case OP_8:
return "8";
case OP_9:
return "9";
case OP_10:
return "10";
case OP_11:
return "11";
case OP_12:
return "12";
case OP_13:
return "13";
case OP_14:
return "14";
case OP_15:
return "15";
case OP_16:
return "16";
case OP_NOP:
return "NOP";
case OP_VER:
return "VER";
case OP_IF:
return "IF";
case OP_NOTIF:
return "NOTIF";
case OP_VERIF:
return "VERIF";
case OP_VERNOTIF:
return "VERNOTIF";
case OP_ELSE:
return "ELSE";
case OP_ENDIF:
return "ENDIF";
case OP_VERIFY:
return "VERIFY";
case OP_RETURN:
return "RETURN";
case OP_TOALTSTACK:
return "TOALTSTACK";
case OP_FROMALTSTACK:
return "FROMALTSTACK";
case OP_2DROP:
return "2DROP";
case OP_2DUP:
return "2DUP";
case OP_3DUP:
return "3DUP";
case OP_2OVER:
return "2OVER";
case OP_2ROT:
return "2ROT";
case OP_2SWAP:
return "2SWAP";
case OP_IFDUP:
return "IFDUP";
case OP_DEPTH:
return "DEPTH";
case OP_DROP:
return "DROP";
case OP_DUP:
return "DUP";
case OP_NIP:
return "NIP";
case OP_OVER:
return "OVER";
case OP_PICK:
return "PICK";
case OP_ROLL:
return "ROLL";
case OP_ROT:
return "ROT";
case OP_SWAP:
return "SWAP";
case OP_TUCK:
return "TUCK";
case OP_CAT:
return "CAT";
case OP_SUBSTR:
return "SUBSTR";
case OP_LEFT:
return "LEFT";
case OP_RIGHT:
return "RIGHT";
case OP_SIZE:
return "SIZE";
case OP_INVERT:
return "INVERT";
case OP_AND:
return "AND";
case OP_OR:
return "OR";
case OP_XOR:
return "XOR";
case OP_EQUAL:
return "EQUAL";
case OP_EQUALVERIFY:
return "EQUALVERIFY";
case OP_RESERVED1:
return "RESERVED1";
case OP_RESERVED2:
return "RESERVED2";
case OP_1ADD:
return "1ADD";
case OP_1SUB:
return "1SUB";
case OP_2MUL:
return "2MUL";
case OP_2DIV:
return "2DIV";
case OP_NEGATE:
return "NEGATE";
case OP_ABS:
return "ABS";
case OP_NOT:
return "NOT";
case OP_0NOTEQUAL:
return "0NOTEQUAL";
case OP_ADD:
return "ADD";
case OP_SUB:
return "SUB";
case OP_MUL:
return "MUL";
case OP_DIV:
return "DIV";
case OP_MOD:
return "MOD";
case OP_LSHIFT:
return "LSHIFT";
case OP_RSHIFT:
return "RSHIFT";
case OP_BOOLAND:
return "BOOLAND";
case OP_BOOLOR:
return "BOOLOR";
case OP_NUMEQUAL:
return "NUMEQUAL";
case OP_NUMEQUALVERIFY:
return "NUMEQUALVERIFY";
case OP_NUMNOTEQUAL:
return "NUMNOTEQUAL";
case OP_LESSTHAN:
return "LESSTHAN";
case OP_GREATERTHAN:
return "GREATERTHAN";
case OP_LESSTHANOREQUAL:
return "LESSTHANOREQUAL";
case OP_GREATERTHANOREQUAL:
return "GREATERTHANOREQUAL";
case OP_MIN:
return "MIN";
case OP_MAX:
return "MAX";
case OP_WITHIN:
return "WITHIN";
case OP_RIPEMD160:
return "RIPEMD160";
case OP_SHA1:
return "SHA1";
case OP_SHA256:
return "SHA256";
case OP_HASH160:
return "HASH160";
case OP_HASH256:
return "HASH256";
case OP_CODESEPARATOR:
return "CODESEPARATOR";
case OP_CHECKSIG:
return "CHECKSIG";
case OP_CHECKSIGVERIFY:
return "CHECKSIGVERIFY";
case OP_CHECKMULTISIG:
return "CHECKMULTISIG";
case OP_CHECKMULTISIGVERIFY:
return "CHECKMULTISIGVERIFY";
case OP_NOP1:
return "NOP1";
case OP_NOP2:
return "NOP2";
case OP_NOP3:
return "NOP3";
case OP_NOP4:
return "NOP4";
case OP_NOP5:
return "NOP5";
case OP_NOP6:
return "NOP6";
case OP_NOP7:
return "NOP7";
case OP_NOP8:
return "NOP8";
case OP_NOP9:
return "NOP9";
case OP_NOP10:
return "NOP10";
default:
return "NON_OP(" + opcode + ")";
}
if (opCodeMap.containsKey(opcode))
return opCodeMap.get(opcode);
return "NON_OP(" + opcode + ")";
}
/**
* Converts the given OpCodeName into an int
*/
public static int getOpCode(String opCodeName) {
if (opCodeNameMap.containsKey(opCodeName))
return opCodeNameMap.get(opCodeName);
return OP_INVALIDOPCODE;
}
}