| 
									
										
										
										
											2014-12-04 10:28:02 +01:00
										 |  |  | package core | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"math/big" | 
					
						
							| 
									
										
										
										
											2014-10-23 15:01:27 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-05 00:34:59 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/ethutil" | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 	"github.com/ethereum/go-ethereum/vm" | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func Disassemble(script []byte) (asm []string) { | 
					
						
							|  |  |  | 	pc := new(big.Int) | 
					
						
							|  |  |  | 	for { | 
					
						
							|  |  |  | 		if pc.Cmp(big.NewInt(int64(len(script)))) >= 0 { | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Get the memory location of pc | 
					
						
							|  |  |  | 		val := script[pc.Int64()] | 
					
						
							|  |  |  | 		// Get the opcode (it must be an opcode!) | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 		op := vm.OpCode(val) | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-26 11:25:43 +02:00
										 |  |  | 		asm = append(asm, fmt.Sprintf("%04v: %v", pc, op)) | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		switch op { | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 		case vm.PUSH1, vm.PUSH2, vm.PUSH3, vm.PUSH4, vm.PUSH5, vm.PUSH6, vm.PUSH7, vm.PUSH8, | 
					
						
							|  |  |  | 			vm.PUSH9, vm.PUSH10, vm.PUSH11, vm.PUSH12, vm.PUSH13, vm.PUSH14, vm.PUSH15, | 
					
						
							|  |  |  | 			vm.PUSH16, vm.PUSH17, vm.PUSH18, vm.PUSH19, vm.PUSH20, vm.PUSH21, vm.PUSH22, | 
					
						
							|  |  |  | 			vm.PUSH23, vm.PUSH24, vm.PUSH25, vm.PUSH26, vm.PUSH27, vm.PUSH28, vm.PUSH29, | 
					
						
							|  |  |  | 			vm.PUSH30, vm.PUSH31, vm.PUSH32: | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | 			pc.Add(pc, ethutil.Big1) | 
					
						
							| 
									
										
										
										
											2014-11-01 01:18:03 +01:00
										 |  |  | 			a := int64(op) - int64(vm.PUSH1) + 1 | 
					
						
							| 
									
										
										
										
											2014-07-11 16:04:09 +02:00
										 |  |  | 			if int(pc.Int64()+a) > len(script) { | 
					
						
							| 
									
										
										
										
											2014-07-22 15:57:54 +02:00
										 |  |  | 				return | 
					
						
							| 
									
										
										
										
											2014-07-11 16:04:09 +02:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-08 14:20:06 +02:00
										 |  |  | 			data := script[pc.Int64() : pc.Int64()+a] | 
					
						
							| 
									
										
										
										
											2014-06-13 12:45:11 +02:00
										 |  |  | 			if len(data) == 0 { | 
					
						
							|  |  |  | 				data = []byte{0} | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-06-26 11:25:43 +02:00
										 |  |  | 			asm = append(asm, fmt.Sprintf("%04v: 0x%x", pc, data)) | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-08 14:20:06 +02:00
										 |  |  | 			pc.Add(pc, big.NewInt(a-1)) | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		pc.Add(pc, ethutil.Big1) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 15:57:54 +02:00
										 |  |  | 	return asm | 
					
						
							| 
									
										
										
										
											2014-04-15 16:16:38 -04:00
										 |  |  | } |