|
|
@ -4,55 +4,8 @@ import ( |
|
|
|
"fmt" |
|
|
|
"fmt" |
|
|
|
"github.com/ethereum/eth-go/ethutil" |
|
|
|
"github.com/ethereum/eth-go/ethutil" |
|
|
|
"math/big" |
|
|
|
"math/big" |
|
|
|
"regexp" |
|
|
|
|
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
func CompileInstr(s interface{}) ([]byte, error) { |
|
|
|
|
|
|
|
switch s.(type) { |
|
|
|
|
|
|
|
case string: |
|
|
|
|
|
|
|
str := s.(string) |
|
|
|
|
|
|
|
isOp := IsOpCode(str) |
|
|
|
|
|
|
|
if isOp { |
|
|
|
|
|
|
|
return []byte{OpCodes[str]}, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
num := new(big.Int) |
|
|
|
|
|
|
|
_, success := num.SetString(str, 0) |
|
|
|
|
|
|
|
// Assume regular bytes during compilation
|
|
|
|
|
|
|
|
if !success { |
|
|
|
|
|
|
|
num.SetBytes([]byte(str)) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// tmp fix for 32 bytes
|
|
|
|
|
|
|
|
n := ethutil.BigToBytes(num, 256) |
|
|
|
|
|
|
|
return n, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return num.Bytes(), nil |
|
|
|
|
|
|
|
case int: |
|
|
|
|
|
|
|
num := ethutil.BigToBytes(big.NewInt(int64(s.(int))), 256) |
|
|
|
|
|
|
|
return num, nil |
|
|
|
|
|
|
|
case []byte: |
|
|
|
|
|
|
|
return ethutil.BigD(s.([]byte)).Bytes(), nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nil, nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Script compilation functions
|
|
|
|
|
|
|
|
// Compiles strings to machine code
|
|
|
|
|
|
|
|
func Assemble(instructions ...interface{}) (script []byte) { |
|
|
|
|
|
|
|
//script = make([]string, len(instructions))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for _, val := range instructions { |
|
|
|
|
|
|
|
instr, _ := CompileInstr(val) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//script[i] = string(instr)
|
|
|
|
|
|
|
|
script = append(script, instr...) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func Disassemble(script []byte) (asm []string) { |
|
|
|
func Disassemble(script []byte) (asm []string) { |
|
|
|
pc := new(big.Int) |
|
|
|
pc := new(big.Int) |
|
|
|
for { |
|
|
|
for { |
|
|
@ -104,24 +57,3 @@ func Disassemble(script []byte) (asm []string) { |
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func PreProcess(data string) (mainInput, initInput string) { |
|
|
|
|
|
|
|
// Regexp for parsing anything between brackets
|
|
|
|
|
|
|
|
reg := "\\(\\)\\s*{([\\d\\w\\W\\n\\s]+?)}" |
|
|
|
|
|
|
|
mainReg := regexp.MustCompile("main" + reg) |
|
|
|
|
|
|
|
initReg := regexp.MustCompile("init" + reg) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
main := mainReg.FindStringSubmatch(data) |
|
|
|
|
|
|
|
if len(main) > 0 { |
|
|
|
|
|
|
|
mainInput = main[1] |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
mainInput = data |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
init := initReg.FindStringSubmatch(data) |
|
|
|
|
|
|
|
if len(init) > 0 { |
|
|
|
|
|
|
|
initInput = init[1] |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|