| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // Copyright 2014 The go-ethereum Authors | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // This file is part of the go-ethereum library. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-23 18:35:11 +02:00
										 |  |  | // The go-ethereum library is free software: you can redistribute it and/or modify | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // it under the terms of the GNU Lesser General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // The go-ethereum library is distributed in the hope that it will be useful, | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | // GNU Lesser General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Lesser General Public License | 
					
						
							| 
									
										
										
										
											2015-07-22 18:48:40 +02:00
										 |  |  | // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2015-07-07 02:54:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-18 13:31:20 +02:00
										 |  |  | package vm | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 10:19:10 +02:00
										 |  |  | // OpCode is an EVM opcode | 
					
						
							| 
									
										
										
										
											2014-10-14 11:48:52 +02:00
										 |  |  | type OpCode byte | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-06 23:39:43 +02:00
										 |  |  | func (op OpCode) IsPush() bool { | 
					
						
							|  |  |  | 	switch op { | 
					
						
							|  |  |  | 	case PUSH1, PUSH2, PUSH3, PUSH4, PUSH5, PUSH6, PUSH7, PUSH8, PUSH9, PUSH10, PUSH11, PUSH12, PUSH13, PUSH14, PUSH15, PUSH16, PUSH17, PUSH18, PUSH19, PUSH20, PUSH21, PUSH22, PUSH23, PUSH24, PUSH25, PUSH26, PUSH27, PUSH28, PUSH29, PUSH30, PUSH31, PUSH32: | 
					
						
							|  |  |  | 		return true | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (op OpCode) IsStaticJump() bool { | 
					
						
							|  |  |  | 	return op == JUMP | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	// 0x0 range - arithmetic ops | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	STOP OpCode = iota | 
					
						
							|  |  |  | 	ADD | 
					
						
							|  |  |  | 	MUL | 
					
						
							|  |  |  | 	SUB | 
					
						
							|  |  |  | 	DIV | 
					
						
							|  |  |  | 	SDIV | 
					
						
							|  |  |  | 	MOD | 
					
						
							|  |  |  | 	SMOD | 
					
						
							|  |  |  | 	ADDMOD | 
					
						
							|  |  |  | 	MULMOD | 
					
						
							|  |  |  | 	EXP | 
					
						
							|  |  |  | 	SIGNEXTEND | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	LT OpCode = iota + 0x10 | 
					
						
							|  |  |  | 	GT | 
					
						
							|  |  |  | 	SLT | 
					
						
							|  |  |  | 	SGT | 
					
						
							|  |  |  | 	EQ | 
					
						
							|  |  |  | 	ISZERO | 
					
						
							|  |  |  | 	AND | 
					
						
							|  |  |  | 	OR | 
					
						
							|  |  |  | 	XOR | 
					
						
							|  |  |  | 	NOT | 
					
						
							|  |  |  | 	BYTE | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SHA3 = 0x20 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0x30 range - closure state | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	ADDRESS OpCode = 0x30 + iota | 
					
						
							|  |  |  | 	BALANCE | 
					
						
							|  |  |  | 	ORIGIN | 
					
						
							|  |  |  | 	CALLER | 
					
						
							|  |  |  | 	CALLVALUE | 
					
						
							|  |  |  | 	CALLDATALOAD | 
					
						
							|  |  |  | 	CALLDATASIZE | 
					
						
							|  |  |  | 	CALLDATACOPY | 
					
						
							|  |  |  | 	CODESIZE | 
					
						
							|  |  |  | 	CODECOPY | 
					
						
							|  |  |  | 	GASPRICE | 
					
						
							|  |  |  | 	EXTCODESIZE | 
					
						
							|  |  |  | 	EXTCODECOPY | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x40 range - block operations | 
					
						
							| 
									
										
										
										
											2015-01-03 17:18:43 +01:00
										 |  |  | 	BLOCKHASH OpCode = 0x40 + iota | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	COINBASE | 
					
						
							|  |  |  | 	TIMESTAMP | 
					
						
							|  |  |  | 	NUMBER | 
					
						
							|  |  |  | 	DIFFICULTY | 
					
						
							|  |  |  | 	GASLIMIT | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0x50 range - 'storage' and execution | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	POP OpCode = 0x50 + iota | 
					
						
							|  |  |  | 	MLOAD | 
					
						
							|  |  |  | 	MSTORE | 
					
						
							|  |  |  | 	MSTORE8 | 
					
						
							|  |  |  | 	SLOAD | 
					
						
							|  |  |  | 	SSTORE | 
					
						
							|  |  |  | 	JUMP | 
					
						
							|  |  |  | 	JUMPI | 
					
						
							|  |  |  | 	PC | 
					
						
							|  |  |  | 	MSIZE | 
					
						
							|  |  |  | 	GAS | 
					
						
							|  |  |  | 	JUMPDEST | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0x60 range | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	PUSH1 OpCode = 0x60 + iota | 
					
						
							|  |  |  | 	PUSH2 | 
					
						
							|  |  |  | 	PUSH3 | 
					
						
							|  |  |  | 	PUSH4 | 
					
						
							|  |  |  | 	PUSH5 | 
					
						
							|  |  |  | 	PUSH6 | 
					
						
							|  |  |  | 	PUSH7 | 
					
						
							|  |  |  | 	PUSH8 | 
					
						
							|  |  |  | 	PUSH9 | 
					
						
							|  |  |  | 	PUSH10 | 
					
						
							|  |  |  | 	PUSH11 | 
					
						
							|  |  |  | 	PUSH12 | 
					
						
							|  |  |  | 	PUSH13 | 
					
						
							|  |  |  | 	PUSH14 | 
					
						
							|  |  |  | 	PUSH15 | 
					
						
							|  |  |  | 	PUSH16 | 
					
						
							|  |  |  | 	PUSH17 | 
					
						
							|  |  |  | 	PUSH18 | 
					
						
							|  |  |  | 	PUSH19 | 
					
						
							|  |  |  | 	PUSH20 | 
					
						
							|  |  |  | 	PUSH21 | 
					
						
							|  |  |  | 	PUSH22 | 
					
						
							|  |  |  | 	PUSH23 | 
					
						
							|  |  |  | 	PUSH24 | 
					
						
							|  |  |  | 	PUSH25 | 
					
						
							|  |  |  | 	PUSH26 | 
					
						
							|  |  |  | 	PUSH27 | 
					
						
							|  |  |  | 	PUSH28 | 
					
						
							|  |  |  | 	PUSH29 | 
					
						
							|  |  |  | 	PUSH30 | 
					
						
							|  |  |  | 	PUSH31 | 
					
						
							|  |  |  | 	PUSH32 | 
					
						
							|  |  |  | 	DUP1 | 
					
						
							|  |  |  | 	DUP2 | 
					
						
							|  |  |  | 	DUP3 | 
					
						
							|  |  |  | 	DUP4 | 
					
						
							|  |  |  | 	DUP5 | 
					
						
							|  |  |  | 	DUP6 | 
					
						
							|  |  |  | 	DUP7 | 
					
						
							|  |  |  | 	DUP8 | 
					
						
							|  |  |  | 	DUP9 | 
					
						
							|  |  |  | 	DUP10 | 
					
						
							|  |  |  | 	DUP11 | 
					
						
							|  |  |  | 	DUP12 | 
					
						
							|  |  |  | 	DUP13 | 
					
						
							|  |  |  | 	DUP14 | 
					
						
							|  |  |  | 	DUP15 | 
					
						
							|  |  |  | 	DUP16 | 
					
						
							|  |  |  | 	SWAP1 | 
					
						
							|  |  |  | 	SWAP2 | 
					
						
							|  |  |  | 	SWAP3 | 
					
						
							|  |  |  | 	SWAP4 | 
					
						
							|  |  |  | 	SWAP5 | 
					
						
							|  |  |  | 	SWAP6 | 
					
						
							|  |  |  | 	SWAP7 | 
					
						
							|  |  |  | 	SWAP8 | 
					
						
							|  |  |  | 	SWAP9 | 
					
						
							|  |  |  | 	SWAP10 | 
					
						
							|  |  |  | 	SWAP11 | 
					
						
							|  |  |  | 	SWAP12 | 
					
						
							|  |  |  | 	SWAP13 | 
					
						
							|  |  |  | 	SWAP14 | 
					
						
							|  |  |  | 	SWAP15 | 
					
						
							|  |  |  | 	SWAP16 | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2014-10-27 11:44:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	LOG0 OpCode = 0xa0 + iota | 
					
						
							|  |  |  | 	LOG1 | 
					
						
							|  |  |  | 	LOG2 | 
					
						
							|  |  |  | 	LOG3 | 
					
						
							|  |  |  | 	LOG4 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 13:33:46 +02:00
										 |  |  | // unofficial opcodes used for parsing | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	PUSH OpCode = 0xb0 + iota | 
					
						
							|  |  |  | 	DUP | 
					
						
							|  |  |  | 	SWAP | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | const ( | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0xf0 range - closures | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	CREATE OpCode = 0xf0 + iota | 
					
						
							|  |  |  | 	CALL | 
					
						
							|  |  |  | 	CALLCODE | 
					
						
							| 
									
										
										
										
											2014-12-02 17:22:33 +01:00
										 |  |  | 	RETURN | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | 	DELEGATECALL | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SUICIDE = 0xff | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Since the opcodes aren't all in order we can't use a regular slice | 
					
						
							|  |  |  | var opCodeToString = map[OpCode]string{ | 
					
						
							|  |  |  | 	// 0x0 range - arithmetic ops | 
					
						
							| 
									
										
										
										
											2014-11-04 18:18:57 +01:00
										 |  |  | 	STOP:       "STOP", | 
					
						
							|  |  |  | 	ADD:        "ADD", | 
					
						
							|  |  |  | 	MUL:        "MUL", | 
					
						
							|  |  |  | 	SUB:        "SUB", | 
					
						
							|  |  |  | 	DIV:        "DIV", | 
					
						
							|  |  |  | 	SDIV:       "SDIV", | 
					
						
							|  |  |  | 	MOD:        "MOD", | 
					
						
							|  |  |  | 	SMOD:       "SMOD", | 
					
						
							|  |  |  | 	EXP:        "EXP", | 
					
						
							|  |  |  | 	NOT:        "NOT", | 
					
						
							|  |  |  | 	LT:         "LT", | 
					
						
							|  |  |  | 	GT:         "GT", | 
					
						
							|  |  |  | 	SLT:        "SLT", | 
					
						
							|  |  |  | 	SGT:        "SGT", | 
					
						
							|  |  |  | 	EQ:         "EQ", | 
					
						
							|  |  |  | 	ISZERO:     "ISZERO", | 
					
						
							|  |  |  | 	SIGNEXTEND: "SIGNEXTEND", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x10 range - bit ops | 
					
						
							| 
									
										
										
										
											2014-08-21 19:23:54 +02:00
										 |  |  | 	AND:    "AND", | 
					
						
							|  |  |  | 	OR:     "OR", | 
					
						
							|  |  |  | 	XOR:    "XOR", | 
					
						
							|  |  |  | 	BYTE:   "BYTE", | 
					
						
							|  |  |  | 	ADDMOD: "ADDMOD", | 
					
						
							|  |  |  | 	MULMOD: "MULMOD", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x20 range - crypto | 
					
						
							|  |  |  | 	SHA3: "SHA3", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 0x30 range - closure state | 
					
						
							|  |  |  | 	ADDRESS:      "ADDRESS", | 
					
						
							|  |  |  | 	BALANCE:      "BALANCE", | 
					
						
							|  |  |  | 	ORIGIN:       "ORIGIN", | 
					
						
							|  |  |  | 	CALLER:       "CALLER", | 
					
						
							|  |  |  | 	CALLVALUE:    "CALLVALUE", | 
					
						
							|  |  |  | 	CALLDATALOAD: "CALLDATALOAD", | 
					
						
							|  |  |  | 	CALLDATASIZE: "CALLDATASIZE", | 
					
						
							|  |  |  | 	CALLDATACOPY: "CALLDATACOPY", | 
					
						
							|  |  |  | 	CODESIZE:     "CODESIZE", | 
					
						
							|  |  |  | 	CODECOPY:     "CODECOPY", | 
					
						
							| 
									
										
										
										
											2016-10-19 15:55:34 +11:00
										 |  |  | 	GASPRICE:     "GASPRICE", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x40 range - block operations | 
					
						
							| 
									
										
										
										
											2015-01-03 17:18:43 +01:00
										 |  |  | 	BLOCKHASH:   "BLOCKHASH", | 
					
						
							| 
									
										
										
										
											2014-09-08 00:49:25 +02:00
										 |  |  | 	COINBASE:    "COINBASE", | 
					
						
							|  |  |  | 	TIMESTAMP:   "TIMESTAMP", | 
					
						
							|  |  |  | 	NUMBER:      "NUMBER", | 
					
						
							|  |  |  | 	DIFFICULTY:  "DIFFICULTY", | 
					
						
							|  |  |  | 	GASLIMIT:    "GASLIMIT", | 
					
						
							|  |  |  | 	EXTCODESIZE: "EXTCODESIZE", | 
					
						
							|  |  |  | 	EXTCODECOPY: "EXTCODECOPY", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x50 range - 'storage' and execution | 
					
						
							| 
									
										
										
										
											2014-08-21 20:25:02 +02:00
										 |  |  | 	POP: "POP", | 
					
						
							|  |  |  | 	//DUP:     "DUP", | 
					
						
							|  |  |  | 	//SWAP:    "SWAP", | 
					
						
							| 
									
										
										
										
											2014-10-08 12:01:14 +02:00
										 |  |  | 	MLOAD:    "MLOAD", | 
					
						
							|  |  |  | 	MSTORE:   "MSTORE", | 
					
						
							|  |  |  | 	MSTORE8:  "MSTORE8", | 
					
						
							|  |  |  | 	SLOAD:    "SLOAD", | 
					
						
							|  |  |  | 	SSTORE:   "SSTORE", | 
					
						
							|  |  |  | 	JUMP:     "JUMP", | 
					
						
							|  |  |  | 	JUMPI:    "JUMPI", | 
					
						
							|  |  |  | 	PC:       "PC", | 
					
						
							|  |  |  | 	MSIZE:    "MSIZE", | 
					
						
							|  |  |  | 	GAS:      "GAS", | 
					
						
							|  |  |  | 	JUMPDEST: "JUMPDEST", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x60 range - push | 
					
						
							|  |  |  | 	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", | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-21 19:23:54 +02:00
										 |  |  | 	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", | 
					
						
							| 
									
										
										
										
											2014-12-03 12:21:12 +01:00
										 |  |  | 	LOG0:   "LOG0", | 
					
						
							|  |  |  | 	LOG1:   "LOG1", | 
					
						
							|  |  |  | 	LOG2:   "LOG2", | 
					
						
							|  |  |  | 	LOG3:   "LOG3", | 
					
						
							|  |  |  | 	LOG4:   "LOG4", | 
					
						
							| 
									
										
										
										
											2014-08-21 19:23:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 	// 0xf0 range | 
					
						
							| 
									
										
										
										
											2015-11-27 15:40:29 +01:00
										 |  |  | 	CREATE:       "CREATE", | 
					
						
							|  |  |  | 	CALL:         "CALL", | 
					
						
							|  |  |  | 	RETURN:       "RETURN", | 
					
						
							|  |  |  | 	CALLCODE:     "CALLCODE", | 
					
						
							|  |  |  | 	DELEGATECALL: "DELEGATECALL", | 
					
						
							|  |  |  | 	SUICIDE:      "SUICIDE", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 13:33:46 +02:00
										 |  |  | 	PUSH: "PUSH", | 
					
						
							|  |  |  | 	DUP:  "DUP", | 
					
						
							|  |  |  | 	SWAP: "SWAP", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (o OpCode) String() string { | 
					
						
							|  |  |  | 	str := opCodeToString[o] | 
					
						
							|  |  |  | 	if len(str) == 0 { | 
					
						
							|  |  |  | 		return fmt.Sprintf("Missing opcode 0x%x", int(o)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return str | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-07-09 13:30:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | var stringToOp = map[string]OpCode{ | 
					
						
							|  |  |  | 	"STOP":         STOP, | 
					
						
							|  |  |  | 	"ADD":          ADD, | 
					
						
							|  |  |  | 	"MUL":          MUL, | 
					
						
							|  |  |  | 	"SUB":          SUB, | 
					
						
							|  |  |  | 	"DIV":          DIV, | 
					
						
							|  |  |  | 	"SDIV":         SDIV, | 
					
						
							|  |  |  | 	"MOD":          MOD, | 
					
						
							|  |  |  | 	"SMOD":         SMOD, | 
					
						
							|  |  |  | 	"EXP":          EXP, | 
					
						
							|  |  |  | 	"NOT":          NOT, | 
					
						
							|  |  |  | 	"LT":           LT, | 
					
						
							|  |  |  | 	"GT":           GT, | 
					
						
							|  |  |  | 	"SLT":          SLT, | 
					
						
							|  |  |  | 	"SGT":          SGT, | 
					
						
							|  |  |  | 	"EQ":           EQ, | 
					
						
							|  |  |  | 	"ISZERO":       ISZERO, | 
					
						
							|  |  |  | 	"SIGNEXTEND":   SIGNEXTEND, | 
					
						
							|  |  |  | 	"AND":          AND, | 
					
						
							|  |  |  | 	"OR":           OR, | 
					
						
							|  |  |  | 	"XOR":          XOR, | 
					
						
							|  |  |  | 	"BYTE":         BYTE, | 
					
						
							|  |  |  | 	"ADDMOD":       ADDMOD, | 
					
						
							|  |  |  | 	"MULMOD":       MULMOD, | 
					
						
							|  |  |  | 	"SHA3":         SHA3, | 
					
						
							|  |  |  | 	"ADDRESS":      ADDRESS, | 
					
						
							|  |  |  | 	"BALANCE":      BALANCE, | 
					
						
							|  |  |  | 	"ORIGIN":       ORIGIN, | 
					
						
							|  |  |  | 	"CALLER":       CALLER, | 
					
						
							|  |  |  | 	"CALLVALUE":    CALLVALUE, | 
					
						
							|  |  |  | 	"CALLDATALOAD": CALLDATALOAD, | 
					
						
							|  |  |  | 	"CALLDATASIZE": CALLDATASIZE, | 
					
						
							|  |  |  | 	"CALLDATACOPY": CALLDATACOPY, | 
					
						
							| 
									
										
										
										
											2016-01-19 23:50:00 +01:00
										 |  |  | 	"DELEGATECALL": DELEGATECALL, | 
					
						
							| 
									
										
										
										
											2015-07-09 13:30:04 +02:00
										 |  |  | 	"CODESIZE":     CODESIZE, | 
					
						
							|  |  |  | 	"CODECOPY":     CODECOPY, | 
					
						
							|  |  |  | 	"GASPRICE":     GASPRICE, | 
					
						
							|  |  |  | 	"BLOCKHASH":    BLOCKHASH, | 
					
						
							|  |  |  | 	"COINBASE":     COINBASE, | 
					
						
							|  |  |  | 	"TIMESTAMP":    TIMESTAMP, | 
					
						
							|  |  |  | 	"NUMBER":       NUMBER, | 
					
						
							|  |  |  | 	"DIFFICULTY":   DIFFICULTY, | 
					
						
							|  |  |  | 	"GASLIMIT":     GASLIMIT, | 
					
						
							|  |  |  | 	"EXTCODESIZE":  EXTCODESIZE, | 
					
						
							|  |  |  | 	"EXTCODECOPY":  EXTCODECOPY, | 
					
						
							|  |  |  | 	"POP":          POP, | 
					
						
							|  |  |  | 	"MLOAD":        MLOAD, | 
					
						
							|  |  |  | 	"MSTORE":       MSTORE, | 
					
						
							|  |  |  | 	"MSTORE8":      MSTORE8, | 
					
						
							|  |  |  | 	"SLOAD":        SLOAD, | 
					
						
							|  |  |  | 	"SSTORE":       SSTORE, | 
					
						
							|  |  |  | 	"JUMP":         JUMP, | 
					
						
							|  |  |  | 	"JUMPI":        JUMPI, | 
					
						
							|  |  |  | 	"PC":           PC, | 
					
						
							|  |  |  | 	"MSIZE":        MSIZE, | 
					
						
							|  |  |  | 	"GAS":          GAS, | 
					
						
							|  |  |  | 	"JUMPDEST":     JUMPDEST, | 
					
						
							|  |  |  | 	"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, | 
					
						
							|  |  |  | 	"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, | 
					
						
							|  |  |  | 	"LOG0":         LOG0, | 
					
						
							|  |  |  | 	"LOG1":         LOG1, | 
					
						
							|  |  |  | 	"LOG2":         LOG2, | 
					
						
							|  |  |  | 	"LOG3":         LOG3, | 
					
						
							|  |  |  | 	"LOG4":         LOG4, | 
					
						
							|  |  |  | 	"CREATE":       CREATE, | 
					
						
							|  |  |  | 	"CALL":         CALL, | 
					
						
							|  |  |  | 	"RETURN":       RETURN, | 
					
						
							|  |  |  | 	"CALLCODE":     CALLCODE, | 
					
						
							|  |  |  | 	"SUICIDE":      SUICIDE, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func StringToOp(str string) OpCode { | 
					
						
							|  |  |  | 	return stringToOp[str] | 
					
						
							|  |  |  | } |