Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
b663e8b2
Commit
b663e8b2
authored
Mar 13, 2015
by
obscuren
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'rpcfrontier' into develop
parents
f1fcda4f
e3b64d70
Changes
7
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
201 additions
and
119 deletions
+201
-119
backend.go
eth/backend.go
+3
-0
api.go
rpc/api.go
+28
-22
args.go
rpc/args.go
+84
-50
http.go
rpc/http.go
+22
-5
messages.go
rpc/messages.go
+60
-39
util.go
rpc/util.go
+3
-3
xeth.go
xeth/xeth.go
+1
-0
No files found.
eth/backend.go
View file @
b663e8b2
...
...
@@ -131,6 +131,7 @@ type Ethereum struct {
Mining
bool
DataDir
string
version
string
}
func
New
(
config
*
Config
)
(
*
Ethereum
,
error
)
{
...
...
@@ -165,6 +166,7 @@ func New(config *Config) (*Ethereum, error) {
logger
:
servlogger
,
accountManager
:
config
.
AccountManager
,
DataDir
:
config
.
DataDir
,
version
:
config
.
Name
,
// TODO should separate from Name
}
eth
.
chainManager
=
core
.
NewChainManager
(
blockDb
,
stateDb
,
eth
.
EventMux
())
...
...
@@ -236,6 +238,7 @@ func (s *Ethereum) IsListening() bool { return true } // Alwa
func
(
s
*
Ethereum
)
PeerCount
()
int
{
return
s
.
net
.
PeerCount
()
}
func
(
s
*
Ethereum
)
Peers
()
[]
*
p2p
.
Peer
{
return
s
.
net
.
Peers
()
}
func
(
s
*
Ethereum
)
MaxPeers
()
int
{
return
s
.
net
.
MaxPeers
}
func
(
s
*
Ethereum
)
Version
()
string
{
return
s
.
version
}
// Start the ethereum
func
(
s
*
Ethereum
)
Start
()
error
{
...
...
rpc/api.go
View file @
b663e8b2
...
...
@@ -176,7 +176,7 @@ func (self *EthereumApi) UninstallFilter(id int, reply *interface{}) error {
return
nil
}
func
(
self
*
EthereumApi
)
NewFilterString
(
args
string
,
reply
*
interface
{})
error
{
func
(
self
*
EthereumApi
)
NewFilterString
(
args
*
FilterStringArgs
,
reply
*
interface
{})
error
{
var
id
int
filter
:=
core
.
NewFilter
(
self
.
xeth
()
.
Backend
())
...
...
@@ -186,10 +186,14 @@ func (self *EthereumApi) NewFilterString(args string, reply *interface{}) error
self
.
logs
[
id
]
.
add
(
&
state
.
StateLog
{})
}
if
args
==
"pending"
{
switch
args
.
Word
{
case
"pending"
:
filter
.
PendingCallback
=
callback
}
else
if
args
==
"chain"
{
case
"latest"
:
filter
.
BlockCallback
=
callback
default
:
return
NewValidationError
(
"Word"
,
"Must be `latest` or `pending`"
)
}
id
=
self
.
filterManager
.
InstallFilter
(
filter
)
...
...
@@ -477,6 +481,10 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
*
reply
=
toHex
(
crypto
.
Sha3
(
fromHex
(
args
.
Data
)))
case
"web3_clientVersion"
:
*
reply
=
p
.
xeth
()
.
Backend
()
.
Version
()
case
"net_version"
:
return
NewNotImplementedError
(
req
.
Method
)
case
"net_listening"
:
*
reply
=
p
.
xeth
()
.
IsListening
()
case
"net_peerCount"
:
...
...
@@ -578,7 +586,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
}
return
p
.
Call
(
args
,
reply
)
case
"eth_flush"
:
return
errNotImplemented
return
NewNotImplementedError
(
req
.
Method
)
case
"eth_getBlockByHash"
:
args
:=
new
(
GetBlockByHashArgs
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
...
...
@@ -618,7 +626,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
if
args
.
Index
>
int64
(
len
(
v
.
Transactions
))
||
args
.
Index
<
0
{
return
New
ErrorWithMessage
(
errDecodeArgs
,
"Transaction index
does not exist"
)
return
New
ValidationError
(
"Index"
,
"
does not exist"
)
}
*
reply
=
v
.
Transactions
[
args
.
Index
]
case
"eth_getTransactionByBlockNumberAndIndex"
:
...
...
@@ -632,7 +640,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
if
args
.
Index
>
int64
(
len
(
v
.
Transactions
))
||
args
.
Index
<
0
{
return
New
ErrorWithMessage
(
errDecodeArgs
,
"Transaction index
does not exist"
)
return
New
ValidationError
(
"Index"
,
"
does not exist"
)
}
*
reply
=
v
.
Transactions
[
args
.
Index
]
case
"eth_getUncleByBlockHashAndIndex"
:
...
...
@@ -646,7 +654,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
if
args
.
Index
>
int64
(
len
(
v
.
Uncles
))
||
args
.
Index
<
0
{
return
New
ErrorWithMessage
(
errDecodeArgs
,
"Uncle index
does not exist"
)
return
New
ValidationError
(
"Index"
,
"
does not exist"
)
}
uncle
,
err
:=
p
.
GetBlockByHash
(
toHex
(
v
.
Uncles
[
args
.
Index
]),
false
)
...
...
@@ -665,7 +673,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
if
args
.
Index
>
int64
(
len
(
v
.
Uncles
))
||
args
.
Index
<
0
{
return
New
ErrorWithMessage
(
errDecodeArgs
,
"Uncle index
does not exist"
)
return
New
ValidationError
(
"Index"
,
"
does not exist"
)
}
uncle
,
err
:=
p
.
GetBlockByHash
(
toHex
(
v
.
Uncles
[
args
.
Index
]),
false
)
...
...
@@ -675,10 +683,8 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
*
reply
=
uncle
case
"eth_getCompilers"
:
return
p
.
GetCompilers
(
reply
)
case
"eth_compileSolidity"
:
case
"eth_compileLLL"
:
case
"eth_compileSerpent"
:
return
errNotImplemented
case
"eth_compileSolidity"
,
"eth_compileLLL"
,
"eth_compileSerpent"
:
return
NewNotImplementedError
(
req
.
Method
)
case
"eth_newFilter"
:
args
:=
new
(
FilterOptions
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
...
...
@@ -690,7 +696,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
return
err
}
return
p
.
NewFilterString
(
args
.
Word
,
reply
)
return
p
.
NewFilterString
(
args
,
reply
)
case
"eth_uninstallFilter"
:
args
:=
new
(
FilterIdArgs
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
...
...
@@ -715,21 +721,22 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
return
p
.
AllLogs
(
args
,
reply
)
case
"eth_getWork"
:
case
"eth_submitWork"
:
return
errNotImplemented
case
"db_put"
:
case
"eth_getWork"
,
"eth_submitWork"
:
return
NewNotImplementedError
(
req
.
Method
)
case
"db_putString"
:
args
:=
new
(
DbArgs
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
return
err
}
return
p
.
DbPut
(
args
,
reply
)
case
"db_get"
:
case
"db_get
String
"
:
args
:=
new
(
DbArgs
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
return
err
}
return
p
.
DbGet
(
args
,
reply
)
case
"db_putHex"
,
"db_getHex"
:
return
NewNotImplementedError
(
req
.
Method
)
case
"shh_post"
:
args
:=
new
(
WhisperMessageArgs
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
...
...
@@ -744,9 +751,8 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
return
err
}
return
p
.
HasWhisperIdentity
(
args
.
Identity
,
reply
)
case
"shh_newGroup"
:
case
"shh_addToGroup"
:
return
errNotImplemented
case
"shh_newGroup"
,
"shh_addToGroup"
:
return
NewNotImplementedError
(
req
.
Method
)
case
"shh_newFilter"
:
args
:=
new
(
WhisperFilterArgs
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
...
...
@@ -790,7 +796,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
// }
// return p.WatchTx(args, reply)
default
:
return
New
ErrorWithMessage
(
errNotImplemented
,
req
.
Method
)
return
New
NotImplementedError
(
req
.
Method
)
}
rpclogger
.
DebugDetailf
(
"Reply: %T %s"
,
reply
,
reply
)
...
...
rpc/args.go
View file @
b663e8b2
This diff is collapsed.
Click to expand it.
rpc/http.go
View file @
b663e8b2
...
...
@@ -25,22 +25,39 @@ func JSONRPC(pipe *xeth.XEth, dataDir string) http.Handler {
rpchttplogger
.
DebugDetailln
(
"Handling request"
)
if
req
.
ContentLength
>
maxSizeReqLength
{
jsonerr
:=
&
RpcErrorObject
{
-
32700
,
"
Error:
Request too large"
}
jsonerr
:=
&
RpcErrorObject
{
-
32700
,
"Request too large"
}
json
.
Send
(
w
,
&
RpcErrorResponse
{
JsonRpc
:
jsonrpcver
,
ID
:
nil
,
Error
:
jsonerr
})
return
}
reqParsed
,
reqerr
:=
json
.
ParseRequestBody
(
req
)
if
reqerr
!=
nil
{
jsonerr
:=
&
RpcErrorObject
{
-
32700
,
"Error: Could not parse request"
}
switch
reqerr
.
(
type
)
{
case
nil
:
break
case
*
DecodeParamError
,
*
InsufficientParamsError
,
*
ValidationError
:
jsonerr
:=
&
RpcErrorObject
{
-
32602
,
reqerr
.
Error
()}
json
.
Send
(
w
,
&
RpcErrorResponse
{
JsonRpc
:
jsonrpcver
,
ID
:
nil
,
Error
:
jsonerr
})
return
default
:
jsonerr
:=
&
RpcErrorObject
{
-
32700
,
"Could not parse request"
}
json
.
Send
(
w
,
&
RpcErrorResponse
{
JsonRpc
:
jsonrpcver
,
ID
:
nil
,
Error
:
jsonerr
})
return
}
var
response
interface
{}
reserr
:=
api
.
GetRequestReply
(
&
reqParsed
,
&
response
)
if
reserr
!=
nil
{
rpchttplogger
.
Warnln
(
reserr
)
switch
reserr
.
(
type
)
{
case
nil
:
break
case
*
NotImplementedError
:
jsonerr
:=
&
RpcErrorObject
{
-
32601
,
reserr
.
Error
()}
json
.
Send
(
w
,
&
RpcErrorResponse
{
JsonRpc
:
jsonrpcver
,
ID
:
reqParsed
.
ID
,
Error
:
jsonerr
})
return
case
*
DecodeParamError
,
*
InsufficientParamsError
,
*
ValidationError
:
jsonerr
:=
&
RpcErrorObject
{
-
32602
,
reserr
.
Error
()}
json
.
Send
(
w
,
&
RpcErrorResponse
{
JsonRpc
:
jsonrpcver
,
ID
:
reqParsed
.
ID
,
Error
:
jsonerr
})
return
default
:
jsonerr
:=
&
RpcErrorObject
{
-
32603
,
reserr
.
Error
()}
json
.
Send
(
w
,
&
RpcErrorResponse
{
JsonRpc
:
jsonrpcver
,
ID
:
reqParsed
.
ID
,
Error
:
jsonerr
})
return
...
...
rpc/messages.go
View file @
b663e8b2
...
...
@@ -18,16 +18,69 @@ package rpc
import
(
"encoding/json"
"errors"
"fmt"
)
var
(
errArguments
=
errors
.
New
(
"Error: Insufficient arguments"
)
errNotImplemented
=
errors
.
New
(
"Error: Method not implemented"
)
errUnknown
=
errors
.
New
(
"Error: Unknown error"
)
errDecodeArgs
=
errors
.
New
(
"Error: Could not decode arguments"
)
)
type
InsufficientParamsError
struct
{
have
int
want
int
}
func
(
e
*
InsufficientParamsError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"insufficient params, want %d have %d"
,
e
.
want
,
e
.
have
)
}
func
NewInsufficientParamsError
(
have
int
,
want
int
)
*
InsufficientParamsError
{
return
&
InsufficientParamsError
{
have
:
have
,
want
:
want
,
}
}
type
NotImplementedError
struct
{
Method
string
}
func
(
e
*
NotImplementedError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"%s method not implemented"
,
e
.
Method
)
}
func
NewNotImplementedError
(
method
string
)
*
NotImplementedError
{
return
&
NotImplementedError
{
Method
:
method
,
}
}
type
DecodeParamError
struct
{
err
string
}
func
(
e
*
DecodeParamError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"could not decode, %s"
,
e
.
err
)
}
func
NewDecodeParamError
(
errstr
string
)
error
{
return
&
DecodeParamError
{
err
:
errstr
,
}
}
type
ValidationError
struct
{
ParamName
string
msg
string
}
func
(
e
*
ValidationError
)
Error
()
string
{
return
fmt
.
Sprintf
(
"%s not valid, %s"
,
e
.
ParamName
,
e
.
msg
)
}
func
NewValidationError
(
param
string
,
msg
string
)
error
{
return
&
ValidationError
{
ParamName
:
param
,
msg
:
msg
,
}
}
type
RpcRequest
struct
{
ID
interface
{}
`json:"id"`
...
...
@@ -53,35 +106,3 @@ type RpcErrorObject struct {
Message
string
`json:"message"`
// Data interface{} `json:"data"`
}
func
NewErrorWithMessage
(
err
error
,
msg
string
)
error
{
return
fmt
.
Errorf
(
"%s: %s"
,
err
.
Error
(),
msg
)
}
// func (req *RpcRequest) ToRegisterArgs() (string, error) {
// if len(req.Params) < 1 {
// return "", errArguments
// }
// var args string
// err := json.Unmarshal(req.Params, &args)
// if err != nil {
// return "", err
// }
// return args, nil
// }
// func (req *RpcRequest) ToWatchTxArgs() (string, error) {
// if len(req.Params) < 1 {
// return "", errArguments
// }
// var args string
// err := json.Unmarshal(req.Params, &args)
// if err != nil {
// return "", err
// }
// return args, nil
// }
rpc/util.go
View file @
b663e8b2
...
...
@@ -42,7 +42,7 @@ type JsonWrapper struct{}
func
UnmarshalRawMessages
(
b
[]
byte
,
iface
interface
{},
number
*
int64
)
(
err
error
)
{
var
data
[]
json
.
RawMessage
if
err
=
json
.
Unmarshal
(
b
,
&
data
);
err
!=
nil
&&
len
(
data
)
==
0
{
return
errDecodeArgs
return
NewDecodeParamError
(
err
.
Error
())
}
// Number index determines the index in the array for a possible block number
...
...
@@ -74,7 +74,7 @@ func UnmarshalRawMessages(b []byte, iface interface{}, number *int64) (err error
fallthrough
default
:
if
err
=
json
.
Unmarshal
(
data
[
0
],
iface
);
err
!=
nil
{
return
errDecodeArgs
return
NewDecodeParamError
(
err
.
Error
())
}
numberIndex
=
1
}
...
...
@@ -82,7 +82,7 @@ func UnmarshalRawMessages(b []byte, iface interface{}, number *int64) (err error
// <0 index means out of bound for block number
if
numberIndex
>=
0
&&
len
(
data
)
>
numberIndex
{
if
err
=
blockNumber
(
data
[
numberIndex
],
number
);
err
!=
nil
{
return
errDecodeArgs
return
NewDecodeParamError
(
err
.
Error
())
}
}
...
...
xeth/xeth.go
View file @
b663e8b2
...
...
@@ -39,6 +39,7 @@ type Backend interface {
IsMining
()
bool
StartMining
()
error
StopMining
()
Version
()
string
}
// Frontend should be implemented by users of XEth. Its methods are
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment