opcodes.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. // Copyright 2014 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package vm
  17. import (
  18. "fmt"
  19. )
  20. type OpCode byte
  21. // Op codes
  22. const (
  23. // 0x0 range - arithmetic ops
  24. STOP OpCode = iota
  25. ADD
  26. MUL
  27. SUB
  28. DIV
  29. SDIV
  30. MOD
  31. SMOD
  32. ADDMOD
  33. MULMOD
  34. EXP
  35. SIGNEXTEND
  36. )
  37. const (
  38. LT OpCode = iota + 0x10
  39. GT
  40. SLT
  41. SGT
  42. EQ
  43. ISZERO
  44. AND
  45. OR
  46. XOR
  47. NOT
  48. BYTE
  49. SHA3 = 0x20
  50. )
  51. const (
  52. // 0x30 range - closure state
  53. ADDRESS OpCode = 0x30 + iota
  54. BALANCE
  55. ORIGIN
  56. CALLER
  57. CALLVALUE
  58. CALLDATALOAD
  59. CALLDATASIZE
  60. CALLDATACOPY
  61. CODESIZE
  62. CODECOPY
  63. GASPRICE
  64. EXTCODESIZE
  65. EXTCODECOPY
  66. )
  67. const (
  68. // 0x40 range - block operations
  69. BLOCKHASH OpCode = 0x40 + iota
  70. COINBASE
  71. TIMESTAMP
  72. NUMBER
  73. DIFFICULTY
  74. GASLIMIT
  75. )
  76. const (
  77. // 0x50 range - 'storage' and execution
  78. POP OpCode = 0x50 + iota
  79. MLOAD
  80. MSTORE
  81. MSTORE8
  82. SLOAD
  83. SSTORE
  84. JUMP
  85. JUMPI
  86. PC
  87. MSIZE
  88. GAS
  89. JUMPDEST
  90. )
  91. const (
  92. // 0x60 range
  93. PUSH1 OpCode = 0x60 + iota
  94. PUSH2
  95. PUSH3
  96. PUSH4
  97. PUSH5
  98. PUSH6
  99. PUSH7
  100. PUSH8
  101. PUSH9
  102. PUSH10
  103. PUSH11
  104. PUSH12
  105. PUSH13
  106. PUSH14
  107. PUSH15
  108. PUSH16
  109. PUSH17
  110. PUSH18
  111. PUSH19
  112. PUSH20
  113. PUSH21
  114. PUSH22
  115. PUSH23
  116. PUSH24
  117. PUSH25
  118. PUSH26
  119. PUSH27
  120. PUSH28
  121. PUSH29
  122. PUSH30
  123. PUSH31
  124. PUSH32
  125. DUP1
  126. DUP2
  127. DUP3
  128. DUP4
  129. DUP5
  130. DUP6
  131. DUP7
  132. DUP8
  133. DUP9
  134. DUP10
  135. DUP11
  136. DUP12
  137. DUP13
  138. DUP14
  139. DUP15
  140. DUP16
  141. SWAP1
  142. SWAP2
  143. SWAP3
  144. SWAP4
  145. SWAP5
  146. SWAP6
  147. SWAP7
  148. SWAP8
  149. SWAP9
  150. SWAP10
  151. SWAP11
  152. SWAP12
  153. SWAP13
  154. SWAP14
  155. SWAP15
  156. SWAP16
  157. )
  158. const (
  159. LOG0 OpCode = 0xa0 + iota
  160. LOG1
  161. LOG2
  162. LOG3
  163. LOG4
  164. )
  165. const (
  166. // 0xf0 range - closures
  167. CREATE OpCode = 0xf0 + iota
  168. CALL
  169. CALLCODE
  170. RETURN
  171. // 0x70 range - other
  172. SUICIDE = 0xff
  173. )
  174. // Since the opcodes aren't all in order we can't use a regular slice
  175. var opCodeToString = map[OpCode]string{
  176. // 0x0 range - arithmetic ops
  177. STOP: "STOP",
  178. ADD: "ADD",
  179. MUL: "MUL",
  180. SUB: "SUB",
  181. DIV: "DIV",
  182. SDIV: "SDIV",
  183. MOD: "MOD",
  184. SMOD: "SMOD",
  185. EXP: "EXP",
  186. NOT: "NOT",
  187. LT: "LT",
  188. GT: "GT",
  189. SLT: "SLT",
  190. SGT: "SGT",
  191. EQ: "EQ",
  192. ISZERO: "ISZERO",
  193. SIGNEXTEND: "SIGNEXTEND",
  194. // 0x10 range - bit ops
  195. AND: "AND",
  196. OR: "OR",
  197. XOR: "XOR",
  198. BYTE: "BYTE",
  199. ADDMOD: "ADDMOD",
  200. MULMOD: "MULMOD",
  201. // 0x20 range - crypto
  202. SHA3: "SHA3",
  203. // 0x30 range - closure state
  204. ADDRESS: "ADDRESS",
  205. BALANCE: "BALANCE",
  206. ORIGIN: "ORIGIN",
  207. CALLER: "CALLER",
  208. CALLVALUE: "CALLVALUE",
  209. CALLDATALOAD: "CALLDATALOAD",
  210. CALLDATASIZE: "CALLDATASIZE",
  211. CALLDATACOPY: "CALLDATACOPY",
  212. CODESIZE: "CODESIZE",
  213. CODECOPY: "CODECOPY",
  214. GASPRICE: "TXGASPRICE",
  215. // 0x40 range - block operations
  216. BLOCKHASH: "BLOCKHASH",
  217. COINBASE: "COINBASE",
  218. TIMESTAMP: "TIMESTAMP",
  219. NUMBER: "NUMBER",
  220. DIFFICULTY: "DIFFICULTY",
  221. GASLIMIT: "GASLIMIT",
  222. EXTCODESIZE: "EXTCODESIZE",
  223. EXTCODECOPY: "EXTCODECOPY",
  224. // 0x50 range - 'storage' and execution
  225. POP: "POP",
  226. //DUP: "DUP",
  227. //SWAP: "SWAP",
  228. MLOAD: "MLOAD",
  229. MSTORE: "MSTORE",
  230. MSTORE8: "MSTORE8",
  231. SLOAD: "SLOAD",
  232. SSTORE: "SSTORE",
  233. JUMP: "JUMP",
  234. JUMPI: "JUMPI",
  235. PC: "PC",
  236. MSIZE: "MSIZE",
  237. GAS: "GAS",
  238. JUMPDEST: "JUMPDEST",
  239. // 0x60 range - push
  240. PUSH1: "PUSH1",
  241. PUSH2: "PUSH2",
  242. PUSH3: "PUSH3",
  243. PUSH4: "PUSH4",
  244. PUSH5: "PUSH5",
  245. PUSH6: "PUSH6",
  246. PUSH7: "PUSH7",
  247. PUSH8: "PUSH8",
  248. PUSH9: "PUSH9",
  249. PUSH10: "PUSH10",
  250. PUSH11: "PUSH11",
  251. PUSH12: "PUSH12",
  252. PUSH13: "PUSH13",
  253. PUSH14: "PUSH14",
  254. PUSH15: "PUSH15",
  255. PUSH16: "PUSH16",
  256. PUSH17: "PUSH17",
  257. PUSH18: "PUSH18",
  258. PUSH19: "PUSH19",
  259. PUSH20: "PUSH20",
  260. PUSH21: "PUSH21",
  261. PUSH22: "PUSH22",
  262. PUSH23: "PUSH23",
  263. PUSH24: "PUSH24",
  264. PUSH25: "PUSH25",
  265. PUSH26: "PUSH26",
  266. PUSH27: "PUSH27",
  267. PUSH28: "PUSH28",
  268. PUSH29: "PUSH29",
  269. PUSH30: "PUSH30",
  270. PUSH31: "PUSH31",
  271. PUSH32: "PUSH32",
  272. DUP1: "DUP1",
  273. DUP2: "DUP2",
  274. DUP3: "DUP3",
  275. DUP4: "DUP4",
  276. DUP5: "DUP5",
  277. DUP6: "DUP6",
  278. DUP7: "DUP7",
  279. DUP8: "DUP8",
  280. DUP9: "DUP9",
  281. DUP10: "DUP10",
  282. DUP11: "DUP11",
  283. DUP12: "DUP12",
  284. DUP13: "DUP13",
  285. DUP14: "DUP14",
  286. DUP15: "DUP15",
  287. DUP16: "DUP16",
  288. SWAP1: "SWAP1",
  289. SWAP2: "SWAP2",
  290. SWAP3: "SWAP3",
  291. SWAP4: "SWAP4",
  292. SWAP5: "SWAP5",
  293. SWAP6: "SWAP6",
  294. SWAP7: "SWAP7",
  295. SWAP8: "SWAP8",
  296. SWAP9: "SWAP9",
  297. SWAP10: "SWAP10",
  298. SWAP11: "SWAP11",
  299. SWAP12: "SWAP12",
  300. SWAP13: "SWAP13",
  301. SWAP14: "SWAP14",
  302. SWAP15: "SWAP15",
  303. SWAP16: "SWAP16",
  304. LOG0: "LOG0",
  305. LOG1: "LOG1",
  306. LOG2: "LOG2",
  307. LOG3: "LOG3",
  308. LOG4: "LOG4",
  309. // 0xf0 range
  310. CREATE: "CREATE",
  311. CALL: "CALL",
  312. RETURN: "RETURN",
  313. CALLCODE: "CALLCODE",
  314. // 0x70 range - other
  315. SUICIDE: "SUICIDE",
  316. }
  317. func (o OpCode) String() string {
  318. str := opCodeToString[o]
  319. if len(str) == 0 {
  320. return fmt.Sprintf("Missing opcode 0x%x", int(o))
  321. }
  322. return str
  323. }
  324. var stringToOp = map[string]OpCode{
  325. "STOP": STOP,
  326. "ADD": ADD,
  327. "MUL": MUL,
  328. "SUB": SUB,
  329. "DIV": DIV,
  330. "SDIV": SDIV,
  331. "MOD": MOD,
  332. "SMOD": SMOD,
  333. "EXP": EXP,
  334. "NOT": NOT,
  335. "LT": LT,
  336. "GT": GT,
  337. "SLT": SLT,
  338. "SGT": SGT,
  339. "EQ": EQ,
  340. "ISZERO": ISZERO,
  341. "SIGNEXTEND": SIGNEXTEND,
  342. "AND": AND,
  343. "OR": OR,
  344. "XOR": XOR,
  345. "BYTE": BYTE,
  346. "ADDMOD": ADDMOD,
  347. "MULMOD": MULMOD,
  348. "SHA3": SHA3,
  349. "ADDRESS": ADDRESS,
  350. "BALANCE": BALANCE,
  351. "ORIGIN": ORIGIN,
  352. "CALLER": CALLER,
  353. "CALLVALUE": CALLVALUE,
  354. "CALLDATALOAD": CALLDATALOAD,
  355. "CALLDATASIZE": CALLDATASIZE,
  356. "CALLDATACOPY": CALLDATACOPY,
  357. "CODESIZE": CODESIZE,
  358. "CODECOPY": CODECOPY,
  359. "GASPRICE": GASPRICE,
  360. "BLOCKHASH": BLOCKHASH,
  361. "COINBASE": COINBASE,
  362. "TIMESTAMP": TIMESTAMP,
  363. "NUMBER": NUMBER,
  364. "DIFFICULTY": DIFFICULTY,
  365. "GASLIMIT": GASLIMIT,
  366. "EXTCODESIZE": EXTCODESIZE,
  367. "EXTCODECOPY": EXTCODECOPY,
  368. "POP": POP,
  369. "MLOAD": MLOAD,
  370. "MSTORE": MSTORE,
  371. "MSTORE8": MSTORE8,
  372. "SLOAD": SLOAD,
  373. "SSTORE": SSTORE,
  374. "JUMP": JUMP,
  375. "JUMPI": JUMPI,
  376. "PC": PC,
  377. "MSIZE": MSIZE,
  378. "GAS": GAS,
  379. "JUMPDEST": JUMPDEST,
  380. "PUSH1": PUSH1,
  381. "PUSH2": PUSH2,
  382. "PUSH3": PUSH3,
  383. "PUSH4": PUSH4,
  384. "PUSH5": PUSH5,
  385. "PUSH6": PUSH6,
  386. "PUSH7": PUSH7,
  387. "PUSH8": PUSH8,
  388. "PUSH9": PUSH9,
  389. "PUSH10": PUSH10,
  390. "PUSH11": PUSH11,
  391. "PUSH12": PUSH12,
  392. "PUSH13": PUSH13,
  393. "PUSH14": PUSH14,
  394. "PUSH15": PUSH15,
  395. "PUSH16": PUSH16,
  396. "PUSH17": PUSH17,
  397. "PUSH18": PUSH18,
  398. "PUSH19": PUSH19,
  399. "PUSH20": PUSH20,
  400. "PUSH21": PUSH21,
  401. "PUSH22": PUSH22,
  402. "PUSH23": PUSH23,
  403. "PUSH24": PUSH24,
  404. "PUSH25": PUSH25,
  405. "PUSH26": PUSH26,
  406. "PUSH27": PUSH27,
  407. "PUSH28": PUSH28,
  408. "PUSH29": PUSH29,
  409. "PUSH30": PUSH30,
  410. "PUSH31": PUSH31,
  411. "PUSH32": PUSH32,
  412. "DUP1": DUP1,
  413. "DUP2": DUP2,
  414. "DUP3": DUP3,
  415. "DUP4": DUP4,
  416. "DUP5": DUP5,
  417. "DUP6": DUP6,
  418. "DUP7": DUP7,
  419. "DUP8": DUP8,
  420. "DUP9": DUP9,
  421. "DUP10": DUP10,
  422. "DUP11": DUP11,
  423. "DUP12": DUP12,
  424. "DUP13": DUP13,
  425. "DUP14": DUP14,
  426. "DUP15": DUP15,
  427. "DUP16": DUP16,
  428. "SWAP1": SWAP1,
  429. "SWAP2": SWAP2,
  430. "SWAP3": SWAP3,
  431. "SWAP4": SWAP4,
  432. "SWAP5": SWAP5,
  433. "SWAP6": SWAP6,
  434. "SWAP7": SWAP7,
  435. "SWAP8": SWAP8,
  436. "SWAP9": SWAP9,
  437. "SWAP10": SWAP10,
  438. "SWAP11": SWAP11,
  439. "SWAP12": SWAP12,
  440. "SWAP13": SWAP13,
  441. "SWAP14": SWAP14,
  442. "SWAP15": SWAP15,
  443. "SWAP16": SWAP16,
  444. "LOG0": LOG0,
  445. "LOG1": LOG1,
  446. "LOG2": LOG2,
  447. "LOG3": LOG3,
  448. "LOG4": LOG4,
  449. "CREATE": CREATE,
  450. "CALL": CALL,
  451. "RETURN": RETURN,
  452. "CALLCODE": CALLCODE,
  453. "SUICIDE": SUICIDE,
  454. }
  455. func StringToOp(str string) OpCode {
  456. return stringToOp[str]
  457. }