| 
									
										
										
										
											2014-10-18 13:31:20 +02:00
										 |  |  | package vm | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-14 11:48:52 +02:00
										 |  |  | type OpCode byte | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Op codes | 
					
						
							|  |  |  | 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 | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	PREVHASH OpCode = 0x40 + iota | 
					
						
							|  |  |  | 	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 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x70 range - other | 
					
						
							|  |  |  | 	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", | 
					
						
							|  |  |  | 	GASPRICE:     "TXGASPRICE", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 0x40 range - block operations | 
					
						
							| 
									
										
										
										
											2014-09-08 00:49:25 +02:00
										 |  |  | 	PREVHASH:    "PREVHASH", | 
					
						
							|  |  |  | 	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 | 
					
						
							| 
									
										
										
										
											2014-10-08 12:01:14 +02:00
										 |  |  | 	CREATE:   "CREATE", | 
					
						
							|  |  |  | 	CALL:     "CALL", | 
					
						
							|  |  |  | 	RETURN:   "RETURN", | 
					
						
							|  |  |  | 	CALLCODE: "CALLCODE", | 
					
						
							| 
									
										
										
										
											2014-07-22 11:54:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 0x70 range - other | 
					
						
							|  |  |  | 	SUICIDE: "SUICIDE", | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (o OpCode) String() string { | 
					
						
							|  |  |  | 	str := opCodeToString[o] | 
					
						
							|  |  |  | 	if len(str) == 0 { | 
					
						
							|  |  |  | 		return fmt.Sprintf("Missing opcode 0x%x", int(o)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return str | 
					
						
							|  |  |  | } |