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
6afc5e76
Commit
6afc5e76
authored
Apr 01, 2015
by
obscuren
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'hexify' of
https://github.com/tgerring/go-ethereum
into tgerring-hexify
parents
4e8f8cfa
02fb8378
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
703 additions
and
305 deletions
+703
-305
block_processor.go
core/block_processor.go
+19
-3
api.go
rpc/api.go
+14
-10
args.go
rpc/args.go
+87
-0
args_test.go
rpc/args_test.go
+269
-8
messages.go
rpc/messages.go
+87
-0
responses.go
rpc/responses.go
+103
-209
responses_test.go
rpc/responses_test.go
+103
-72
xeth.go
xeth/xeth.go
+21
-3
No files found.
core/block_processor.go
View file @
6afc5e76
...
@@ -233,8 +233,9 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (td *big
...
@@ -233,8 +233,9 @@ func (sm *BlockProcessor) processWithParent(block, parent *types.Block) (td *big
sm
.
txpool
.
RemoveSet
(
block
.
Transactions
())
sm
.
txpool
.
RemoveSet
(
block
.
Transactions
())
}
}
for
_
,
tx
:=
range
block
.
Transactions
()
{
// This puts transactions in a extra db for rpc
putTx
(
sm
.
extraDb
,
tx
)
for
i
,
tx
:=
range
block
.
Transactions
()
{
putTx
(
sm
.
extraDb
,
tx
,
block
,
uint64
(
i
))
}
}
if
uncle
{
if
uncle
{
...
@@ -362,11 +363,26 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro
...
@@ -362,11 +363,26 @@ func (sm *BlockProcessor) GetLogs(block *types.Block) (logs state.Logs, err erro
return
state
.
Logs
(),
nil
return
state
.
Logs
(),
nil
}
}
func
putTx
(
db
common
.
Database
,
tx
*
types
.
Transaction
)
{
func
putTx
(
db
common
.
Database
,
tx
*
types
.
Transaction
,
block
*
types
.
Block
,
i
uint64
)
{
rlpEnc
,
err
:=
rlp
.
EncodeToBytes
(
tx
)
rlpEnc
,
err
:=
rlp
.
EncodeToBytes
(
tx
)
if
err
!=
nil
{
if
err
!=
nil
{
statelogger
.
Infoln
(
"Failed encoding tx"
,
err
)
statelogger
.
Infoln
(
"Failed encoding tx"
,
err
)
return
return
}
}
db
.
Put
(
tx
.
Hash
()
.
Bytes
(),
rlpEnc
)
db
.
Put
(
tx
.
Hash
()
.
Bytes
(),
rlpEnc
)
var
txExtra
struct
{
BlockHash
common
.
Hash
BlockIndex
uint64
Index
uint64
}
txExtra
.
BlockHash
=
block
.
Hash
()
txExtra
.
BlockIndex
=
block
.
NumberU64
()
txExtra
.
Index
=
i
rlpMeta
,
err
:=
rlp
.
EncodeToBytes
(
txExtra
)
if
err
!=
nil
{
statelogger
.
Infoln
(
"Failed encoding meta"
,
err
)
return
}
db
.
Put
(
append
(
tx
.
Hash
()
.
Bytes
(),
0x0001
),
rlpMeta
)
}
}
rpc/api.go
View file @
6afc5e76
...
@@ -54,7 +54,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
...
@@ -54,7 +54,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
case
"net_peerCount"
:
case
"net_peerCount"
:
v
:=
api
.
xeth
()
.
PeerCount
()
v
:=
api
.
xeth
()
.
PeerCount
()
*
reply
=
common
.
ToHex
(
big
.
NewInt
(
int64
(
v
))
.
Bytes
())
*
reply
=
common
.
ToHex
(
big
.
NewInt
(
int64
(
v
))
.
Bytes
())
case
"eth_
v
ersion"
:
case
"eth_
protocolV
ersion"
:
*
reply
=
api
.
xeth
()
.
EthVersion
()
*
reply
=
api
.
xeth
()
.
EthVersion
()
case
"eth_coinbase"
:
case
"eth_coinbase"
:
// TODO handling of empty coinbase due to lack of accounts
// TODO handling of empty coinbase due to lack of accounts
...
@@ -159,7 +159,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
...
@@ -159,7 +159,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
}
}
*
reply
=
v
*
reply
=
v
case
"eth_call"
:
case
"eth_call"
:
args
:=
new
(
NewTx
Args
)
args
:=
new
(
Call
Args
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
return
err
return
err
}
}
...
@@ -199,9 +199,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
...
@@ -199,9 +199,13 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
args
:=
new
(
HashIndexArgs
)
args
:=
new
(
HashIndexArgs
)
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
if
err
:=
json
.
Unmarshal
(
req
.
Params
,
&
args
);
err
!=
nil
{
}
}
tx
:=
api
.
xeth
()
.
EthTransactionByHash
(
args
.
Hash
)
tx
,
bhash
,
bnum
,
txi
:=
api
.
xeth
()
.
EthTransactionByHash
(
args
.
Hash
)
if
tx
!=
nil
{
if
tx
!=
nil
{
*
reply
=
NewTransactionRes
(
tx
)
v
:=
NewTransactionRes
(
tx
)
v
.
BlockHash
=
newHexData
(
bhash
)
v
.
BlockNumber
=
newHexNum
(
bnum
)
v
.
TxIndex
=
newHexNum
(
txi
)
*
reply
=
v
}
}
case
"eth_getTransactionByBlockHashAndIndex"
:
case
"eth_getTransactionByBlockHashAndIndex"
:
args
:=
new
(
HashIndexArgs
)
args
:=
new
(
HashIndexArgs
)
...
@@ -213,7 +217,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
...
@@ -213,7 +217,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
br
:=
NewBlockRes
(
block
)
br
:=
NewBlockRes
(
block
)
br
.
fullTx
=
true
br
.
fullTx
=
true
if
args
.
Index
>
int64
(
len
(
br
.
Transactions
))
||
args
.
Index
<
0
{
if
args
.
Index
>
=
int64
(
len
(
br
.
Transactions
))
||
args
.
Index
<
0
{
return
NewValidationError
(
"Index"
,
"does not exist"
)
return
NewValidationError
(
"Index"
,
"does not exist"
)
}
}
*
reply
=
br
.
Transactions
[
args
.
Index
]
*
reply
=
br
.
Transactions
[
args
.
Index
]
...
@@ -227,7 +231,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
...
@@ -227,7 +231,7 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
v
:=
NewBlockRes
(
block
)
v
:=
NewBlockRes
(
block
)
v
.
fullTx
=
true
v
.
fullTx
=
true
if
args
.
Index
>
int64
(
len
(
v
.
Transactions
))
||
args
.
Index
<
0
{
if
args
.
Index
>
=
int64
(
len
(
v
.
Transactions
))
||
args
.
Index
<
0
{
return
NewValidationError
(
"Index"
,
"does not exist"
)
return
NewValidationError
(
"Index"
,
"does not exist"
)
}
}
*
reply
=
v
.
Transactions
[
args
.
Index
]
*
reply
=
v
.
Transactions
[
args
.
Index
]
...
@@ -239,12 +243,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
...
@@ -239,12 +243,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
br
:=
NewBlockRes
(
api
.
xeth
()
.
EthBlockByHash
(
args
.
Hash
))
br
:=
NewBlockRes
(
api
.
xeth
()
.
EthBlockByHash
(
args
.
Hash
))
if
args
.
Index
>
int64
(
len
(
br
.
Uncles
))
||
args
.
Index
<
0
{
if
args
.
Index
>
=
int64
(
len
(
br
.
Uncles
))
||
args
.
Index
<
0
{
return
NewValidationError
(
"Index"
,
"does not exist"
)
return
NewValidationError
(
"Index"
,
"does not exist"
)
}
}
uhash
:=
br
.
Uncles
[
args
.
Index
]
uhash
:=
br
.
Uncles
[
args
.
Index
]
uncle
:=
NewBlockRes
(
api
.
xeth
()
.
EthBlockByHash
(
uhash
.
Hex
()))
uncle
:=
NewBlockRes
(
api
.
xeth
()
.
EthBlockByHash
(
uhash
.
String
()))
*
reply
=
uncle
*
reply
=
uncle
case
"eth_getUncleByBlockNumberAndIndex"
:
case
"eth_getUncleByBlockNumberAndIndex"
:
...
@@ -257,12 +261,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
...
@@ -257,12 +261,12 @@ func (api *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) err
v
:=
NewBlockRes
(
block
)
v
:=
NewBlockRes
(
block
)
v
.
fullTx
=
true
v
.
fullTx
=
true
if
args
.
Index
>
int64
(
len
(
v
.
Uncles
))
||
args
.
Index
<
0
{
if
args
.
Index
>
=
int64
(
len
(
v
.
Uncles
))
||
args
.
Index
<
0
{
return
NewValidationError
(
"Index"
,
"does not exist"
)
return
NewValidationError
(
"Index"
,
"does not exist"
)
}
}
uhash
:=
v
.
Uncles
[
args
.
Index
]
uhash
:=
v
.
Uncles
[
args
.
Index
]
uncle
:=
NewBlockRes
(
api
.
xeth
()
.
EthBlockByHash
(
uhash
.
Hex
()))
uncle
:=
NewBlockRes
(
api
.
xeth
()
.
EthBlockByHash
(
uhash
.
String
()))
*
reply
=
uncle
*
reply
=
uncle
case
"eth_getCompilers"
:
case
"eth_getCompilers"
:
...
...
rpc/args.go
View file @
6afc5e76
...
@@ -238,6 +238,93 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
...
@@ -238,6 +238,93 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) {
return
nil
return
nil
}
}
type
CallArgs
struct
{
From
string
To
string
Value
*
big
.
Int
Gas
*
big
.
Int
GasPrice
*
big
.
Int
Data
string
BlockNumber
int64
}
func
(
args
*
CallArgs
)
UnmarshalJSON
(
b
[]
byte
)
(
err
error
)
{
var
obj
[]
json
.
RawMessage
var
ext
struct
{
From
string
To
string
Value
interface
{}
Gas
interface
{}
GasPrice
interface
{}
Data
string
}
// Decode byte slice to array of RawMessages
if
err
:=
json
.
Unmarshal
(
b
,
&
obj
);
err
!=
nil
{
return
NewDecodeParamError
(
err
.
Error
())
}
// Check for sufficient params
if
len
(
obj
)
<
1
{
return
NewInsufficientParamsError
(
len
(
obj
),
1
)
}
// Decode 0th RawMessage to temporary struct
if
err
:=
json
.
Unmarshal
(
obj
[
0
],
&
ext
);
err
!=
nil
{
return
NewDecodeParamError
(
err
.
Error
())
}
if
len
(
ext
.
From
)
==
0
{
return
NewValidationError
(
"from"
,
"is required"
)
}
args
.
From
=
ext
.
From
if
len
(
ext
.
To
)
==
0
{
return
NewValidationError
(
"to"
,
"is required"
)
}
args
.
To
=
ext
.
To
var
num
int64
if
ext
.
Value
==
nil
{
num
=
int64
(
0
)
}
else
{
if
err
:=
numString
(
ext
.
Value
,
&
num
);
err
!=
nil
{
return
err
}
}
args
.
Value
=
big
.
NewInt
(
num
)
if
ext
.
Gas
==
nil
{
num
=
int64
(
0
)
}
else
{
if
err
:=
numString
(
ext
.
Gas
,
&
num
);
err
!=
nil
{
return
err
}
}
args
.
Gas
=
big
.
NewInt
(
num
)
if
ext
.
GasPrice
==
nil
{
num
=
int64
(
0
)
}
else
{
if
err
:=
numString
(
ext
.
GasPrice
,
&
num
);
err
!=
nil
{
return
err
}
}
args
.
GasPrice
=
big
.
NewInt
(
num
)
args
.
Data
=
ext
.
Data
// Check for optional BlockNumber param
if
len
(
obj
)
>
1
{
if
err
:=
blockHeightFromJson
(
obj
[
1
],
&
args
.
BlockNumber
);
err
!=
nil
{
return
err
}
}
return
nil
}
type
GetStorageArgs
struct
{
type
GetStorageArgs
struct
{
Address
string
Address
string
BlockNumber
int64
BlockNumber
int64
...
...
rpc/args_test.go
View file @
6afc5e76
...
@@ -531,14 +531,275 @@ func TestNewTxArgsFromEmpty(t *testing.T) {
...
@@ -531,14 +531,275 @@ func TestNewTxArgsFromEmpty(t *testing.T) {
input
:=
`[{"to": "0xb60e8dd61c5d32be8058bb8eb970870f07233155"}]`
input
:=
`[{"to": "0xb60e8dd61c5d32be8058bb8eb970870f07233155"}]`
args
:=
new
(
NewTxArgs
)
args
:=
new
(
NewTxArgs
)
err
:=
json
.
Unmarshal
([]
byte
(
input
),
&
args
)
str
:=
ExpectValidationError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
switch
err
.
(
type
)
{
if
len
(
str
)
>
0
{
case
nil
:
t
.
Error
(
str
)
t
.
Error
(
"Expected error but didn't get one"
)
}
case
*
ValidationError
:
}
break
default
:
func
TestCallArgs
(
t
*
testing
.
T
)
{
t
.
Errorf
(
"Expected *rpc.ValidationError, but got %T with message `%s`"
,
err
,
err
.
Error
())
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"},
"0x10"]`
expected
:=
new
(
CallArgs
)
expected
.
From
=
"0xb60e8dd61c5d32be8058bb8eb970870f07233155"
expected
.
To
=
"0xd46e8dd67c5d32be8058bb8eb970870f072445675"
expected
.
Gas
=
big
.
NewInt
(
30400
)
expected
.
GasPrice
=
big
.
NewInt
(
10000000000000
)
expected
.
Value
=
big
.
NewInt
(
10000000000000
)
expected
.
Data
=
"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
expected
.
BlockNumber
=
big
.
NewInt
(
16
)
.
Int64
()
args
:=
new
(
CallArgs
)
if
err
:=
json
.
Unmarshal
([]
byte
(
input
),
&
args
);
err
!=
nil
{
t
.
Error
(
err
)
}
if
expected
.
From
!=
args
.
From
{
t
.
Errorf
(
"From shoud be %#v but is %#v"
,
expected
.
From
,
args
.
From
)
}
if
expected
.
To
!=
args
.
To
{
t
.
Errorf
(
"To shoud be %#v but is %#v"
,
expected
.
To
,
args
.
To
)
}
if
bytes
.
Compare
(
expected
.
Gas
.
Bytes
(),
args
.
Gas
.
Bytes
())
!=
0
{
t
.
Errorf
(
"Gas shoud be %#v but is %#v"
,
expected
.
Gas
.
Bytes
(),
args
.
Gas
.
Bytes
())
}
if
bytes
.
Compare
(
expected
.
GasPrice
.
Bytes
(),
args
.
GasPrice
.
Bytes
())
!=
0
{
t
.
Errorf
(
"GasPrice shoud be %#v but is %#v"
,
expected
.
GasPrice
,
args
.
GasPrice
)
}
if
bytes
.
Compare
(
expected
.
Value
.
Bytes
(),
args
.
Value
.
Bytes
())
!=
0
{
t
.
Errorf
(
"Value shoud be %#v but is %#v"
,
expected
.
Value
,
args
.
Value
)
}
if
expected
.
Data
!=
args
.
Data
{
t
.
Errorf
(
"Data shoud be %#v but is %#v"
,
expected
.
Data
,
args
.
Data
)
}
if
expected
.
BlockNumber
!=
args
.
BlockNumber
{
t
.
Errorf
(
"BlockNumber shoud be %#v but is %#v"
,
expected
.
BlockNumber
,
args
.
BlockNumber
)
}
}
func
TestCallArgsInt
(
t
*
testing
.
T
)
{
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": 100,
"gasPrice": 50,
"value": 8765456789,
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"},
5]`
expected
:=
new
(
CallArgs
)
expected
.
Gas
=
big
.
NewInt
(
100
)
expected
.
GasPrice
=
big
.
NewInt
(
50
)
expected
.
Value
=
big
.
NewInt
(
8765456789
)
expected
.
BlockNumber
=
int64
(
5
)
args
:=
new
(
CallArgs
)
if
err
:=
json
.
Unmarshal
([]
byte
(
input
),
&
args
);
err
!=
nil
{
t
.
Error
(
err
)
}
if
bytes
.
Compare
(
expected
.
Gas
.
Bytes
(),
args
.
Gas
.
Bytes
())
!=
0
{
t
.
Errorf
(
"Gas shoud be %v but is %v"
,
expected
.
Gas
,
args
.
Gas
)
}
if
bytes
.
Compare
(
expected
.
GasPrice
.
Bytes
(),
args
.
GasPrice
.
Bytes
())
!=
0
{
t
.
Errorf
(
"GasPrice shoud be %v but is %v"
,
expected
.
GasPrice
,
args
.
GasPrice
)
}
if
bytes
.
Compare
(
expected
.
Value
.
Bytes
(),
args
.
Value
.
Bytes
())
!=
0
{
t
.
Errorf
(
"Value shoud be %v but is %v"
,
expected
.
Value
,
args
.
Value
)
}
if
expected
.
BlockNumber
!=
args
.
BlockNumber
{
t
.
Errorf
(
"BlockNumber shoud be %v but is %v"
,
expected
.
BlockNumber
,
args
.
BlockNumber
)
}
}
func
TestCallArgsBlockBool
(
t
*
testing
.
T
)
{
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"},
false]`
args
:=
new
(
CallArgs
)
str
:=
ExpectInvalidTypeError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsGasInvalid
(
t
*
testing
.
T
)
{
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": false,
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args
:=
new
(
CallArgs
)
str
:=
ExpectInvalidTypeError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsGaspriceInvalid
(
t
*
testing
.
T
)
{
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": false,
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args
:=
new
(
CallArgs
)
str
:=
ExpectInvalidTypeError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsValueInvalid
(
t
*
testing
.
T
)
{
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": false,
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args
:=
new
(
CallArgs
)
str
:=
ExpectInvalidTypeError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsGasMissing
(
t
*
testing
.
T
)
{
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args
:=
new
(
CallArgs
)
if
err
:=
json
.
Unmarshal
([]
byte
(
input
),
&
args
);
err
!=
nil
{
t
.
Error
(
err
)
}
expected
:=
new
(
CallArgs
)
expected
.
Gas
=
big
.
NewInt
(
0
)
if
bytes
.
Compare
(
expected
.
Gas
.
Bytes
(),
args
.
Gas
.
Bytes
())
!=
0
{
t
.
Errorf
(
"Gas shoud be %v but is %v"
,
expected
.
Gas
,
args
.
Gas
)
}
}
func
TestCallArgsBlockGaspriceMissing
(
t
*
testing
.
T
)
{
input
:=
`[{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"value": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args
:=
new
(
CallArgs
)
if
err
:=
json
.
Unmarshal
([]
byte
(
input
),
&
args
);
err
!=
nil
{
t
.
Error
(
err
)
}
expected
:=
new
(
CallArgs
)
expected
.
GasPrice
=
big
.
NewInt
(
0
)
if
bytes
.
Compare
(
expected
.
GasPrice
.
Bytes
(),
args
.
GasPrice
.
Bytes
())
!=
0
{
t
.
Errorf
(
"GasPrice shoud be %v but is %v"
,
expected
.
GasPrice
,
args
.
GasPrice
)
}
}
func
TestCallArgsValueMissing
(
t
*
testing
.
T
)
{
input
:=
`[{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f072445675",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}]`
args
:=
new
(
CallArgs
)
if
err
:=
json
.
Unmarshal
([]
byte
(
input
),
&
args
);
err
!=
nil
{
t
.
Error
(
err
)
}
expected
:=
new
(
CallArgs
)
expected
.
Value
=
big
.
NewInt
(
int64
(
0
))
if
bytes
.
Compare
(
expected
.
Value
.
Bytes
(),
args
.
Value
.
Bytes
())
!=
0
{
t
.
Errorf
(
"GasPrice shoud be %v but is %v"
,
expected
.
Value
,
args
.
Value
)
}
}
func
TestCallArgsEmpty
(
t
*
testing
.
T
)
{
input
:=
`[]`
args
:=
new
(
CallArgs
)
str
:=
ExpectInsufficientParamsError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsInvalid
(
t
*
testing
.
T
)
{
input
:=
`{}`
args
:=
new
(
CallArgs
)
str
:=
ExpectDecodeParamError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsNotStrings
(
t
*
testing
.
T
)
{
input
:=
`[{"from":6}]`
args
:=
new
(
CallArgs
)
str
:=
ExpectDecodeParamError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsFromEmpty
(
t
*
testing
.
T
)
{
input
:=
`[{"to": "0xb60e8dd61c5d32be8058bb8eb970870f07233155"}]`
args
:=
new
(
CallArgs
)
str
:=
ExpectValidationError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
func
TestCallArgsToEmpty
(
t
*
testing
.
T
)
{
input
:=
`[{"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155"}]`
args
:=
new
(
CallArgs
)
str
:=
ExpectValidationError
(
json
.
Unmarshal
([]
byte
(
input
),
&
args
))
if
len
(
str
)
>
0
{
t
.
Error
(
str
)
}
}
}
}
...
...
rpc/messages.go
View file @
6afc5e76
...
@@ -19,8 +19,95 @@ package rpc
...
@@ -19,8 +19,95 @@ package rpc
import
(
import
(
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"math/big"
"strings"
"github.com/ethereum/go-ethereum/common"
)
)
type
hexdata
struct
{
data
[]
byte
}
func
(
d
*
hexdata
)
String
()
string
{
return
"0x"
+
common
.
Bytes2Hex
(
d
.
data
)
}
func
(
d
*
hexdata
)
MarshalJSON
()
([]
byte
,
error
)
{
return
json
.
Marshal
(
d
.
String
())
}
func
(
d
*
hexdata
)
UnmarshalJSON
(
b
[]
byte
)
(
err
error
)
{
d
.
data
=
common
.
FromHex
(
string
(
b
))
return
nil
}
func
newHexData
(
input
interface
{})
*
hexdata
{
d
:=
new
(
hexdata
)
switch
input
:=
input
.
(
type
)
{
case
[]
byte
:
d
.
data
=
input
case
common
.
Hash
:
d
.
data
=
input
.
Bytes
()
case
*
common
.
Hash
:
d
.
data
=
input
.
Bytes
()
case
common
.
Address
:
d
.
data
=
input
.
Bytes
()
case
*
common
.
Address
:
d
.
data
=
input
.
Bytes
()
case
*
big
.
Int
:
d
.
data
=
input
.
Bytes
()
case
int64
:
d
.
data
=
big
.
NewInt
(
input
)
.
Bytes
()
case
uint64
:
d
.
data
=
big
.
NewInt
(
int64
(
input
))
.
Bytes
()
case
int
:
d
.
data
=
big
.
NewInt
(
int64
(
input
))
.
Bytes
()
case
uint
:
d
.
data
=
big
.
NewInt
(
int64
(
input
))
.
Bytes
()
case
string
:
// hexstring
d
.
data
=
common
.
Big
(
input
)
.
Bytes
()
default
:
d
.
data
=
nil
}
return
d
}
type
hexnum
struct
{
data
[]
byte
}
func
(
d
*
hexnum
)
String
()
string
{
// Get hex string from bytes
out
:=
common
.
Bytes2Hex
(
d
.
data
)
// Trim leading 0s
out
=
strings
.
Trim
(
out
,
"0"
)
// Output "0x0" when value is 0
if
len
(
out
)
==
0
{
out
=
"0"
}
return
"0x"
+
out
}
func
(
d
*
hexnum
)
MarshalJSON
()
([]
byte
,
error
)
{
return
json
.
Marshal
(
d
.
String
())
}
func
(
d
*
hexnum
)
UnmarshalJSON
(
b
[]
byte
)
(
err
error
)
{
d
.
data
=
common
.
FromHex
(
string
(
b
))
return
nil
}
func
newHexNum
(
input
interface
{})
*
hexnum
{
d
:=
new
(
hexnum
)
d
.
data
=
newHexData
(
input
)
.
data
return
d
}
type
InvalidTypeError
struct
{
type
InvalidTypeError
struct
{
method
string
method
string
msg
string
msg
string
...
...
rpc/responses.go
View file @
6afc5e76
This diff is collapsed.
Click to expand it.
rpc/responses_test.go
View file @
6afc5e76
...
@@ -2,7 +2,9 @@ package rpc
...
@@ -2,7 +2,9 @@ package rpc
import
(
import
(
"encoding/json"
"encoding/json"
"fmt"
"math/big"
"math/big"
"regexp"
"testing"
"testing"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common"
...
@@ -10,6 +12,15 @@ import (
...
@@ -10,6 +12,15 @@ import (
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/types"
)
)
const
(
reHash
=
`"0x[0-9a-f]{64}"`
// 32 bytes
reHashOpt
=
`"(0x[0-9a-f]{64})"|null`
// 32 bytes or null
reAddress
=
`"0x[0-9a-f]{40}"`
// 20 bytes
reAddressOpt
=
`"0x[0-9a-f]{40}"|null`
// 20 bytes or null
reNum
=
`"0x([1-9a-f][0-9a-f]{1,15})|0"`
// must not have left-padded zeros
reData
=
`"0x[0-9a-f]*"`
// can be "empty"
)
func
TestNewBlockRes
(
t
*
testing
.
T
)
{
func
TestNewBlockRes
(
t
*
testing
.
T
)
{
parentHash
:=
common
.
HexToHash
(
"0x01"
)
parentHash
:=
common
.
HexToHash
(
"0x01"
)
coinbase
:=
common
.
HexToAddress
(
"0x01"
)
coinbase
:=
common
.
HexToAddress
(
"0x01"
)
...
@@ -18,56 +29,35 @@ func TestNewBlockRes(t *testing.T) {
...
@@ -18,56 +29,35 @@ func TestNewBlockRes(t *testing.T) {
nonce
:=
uint64
(
1
)
nonce
:=
uint64
(
1
)
extra
:=
""
extra
:=
""
block
:=
types
.
NewBlock
(
parentHash
,
coinbase
,
root
,
difficulty
,
nonce
,
extra
)
block
:=
types
.
NewBlock
(
parentHash
,
coinbase
,
root
,
difficulty
,
nonce
,
extra
)
tests
:=
map
[
string
]
string
{
_
=
NewBlockRes
(
block
)
"number"
:
reNum
,
}
"hash"
:
reHash
,
"parentHash"
:
reHash
,
func
TestBlockRes
(
t
*
testing
.
T
)
{
"nonce"
:
reNum
,
v
:=
&
BlockRes
{
"sha3Uncles"
:
reHash
,
BlockNumber
:
big
.
NewInt
(
0
),
"logsBloom"
:
reData
,
BlockHash
:
common
.
HexToHash
(
"0x0"
),
"transactionRoot"
:
reHash
,
ParentHash
:
common
.
HexToHash
(
"0x0"
),
"stateRoot"
:
reHash
,
Nonce
:
[
8
]
byte
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
"miner"
:
reAddress
,
Sha3Uncles
:
common
.
HexToHash
(
"0x0"
),
"difficulty"
:
`"0x1"`
,
LogsBloom
:
types
.
BytesToBloom
([]
byte
{
0
}),
"totalDifficulty"
:
reNum
,
TransactionRoot
:
common
.
HexToHash
(
"0x0"
),
"size"
:
reNum
,
StateRoot
:
common
.
HexToHash
(
"0x0"
),
"extraData"
:
reData
,
Miner
:
common
.
HexToAddress
(
"0x0"
),
"gasLimit"
:
reNum
,
Difficulty
:
big
.
NewInt
(
0
),
// "minGasPrice": "0x",
TotalDifficulty
:
big
.
NewInt
(
0
),
"gasUsed"
:
reNum
,
Size
:
big
.
NewInt
(
0
),
"timestamp"
:
reNum
,
ExtraData
:
[]
byte
{},
GasLimit
:
big
.
NewInt
(
0
),
MinGasPrice
:
int64
(
0
),
GasUsed
:
big
.
NewInt
(
0
),
UnixTimestamp
:
int64
(
0
),
// Transactions []*TransactionRes `json:"transactions"`
// Uncles []common.Hash `json:"uncles"`
}
}
_
,
_
=
json
.
Marshal
(
v
)
v
:=
NewBlockRes
(
block
)
j
,
_
:=
json
.
Marshal
(
v
)
// fmt.Println(string(j))
for
k
,
re
:=
range
tests
{
match
,
_
:=
regexp
.
MatchString
(
fmt
.
Sprintf
(
`{.*"%s":%s.*}`
,
k
,
re
),
string
(
j
))
}
if
!
match
{
t
.
Error
(
fmt
.
Sprintf
(
"%s output json does not match format %s. Got %s"
,
k
,
re
,
j
))
func
TestTransactionRes
(
t
*
testing
.
T
)
{
}
a
:=
common
.
HexToAddress
(
"0x0"
)
v
:=
&
TransactionRes
{
Hash
:
common
.
HexToHash
(
"0x0"
),
Nonce
:
uint64
(
0
),
BlockHash
:
common
.
HexToHash
(
"0x0"
),
BlockNumber
:
int64
(
0
),
TxIndex
:
int64
(
0
),
From
:
common
.
HexToAddress
(
"0x0"
),
To
:
&
a
,
Value
:
big
.
NewInt
(
0
),
Gas
:
big
.
NewInt
(
0
),
GasPrice
:
big
.
NewInt
(
0
),
Input
:
[]
byte
{
0
},
}
}
_
,
_
=
json
.
Marshal
(
v
)
}
}
func
TestNewTransactionRes
(
t
*
testing
.
T
)
{
func
TestNewTransactionRes
(
t
*
testing
.
T
)
{
...
@@ -78,26 +68,80 @@ func TestNewTransactionRes(t *testing.T) {
...
@@ -78,26 +68,80 @@ func TestNewTransactionRes(t *testing.T) {
data
:=
[]
byte
{
1
,
2
,
3
}
data
:=
[]
byte
{
1
,
2
,
3
}
tx
:=
types
.
NewTransactionMessage
(
to
,
amount
,
gasAmount
,
gasPrice
,
data
)
tx
:=
types
.
NewTransactionMessage
(
to
,
amount
,
gasAmount
,
gasPrice
,
data
)
_
=
NewTransactionRes
(
tx
)
tests
:=
map
[
string
]
string
{
"hash"
:
reHash
,
"nonce"
:
reNum
,
"blockHash"
:
reHash
,
"blockNum"
:
reNum
,
"transactionIndex"
:
reNum
,
"from"
:
reAddress
,
"to"
:
reAddressOpt
,
"value"
:
reNum
,
"gas"
:
reNum
,
"gasPrice"
:
reNum
,
"input"
:
reData
,
}
v
:=
NewTransactionRes
(
tx
)
v
.
BlockHash
=
newHexData
(
common
.
HexToHash
(
"0x030201"
))
v
.
BlockNumber
=
newHexNum
(
5
)
v
.
TxIndex
=
newHexNum
(
0
)
j
,
_
:=
json
.
Marshal
(
v
)
for
k
,
re
:=
range
tests
{
match
,
_
:=
regexp
.
MatchString
(
fmt
.
Sprintf
(
`{.*"%s":%s.*}`
,
k
,
re
),
string
(
j
))
if
!
match
{
t
.
Error
(
fmt
.
Sprintf
(
"`%s` output json does not match format %s. Source %s"
,
k
,
re
,
j
))
}
}
}
}
func
TestLogRes
(
t
*
testing
.
T
)
{
func
TestNewLogRes
(
t
*
testing
.
T
)
{
topics
:=
make
([]
common
.
Hash
,
3
)
log
:=
makeStateLog
(
0
)
topics
=
append
(
topics
,
common
.
HexToHash
(
"0x00"
))
tests
:=
map
[
string
]
string
{
topics
=
append
(
topics
,
common
.
HexToHash
(
"0x10"
))
"address"
:
reAddress
,
topics
=
append
(
topics
,
common
.
HexToHash
(
"0x20"
))
// "topics": "[.*]"
"data"
:
reData
,
"blockNumber"
:
reNum
,
// "hash": reHash,
// "logIndex": reNum,
// "blockHash": reHash,
// "transactionHash": reHash,
"transactionIndex"
:
reNum
,
}
v
:=
NewLogRes
(
log
)
j
,
_
:=
json
.
Marshal
(
v
)
for
k
,
re
:=
range
tests
{
match
,
_
:=
regexp
.
MatchString
(
fmt
.
Sprintf
(
`{.*"%s":%s.*}`
,
k
,
re
),
string
(
j
))
if
!
match
{
t
.
Error
(
fmt
.
Sprintf
(
"`%s` output json does not match format %s. Got %s"
,
k
,
re
,
j
))
}
}
}
v
:=
&
LogRes
{
func
TestNewLogsRes
(
t
*
testing
.
T
)
{
Topics
:
topics
,
logs
:=
make
([]
state
.
Log
,
3
)
Address
:
common
.
HexToAddress
(
"0x0"
),
logs
[
0
]
=
makeStateLog
(
1
)
Data
:
[]
byte
{
1
,
2
,
3
},
logs
[
1
]
=
makeStateLog
(
2
)
Number
:
uint64
(
5
),
logs
[
2
]
=
makeStateLog
(
3
)
tests
:=
map
[
string
]
string
{}
v
:=
NewLogsRes
(
logs
)
j
,
_
:=
json
.
Marshal
(
v
)
for
k
,
re
:=
range
tests
{
match
,
_
:=
regexp
.
MatchString
(
fmt
.
Sprintf
(
`[{.*"%s":%s.*}]`
,
k
,
re
),
string
(
j
))
if
!
match
{
t
.
Error
(
fmt
.
Sprintf
(
"%s output json does not match format %s. Got %s"
,
k
,
re
,
j
))
}
}
}
_
,
_
=
json
.
Marshal
(
v
)
}
}
func
M
akeStateLog
(
num
int
)
state
.
Log
{
func
m
akeStateLog
(
num
int
)
state
.
Log
{
address
:=
common
.
HexToAddress
(
"0x0"
)
address
:=
common
.
HexToAddress
(
"0x0"
)
data
:=
[]
byte
{
1
,
2
,
3
}
data
:=
[]
byte
{
1
,
2
,
3
}
number
:=
uint64
(
num
)
number
:=
uint64
(
num
)
...
@@ -108,16 +152,3 @@ func MakeStateLog(num int) state.Log {
...
@@ -108,16 +152,3 @@ func MakeStateLog(num int) state.Log {
log
:=
state
.
NewLog
(
address
,
topics
,
data
,
number
)
log
:=
state
.
NewLog
(
address
,
topics
,
data
,
number
)
return
log
return
log
}
}
func
TestNewLogRes
(
t
*
testing
.
T
)
{
log
:=
MakeStateLog
(
0
)
_
=
NewLogRes
(
log
)
}
func
TestNewLogsRes
(
t
*
testing
.
T
)
{
logs
:=
make
([]
state
.
Log
,
3
)
logs
[
0
]
=
MakeStateLog
(
1
)
logs
[
1
]
=
MakeStateLog
(
2
)
logs
[
2
]
=
MakeStateLog
(
3
)
_
=
NewLogsRes
(
logs
)
}
xeth/xeth.go
View file @
6afc5e76
...
@@ -19,6 +19,7 @@ import (
...
@@ -19,6 +19,7 @@ import (
"github.com/ethereum/go-ethereum/event/filter"
"github.com/ethereum/go-ethereum/event/filter"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/miner"
"github.com/ethereum/go-ethereum/miner"
"github.com/ethereum/go-ethereum/rlp"
)
)
var
(
var
(
...
@@ -185,12 +186,29 @@ func (self *XEth) EthBlockByHash(strHash string) *types.Block {
...
@@ -185,12 +186,29 @@ func (self *XEth) EthBlockByHash(strHash string) *types.Block {
return
block
return
block
}
}
func
(
self
*
XEth
)
EthTransactionByHash
(
hash
string
)
*
types
.
Transaction
{
func
(
self
*
XEth
)
EthTransactionByHash
(
hash
string
)
(
tx
*
types
.
Transaction
,
blhash
common
.
Hash
,
blnum
*
big
.
Int
,
txi
uint64
)
{
data
,
_
:=
self
.
backend
.
ExtraDb
()
.
Get
(
common
.
FromHex
(
hash
))
data
,
_
:=
self
.
backend
.
ExtraDb
()
.
Get
(
common
.
FromHex
(
hash
))
if
len
(
data
)
!=
0
{
if
len
(
data
)
!=
0
{
return
types
.
NewTransactionFromBytes
(
data
)
tx
=
types
.
NewTransactionFromBytes
(
data
)
}
}
return
nil
// meta
var
txExtra
struct
{
BlockHash
common
.
Hash
BlockIndex
int64
Index
uint64
}
v
,
_
:=
self
.
backend
.
ExtraDb
()
.
Get
(
append
(
common
.
FromHex
(
hash
),
0x0001
))
r
:=
bytes
.
NewReader
(
v
)
err
:=
rlp
.
Decode
(
r
,
&
txExtra
)
if
err
==
nil
{
blhash
=
txExtra
.
BlockHash
blnum
=
big
.
NewInt
(
txExtra
.
BlockIndex
)
txi
=
txExtra
.
Index
}
return
}
}
func
(
self
*
XEth
)
BlockByNumber
(
num
int64
)
*
Block
{
func
(
self
*
XEth
)
BlockByNumber
(
num
int64
)
*
Block
{
...
...
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