102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package ethutil
 | 
						|
 | 
						|
import (
 | 
						|
	"math/big"
 | 
						|
	"strconv"
 | 
						|
)
 | 
						|
 | 
						|
// Op codes
 | 
						|
var OpCodes = map[string]byte{
 | 
						|
	"STOP":           0x00,
 | 
						|
	"ADD":            0x01,
 | 
						|
	"MUL":            0x02,
 | 
						|
	"SUB":            0x03,
 | 
						|
	"DIV":            0x04,
 | 
						|
	"SDIV":           0x05,
 | 
						|
	"MOD":            0x06,
 | 
						|
	"SMOD":           0x07,
 | 
						|
	"EXP":            0x08,
 | 
						|
	"NEG":            0x09,
 | 
						|
	"LT":             0x0a,
 | 
						|
	"LE":             0x0b,
 | 
						|
	"GT":             0x0c,
 | 
						|
	"GE":             0x0d,
 | 
						|
	"EQ":             0x0e,
 | 
						|
	"NOT":            0x0f,
 | 
						|
	"MYADDRESS":      0x10,
 | 
						|
	"TXSENDER":       0x11,
 | 
						|
	"TXVALUE":        0x12,
 | 
						|
	"TXDATAN":        0x13,
 | 
						|
	"TXDATA":         0x14,
 | 
						|
	"BLK_PREVHASH":   0x15,
 | 
						|
	"BLK_COINBASE":   0x16,
 | 
						|
	"BLK_TIMESTAMP":  0x17,
 | 
						|
	"BLK_NUMBER":     0x18,
 | 
						|
	"BLK_DIFFICULTY": 0x19,
 | 
						|
	"BLK_NONCE":      0x1a,
 | 
						|
	"BASEFEE":        0x1b,
 | 
						|
	"SHA256":         0x20,
 | 
						|
	"RIPEMD160":      0x21,
 | 
						|
	"ECMUL":          0x22,
 | 
						|
	"ECADD":          0x23,
 | 
						|
	"ECSIGN":         0x24,
 | 
						|
	"ECRECOVER":      0x25,
 | 
						|
	"ECVALID":        0x26,
 | 
						|
	"SHA3":           0x27,
 | 
						|
	"PUSH":           0x30,
 | 
						|
	"POP":            0x31,
 | 
						|
	"DUP":            0x32,
 | 
						|
	"SWAP":           0x33,
 | 
						|
	"MLOAD":          0x34,
 | 
						|
	"MSTORE":         0x35,
 | 
						|
	"SLOAD":          0x36,
 | 
						|
	"SSTORE":         0x37,
 | 
						|
	"JMP":            0x38,
 | 
						|
	"JMPI":           0x39,
 | 
						|
	"IND":            0x3a,
 | 
						|
	"EXTRO":          0x3b,
 | 
						|
	"BALANCE":        0x3c,
 | 
						|
	"MKTX":           0x3d,
 | 
						|
	"SUICIDE":        0x3f,
 | 
						|
}
 | 
						|
 | 
						|
func IsOpCode(s string) bool {
 | 
						|
	for key, _ := range OpCodes {
 | 
						|
		if key == s {
 | 
						|
			return true
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return false
 | 
						|
}
 | 
						|
 | 
						|
func CompileInstr(s string) ([]byte, error) {
 | 
						|
	isOp := IsOpCode(s)
 | 
						|
	if isOp {
 | 
						|
		return []byte{OpCodes[s]}, nil
 | 
						|
	}
 | 
						|
 | 
						|
	num := new(big.Int)
 | 
						|
	num.SetString(s, 0)
 | 
						|
 | 
						|
	return num.Bytes(), nil
 | 
						|
}
 | 
						|
 | 
						|
func Instr(instr string) (int, []string, error) {
 | 
						|
 | 
						|
	base := new(big.Int)
 | 
						|
	base.SetString(instr, 0)
 | 
						|
 | 
						|
	args := make([]string, 7)
 | 
						|
	for i := 0; i < 7; i++ {
 | 
						|
		// int(int(val) / int(math.Pow(256,float64(i)))) % 256
 | 
						|
		exp := BigPow(256, i)
 | 
						|
		num := new(big.Int)
 | 
						|
		num.Div(base, exp)
 | 
						|
 | 
						|
		args[i] = num.Mod(num, big.NewInt(256)).String()
 | 
						|
	}
 | 
						|
	op, _ := strconv.Atoi(args[0])
 | 
						|
 | 
						|
	return op, args[1:7], nil
 | 
						|
}
 |