aboutsummaryrefslogtreecommitdiffstats
path: root/rpc
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-04-28 17:17:41 +0800
committerobscuren <geffobscura@gmail.com>2015-04-28 17:17:41 +0800
commit99027c79fe7406919d654ab482d8ad37fcf098ce (patch)
tree9f6625b30b9d63d28f7e86c69d31991daac4fbf7 /rpc
parentbac455c0117f7095ee9c60ac75a249ddd66c2660 (diff)
parenta05c420371aa56657b86ba3dce6ebb087adb708d (diff)
downloadgo-tangerine-99027c79fe7406919d654ab482d8ad37fcf098ce.tar
go-tangerine-99027c79fe7406919d654ab482d8ad37fcf098ce.tar.gz
go-tangerine-99027c79fe7406919d654ab482d8ad37fcf098ce.tar.bz2
go-tangerine-99027c79fe7406919d654ab482d8ad37fcf098ce.tar.lz
go-tangerine-99027c79fe7406919d654ab482d8ad37fcf098ce.tar.xz
go-tangerine-99027c79fe7406919d654ab482d8ad37fcf098ce.tar.zst
go-tangerine-99027c79fe7406919d654ab482d8ad37fcf098ce.zip
Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop
Conflicts: rpc/api.go
Diffstat (limited to 'rpc')
-rw-r--r--rpc/api.go36
-rw-r--r--rpc/args.go69
-rw-r--r--rpc/args_test.go2
3 files changed, 73 insertions, 34 deletions
diff --git a/rpc/api.go b/rpc/api.go
index 6f7a81474..6d3a20bfa 100644
--- a/rpc/api.go
+++ b/rpc/api.go
@@ -406,65 +406,67 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
res, _ := api.xeth().DbGet([]byte(args.Database + args.Key))
*reply = newHexData(res)
+
case "shh_version":
+ // Retrieves the currently running whisper protocol version
*reply = api.xeth().WhisperVersion()
+
case "shh_post":
+ // Injects a new message into the whisper network
args := new(WhisperMessageArgs)
if err := json.Unmarshal(req.Params, &args); err != nil {
return err
}
-
err := api.xeth().Whisper().Post(args.Payload, args.To, args.From, args.Topics, args.Priority, args.Ttl)
if err != nil {
return err
}
-
*reply = true
+
case "shh_newIdentity":
+ // Creates a new whisper identity to use for sending/receiving messages
*reply = api.xeth().Whisper().NewIdentity()
- // case "shh_removeIdentity":
- // args := new(WhisperIdentityArgs)
- // if err := json.Unmarshal(req.Params, &args); err != nil {
- // return err
- // }
- // *reply = api.xeth().Whisper().RemoveIdentity(args.Identity)
+
case "shh_hasIdentity":
+ // Checks if an identity if owned or not
args := new(WhisperIdentityArgs)
if err := json.Unmarshal(req.Params, &args); err != nil {
return err
}
*reply = api.xeth().Whisper().HasIdentity(args.Identity)
- case "shh_newGroup", "shh_addToGroup":
- return NewNotImplementedError(req.Method)
+
case "shh_newFilter":
+ // Create a new filter to watch and match messages with
args := new(WhisperFilterArgs)
if err := json.Unmarshal(req.Params, &args); err != nil {
return err
}
- opts := new(xeth.Options)
- // opts.From = args.From
- opts.To = args.To
- opts.Topics = args.Topics
- id := api.xeth().NewWhisperFilter(opts)
+ id := api.xeth().NewWhisperFilter(args.To, args.From, args.Topics)
*reply = newHexNum(big.NewInt(int64(id)).Bytes())
+
case "shh_uninstallFilter":
+ // Remove an existing filter watching messages
args := new(FilterIdArgs)
if err := json.Unmarshal(req.Params, &args); err != nil {
return err
}
*reply = api.xeth().UninstallWhisperFilter(args.Id)
+
case "shh_getFilterChanges":
+ // Retrieve all the new messages arrived since the last request
args := new(FilterIdArgs)
if err := json.Unmarshal(req.Params, &args); err != nil {
return err
}
- *reply = api.xeth().MessagesChanged(args.Id)
+ *reply = api.xeth().WhisperMessagesChanged(args.Id)
+
case "shh_getMessages":
+ // Retrieve all the cached messages matching a specific, existing filter
args := new(FilterIdArgs)
if err := json.Unmarshal(req.Params, &args); err != nil {
return err
}
- *reply = api.xeth().Whisper().Messages(args.Id)
+ *reply = api.xeth().WhisperMessages(args.Id)
case "eth_hashrate":
*reply = newHexNum(api.xeth().HashRate())
diff --git a/rpc/args.go b/rpc/args.go
index 7694a3d3f..4bd48e6d6 100644
--- a/rpc/args.go
+++ b/rpc/args.go
@@ -1010,25 +1010,27 @@ func (args *WhisperIdentityArgs) UnmarshalJSON(b []byte) (err error) {
}
type WhisperFilterArgs struct {
- To string `json:"to"`
+ To string
From string
- Topics []string
+ Topics [][]string
}
+// UnmarshalJSON implements the json.Unmarshaler interface, invoked to convert a
+// JSON message blob into a WhisperFilterArgs structure.
func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
+ // Unmarshal the JSON message and sanity check
var obj []struct {
- To interface{}
- Topics []interface{}
+ To interface{} `json:"to"`
+ From interface{} `json:"from"`
+ Topics interface{} `json:"topics"`
}
-
- if err = json.Unmarshal(b, &obj); err != nil {
+ if err := json.Unmarshal(b, &obj); err != nil {
return NewDecodeParamError(err.Error())
}
-
if len(obj) < 1 {
return NewInsufficientParamsError(len(obj), 1)
}
-
+ // Retrieve the simple data contents of the filter arguments
if obj[0].To == nil {
args.To = ""
} else {
@@ -1038,17 +1040,52 @@ func (args *WhisperFilterArgs) UnmarshalJSON(b []byte) (err error) {
}
args.To = argstr
}
-
- t := make([]string, len(obj[0].Topics))
- for i, j := range obj[0].Topics {
- argstr, ok := j.(string)
+ if obj[0].From == nil {
+ args.From = ""
+ } else {
+ argstr, ok := obj[0].From.(string)
if !ok {
- return NewInvalidTypeError("topics["+string(i)+"]", "is not a string")
+ return NewInvalidTypeError("from", "is not a string")
}
- t[i] = argstr
+ args.From = argstr
+ }
+ // Construct the nested topic array
+ if obj[0].Topics != nil {
+ // Make sure we have an actual topic array
+ list, ok := obj[0].Topics.([]interface{})
+ if !ok {
+ return NewInvalidTypeError("topics", "is not an array")
+ }
+ // Iterate over each topic and handle nil, string or array
+ topics := make([][]string, len(list))
+ for idx, field := range list {
+ switch value := field.(type) {
+ case nil:
+ topics[idx] = []string{}
+
+ case string:
+ topics[idx] = []string{value}
+
+ case []interface{}:
+ topics[idx] = make([]string, len(value))
+ for i, nested := range value {
+ switch value := nested.(type) {
+ case nil:
+ topics[idx][i] = ""
+
+ case string:
+ topics[idx][i] = value
+
+ default:
+ return NewInvalidTypeError(fmt.Sprintf("topic[%d][%d]", idx, i), "is not a string")
+ }
+ }
+ default:
+ return NewInvalidTypeError(fmt.Sprintf("topic[%d]", idx), "not a string or array")
+ }
+ }
+ args.Topics = topics
}
- args.Topics = t
-
return nil
}
diff --git a/rpc/args_test.go b/rpc/args_test.go
index 2f011bfd9..f5949b7a2 100644
--- a/rpc/args_test.go
+++ b/rpc/args_test.go
@@ -1943,7 +1943,7 @@ func TestWhisperFilterArgs(t *testing.T) {
input := `[{"topics": ["0x68656c6c6f20776f726c64"], "to": "0x34ag445g3455b34"}]`
expected := new(WhisperFilterArgs)
expected.To = "0x34ag445g3455b34"
- expected.Topics = []string{"0x68656c6c6f20776f726c64"}
+ expected.Topics = [][]string{[]string{"0x68656c6c6f20776f726c64"}}
args := new(WhisperFilterArgs)
if err := json.Unmarshal([]byte(input), &args); err != nil {