aboutsummaryrefslogtreecommitdiffstats
path: root/ethutil
diff options
context:
space:
mode:
Diffstat (limited to 'ethutil')
-rw-r--r--ethutil/common.go6
-rw-r--r--ethutil/config.go19
-rw-r--r--ethutil/parsing.go161
-rw-r--r--ethutil/rlp.go4
-rw-r--r--ethutil/trie_test.go1
5 files changed, 126 insertions, 65 deletions
diff --git a/ethutil/common.go b/ethutil/common.go
index 07df6bb13..f15b10e6d 100644
--- a/ethutil/common.go
+++ b/ethutil/common.go
@@ -33,3 +33,9 @@ func CurrencyToString(num *big.Int) string {
return fmt.Sprintf("%v Wei", num)
}
+
+var (
+ Big1 = big.NewInt(1)
+ Big0 = big.NewInt(0)
+ Big256 = big.NewInt(0xff)
+)
diff --git a/ethutil/config.go b/ethutil/config.go
index 5fdc8e1c5..54b066fb9 100644
--- a/ethutil/config.go
+++ b/ethutil/config.go
@@ -6,6 +6,7 @@ import (
"os"
"os/user"
"path"
+ "runtime"
)
type LogType byte
@@ -19,12 +20,13 @@ const (
type config struct {
Db Database
- Log *Logger
- ExecPath string
- Debug bool
- Ver string
- Pubkey []byte
- Seed bool
+ Log *Logger
+ ExecPath string
+ Debug bool
+ Ver string
+ ClientString string
+ Pubkey []byte
+ Seed bool
}
var Config *config
@@ -48,11 +50,16 @@ func ReadConfig(base string) *config {
Config = &config{ExecPath: path, Debug: true, Ver: "0.3.1"}
Config.Log = NewLogger(LogFile|LogStd, LogLevelDebug)
+ Config.SetClientString("/Ethereum(G)")
}
return Config
}
+func (c *config) SetClientString(str string) {
+ Config.ClientString = fmt.Sprintf("%s nv%s/%s", str, c.Ver, runtime.GOOS)
+}
+
type LoggerType byte
const (
diff --git a/ethutil/parsing.go b/ethutil/parsing.go
index 553bb9717..8929f0829 100644
--- a/ethutil/parsing.go
+++ b/ethutil/parsing.go
@@ -7,57 +7,72 @@ import (
// 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,
+ // 0x0 range - arithmetic ops
+ "STOP": 0x00,
+ "ADD": 0x01,
+ "MUL": 0x02,
+ "SUB": 0x03,
+ "DIV": 0x04,
+ "SDIV": 0x05,
+ "MOD": 0x06,
+ "SMOD": 0x07,
+ "EXP": 0x08,
+ "NEG": 0x09,
+ "LT": 0x0a,
+ "GT": 0x0b,
+ "EQ": 0x0c,
+ "NOT": 0x0d,
+
+ // 0x10 range - bit ops
+ "AND": 0x10,
+ "OR": 0x11,
+ "XOR": 0x12,
+ "BYTE": 0x13,
+
+ // 0x20 range - crypto
+ "SHA3": 0x20,
+
+ // 0x30 range - closure state
+ "ADDRESS": 0x30,
+ "BALANCE": 0x31,
+ "ORIGIN": 0x32,
+ "CALLER": 0x33,
+ "CALLVALUE": 0x34,
+ "CALLDATA": 0x35,
+ "CALLDATASIZE": 0x36,
+ "GASPRICE": 0x38,
+
+ // 0x40 range - block operations
+ "PREVHASH": 0x40,
+ "COINBASE": 0x41,
+ "TIMESTAMP": 0x42,
+ "NUMBER": 0x43,
+ "DIFFICULTY": 0x44,
+ "GASLIMIT": 0x45,
+
+ // 0x50 range - 'storage' and execution
+ "PUSH": 0x50,
+ "POP": 0x51,
+ "DUP": 0x52,
+ "SWAP": 0x53,
+ "MLOAD": 0x54,
+ "MSTORE": 0x55,
+ "MSTORE8": 0x56,
+ "SLOAD": 0x57,
+ "SSTORE": 0x58,
+ "JUMP": 0x59,
+ "JUMPI": 0x5a,
+ "PC": 0x5b,
+ "MSIZE": 0x5c,
+
+ // 0x60 range - closures
+ "CREATE": 0x60,
+ "CALL": 0x61,
+ "RETURN": 0x62,
+
+ // 0x70 range - other
+ "LOG": 0x70,
+ "SUICIDE": 0x7f,
}
func IsOpCode(s string) bool {
@@ -69,16 +84,30 @@ func IsOpCode(s string) bool {
return false
}
-func CompileInstr(s string) ([]byte, error) {
- isOp := IsOpCode(s)
- if isOp {
- return []byte{OpCodes[s]}, nil
- }
+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)
- num.SetString(s, 0)
+ num := new(big.Int)
+ _, success := num.SetString(str, 0)
+ // Assume regular bytes during compilation
+ if !success {
+ num.SetBytes([]byte(str))
+ }
+
+ return num.Bytes(), nil
+ case int:
+ return big.NewInt(int64(s.(int))).Bytes(), nil
+ case []byte:
+ return BigD(s.([]byte)).Bytes(), nil
+ }
- return num.Bytes(), nil
+ return nil, nil
}
func Instr(instr string) (int, []string, error) {
@@ -99,3 +128,17 @@ func Instr(instr string) (int, []string, error) {
return op, args[1:7], nil
}
+
+// Script compilation functions
+// Compiles strings to machine code
+func Compile(instructions ...interface{}) (script []string) {
+ script = make([]string, len(instructions))
+
+ for i, val := range instructions {
+ instr, _ := CompileInstr(val)
+
+ script[i] = string(instr)
+ }
+
+ return
+}
diff --git a/ethutil/rlp.go b/ethutil/rlp.go
index e633f5f1d..33ec0d359 100644
--- a/ethutil/rlp.go
+++ b/ethutil/rlp.go
@@ -9,6 +9,10 @@ import (
"math/big"
)
+type RlpEncodable interface {
+ RlpEncode() []byte
+}
+
type RlpEncoder struct {
rlpData []byte
}
diff --git a/ethutil/trie_test.go b/ethutil/trie_test.go
index 7c398f1de..79e5de921 100644
--- a/ethutil/trie_test.go
+++ b/ethutil/trie_test.go
@@ -1,6 +1,7 @@
package ethutil
import (
+ "fmt"
"reflect"
"testing"
)