aboutsummaryrefslogblamecommitdiffstats
path: root/ethchain/asm.go
blob: c267f9b55a71663ef570b7403e4ca24b73a2f5ec (plain) (tree)
1
2
3
4
5
6
7
8





                                            

 














                                                                
                                                                                                                                                                                                                                                                           
                                                
                                                         
                                                                 

                                                
                         
                                                                   
 
                                                   






                                        
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 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:
            pc.Add(pc, ethutil.Big1)
            a := int64(op) - int64(PUSH1) + 1
            data := script[pc.Int64() : pc.Int64()+a]
            if len(data) == 0 {
                data = []byte{0}
            }
            asm = append(asm, fmt.Sprintf("%#x", data))

            pc.Add(pc, big.NewInt(a-1))
        }

        pc.Add(pc, ethutil.Big1)
    }

    return
}