Added unmarshalState

This commit is contained in:
obscuren 2015-03-10 13:40:49 +01:00
parent 53f8f29744
commit bbe8b18660
3 changed files with 1522 additions and 1029 deletions

View File

@ -35,7 +35,7 @@
var web3 = require('web3');
var eth = web3.eth;
web3.setProvider(new web3.providers.HttpSyncProvider('http://localhost:8545'));
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
var desc = [{
"name": "balance(address)",
"type": "function",

File diff suppressed because it is too large Load Diff

View File

@ -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
@ -63,10 +87,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"`
@ -74,20 +100,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
}