47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package ethchain
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"github.com/ethereum/eth-go/ethutil"
 | 
						|
	"math/big"
 | 
						|
)
 | 
						|
 | 
						|
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!)
 | 
						|
		op := OpCode(val)
 | 
						|
 | 
						|
		asm = append(asm, fmt.Sprintf("%v", op))
 | 
						|
 | 
						|
		switch op {
 | 
						|
		case oPUSH1, oPUSH2, oPUSH3, oPUSH4, oPUSH5, oPUSH6, oPUSH7, oPUSH8, oPUSH9, oPUSH10, oPUSH11, oPUSH12, oPUSH13, oPUSH14, oPUSH15, oPUSH16, oPUSH17, oPUSH18, oPUSH19, oPUSH20, oPUSH21, oPUSH22, oPUSH23, oPUSH24, oPUSH25, oPUSH26, oPUSH27, oPUSH28, oPUSH29, oPUSH30, oPUSH31, oPUSH32:
 | 
						|
			pc.Add(pc, ethutil.Big1)
 | 
						|
			a := int64(op) - int64(oPUSH1) + 1
 | 
						|
			data := script[pc.Int64() : pc.Int64()+a]
 | 
						|
			val := ethutil.BigD(data)
 | 
						|
 | 
						|
			var b []byte
 | 
						|
			if val.Int64() == 0 {
 | 
						|
				b = []byte{0}
 | 
						|
			} else {
 | 
						|
				b = val.Bytes()
 | 
						|
			}
 | 
						|
 | 
						|
			asm = append(asm, fmt.Sprintf("0x%x", b))
 | 
						|
 | 
						|
			pc.Add(pc, big.NewInt(a-1))
 | 
						|
		}
 | 
						|
 | 
						|
		pc.Add(pc, ethutil.Big1)
 | 
						|
	}
 | 
						|
 | 
						|
	return
 | 
						|
}
 |