opcodes.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. const codes = {
  2. // 0x0 range - arithmetic ops
  3. // name, baseCost, off stack, on stack
  4. 0x00: ['STOP', 0, 0, 0],
  5. 0x01: ['ADD', 3, 2, 1],
  6. 0x02: ['MUL', 5, 2, 1],
  7. 0x03: ['SUB', 3, 2, 1],
  8. 0x04: ['DIV', 5, 2, 1],
  9. 0x05: ['SDIV', 5, 2, 1],
  10. 0x06: ['MOD', 5, 2, 1],
  11. 0x07: ['SMOD', 5, 2, 1],
  12. 0x08: ['ADDMOD', 8, 3, 1],
  13. 0x09: ['MULMOD', 8, 3, 1],
  14. 0x0a: ['EXP', 10, 2, 1],
  15. 0x0b: ['SIGNEXTEND', 5, 2, 1],
  16. // 0x10 range - bit ops
  17. 0x10: ['LT', 3, 2, 1],
  18. 0x11: ['GT', 3, 2, 1],
  19. 0x12: ['SLT', 3, 2, 1],
  20. 0x13: ['SGT', 3, 2, 1],
  21. 0x14: ['EQ', 3, 2, 1],
  22. 0x15: ['ISZERO', 3, 1, 1],
  23. 0x16: ['AND', 3, 2, 1],
  24. 0x17: ['OR', 3, 2, 1],
  25. 0x18: ['XOR', 3, 2, 1],
  26. 0x19: ['NOT', 3, 1, 1],
  27. 0x1a: ['BYTE', 3, 2, 1],
  28. // 0x20 range - crypto
  29. 0x20: ['SHA3', 30, 2, 1],
  30. // 0x30 range - closure state
  31. 0x30: ['ADDRESS', 0, 0, 1],
  32. 0x31: ['BALANCE', 0, 1, 1],
  33. 0x32: ['ORIGIN', 0, 0, 1],
  34. 0x33: ['CALLER', 0, 0, 1],
  35. 0x34: ['CALLVALUE', 0, 0, 1],
  36. 0x35: ['CALLDATALOAD', 0, 1, 1],
  37. 0x36: ['CALLDATASIZE', 0, 0, 1],
  38. 0x37: ['CALLDATACOPY', 0, 3, 0],
  39. 0x38: ['CODESIZE', 0, 0, 1],
  40. 0x39: ['CODECOPY', 0, 3, 0],
  41. 0x3a: ['GASPRICE', 0, 0, 1],
  42. 0x3b: ['EXTCODESIZE', 0, 1, 1],
  43. 0x3c: ['EXTCODECOPY', 0, 4, 0],
  44. // '0x40' range - block operations
  45. 0x40: ['BLOCKHASH', 0, 1, 1],
  46. 0x41: ['COINBASE', 0, 0, 1],
  47. 0x42: ['TIMESTAMP', 0, 0, 1],
  48. 0x43: ['NUMBER', 0, 0, 1],
  49. 0x44: ['DIFFICULTY', 0, 0, 1],
  50. 0x45: ['GASLIMIT', 0, 0, 1],
  51. // 0x50 range - 'storage' and execution
  52. 0x50: ['POP', 2, 1, 0],
  53. 0x51: ['MLOAD', 3, 1, 1],
  54. 0x52: ['MSTORE', 3, 2, 0],
  55. 0x53: ['MSTORE8', 3, 2, 0],
  56. 0x54: ['SLOAD', 0, 1, 1],
  57. 0x55: ['SSTORE', 0, 2, 0],
  58. 0x56: ['JUMP', 8, 0, 0],
  59. 0x57: ['JUMPI', 10, 0, 0],
  60. 0x58: ['PC', 2, 0, 1],
  61. 0x59: ['MSIZE', 2, 0, 1],
  62. 0x5a: ['GAS', 0, 0, 1],
  63. 0x5b: ['JUMPDEST', 0, 0, 0],
  64. // 0x60, range
  65. 0x60: ['PUSH', 3, 0, 1],
  66. 0x61: ['PUSH', 3, 0, 1],
  67. 0x62: ['PUSH', 3, 0, 1],
  68. 0x63: ['PUSH', 3, 0, 1],
  69. 0x64: ['PUSH', 3, 0, 1],
  70. 0x65: ['PUSH', 3, 0, 1],
  71. 0x66: ['PUSH', 3, 0, 1],
  72. 0x67: ['PUSH', 3, 0, 1],
  73. 0x68: ['PUSH', 3, 0, 1],
  74. 0x69: ['PUSH', 3, 0, 1],
  75. 0x6a: ['PUSH', 3, 0, 1],
  76. 0x6b: ['PUSH', 3, 0, 1],
  77. 0x6c: ['PUSH', 3, 0, 1],
  78. 0x6d: ['PUSH', 3, 0, 1],
  79. 0x6e: ['PUSH', 3, 0, 1],
  80. 0x6f: ['PUSH', 3, 0, 1],
  81. 0x70: ['PUSH', 3, 0, 1],
  82. 0x71: ['PUSH', 3, 0, 1],
  83. 0x72: ['PUSH', 3, 0, 1],
  84. 0x73: ['PUSH', 3, 0, 1],
  85. 0x74: ['PUSH', 3, 0, 1],
  86. 0x75: ['PUSH', 3, 0, 1],
  87. 0x76: ['PUSH', 3, 0, 1],
  88. 0x77: ['PUSH', 3, 0, 1],
  89. 0x78: ['PUSH', 3, 0, 1],
  90. 0x79: ['PUSH', 3, 0, 1],
  91. 0x7a: ['PUSH', 3, 0, 1],
  92. 0x7b: ['PUSH', 3, 0, 1],
  93. 0x7c: ['PUSH', 3, 0, 1],
  94. 0x7d: ['PUSH', 3, 0, 1],
  95. 0x7e: ['PUSH', 3, 0, 1],
  96. 0x7f: ['PUSH', 3, 0, 1],
  97. 0x80: ['DUP', 3, 0, 1],
  98. 0x81: ['DUP', 3, 0, 1],
  99. 0x82: ['DUP', 3, 0, 1],
  100. 0x83: ['DUP', 3, 0, 1],
  101. 0x84: ['DUP', 3, 0, 1],
  102. 0x85: ['DUP', 3, 0, 1],
  103. 0x86: ['DUP', 3, 0, 1],
  104. 0x87: ['DUP', 3, 0, 1],
  105. 0x88: ['DUP', 3, 0, 1],
  106. 0x89: ['DUP', 3, 0, 1],
  107. 0x8a: ['DUP', 3, 0, 1],
  108. 0x8b: ['DUP', 3, 0, 1],
  109. 0x8c: ['DUP', 3, 0, 1],
  110. 0x8d: ['DUP', 3, 0, 1],
  111. 0x8e: ['DUP', 3, 0, 1],
  112. 0x8f: ['DUP', 3, 0, 1],
  113. 0x90: ['SWAP', 3, 0, 0],
  114. 0x91: ['SWAP', 3, 0, 0],
  115. 0x92: ['SWAP', 3, 0, 0],
  116. 0x93: ['SWAP', 3, 0, 0],
  117. 0x94: ['SWAP', 3, 0, 0],
  118. 0x95: ['SWAP', 3, 0, 0],
  119. 0x96: ['SWAP', 3, 0, 0],
  120. 0x97: ['SWAP', 3, 0, 0],
  121. 0x98: ['SWAP', 3, 0, 0],
  122. 0x99: ['SWAP', 3, 0, 0],
  123. 0x9a: ['SWAP', 3, 0, 0],
  124. 0x9b: ['SWAP', 3, 0, 0],
  125. 0x9c: ['SWAP', 3, 0, 0],
  126. 0x9d: ['SWAP', 3, 0, 0],
  127. 0x9e: ['SWAP', 3, 0, 0],
  128. 0x9f: ['SWAP', 3, 0, 0],
  129. 0xa0: ['LOG', 0, 2, 0],
  130. 0xa1: ['LOG', 0, 3, 0],
  131. 0xa2: ['LOG', 0, 4, 0],
  132. 0xa3: ['LOG', 0, 5, 0],
  133. 0xa4: ['LOG', 0, 6, 0],
  134. // '0xf0' range - closures
  135. 0xf0: ['CREATE', 0, 3, 1],
  136. 0xf1: ['CALL', 0, 7, 1],
  137. 0xf2: ['CALLCODE', 0, 7, 1],
  138. 0xf3: ['RETURN', 0, 2, 0],
  139. 0xf4: ['DELEGATECALL', 0, 6, 1],
  140. // '0x70', range - other
  141. 0xff: ['SELFDESTRUCT', 0, 1, 0]
  142. }
  143. module.exports = function (op) {
  144. const code = codes[op] ? codes[op] : ['INVALID', 0, 0, 0]
  145. let opcode = code[0]
  146. let number
  147. switch (opcode) {
  148. case 'LOG':
  149. number = op - 0xa0
  150. break
  151. case 'PUSH':
  152. number = op - 0x5f
  153. break
  154. case 'DUP':
  155. number = op - 0x7f
  156. break
  157. case 'SWAP':
  158. number = op - 0x8f
  159. break
  160. }
  161. return {
  162. name: opcode,
  163. fee: code[1],
  164. off: code[2],
  165. on: code[3],
  166. number: number
  167. }
  168. }