diff options
author | Taylor Gerring <taylor.gerring@gmail.com> | 2015-03-11 01:50:13 +0800 |
---|---|---|
committer | Taylor Gerring <taylor.gerring@gmail.com> | 2015-03-11 01:50:13 +0800 |
commit | 617804c32731c5103319e7072557f62a9ce63836 (patch) | |
tree | baca8a8f2e014892983ca45e8ec618ab54121526 /rpc | |
parent | 3de51f76eea87f8e8a4b8a7277cd294529e28491 (diff) | |
parent | bbe8b186600992ada6da9e75e9976cd5a9dc0ae3 (diff) | |
download | dexon-617804c32731c5103319e7072557f62a9ce63836.tar.gz dexon-617804c32731c5103319e7072557f62a9ce63836.tar.zst dexon-617804c32731c5103319e7072557f62a9ce63836.zip |
Merge branch 'rpcfrontier' of github.com:ethereum/go-ethereum into rpcfrontier
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/args.go | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/rpc/args.go b/rpc/args.go index 9735feb62..e2e987812 100644 --- a/rpc/args.go +++ b/rpc/args.go @@ -8,6 +8,30 @@ import ( "github.com/ethereum/go-ethereum/ethutil" ) +// Unmarshal state is a helper method which has the ability to decode messsages +// that use the `defaultBlock` (https://github.com/ethereum/wiki/wiki/JSON-RPC#the-default-block-parameter) +// For example a `call`: [{to: "0x....", data:"0x..."}, "latest"]. The first argument is the transaction +// message and the second one refers to the block height (or state) to which to apply this `call`. +func unmarshalState(b []byte, iface interface{}, str *string) (err error) { + var data []json.RawMessage + if err = json.Unmarshal(b, &data); err != nil && len(data) == 0 { + return errDecodeArgs + } + + if err = json.Unmarshal(data[0], iface); err != nil { + return errDecodeArgs + } + + // Second argument is optional (transact doesn't require it) + if len(data) > 1 { + if err = json.Unmarshal(data[1], str); err != nil { + return errDecodeArgs + } + } + + return nil +} + type GetBlockByHashArgs struct { BlockHash string Transactions bool @@ -68,10 +92,12 @@ type NewTxArgs struct { Gas *big.Int GasPrice *big.Int Data string + + BlockHeight string } func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { - var obj []struct { + var obj struct { From string `json:"from"` To string `json:"to"` Value string `json:"value"` @@ -79,20 +105,18 @@ func (args *NewTxArgs) UnmarshalJSON(b []byte) (err error) { GasPrice string `json:"gasPrice"` Data string `json:"data"` } - - if err = json.Unmarshal(b, &obj); err != nil { - return errDecodeArgs + var height string + if err = unmarshalState(b, &obj, &height); err != nil { + return err } - if len(obj) < 1 { - return errArguments - } - args.From = obj[0].From - args.To = obj[0].To - args.Value = ethutil.Big(obj[0].Value) - args.Gas = ethutil.Big(obj[0].Gas) - args.GasPrice = ethutil.Big(obj[0].GasPrice) - args.Data = obj[0].Data + args.From = obj.From + args.To = obj.To + args.Value = ethutil.Big(obj.Value) + args.Gas = ethutil.Big(obj.Gas) + args.GasPrice = ethutil.Big(obj.GasPrice) + args.Data = obj.Data + args.BlockHeight = height return nil } |