DRY up the use of fromHex and put it in ethutil

This commit is contained in:
Maran 2015-03-14 11:39:35 +01:00
parent b927c29469
commit 991993357c
10 changed files with 75 additions and 90 deletions

View File

@ -64,6 +64,19 @@ func DefaultDataDir() string {
return path.Join(usr.HomeDir, ".ethereum") return path.Join(usr.HomeDir, ".ethereum")
} }
} }
func FromHex(s string) []byte {
if len(s) > 1 {
if s[0:2] == "0x" {
s = s[2:]
}
if len(s)%2 == 1 {
s = "0" + s
}
return Hex2Bytes(s)
}
return nil
}
func IsWindows() bool { func IsWindows() bool {
return runtime.GOOS == "windows" return runtime.GOOS == "windows"
} }

View File

@ -1,8 +1,10 @@
package ethutil package ethutil
import ( import (
"bytes"
"math/big" "math/big"
"os" "os"
"testing"
checker "gopkg.in/check.v1" checker "gopkg.in/check.v1"
) )
@ -66,3 +68,22 @@ func (s *CommonSuite) TestLarge(c *checker.C) {
c.Assert(adalarge, checker.Equals, "10000E7 Einstein") c.Assert(adalarge, checker.Equals, "10000E7 Einstein")
c.Assert(weilarge, checker.Equals, "100 Babbage") c.Assert(weilarge, checker.Equals, "100 Babbage")
} }
//fromHex
func TestFromHex(t *testing.T) {
input := "0x01"
expected := []byte{1}
result := FromHex(input)
if bytes.Compare(expected, result) != 0 {
t.Errorf("Expected % x got % x", expected, result)
}
}
func TestFromHexOddLength(t *testing.T) {
input := "0x1"
expected := []byte{1}
result := FromHex(input)
if bytes.Compare(expected, result) != 0 {
t.Errorf("Expected % x got % x", expected, result)
}
}

View File

