Skip to content

Commit 2a2d82e

Browse files
Optimize OPS type from Record to Enum (#2189)
* feat: use enum enhance OPS types * feat: update OPS reference * wip: update OPS avoid duplicate value * wip: build src * wip: set REVERSE_OPS as alias of OPS * wip: remove REVERSE_OPS and add check if the chunk is a valid opcode string in OPS * test: add OPS test * test: add decodes OP_FALSE as empty buffer * test: add decodes a series of numbers from '82 to 96' correctly * test: optimize unit test
1 parent 0b0130d commit 2a2d82e

File tree

9 files changed

+612
-427
lines changed

9 files changed

+612
-427
lines changed

src/cjs/ops.cjs

+124-129
Original file line numberDiff line numberDiff line change
@@ -1,131 +1,126 @@
11
'use strict';
22
Object.defineProperty(exports, '__esModule', { value: true });
3-
exports.REVERSE_OPS = exports.OPS = void 0;
4-
const OPS = {
5-
OP_FALSE: 0,
6-
OP_0: 0,
7-
OP_PUSHDATA1: 76,
8-
OP_PUSHDATA2: 77,
9-
OP_PUSHDATA4: 78,
10-
OP_1NEGATE: 79,
11-
OP_RESERVED: 80,
12-
OP_TRUE: 81,
13-
OP_1: 81,
14-
OP_2: 82,
15-
OP_3: 83,
16-
OP_4: 84,
17-
OP_5: 85,
18-
OP_6: 86,
19-
OP_7: 87,
20-
OP_8: 88,
21-
OP_9: 89,
22-
OP_10: 90,
23-
OP_11: 91,
24-
OP_12: 92,
25-
OP_13: 93,
26-
OP_14: 94,
27-
OP_15: 95,
28-
OP_16: 96,
29-
OP_NOP: 97,
30-
OP_VER: 98,
31-
OP_IF: 99,
32-
OP_NOTIF: 100,
33-
OP_VERIF: 101,
34-
OP_VERNOTIF: 102,
35-
OP_ELSE: 103,
36-
OP_ENDIF: 104,
37-
OP_VERIFY: 105,
38-
OP_RETURN: 106,
39-
OP_TOALTSTACK: 107,
40-
OP_FROMALTSTACK: 108,
41-
OP_2DROP: 109,
42-
OP_2DUP: 110,
43-
OP_3DUP: 111,
44-
OP_2OVER: 112,
45-
OP_2ROT: 113,
46-
OP_2SWAP: 114,
47-
OP_IFDUP: 115,
48-
OP_DEPTH: 116,
49-
OP_DROP: 117,
50-
OP_DUP: 118,
51-
OP_NIP: 119,
52-
OP_OVER: 120,
53-
OP_PICK: 121,
54-
OP_ROLL: 122,
55-
OP_ROT: 123,
56-
OP_SWAP: 124,
57-
OP_TUCK: 125,
58-
OP_CAT: 126,
59-
OP_SUBSTR: 127,
60-
OP_LEFT: 128,
61-
OP_RIGHT: 129,
62-
OP_SIZE: 130,
63-
OP_INVERT: 131,
64-
OP_AND: 132,
65-
OP_OR: 133,
66-
OP_XOR: 134,
67-
OP_EQUAL: 135,
68-
OP_EQUALVERIFY: 136,
69-
OP_RESERVED1: 137,
70-
OP_RESERVED2: 138,
71-
OP_1ADD: 139,
72-
OP_1SUB: 140,
73-
OP_2MUL: 141,
74-
OP_2DIV: 142,
75-
OP_NEGATE: 143,
76-
OP_ABS: 144,
77-
OP_NOT: 145,
78-
OP_0NOTEQUAL: 146,
79-
OP_ADD: 147,
80-
OP_SUB: 148,
81-
OP_MUL: 149,
82-
OP_DIV: 150,
83-
OP_MOD: 151,
84-
OP_LSHIFT: 152,
85-
OP_RSHIFT: 153,
86-
OP_BOOLAND: 154,
87-
OP_BOOLOR: 155,
88-
OP_NUMEQUAL: 156,
89-
OP_NUMEQUALVERIFY: 157,
90-
OP_NUMNOTEQUAL: 158,
91-
OP_LESSTHAN: 159,
92-
OP_GREATERTHAN: 160,
93-
OP_LESSTHANOREQUAL: 161,
94-
OP_GREATERTHANOREQUAL: 162,
95-
OP_MIN: 163,
96-
OP_MAX: 164,
97-
OP_WITHIN: 165,
98-
OP_RIPEMD160: 166,
99-
OP_SHA1: 167,
100-
OP_SHA256: 168,
101-
OP_HASH160: 169,
102-
OP_HASH256: 170,
103-
OP_CODESEPARATOR: 171,
104-
OP_CHECKSIG: 172,
105-
OP_CHECKSIGVERIFY: 173,
106-
OP_CHECKMULTISIG: 174,
107-
OP_CHECKMULTISIGVERIFY: 175,
108-
OP_NOP1: 176,
109-
OP_NOP2: 177,
110-
OP_CHECKLOCKTIMEVERIFY: 177,
111-
OP_NOP3: 178,
112-
OP_CHECKSEQUENCEVERIFY: 178,
113-
OP_NOP4: 179,
114-
OP_NOP5: 180,
115-
OP_NOP6: 181,
116-
OP_NOP7: 182,
117-
OP_NOP8: 183,
118-
OP_NOP9: 184,
119-
OP_NOP10: 185,
120-
OP_CHECKSIGADD: 186,
121-
OP_PUBKEYHASH: 253,
122-
OP_PUBKEY: 254,
123-
OP_INVALIDOPCODE: 255,
124-
};
125-
exports.OPS = OPS;
126-
const REVERSE_OPS = {};
127-
exports.REVERSE_OPS = REVERSE_OPS;
128-
for (const op of Object.keys(OPS)) {
129-
const code = OPS[op];
130-
REVERSE_OPS[code] = op;
131-
}
3+
exports.OPS = void 0;
4+
// Define OPS enum
5+
var OPS;
6+
(function (OPS) {
7+
OPS[(OPS['OP_FALSE'] = 0)] = 'OP_FALSE';
8+
OPS[(OPS['OP_0'] = 0)] = 'OP_0';
9+
OPS[(OPS['OP_PUSHDATA1'] = 76)] = 'OP_PUSHDATA1';
10+
OPS[(OPS['OP_PUSHDATA2'] = 77)] = 'OP_PUSHDATA2';
11+
OPS[(OPS['OP_PUSHDATA4'] = 78)] = 'OP_PUSHDATA4';
12+
OPS[(OPS['OP_1NEGATE'] = 79)] = 'OP_1NEGATE';
13+
OPS[(OPS['OP_RESERVED'] = 80)] = 'OP_RESERVED';
14+
OPS[(OPS['OP_TRUE'] = 81)] = 'OP_TRUE';
15+
OPS[(OPS['OP_1'] = 81)] = 'OP_1';
16+
OPS[(OPS['OP_2'] = 82)] = 'OP_2';
17+
OPS[(OPS['OP_3'] = 83)] = 'OP_3';
18+
OPS[(OPS['OP_4'] = 84)] = 'OP_4';
19+
OPS[(OPS['OP_5'] = 85)] = 'OP_5';
20+
OPS[(OPS['OP_6'] = 86)] = 'OP_6';
21+
OPS[(OPS['OP_7'] = 87)] = 'OP_7';
22+
OPS[(OPS['OP_8'] = 88)] = 'OP_8';
23+
OPS[(OPS['OP_9'] = 89)] = 'OP_9';
24+
OPS[(OPS['OP_10'] = 90)] = 'OP_10';
25+
OPS[(OPS['OP_11'] = 91)] = 'OP_11';
26+
OPS[(OPS['OP_12'] = 92)] = 'OP_12';
27+
OPS[(OPS['OP_13'] = 93)] = 'OP_13';
28+
OPS[(OPS['OP_14'] = 94)] = 'OP_14';
29+
OPS[(OPS['OP_15'] = 95)] = 'OP_15';
30+
OPS[(OPS['OP_16'] = 96)] = 'OP_16';
31+
OPS[(OPS['OP_NOP'] = 97)] = 'OP_NOP';
32+
OPS[(OPS['OP_VER'] = 98)] = 'OP_VER';
33+
OPS[(OPS['OP_IF'] = 99)] = 'OP_IF';
34+
OPS[(OPS['OP_NOTIF'] = 100)] = 'OP_NOTIF';
35+
OPS[(OPS['OP_VERIF'] = 101)] = 'OP_VERIF';
36+
OPS[(OPS['OP_VERNOTIF'] = 102)] = 'OP_VERNOTIF';
37+
OPS[(OPS['OP_ELSE'] = 103)] = 'OP_ELSE';
38+
OPS[(OPS['OP_ENDIF'] = 104)] = 'OP_ENDIF';
39+
OPS[(OPS['OP_VERIFY'] = 105)] = 'OP_VERIFY';
40+
OPS[(OPS['OP_RETURN'] = 106)] = 'OP_RETURN';
41+
OPS[(OPS['OP_TOALTSTACK'] = 107)] = 'OP_TOALTSTACK';
42+
OPS[(OPS['OP_FROMALTSTACK'] = 108)] = 'OP_FROMALTSTACK';
43+
OPS[(OPS['OP_2DROP'] = 109)] = 'OP_2DROP';
44+
OPS[(OPS['OP_2DUP'] = 110)] = 'OP_2DUP';
45+
OPS[(OPS['OP_3DUP'] = 111)] = 'OP_3DUP';
46+
OPS[(OPS['OP_2OVER'] = 112)] = 'OP_2OVER';
47+
OPS[(OPS['OP_2ROT'] = 113)] = 'OP_2ROT';
48+
OPS[(OPS['OP_2SWAP'] = 114)] = 'OP_2SWAP';
49+
OPS[(OPS['OP_IFDUP'] = 115)] = 'OP_IFDUP';
50+
OPS[(OPS['OP_DEPTH'] = 116)] = 'OP_DEPTH';
51+
OPS[(OPS['OP_DROP'] = 117)] = 'OP_DROP';
52+
OPS[(OPS['OP_DUP'] = 118)] = 'OP_DUP';
53+
OPS[(OPS['OP_NIP'] = 119)] = 'OP_NIP';
54+
OPS[(OPS['OP_OVER'] = 120)] = 'OP_OVER';
55+
OPS[(OPS['OP_PICK'] = 121)] = 'OP_PICK';
56+
OPS[(OPS['OP_ROLL'] = 122)] = 'OP_ROLL';
57+
OPS[(OPS['OP_ROT'] = 123)] = 'OP_ROT';
58+
OPS[(OPS['OP_SWAP'] = 124)] = 'OP_SWAP';
59+
OPS[(OPS['OP_TUCK'] = 125)] = 'OP_TUCK';
60+
OPS[(OPS['OP_CAT'] = 126)] = 'OP_CAT';
61+
OPS[(OPS['OP_SUBSTR'] = 127)] = 'OP_SUBSTR';
62+
OPS[(OPS['OP_LEFT'] = 128)] = 'OP_LEFT';
63+
OPS[(OPS['OP_RIGHT'] = 129)] = 'OP_RIGHT';
64+
OPS[(OPS['OP_SIZE'] = 130)] = 'OP_SIZE';
65+
OPS[(OPS['OP_INVERT'] = 131)] = 'OP_INVERT';
66+
OPS[(OPS['OP_AND'] = 132)] = 'OP_AND';
67+
OPS[(OPS['OP_OR'] = 133)] = 'OP_OR';
68+
OPS[(OPS['OP_XOR'] = 134)] = 'OP_XOR';
69+
OPS[(OPS['OP_EQUAL'] = 135)] = 'OP_EQUAL';
70+
OPS[(OPS['OP_EQUALVERIFY'] = 136)] = 'OP_EQUALVERIFY';
71+
OPS[(OPS['OP_RESERVED1'] = 137)] = 'OP_RESERVED1';
72+
OPS[(OPS['OP_RESERVED2'] = 138)] = 'OP_RESERVED2';
73+
OPS[(OPS['OP_1ADD'] = 139)] = 'OP_1ADD';
74+
OPS[(OPS['OP_1SUB'] = 140)] = 'OP_1SUB';
75+
OPS[(OPS['OP_2MUL'] = 141)] = 'OP_2MUL';
76+
OPS[(OPS['OP_2DIV'] = 142)] = 'OP_2DIV';
77+
OPS[(OPS['OP_NEGATE'] = 143)] = 'OP_NEGATE';
78+
OPS[(OPS['OP_ABS'] = 144)] = 'OP_ABS';
79+
OPS[(OPS['OP_NOT'] = 145)] = 'OP_NOT';
80+
OPS[(OPS['OP_0NOTEQUAL'] = 146)] = 'OP_0NOTEQUAL';
81+
OPS[(OPS['OP_ADD'] = 147)] = 'OP_ADD';
82+
OPS[(OPS['OP_SUB'] = 148)] = 'OP_SUB';
83+
OPS[(OPS['OP_MUL'] = 149)] = 'OP_MUL';
84+
OPS[(OPS['OP_DIV'] = 150)] = 'OP_DIV';
85+
OPS[(OPS['OP_MOD'] = 151)] = 'OP_MOD';
86+
OPS[(OPS['OP_LSHIFT'] = 152)] = 'OP_LSHIFT';
87+
OPS[(OPS['OP_RSHIFT'] = 153)] = 'OP_RSHIFT';
88+
OPS[(OPS['OP_BOOLAND'] = 154)] = 'OP_BOOLAND';
89+
OPS[(OPS['OP_BOOLOR'] = 155)] = 'OP_BOOLOR';
90+
OPS[(OPS['OP_NUMEQUAL'] = 156)] = 'OP_NUMEQUAL';
91+
OPS[(OPS['OP_NUMEQUALVERIFY'] = 157)] = 'OP_NUMEQUALVERIFY';
92+
OPS[(OPS['OP_NUMNOTEQUAL'] = 158)] = 'OP_NUMNOTEQUAL';
93+
OPS[(OPS['OP_LESSTHAN'] = 159)] = 'OP_LESSTHAN';
94+
OPS[(OPS['OP_GREATERTHAN'] = 160)] = 'OP_GREATERTHAN';
95+
OPS[(OPS['OP_LESSTHANOREQUAL'] = 161)] = 'OP_LESSTHANOREQUAL';
96+
OPS[(OPS['OP_GREATERTHANOREQUAL'] = 162)] = 'OP_GREATERTHANOREQUAL';
97+
OPS[(OPS['OP_MIN'] = 163)] = 'OP_MIN';
98+
OPS[(OPS['OP_MAX'] = 164)] = 'OP_MAX';
99+
OPS[(OPS['OP_WITHIN'] = 165)] = 'OP_WITHIN';
100+
OPS[(OPS['OP_RIPEMD160'] = 166)] = 'OP_RIPEMD160';
101+
OPS[(OPS['OP_SHA1'] = 167)] = 'OP_SHA1';
102+
OPS[(OPS['OP_SHA256'] = 168)] = 'OP_SHA256';
103+
OPS[(OPS['OP_HASH160'] = 169)] = 'OP_HASH160';
104+
OPS[(OPS['OP_HASH256'] = 170)] = 'OP_HASH256';
105+
OPS[(OPS['OP_CODESEPARATOR'] = 171)] = 'OP_CODESEPARATOR';
106+
OPS[(OPS['OP_CHECKSIG'] = 172)] = 'OP_CHECKSIG';
107+
OPS[(OPS['OP_CHECKSIGVERIFY'] = 173)] = 'OP_CHECKSIGVERIFY';
108+
OPS[(OPS['OP_CHECKMULTISIG'] = 174)] = 'OP_CHECKMULTISIG';
109+
OPS[(OPS['OP_CHECKMULTISIGVERIFY'] = 175)] = 'OP_CHECKMULTISIGVERIFY';
110+
OPS[(OPS['OP_NOP1'] = 176)] = 'OP_NOP1';
111+
OPS[(OPS['OP_CHECKLOCKTIMEVERIFY'] = 177)] = 'OP_CHECKLOCKTIMEVERIFY';
112+
OPS[(OPS['OP_NOP2'] = 177)] = 'OP_NOP2';
113+
OPS[(OPS['OP_CHECKSEQUENCEVERIFY'] = 178)] = 'OP_CHECKSEQUENCEVERIFY';
114+
OPS[(OPS['OP_NOP3'] = 178)] = 'OP_NOP3';
115+
OPS[(OPS['OP_NOP4'] = 179)] = 'OP_NOP4';
116+
OPS[(OPS['OP_NOP5'] = 180)] = 'OP_NOP5';
117+
OPS[(OPS['OP_NOP6'] = 181)] = 'OP_NOP6';
118+
OPS[(OPS['OP_NOP7'] = 182)] = 'OP_NOP7';
119+
OPS[(OPS['OP_NOP8'] = 183)] = 'OP_NOP8';
120+
OPS[(OPS['OP_NOP9'] = 184)] = 'OP_NOP9';
121+
OPS[(OPS['OP_NOP10'] = 185)] = 'OP_NOP10';
122+
OPS[(OPS['OP_CHECKSIGADD'] = 186)] = 'OP_CHECKSIGADD';
123+
OPS[(OPS['OP_PUBKEYHASH'] = 253)] = 'OP_PUBKEYHASH';
124+
OPS[(OPS['OP_PUBKEY'] = 254)] = 'OP_PUBKEY';
125+
OPS[(OPS['OP_INVALIDOPCODE'] = 255)] = 'OP_INVALIDOPCODE';
126+
})(OPS || (exports.OPS = OPS = {}));

src/cjs/ops.d.ts

+122-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,122 @@
1-
declare const OPS: {
2-
[key: string]: number;
3-
};
4-
declare const REVERSE_OPS: {
5-
[key: number]: string;
6-
};
7-
export { OPS, REVERSE_OPS };
1+
declare enum OPS {
2+
OP_FALSE = 0,
3+
OP_0 = 0,// Avoid duplicate value
4+
OP_PUSHDATA1 = 76,
5+
OP_PUSHDATA2 = 77,
6+
OP_PUSHDATA4 = 78,
7+
OP_1NEGATE = 79,
8+
OP_RESERVED = 80,
9+
OP_TRUE = 81,
10+
OP_1 = 81,// Avoid duplicate value
11+
OP_2 = 82,
12+
OP_3 = 83,
13+
OP_4 = 84,
14+
OP_5 = 85,
15+
OP_6 = 86,
16+
OP_7 = 87,
17+
OP_8 = 88,
18+
OP_9 = 89,
19+
OP_10 = 90,
20+
OP_11 = 91,
21+
OP_12 = 92,
22+
OP_13 = 93,
23+
OP_14 = 94,
24+
OP_15 = 95,
25+
OP_16 = 96,
26+
OP_NOP = 97,
27+
OP_VER = 98,
28+
OP_IF = 99,
29+
OP_NOTIF = 100,
30+
OP_VERIF = 101,
31+
OP_VERNOTIF = 102,
32+
OP_ELSE = 103,
33+
OP_ENDIF = 104,
34+
OP_VERIFY = 105,
35+
OP_RETURN = 106,
36+
OP_TOALTSTACK = 107,
37+
OP_FROMALTSTACK = 108,
38+
OP_2DROP = 109,
39+
OP_2DUP = 110,
40+
OP_3DUP = 111,
41+
OP_2OVER = 112,
42+
OP_2ROT = 113,
43+
OP_2SWAP = 114,
44+
OP_IFDUP = 115,
45+
OP_DEPTH = 116,
46+
OP_DROP = 117,
47+
OP_DUP = 118,
48+
OP_NIP = 119,
49+
OP_OVER = 120,
50+
OP_PICK = 121,
51+
OP_ROLL = 122,
52+
OP_ROT = 123,
53+
OP_SWAP = 124,
54+
OP_TUCK = 125,
55+
OP_CAT = 126,
56+
OP_SUBSTR = 127,
57+
OP_LEFT = 128,
58+
OP_RIGHT = 129,
59+
OP_SIZE = 130,
60+
OP_INVERT = 131,
61+
OP_AND = 132,
62+
OP_OR = 133,
63+
OP_XOR = 134,
64+
OP_EQUAL = 135,
65+
OP_EQUALVERIFY = 136,
66+
OP_RESERVED1 = 137,
67+
OP_RESERVED2 = 138,
68+
OP_1ADD = 139,
69+
OP_1SUB = 140,
70+
OP_2MUL = 141,
71+
OP_2DIV = 142,
72+
OP_NEGATE = 143,
73+
OP_ABS = 144,
74+
OP_NOT = 145,
75+
OP_0NOTEQUAL = 146,
76+
OP_ADD = 147,
77+
OP_SUB = 148,
78+
OP_MUL = 149,
79+
OP_DIV = 150,
80+
OP_MOD = 151,
81+
OP_LSHIFT = 152,
82+
OP_RSHIFT = 153,
83+
OP_BOOLAND = 154,
84+
OP_BOOLOR = 155,
85+
OP_NUMEQUAL = 156,
86+
OP_NUMEQUALVERIFY = 157,
87+
OP_NUMNOTEQUAL = 158,
88+
OP_LESSTHAN = 159,
89+
OP_GREATERTHAN = 160,
90+
OP_LESSTHANOREQUAL = 161,
91+
OP_GREATERTHANOREQUAL = 162,
92+
OP_MIN = 163,
93+
OP_MAX = 164,
94+
OP_WITHIN = 165,
95+
OP_RIPEMD160 = 166,
96+
OP_SHA1 = 167,
97+
OP_SHA256 = 168,
98+
OP_HASH160 = 169,
99+
OP_HASH256 = 170,
100+
OP_CODESEPARATOR = 171,
101+
OP_CHECKSIG = 172,
102+
OP_CHECKSIGVERIFY = 173,
103+
OP_CHECKMULTISIG = 174,
104+
OP_CHECKMULTISIGVERIFY = 175,
105+
OP_NOP1 = 176,
106+
OP_CHECKLOCKTIMEVERIFY = 177,// Alias: OP_NOP2
107+
OP_NOP2 = 177,
108+
OP_CHECKSEQUENCEVERIFY = 178,// Alias: OP_NOP3
109+
OP_NOP3 = 178,
110+
OP_NOP4 = 179,
111+
OP_NOP5 = 180,
112+
OP_NOP6 = 181,
113+
OP_NOP7 = 182,
114+
OP_NOP8 = 183,
115+
OP_NOP9 = 184,
116+
OP_NOP10 = 185,
117+
OP_CHECKSIGADD = 186,
118+
OP_PUBKEYHASH = 253,
119+
OP_PUBKEY = 254,
120+
OP_INVALIDOPCODE = 255
121+
}
122+
export { OPS };

0 commit comments

Comments
 (0)