diff options
Diffstat (limited to 'rpc/args.go')
-rw-r--r-- | rpc/args.go | 316 |
1 files changed, 175 insertions, 141 deletions
diff --git a/rpc/args.go b/rpc/args.go index 1928ec218..65707aa37 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -3,14 +3,22 @@ package rpc import ( "bytes" "encoding/json" - "errors" - "fmt" + // "errors" + // "fmt" "math/big" "github.com/ethereum/go-ethereum/common" ) -func blockHeight(raw interface{}, number *int64) (err error) { +func blockHeightFromJson(msg json.RawMessage, number *int64) error { + var raw interface{} + if err := json.Unmarshal(msg, &raw); err != nil { + return NewDecodeParamError(err.Error()) + } + return blockHeight(raw, number) +} + +func blockHeight(raw interface{}, number *int64) error { // Parse as integer num, ok := raw.(float64) if ok { @@ -21,7 +29,7 @@ func blockHeight(raw interface{}, number *int64) (err error) { // Parse as string/hexstring str, ok := raw.(string) if !ok { - return NewDecodeParamError("BlockNumber is not a string") + return NewInvalidTypeError("blockNumber", "not a number or string") } switch str { @@ -36,26 +44,44 @@ func blockHeight(raw interface{}, number *int64) (err error) { return nil } -func toNumber(v interface{}) (int64, error) { - var str string - if v != nil { - var ok bool - str, ok = v.(string) - if !ok { - return 0, errors.New("is not a string or undefined") - } - } else { - str = "latest" +func numString(raw interface{}, number *int64) error { + // Parse as integer + num, ok := raw.(float64) + if ok { + *number = int64(num) + return nil } - switch str { - case "latest": - return -1, nil - default: - return int64(common.Big(v.(string)).Int64()), nil + // Parse as string/hexstring + str, ok := raw.(string) + if !ok { + return NewInvalidTypeError("", "not a number or string") } + *number = common.String2Big(str).Int64() + + return nil } +// func toNumber(v interface{}) (int64, error) { +// var str string +// if v != nil { +// var ok bool +// str, ok = v.(string) +// if !ok { +// return 0, errors.New("is not a string or undefined") +// } +// } else { +// str = "latest" +// } + +// switch str { +// case "latest": +// return -1, nil +// default: +// return int64(common.Big(v.(string)).Int64()), nil +// } +// } + type GetBlockByHashArgs struct { BlockHash string IncludeTxs bool @@ -74,7 +100,7 @@ func (args *GetBlockByHashArgs) UnmarshalJSON(b []byte) (err error) { argstr, ok := obj[0].(string) if !ok { - return NewDecodeParamError("BlockHash not a string") + return NewInvalidTypeError("blockHash", "not a string") } args.BlockHash = argstr @@ -103,8 +129,10 @@ func (args *GetBlockByNumberArgs) UnmarshalJSON(b []byte) (err error) { if v, ok := obj[0].(float64); ok { args.BlockNumber = int64(v) + } else if v, ok := obj[0].(string); ok { + args.BlockNumber = common.Big(v).Int64() } else { - args.BlockNumber = common.Big(obj[0].(string)).Int64() + return NewInvalidTypeError("blockNumber", "not a number or string") } if len(obj) > 1 { @@ -144,7 +172,10 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { return NewDecodeParamError(err.Error()) } - // var ok bool + if len(ext.From) == 0 { + return NewValidationError("from", "is required") + } + args.From = ext.From args.To = ext.To args.Value = common.String2Big(ext.Value) @@ -154,12 +185,7 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { // Check for optional BlockNumber param if len(obj) > 1 { - var raw interface{} - if err = json.Unmarshal(obj[1], &raw); err != nil { - return NewDecodeParamError(err.Error()) - } - - if err := blockHeight(raw, &args.BlockNumber); err != nil { + if err := blockHeightFromJson(obj[1], &args.BlockNumber); err != nil { return err } } @@ -167,13 +193,6 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { return nil } -func (args *NewTxArgs) requirements() error { - if len(args.From) == 0 { - return NewValidationError("From", "Is required") - } - return nil -} - type GetStorageArgs struct { Address string BlockNumber int64 @@ -191,7 +210,7 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { addstr, ok := obj[0].(string) if !ok { - return NewDecodeParamError("Address is not a string") + return NewInvalidTypeError("address", "not a string") } args.Address = addstr @@ -204,13 +223,6 @@ func (args *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { return nil } -func (args *GetStorageArgs) requirements() error { - if len(args.Address) == 0 { - return NewValidationError("Address", "cannot be blank") - } - return nil -} - type GetStorageAtArgs struct { Address string Key string @@ -229,13 +241,13 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) { addstr, ok := obj[0].(string) if !ok { - return NewDecodeParamError("Address is not a string") + return NewInvalidTypeError("address", "not a string") } args.Address = addstr keystr, ok := obj[1].(string) if !ok { - return NewDecodeParamError("Key is not a string") + return NewInvalidTypeError("key", "not a string") } args.Key = keystr @@ -248,17 +260,6 @@ func (args *GetStorageAtArgs) UnmarshalJSON(b []byte) (err error) { return nil } -func (args *GetStorageAtArgs) requirements() error { - if len(args.Address) == 0 { - return NewValidationError("Address", "cannot be blank") - } - - if len(args.Key) == 0 { - return NewValidationError("Key", "cannot be blank") - } - return nil -} - type GetTxCountArgs struct { Address string BlockNumber int64 @@ -276,7 +277,7 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { addstr, ok := obj[0].(string) if !ok { - return NewDecodeParamError("Address is not a string") + return NewInvalidTypeError("address", "not a string") } args.Address = addstr @@ -289,13 +290,6 @@ func (args *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { return nil } -func (args *GetTxCountArgs) requirements() error { - if len(args.Address) == 0 { - return NewValidationError("Address", "cannot be blank") - } - return nil -} - type GetBalanceArgs struct { Address string BlockNumber int64 @@ -313,7 +307,7 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { addstr, ok := obj[0].(string) if !ok { - return NewDecodeParamError("Address is not a string") + return NewInvalidTypeError("address", "not a string") } args.Address = addstr @@ -326,13 +320,6 @@ func (args *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { return nil } -func (args *GetBalanceArgs) requirements() error { - if len(args.Address) == 0 { - return NewValidationError("Address", "cannot be blank") - } - return nil -} - type GetDataArgs struct { Address string BlockNumber int64 @@ -350,7 +337,7 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) { addstr, ok := obj[0].(string) if !ok { - return NewDecodeParamError("Address is not a string") + return NewInvalidTypeError("address", "not a string") } args.Address = addstr @@ -363,13 +350,6 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) { return nil } -func (args *GetDataArgs) requirements() error { - if len(args.Address) == 0 { - return NewValidationError("Address", "cannot be blank") - } - return nil -} - type BlockNumIndexArgs struct { BlockNumber int64 Index int64 @@ -386,16 +366,14 @@ func (args *BlockNumIndexArgs) UnmarshalJSON(b []byte) (err error) { return NewInsufficientParamsError(len(obj), 1) } - arg0, ok := obj[0].(string) - if !ok { - return NewDecodeParamError("BlockNumber is not string") + if err := blockHeight(obj[0], &args.BlockNumber); err != nil { + return err } - args.BlockNumber = common.Big(arg0).Int64() if len(obj) > 1 { arg1, ok := obj[1].(string) if !ok { - return NewDecodeParamError("Index not a string") + return NewInvalidTypeError("index", "not a string") } args.Index = common.Big(arg1).Int64() } @@ -421,14 +399,14 @@ func (args *HashIndexArgs) UnmarshalJSON(b []byte) (err error) { arg0, ok := obj[0].(string) if !ok { - return NewDecodeParamError("Hash not a string") + return NewInvalidTypeError("hash", "not a string") } args.Hash = arg0 if len(obj) > 1 { arg1, ok := obj[1].(string) if !ok { - return NewDecodeParamError("Index not a string") + return NewInvalidTypeError("index", "not a string") } args.Index = common.Big(arg1).Int64() } @@ -450,8 +428,12 @@ func (args *Sha3Args) UnmarshalJSON(b []byte) (err error) { if len(obj) < 1 { return NewInsufficientParamsError(len(obj), 1) } - args.Data = obj[0].(string) + argstr, ok := obj[0].(string) + if !ok { + return NewInvalidTypeError("data", "is not a string") + } + args.Data = argstr return nil } @@ -468,8 +450,8 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) { var obj []struct { FromBlock interface{} `json:"fromBlock"` ToBlock interface{} `json:"toBlock"` - Limit string `json:"limit"` - Offset string `json:"offset"` + Limit interface{} `json:"limit"` + Offset interface{} `json:"offset"` Address string `json:"address"` Topics []interface{} `json:"topics"` } @@ -482,17 +464,40 @@ func (args *BlockFilterArgs) UnmarshalJSON(b []byte) (err error) { return NewInsufficientParamsError(len(obj), 1) } - args.Earliest, err = toNumber(obj[0].ToBlock) - if err != nil { - return NewDecodeParamError(fmt.Sprintf("FromBlock %v", err)) + // args.Earliest, err = toNumber(obj[0].ToBlock) + // if err != nil { + // return NewDecodeParamError(fmt.Sprintf("FromBlock %v", err)) + // } + // args.Latest, err = toNumber(obj[0].FromBlock) + // if err != nil { + // return NewDecodeParamError(fmt.Sprintf("ToBlock %v", err)) + + var num int64 + if err := blockHeight(obj[0].FromBlock, &num); err != nil { + return err + } + if num < 0 { + args.Earliest = -1 //latest block + } else { + args.Earliest = num + } + + if err := blockHeight(obj[0].ToBlock, &num); err != nil { + return err } - args.Latest, err = toNumber(obj[0].FromBlock) - if err != nil { - return NewDecodeParamError(fmt.Sprintf("ToBlock %v", err)) + args.Latest = num + + if err := numString(obj[0].Limit, &num); err != nil { + return err } + args.Max = int(num) + + if err := numString(obj[0].Offset, &num); err != nil { + return err + + } + args.Skip = int(num) - args.Max = int(common.Big(obj[0].Limit).Int64()) - args.Skip = int(common.Big(obj[0].Offset).Int64()) args.Address = obj[0].Address args.Topics = obj[0].Topics @@ -519,19 +524,19 @@ func (args *DbArgs) UnmarshalJSON(b []byte) (err error) { var ok bool if objstr, ok = obj[0].(string); !ok { - return NewDecodeParamError("Database is not a string") + return NewInvalidTypeError("database", "not a string") } args.Database = objstr if objstr, ok = obj[1].(string); !ok { - return NewDecodeParamError("Key is not a string") + return NewInvalidTypeError("key", "not a string") } args.Key = objstr if len(obj) > 2 { objstr, ok = obj[2].(string) if !ok { - return NewDecodeParamError("Value is not a string") + return NewInvalidTypeError("value", "not a string") } args.Value = []byte(objstr) @@ -570,19 +575,19 @@ func (args *DbHexArgs) UnmarshalJSON(b []byte) (err error) { var ok bool if objstr, ok = obj[0].(string); !ok { - return NewDecodeParamError("Database is not a string") + return NewInvalidTypeError("database", "not a string") } args.Database = objstr if objstr, ok = obj[1].(string); !ok { - return NewDecodeParamError("Key is not a string") + return NewInvalidTypeError("key", "not a string") } args.Key = objstr if len(obj) > 2 { objstr, ok = obj[2].(string) if !ok { - return NewDecodeParamError("Value is not a string") + return NewInvalidTypeError("value", "not a string") } args.Value = common.FromHex(objstr) @@ -616,8 +621,8 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) { To string From string Topics []string - Priority string - Ttl string + Priority interface{} + Ttl interface{} } if err = json.Unmarshal(b, &obj); err != nil { @@ -631,8 +636,17 @@ func (args *WhisperMessageArgs) UnmarshalJSON(b []byte) (err error) { args.To = obj[0].To args.From = obj[0].From args.Topics = obj[0].Topics - args.Priority = uint32(common.Big(obj[0].Priority).Int64()) - args.Ttl = uint32(common.Big(obj[0].Ttl).Int64()) + + var num int64 + if err := numString(obj[0].Priority, &num); err != nil { + return err + } + args.Priority = uint32(num) + + if err := numString(obj[0].Ttl, &num); err != nil { + return err + } + args.Ttl = uint32(num) return nil } @@ -643,14 +657,18 @@ type CompileArgs struct { func (args *CompileArgs) UnmarshalJSON(b []byte) (err error) { var obj []interface{} - r := bytes.NewReader(b) - if err := json.NewDecoder(r).Decode(&obj); err != nil { + if err := json.Unmarshal(b, &obj); err != nil { return NewDecodeParamError(err.Error()) } - if len(obj) > 0 { - args.Source = obj[0].(string) + if len(obj) < 1 { + return NewInsufficientParamsError(len(obj), 1) + } + argstr, ok := obj[0].(string) + if !ok { + return NewInvalidTypeError("arg0", "is not a string") } + args.Source = argstr return nil } @@ -673,20 +691,15 @@ func (args *FilterStringArgs) UnmarshalJSON(b []byte) (err error) { var argstr string argstr, ok := obj[0].(string) if !ok { - return NewDecodeParamError("Filter is not a string") + return NewInvalidTypeError("filter", "not a string") } - args.Word = argstr - - return nil -} - -func (args *FilterStringArgs) requirements() error { - switch args.Word { + switch argstr { case "latest", "pending": break default: return NewValidationError("Word", "Must be `latest` or `pending`") } + args.Word = argstr return nil } @@ -695,9 +708,8 @@ type FilterIdArgs struct { } func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) { - var obj []string - r := bytes.NewReader(b) - if err := json.NewDecoder(r).Decode(&obj); err != nil { + var obj []interface{} + if err := json.Unmarshal(b, &obj); err != nil { return NewDecodeParamError(err.Error()) } @@ -705,7 +717,11 @@ func (args *FilterIdArgs) UnmarshalJSON(b []byte) (err error) { return NewInsufficientParamsError(len(obj), 1) } - args.Id = int(common.Big(obj[0]).Int64()) + var num int64 + if err := numString(obj[0], &num); err != nil { + return err + } + args.Id = int(num) return nil } @@ -715,9 +731,8 @@ type WhisperIdentityArgs struct { } func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) { - var obj []string - r := bytes.NewReader(b) - if err := json.NewDecoder(r).Decode(&obj); err != nil { + var obj []interface{} + if err := json.Unmarshal(b, &obj); err != nil { return NewDecodeParamError(err.Error()) } @@ -725,7 +740,14 @@ func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) { return NewInsufficientParamsError(len(obj), 1) } - args.Identity = obj[0] + argstr, ok := obj[0].(string) + if !ok { + return NewInvalidTypeError("arg0", "not a string") + } + // if !common.IsHex(argstr) { + // return NewValidationError("arg0", "not a hexstring") + // } + args.Identity = argstr return nil } @@ -738,9 +760,8 @@ type WhisperFilterArgs struct { func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) { var obj []struct { - To string - From string - Topics []string + To interface{} + Topics []interface{} } if err = json.Unmarshal(b, &obj); err != nil { @@ -751,17 +772,30 @@ func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) { return NewInsufficientParamsError(len(obj), 1) } - args.To = obj[0].To - args.From = obj[0].From - args.Topics = obj[0].Topics + var argstr string + argstr, ok := obj[0].To.(string) + if !ok { + return NewInvalidTypeError("to", "is not a string") + } + args.To = argstr + + t := make([]string, len(obj[0].Topics)) + for i, j := range obj[0].Topics { + argstr, ok := j.(string) + if !ok { + return NewInvalidTypeError("topics["+string(i)+"]", "is not a string") + } + t[i] = argstr + } + args.Topics = t return nil } type SubmitWorkArgs struct { Nonce uint64 - Header common.Hash - Digest common.Hash + Header string + Digest string } func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) { @@ -777,21 +811,21 @@ func (args *SubmitWorkArgs) UnmarshalJSON(b []byte) (err error) { var objstr string var ok bool if objstr, ok = obj[0].(string); !ok { - return NewDecodeParamError("Nonce is not a string") + return NewInvalidTypeError("nonce", "not a string") } args.Nonce = common.String2Big(objstr).Uint64() if objstr, ok = obj[1].(string); !ok { - return NewDecodeParamError("Header is not a string") + return NewInvalidTypeError("header", "not a string") } - args.Header = common.HexToHash(objstr) + args.Header = objstr if objstr, ok = obj[2].(string); !ok { - return NewDecodeParamError("Digest is not a string") + return NewInvalidTypeError("digest", "not a string") } - args.Digest = common.HexToHash(objstr) + args.Digest = objstr return nil } |