@ -241,7 +241,7 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) (err error)
// p.register[args.From] = append(p.register[args.From], args) // p.register[args.From] = append(p.register[args.From], args)
//} else { //} else {
/* /*
account := accounts.Get(fromHex(args.From)) account := accounts.Get(ethutil.FromHex(args.From))
if account != nil { if account != nil {
if account.Unlocked() { if account.Unlocked() {
if !unlockAccount(account) { if !unlockAccount(account) {
@ -249,7 +249,7 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) (err error)
} }
} }
result, _ := account.Transact(fromHex(args.To), fromHex(args.Value), fromHex(args.Gas), fromHex(args.GasPrice), fromHex(args.Data)) result, _ := account.Transact(ethutil.FromHex(args.To), ethutil.FromHex(args.Value), ethutil.FromHex(args.Gas), ethutil.FromHex(args.GasPrice), ethutil.FromHex(args.Data))
if len(result) > 0 { if len(result) > 0 {
*reply = toHex(result) *reply = toHex(result)
} }
@ -480,7 +480,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
if err := json.Unmarshal(req.Params, &args); err != nil { if err := json.Unmarshal(req.Params, &args); err != nil {
return err return err
} }
*reply = toHex(crypto.Sha3(fromHex(args.Data))) *reply = toHex(crypto.Sha3(ethutil.FromHex(args.Data)))
case "web3_clientVersion": case "web3_clientVersion":
*reply = p.xeth().Backend().Version() *reply = p.xeth().Backend().Version()
case "net_version": case "net_version":
@ -815,12 +815,12 @@ func toFilterOptions(options *FilterOptions) core.FilterOptions {
// Convert optional address slice/string to byte slice // Convert optional address slice/string to byte slice
if str, ok := options.Address.(string); ok { if str, ok := options.Address.(string); ok {
opts.Address = [][]byte{fromHex(str)} opts.Address = [][]byte{ethutil.FromHex(str)}
} else if slice, ok := options.Address.([]interface{}); ok { } else if slice, ok := options.Address.([]interface{}); ok {
bslice := make([][]byte, len(slice)) bslice := make([][]byte, len(slice))
for i, addr := range slice { for i, addr := range slice {
if saddr, ok := addr.(string); ok { if saddr, ok := addr.(string); ok {
bslice[i] = fromHex(saddr) bslice[i] = ethutil.FromHex(saddr)
} }
} }
opts.Address = bslice opts.Address = bslice
@ -834,11 +834,11 @@ func toFilterOptions(options *FilterOptions) core.FilterOptions {
if slice, ok := topicDat.([]interface{}); ok { if slice, ok := topicDat.([]interface{}); ok {
topics[i] = make([][]byte, len(slice)) topics[i] = make([][]byte, len(slice))
for j, topic := range slice { for j, topic := range slice {
topics[i][j] = fromHex(topic.(string)) topics[i][j] = ethutil.FromHex(topic.(string))
} }
} else if str, ok := topicDat.(string); ok { } else if str, ok := topicDat.(string); ok {
topics[i] = make([][]byte, 1) topics[i] = make([][]byte, 1)
topics[i][0] = fromHex(str) topics[i][0] = ethutil.FromHex(str)
} }
} }
opts.Topics = topics opts.Topics = topics

View File

@ -128,19 +128,6 @@ func toHex(b []byte) string {
return "0x" + hex return "0x" + hex
} }
func fromHex(s string) []byte {
if len(s) > 1 {
if s[0:2] == "0x" {
s = s[2:]
}
if len(s)%2 == 1 {
s = "0" + s
}
return ethutil.Hex2Bytes(s)
}
return nil
}
func i2hex(n int) string { func i2hex(n int) string {
return toHex(big.NewInt(int64(n)).Bytes()) return toHex(big.NewInt(int64(n)).Bytes())
} }

View File

@ -1,25 +0,0 @@
package rpc
import (
"bytes"
"testing"
)
//fromHex
func TestFromHex(t *testing.T) {
input := "0x01"
expected := []byte{1}
result := fromHex(input)
if bytes.Compare(expected, result) != 0 {
t.Errorf("Expected % x got % x", expected, result)
}
}
func TestFromHexOddLength(t *testing.T) {
input := "0x1"
expected := []byte{1}
result := fromHex(input)
if bytes.Compare(expected, result) != 0 {
t.Errorf("Expected % x got % x", expected, result)
}
}

View File

@ -13,12 +13,6 @@ import (
var qlogger = logger.NewLogger("QSHH") var qlogger = logger.NewLogger("QSHH")
func fromHex(s string) []byte {
if len(s) > 1 {
return ethutil.Hex2Bytes(s[2:])
}
return nil
}
func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) } func toHex(b []byte) string { return "0x" + ethutil.Bytes2Hex(b) }
type Whisper struct { type Whisper struct {
@ -39,15 +33,15 @@ func (self *Whisper) SetView(view qml.Object) {
func (self *Whisper) Post(payload []string, to, from string, topics []string, priority, ttl uint32) { func (self *Whisper) Post(payload []string, to, from string, topics []string, priority, ttl uint32) {
var data []byte var data []byte
for _, d := range payload { for _, d := range payload {
data = append(data, fromHex(d)...) data = append(data, ethutil.FromHex(d)...)
} }
pk := crypto.ToECDSAPub(fromHex(from)) pk := crypto.ToECDSAPub(ethutil.FromHex(from))
if key := self.Whisper.GetIdentity(pk); key != nil { if key := self.Whisper.GetIdentity(pk); key != nil {
msg := whisper.NewMessage(data) msg := whisper.NewMessage(data)
envelope, err := msg.Seal(time.Duration(priority*100000), whisper.Opts{ envelope, err := msg.Seal(time.Duration(priority*100000), whisper.Opts{
Ttl: time.Duration(ttl) * time.Second, Ttl: time.Duration(ttl) * time.Second,
To: crypto.ToECDSAPub(fromHex(to)), To: crypto.ToECDSAPub(ethutil.FromHex(to)),
From: key, From: key,
Topics: whisper.TopicsFromString(topics...), Topics: whisper.TopicsFromString(topics...),
}) })
@ -76,7 +70,7 @@ func (self *Whisper) NewIdentity() string {
} }
func (self *Whisper) HasIdentity(key string) bool { func (self *Whisper) HasIdentity(key string) bool {
return self.Whisper.HasIdentity(crypto.ToECDSAPub(fromHex(key))) return self.Whisper.HasIdentity(crypto.ToECDSAPub(ethutil.FromHex(key)))
} }
func (self *Whisper) Watch(opts map[string]interface{}, view *qml.Common) int { func (self *Whisper) Watch(opts map[string]interface{}, view *qml.Common) int {
@ -106,10 +100,10 @@ func (self *Whisper) Messages(id int) (messages *ethutil.List) {
func filterFromMap(opts map[string]interface{}) (f whisper.Filter) { func filterFromMap(opts map[string]interface{}) (f whisper.Filter) {
if to, ok := opts["to"].(string); ok { if to, ok := opts["to"].(string); ok {
f.To = crypto.ToECDSAPub(fromHex(to)) f.To = crypto.ToECDSAPub(ethutil.FromHex(to))
} }
if from, ok := opts["from"].(string); ok { if from, ok := opts["from"].(string); ok {
f.From = crypto.ToECDSAPub(fromHex(from)) f.From = crypto.ToECDSAPub(ethutil.FromHex(from))
} }
if topicList, ok := opts["topics"].(*qml.List); ok { if topicList, ok := opts["topics"].(*qml.List); ok {
var topics []string var topics []string

View File

@ -1,6 +1,9 @@
package xeth package xeth
import "github.com/ethereum/go-ethereum/state" import (
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/state"
)
type State struct { type State struct {
xeth *XEth xeth *XEth
@ -16,7 +19,7 @@ func (self *State) State() *state.StateDB {
} }
func (self *State) Get(addr string) *Object { func (self *State) Get(addr string) *Object {
return &Object{self.state.GetStateObject(fromHex(addr))} return &Object{self.state.GetStateObject(ethutil.FromHex(addr))}
} }
func (self *State) SafeGet(addr string) *Object { func (self *State) SafeGet(addr string) *Object {
@ -24,9 +27,9 @@ func (self *State) SafeGet(addr string) *Object {
} }
func (self *State) safeGet(addr string) *state.StateObject { func (self *State) safeGet(addr string) *state.StateObject {
object := self.state.GetStateObject(fromHex(addr)) object := self.state.GetStateObject(ethutil.FromHex(addr))
if object == nil { if object == nil {
object = state.NewStateObject(fromHex(addr), self.xeth.eth.StateDb()) object = state.NewStateObject(ethutil.FromHex(addr), self.xeth.eth.StateDb())
} }
return object return object

View File

@ -17,15 +17,6 @@ import (
func toHex(b []byte) string { func toHex(b []byte) string {
return "0x" + ethutil.Bytes2Hex(b) return "0x" + ethutil.Bytes2Hex(b)
} }
func fromHex(s string) []byte {
if len(s) > 1 {
if s[0:2] == "0x" {
s = s[2:]
}
return ethutil.Hex2Bytes(s)
}
return nil
}
type Object struct { type Object struct {
*state.StateObject *state.StateObject
@ -123,7 +114,7 @@ func (self *Block) ToString() string {
} }
func (self *Block) GetTransaction(hash string) *Transaction { func (self *Block) GetTransaction(hash string) *Transaction {
tx := self.ref.Transaction(fromHex(hash)) tx := self.ref.Transaction(ethutil.FromHex(hash))
if tx == nil { if tx == nil {
return nil return nil
} }

View File

@ -5,6 +5,7 @@ import (
"time" "time"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger" "github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/whisper" "github.com/ethereum/go-ethereum/whisper"
) )
@ -28,12 +29,12 @@ func (self *Whisper) Post(payload string, to, from string, topics []string, prio
ttl = 100 ttl = 100
} }
pk := crypto.ToECDSAPub(fromHex(from)) pk := crypto.ToECDSAPub(ethutil.FromHex(from))
if key := self.Whisper.GetIdentity(pk); key != nil || len(from) == 0 { if key := self.Whisper.GetIdentity(pk); key != nil || len(from) == 0 {
msg := whisper.NewMessage(fromHex(payload)) msg := whisper.NewMessage(ethutil.FromHex(payload))
envelope, err := msg.Seal(time.Duration(priority*100000), whisper.Opts{ envelope, err := msg.Seal(time.Duration(priority*100000), whisper.Opts{
Ttl: time.Duration(ttl) * time.Second, Ttl: time.Duration(ttl) * time.Second,
To: crypto.ToECDSAPub(fromHex(to)), To: crypto.ToECDSAPub(ethutil.FromHex(to)),
From: key, From: key,
Topics: whisper.TopicsFromString(topics...), Topics: whisper.TopicsFromString(topics...),
}) })
@ -59,13 +60,13 @@ func (self *Whisper) NewIdentity() string {
} }
func (self *Whisper) HasIdentity(key string) bool { func (self *Whisper) HasIdentity(key string) bool {
return self.Whisper.HasIdentity(crypto.ToECDSAPub(fromHex(key))) return self.Whisper.HasIdentity(crypto.ToECDSAPub(ethutil.FromHex(key)))
} }
func (self *Whisper) Watch(opts *Options) int { func (self *Whisper) Watch(opts *Options) int {
filter := whisper.Filter{ filter := whisper.Filter{
To: crypto.ToECDSAPub(fromHex(opts.To)), To: crypto.ToECDSAPub(ethutil.FromHex(opts.To)),
From: crypto.ToECDSAPub(fromHex(opts.From)), From: crypto.ToECDSAPub(ethutil.FromHex(opts.From)),
Topics: whisper.TopicsFromString(opts.Topics...), Topics: whisper.TopicsFromString(opts.Topics...),
} }

View File

@ -116,21 +116,21 @@ func (self *XEth) State() *State { return self.state }
func (self *XEth) Whisper() *Whisper { return self.whisper } func (self *XEth) Whisper() *Whisper { return self.whisper }
func (self *XEth) BlockByHash(strHash string) *Block { func (self *XEth) BlockByHash(strHash string) *Block {
hash := fromHex(strHash) hash := ethutil.FromHex(strHash)
block := self.chainManager.GetBlock(hash) block := self.chainManager.GetBlock(hash)
return NewBlock(block) return NewBlock(block)
} }
func (self *XEth) EthBlockByHash(strHash string) *types.Block { func (self *XEth) EthBlockByHash(strHash string) *types.Block {
hash := fromHex(strHash) hash := ethutil.FromHex(strHash)
block := self.chainManager.GetBlock(hash) block := self.chainManager.GetBlock(hash)
return block return block
} }
func (self *XEth) EthTransactionByHash(hash string) *types.Transaction { func (self *XEth) EthTransactionByHash(hash string) *types.Transaction {
data, _ := self.eth.ExtraDb().Get(fromHex(hash)) data, _ := self.eth.ExtraDb().Get(ethutil.FromHex(hash))
if len(data) != 0 { if len(data) != 0 {
return types.NewTransactionFromBytes(data) return types.NewTransactionFromBytes(data)
} }
@ -233,7 +233,7 @@ func (self *XEth) IsContract(address string) bool {
} }
func (self *XEth) SecretToAddress(key string) string { func (self *XEth) SecretToAddress(key string) string {
pair, err := crypto.NewKeyPairFromSec(fromHex(key)) pair, err := crypto.NewKeyPairFromSec(ethutil.FromHex(key))
if err != nil { if err != nil {
return "" return ""
} }
@ -273,7 +273,7 @@ func (self *XEth) FromAscii(str string) string {
str = str[2:] str = str[2:]
} }
return string(bytes.Trim(fromHex(str), "\x00")) return string(bytes.Trim(ethutil.FromHex(str), "\x00"))
} }
func (self *XEth) FromNumber(str string) string { func (self *XEth) FromNumber(str string) string {
@ -281,11 +281,11 @@ func (self *XEth) FromNumber(str string) string {
str = str[2:] str = str[2:]
} }
return ethutil.BigD(fromHex(str)).String() return ethutil.BigD(ethutil.FromHex(str)).String()
} }
func (self *XEth) PushTx(encodedTx string) (string, error) { func (self *XEth) PushTx(encodedTx string) (string, error) {
tx := types.NewTransactionFromBytes(fromHex(encodedTx)) tx := types.NewTransactionFromBytes(ethutil.FromHex(encodedTx))
err := self.eth.TxPool().Add(tx) err := self.eth.TxPool().Add(tx)
if err != nil { if err != nil {
return "", err return "", err
@ -306,12 +306,12 @@ var (
func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) { func (self *XEth) Call(fromStr, toStr, valueStr, gasStr, gasPriceStr, dataStr string) (string, error) {
statedb := self.State().State() //self.chainManager.TransState() statedb := self.State().State() //self.chainManager.TransState()
msg := callmsg{ msg := callmsg{
from: statedb.GetOrNewStateObject(fromHex(fromStr)), from: statedb.GetOrNewStateObject(ethutil.FromHex(fromStr)),
to: fromHex(toStr), to: ethutil.FromHex(toStr),
gas: ethutil.Big(gasStr), gas: ethutil.Big(gasStr),
gasPrice: ethutil.Big(gasPriceStr), gasPrice: ethutil.Big(gasPriceStr),
value: ethutil.Big(valueStr), value: ethutil.Big(valueStr),
data: fromHex(dataStr), data: ethutil.FromHex(dataStr),
} }
if msg.gas.Cmp(big.NewInt(0)) == 0 { if msg.gas.Cmp(big.NewInt(0)) == 0 {
msg.gas = defaultGas msg.gas = defaultGas
@ -339,9 +339,9 @@ func (self *XEth) Transact(fromStr, toStr, valueStr, gasStr, gasPriceStr, codeSt
contractCreation bool contractCreation bool
) )
from = fromHex(fromStr) from = ethutil.FromHex(fromStr)
data = fromHex(codeStr) data = ethutil.FromHex(codeStr)
to = fromHex(toStr) to = ethutil.FromHex(toStr)
if len(to) == 0 { if len(to) == 0 {
contractCreation = true contractCreation = true
} }