types.go 5.08 KB
Newer Older
obscuren's avatar
obscuren committed
1
package chain
2

3 4 5 6
import (
	"fmt"
)

7 8 9 10 11
type OpCode int

// Op codes
const (
	// 0x0 range - arithmetic ops
obscuren's avatar
obscuren committed
12 13 14 15 16 17 18 19 20
	STOP = 0x00
	ADD  = 0x01
	MUL  = 0x02
	SUB  = 0x03
	DIV  = 0x04
	SDIV = 0x05
	MOD  = 0x06
	SMOD = 0x07
	EXP  = 0x08
obscuren's avatar
obscuren committed
21
	BNOT = 0x09
obscuren's avatar
obscuren committed
22 23
	LT   = 0x0a
	GT   = 0x0b
24 25 26 27
	SLT  = 0x0c
	SGT  = 0x0d
	EQ   = 0x0e
	NOT  = 0x0f
28 29

	// 0x10 range - bit ops
obscuren's avatar
obscuren committed
30 31 32 33 34 35
	AND    = 0x10
	OR     = 0x11
	XOR    = 0x12
	BYTE   = 0x13
	ADDMOD = 0x14
	MULMOD = 0x15
36 37

	// 0x20 range - crypto
obscuren's avatar
obscuren committed
38
	SHA3 = 0x20
39 40

	// 0x30 range - closure state
obscuren's avatar
obscuren committed
41 42 43 44 45 46 47
	ADDRESS      = 0x30
	BALANCE      = 0x31
	ORIGIN       = 0x32
	CALLER       = 0x33
	CALLVALUE    = 0x34
	CALLDATALOAD = 0x35
	CALLDATASIZE = 0x36
48 49 50 51
	CALLDATACOPY = 0x37
	CODESIZE     = 0x38
	CODECOPY     = 0x39
	GASPRICE     = 0x3a
obscuren's avatar
obscuren committed
52 53
	EXTCODESIZE  = 0x3b
	EXTCODECOPY  = 0x3c
54 55

	// 0x40 range - block operations
obscuren's avatar
obscuren committed
56 57 58 59 60 61
	PREVHASH   = 0x40
	COINBASE   = 0x41
	TIMESTAMP  = 0x42
	NUMBER     = 0x43
	DIFFICULTY = 0x44
	GASLIMIT   = 0x45
62 63

	// 0x50 range - 'storage' and execution
obscuren's avatar
obscuren committed
64 65 66
	POP = 0x50
	//DUP     = 0x51
	//SWAP    = 0x52
67 68 69 70 71 72 73 74 75 76
	MLOAD   = 0x53
	MSTORE  = 0x54
	MSTORE8 = 0x55
	SLOAD   = 0x56
	SSTORE  = 0x57
	JUMP    = 0x58
	JUMPI   = 0x59
	PC      = 0x5a
	MSIZE   = 0x5b
	GAS     = 0x5c
77

obscuren's avatar
obscuren committed
78
	// 0x60 range
obscuren's avatar
obscuren committed
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
	PUSH1  = 0x60
	PUSH2  = 0x61
	PUSH3  = 0x62
	PUSH4  = 0x63
	PUSH5  = 0x64
	PUSH6  = 0x65
	PUSH7  = 0x66
	PUSH8  = 0x67
	PUSH9  = 0x68
	PUSH10 = 0x69
	PUSH11 = 0x6a
	PUSH12 = 0x6b
	PUSH13 = 0x6c
	PUSH14 = 0x6d
	PUSH15 = 0x6e
	PUSH16 = 0x6f
	PUSH17 = 0x70
	PUSH18 = 0x71
	PUSH19 = 0x72
	PUSH20 = 0x73
	PUSH21 = 0x74
	PUSH22 = 0x75
	PUSH23 = 0x76
	PUSH24 = 0x77
	PUSH25 = 0x78
	PUSH26 = 0x79
	PUSH27 = 0x7a
	PUSH28 = 0x7b
	PUSH29 = 0x7c
	PUSH30 = 0x7d
	PUSH31 = 0x7e
	PUSH32 = 0x7f
obscuren's avatar
obscuren committed
111

obscuren's avatar
obscuren committed
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 139 140 141 142 143 144 145
	DUP1  = 0x80
	DUP2  = 0x81
	DUP3  = 0x82
	DUP4  = 0x83
	DUP5  = 0x84
	DUP6  = 0x85
	DUP7  = 0x86
	DUP8  = 0x87
	DUP9  = 0x88
	DUP10 = 0x89
	DUP11 = 0x8a
	DUP12 = 0x8b
	DUP13 = 0x8c
	DUP14 = 0x8d
	DUP15 = 0x8e
	DUP16 = 0x8f

	SWAP1  = 0x90
	SWAP2  = 0x91
	SWAP3  = 0x92
	SWAP4  = 0x93
	SWAP5  = 0x94
	SWAP6  = 0x95
	SWAP7  = 0x96
	SWAP8  = 0x97
	SWAP9  = 0x98
	SWAP10 = 0x99
	SWAP11 = 0x9a
	SWAP12 = 0x9b
	SWAP13 = 0x9c
	SWAP14 = 0x9d
	SWAP15 = 0x9e
	SWAP16 = 0x9f

obscuren's avatar
obscuren committed
146
	// 0xf0 range - closures
obscuren's avatar
obscuren committed
147 148 149 150
	CREATE   = 0xf0
	CALL     = 0xf1
	RETURN   = 0xf2
	CALLCODE = 0xf3
151 152

	// 0x70 range - other
obscuren's avatar
obscuren committed
153 154
	LOG     = 0xfe // XXX Unofficial
	SUICIDE = 0xff
155 156 157 158 159
)

