-
Notifications
You must be signed in to change notification settings - Fork 0
/
OpCode.cs
138 lines (122 loc) · 6.32 KB
/
OpCode.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
namespace Quras.VM
{
public enum OpCode : byte
{
// Constants
PUSH0 = 0x00, // An empty array of bytes is pushed onto the stack.
PUSHF = PUSH0,
PUSHBYTES1 = 0x01, // 0x01-0x4B The next opcode bytes is data to be pushed onto the stack
PUSHBYTES20 = 0x20,
PUSHBYTES75 = 0x4B,
PUSHDATA1 = 0x4C, // The next byte contains the number of bytes to be pushed onto the stack.
PUSHDATA2 = 0x4D, // The next two bytes contain the number of bytes to be pushed onto the stack.
PUSHDATA4 = 0x4E, // The next four bytes contain the number of bytes to be pushed onto the stack.
PUSHM1 = 0x4F, // The number -1 is pushed onto the stack.
PUSH1 = 0x51, // The number 1 is pushed onto the stack.
PUSHT = PUSH1,
PUSH2 = 0x52, // The number 2 is pushed onto the stack.
PUSH3 = 0x53, // The number 3 is pushed onto the stack.
PUSH4 = 0x54, // The number 4 is pushed onto the stack.
PUSH5 = 0x55, // The number 5 is pushed onto the stack.
PUSH6 = 0x56, // The number 6 is pushed onto the stack.
PUSH7 = 0x57, // The number 7 is pushed onto the stack.
PUSH8 = 0x58, // The number 8 is pushed onto the stack.
PUSH9 = 0x59, // The number 9 is pushed onto the stack.
PUSH10 = 0x5A, // The number 10 is pushed onto the stack.
PUSH11 = 0x5B, // The number 11 is pushed onto the stack.
PUSH12 = 0x5C, // The number 12 is pushed onto the stack.
PUSH13 = 0x5D, // The number 13 is pushed onto the stack.
PUSH14 = 0x5E, // The number 14 is pushed onto the stack.
PUSH15 = 0x5F, // The number 15 is pushed onto the stack.
PUSH16 = 0x60, // The number 16 is pushed onto the stack.
// Flow control
NOP = 0x61, // Does nothing.
JMP = 0x62,
JMPIF = 0x63,
JMPIFNOT = 0x64,
CALL = 0x65,
RET = 0x66,
APPCALL = 0x67,
SYSCALL = 0x68,
TAILCALL = 0x69,
// Stack
DUPFROMALTSTACK = 0x6A,
TOALTSTACK = 0x6B, // Puts the input onto the top of the alt stack. Removes it from the main stack.
FROMALTSTACK = 0x6C, // Puts the input onto the top of the main stack. Removes it from the alt stack.
XDROP = 0x6D,
XSWAP = 0x72,
XTUCK = 0x73,
DEPTH = 0x74, // Puts the number of stack items onto the stack.
DROP = 0x75, // Removes the top stack item.
DUP = 0x76, // Duplicates the top stack item.
NIP = 0x77, // Removes the second-to-top stack item.
OVER = 0x78, // Copies the second-to-top stack item to the top.
PICK = 0x79, // The item n back in the stack is copied to the top.
ROLL = 0x7A, // The item n back in the stack is moved to the top.
ROT = 0x7B, // The top three items on the stack are rotated to the left.
SWAP = 0x7C, // The top two items on the stack are swapped.
TUCK = 0x7D, // The item at the top of the stack is copied and inserted before the second-to-top item.
// Splice
CAT = 0x7E, // Concatenates two strings.
SUBSTR = 0x7F, // Returns a section of a string.
LEFT = 0x80, // Keeps only characters left of the specified point in a string.
RIGHT = 0x81, // Keeps only characters right of the specified point in a string.
SIZE = 0x82, // Returns the length of the input string.
// Bitwise logic
INVERT = 0x83, // Flips all of the bits in the input.
AND = 0x84, // Boolean and between each bit in the inputs.
OR = 0x85, // Boolean or between each bit in the inputs.
XOR = 0x86, // Boolean exclusive or between each bit in the inputs.
EQUAL = 0x87, // Returns 1 if the inputs are exactly equal, 0 otherwise.
//OP_EQUALVERIFY = 0x88, // Same as OP_EQUAL, but runs OP_VERIFY afterward.
//OP_RESERVED1 = 0x89, // Transaction is invalid unless occuring in an unexecuted OP_IF branch
//OP_RESERVED2 = 0x8A, // Transaction is invalid unless occuring in an unexecuted OP_IF branch
// Arithmetic
// Note: Arithmetic inputs are limited to signed 32-bit integers, but may overflow their output.
INC = 0x8B, // 1 is added to the input.
DEC = 0x8C, // 1 is subtracted from the input.
SIGN = 0x8D,
NEGATE = 0x8F, // The sign of the input is flipped.
ABS = 0x90, // The input is made positive.
NOT = 0x91, // If the input is 0 or 1, it is flipped. Otherwise the output will be 0.
NZ = 0x92, // Returns 0 if the input is 0. 1 otherwise.
ADD = 0x93, // a is added to b.
SUB = 0x94, // b is subtracted from a.
MUL = 0x95, // a is multiplied by b.
DIV = 0x96, // a is divided by b.
MOD = 0x97, // Returns the remainder after dividing a by b.
SHL = 0x98, // Shifts a left b bits, preserving sign.
SHR = 0x99, // Shifts a right b bits, preserving sign.
BOOLAND = 0x9A, // If both a and b are not 0, the output is 1. Otherwise 0.
BOOLOR = 0x9B, // If a or b is not 0, the output is 1. Otherwise 0.
NUMEQUAL = 0x9C, // Returns 1 if the numbers are equal, 0 otherwise.
NUMNOTEQUAL = 0x9E, // Returns 1 if the numbers are not equal, 0 otherwise.
LT = 0x9F, // Returns 1 if a is less than b, 0 otherwise.
GT = 0xA0, // Returns 1 if a is greater than b, 0 otherwise.
LTE = 0xA1, // Returns 1 if a is less than or equal to b, 0 otherwise.
GTE = 0xA2, // Returns 1 if a is greater than or equal to b, 0 otherwise.
MIN = 0xA3, // Returns the smaller of a and b.
MAX = 0xA4, // Returns the larger of a and b.
WITHIN = 0xA5, // Returns 1 if x is within the specified range (left-inclusive), 0 otherwise.
// Crypto
//RIPEMD160 = 0xA6, // The input is hashed using RIPEMD-160.
SHA1 = 0xA7, // The input is hashed using SHA-1.
SHA256 = 0xA8, // The input is hashed using SHA-256.
HASH160 = 0xA9,
HASH256 = 0xAA,
CHECKSIG = 0xAC,
CHECKMULTISIG = 0xAE,
CHECKRINGSIG = 0xB0,
// Array
ARRAYSIZE = 0xC0,
PACK = 0xC1,
UNPACK = 0xC2,
PICKITEM = 0xC3,
SETITEM = 0xC4,
NEWARRAY = 0xC5, //用作引用類型
NEWSTRUCT = 0xC6, //用作值類型
// Exceptions
THROW = 0xF0,
THROWIFNOT = 0xF1
}
}