// Since the opcodes aren't all in order we can't use a regular slice
var opCodeToString = map[OpCode]string{
	// 0x0 range - arithmetic ops
obscuren's avatar
obscuren committed
160 161 162 163 164 165 166 167 168
	STOP: "STOP",
	ADD:  "ADD",
	MUL:  "MUL",
	SUB:  "SUB",
	DIV:  "DIV",
	SDIV: "SDIV",
	MOD:  "MOD",
	SMOD: "SMOD",
	EXP:  "EXP",
obscuren's avatar
obscuren committed
169
	BNOT: "BNOT",
obscuren's avatar
obscuren committed
170 171
	LT:   "LT",
	GT:   "GT",
172 173
	SLT:  "SLT",
	SGT:  "SGT",
obscuren's avatar
obscuren committed
174 175
	EQ:   "EQ",
	NOT:  "NOT",
176 177

	// 0x10 range - bit ops
obscuren's avatar
obscuren committed
178 179 180 181 182 183
	AND:    "AND",
	OR:     "OR",
	XOR:    "XOR",
	BYTE:   "BYTE",
	ADDMOD: "ADDMOD",
	MULMOD: "MULMOD",
184 185

	// 0x20 range - crypto
obscuren's avatar
obscuren committed
186
	SHA3: "SHA3",
187 188

	// 0x30 range - closure state
obscuren's avatar
obscuren committed
189 190 191 192 193 194 195
	ADDRESS:      "ADDRESS",
	BALANCE:      "BALANCE",
	ORIGIN:       "ORIGIN",
	CALLER:       "CALLER",
	CALLVALUE:    "CALLVALUE",
	CALLDATALOAD: "CALLDATALOAD",
	CALLDATASIZE: "CALLDATASIZE",
196 197 198
	CALLDATACOPY: "CALLDATACOPY",
	CODESIZE:     "CODESIZE",
	CODECOPY:     "CODECOPY",
obscuren's avatar
obscuren committed
199
	GASPRICE:     "TXGASPRICE",
200 201

	// 0x40 range - block operations
obscuren's avatar
obscuren committed
202 203 204 205 206 207 208 209
	PREVHASH:    "PREVHASH",
	COINBASE:    "COINBASE",
	TIMESTAMP:   "TIMESTAMP",
	NUMBER:      "NUMBER",
	DIFFICULTY:  "DIFFICULTY",
	GASLIMIT:    "GASLIMIT",
	EXTCODESIZE: "EXTCODESIZE",
	EXTCODECOPY: "EXTCODECOPY",
210 211

	// 0x50 range - 'storage' and execution
obscuren's avatar
obscuren committed
212 213 214
	POP: "POP",
	//DUP:     "DUP",
	//SWAP:    "SWAP",
obscuren's avatar
obscuren committed
215 216 217 218 219 220 221 222 223
	MLOAD:   "MLOAD",
	MSTORE:  "MSTORE",
	MSTORE8: "MSTORE8",
	SLOAD:   "SLOAD",
	SSTORE:  "SSTORE",
	JUMP:    "JUMP",
	JUMPI:   "JUMPI",
	PC:      "PC",
	MSIZE:   "MSIZE",
224
	GAS:     "GAS",
225

obscuren's avatar
obscuren committed
226
	// 0x60 range - push
obscuren's avatar
obscuren committed
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
	PUSH1:  "PUSH1",
	PUSH2:  "PUSH2",
	PUSH3:  "PUSH3",
	PUSH4:  "PUSH4",
	PUSH5:  "PUSH5",
	PUSH6:  "PUSH6",
	PUSH7:  "PUSH7",
	PUSH8:  "PUSH8",
	PUSH9:  "PUSH9",
	PUSH10: "PUSH10",
	PUSH11: "PUSH11",
	PUSH12: "PUSH12",
	PUSH13: "PUSH13",
	PUSH14: "PUSH14",
	PUSH15: "PUSH15",
	PUSH16: "PUSH16",
	PUSH17: "PUSH17",
	PUSH18: "PUSH18",
	PUSH19: "PUSH19",
	PUSH20: "PUSH20",
	PUSH21: "PUSH21",
	PUSH22: "PUSH22",
	PUSH23: "PUSH23",
	PUSH24: "PUSH24",
	PUSH25: "PUSH25",
	PUSH26: "PUSH26",
	PUSH27: "PUSH27",
	PUSH28: "PUSH28",
	PUSH29: "PUSH29",
	PUSH30: "PUSH30",
	PUSH31: "PUSH31",
	PUSH32: "PUSH32",
obscuren's avatar
obscuren committed
259

obscuren's avatar
obscuren committed
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
	DUP1:  "DUP1",
	DUP2:  "DUP2",
	DUP3:  "DUP3",
	DUP4:  "DUP4",
	DUP5:  "DUP5",
	DUP6:  "DUP6",
	DUP7:  "DUP7",
	DUP8:  "DUP8",
	DUP9:  "DUP9",
	DUP10: "DUP10",
	DUP11: "DUP11",
	DUP12: "DUP12",
	DUP13: "DUP13",
	DUP14: "DUP14",
	DUP15: "DUP15",
	DUP16: "DUP16",

	SWAP1:  "SWAP1",
	SWAP2:  "SWAP2",
	SWAP3:  "SWAP3",
	SWAP4:  "SWAP4",
	SWAP5:  "SWAP5",
	SWAP6:  "SWAP6",
	SWAP7:  "SWAP7",
	SWAP8:  "SWAP8",
	SWAP9:  "SWAP9",
	SWAP10: "SWAP10",
	SWAP11: "SWAP11",
	SWAP12: "SWAP12",
	SWAP13: "SWAP13",
	SWAP14: "SWAP14",
	SWAP15: "SWAP15",
	SWAP16: "SWAP16",

obscuren's avatar
obscuren committed
294
	// 0xf0 range
obscuren's avatar
obscuren committed
295 296 297 298
	CREATE:   "CREATE",
	CALL:     "CALL",
	RETURN:   "RETURN",
	CALLCODE: "CALLCODE",
299 300

	// 0x70 range - other
obscuren's avatar
obscuren committed
301 302
	LOG:     "LOG",
	SUICIDE: "SUICIDE",
303 304 305
}

func (o OpCode) String() string {
306 307
	str := opCodeToString[o]
	if len(str) == 0 {
obscuren's avatar
obscuren committed
308
		return fmt.Sprintf("Missing opcode 0x%x", int(o))
309 310 311
	}

	return str
312
}