From 32bed50ba107ff69ff489e4df6f935fd404a5caa Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 12 Jan 2015 23:25:29 -0600 Subject: begin conversion to rpc over http Per specification at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC --- rpc/packages.go | 343 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 175 insertions(+), 168 deletions(-) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index 5535e6e79..06f00678c 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -1,11 +1,12 @@ package rpc import ( + // "bytes" "encoding/json" - "errors" "math/big" "strings" + // "errors" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/xeth" ) @@ -14,84 +15,169 @@ type EthereumApi struct { pipe *xeth.JSXEth } -type JsonArgs interface { - requirements() error -} +func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *interface{}) error { + err := args.requirements() + if err != nil { + return err + } -type BlockResponse struct { - JsonResponse -} -type GetBlockArgs struct { - BlockNumber int - Hash string + // var block xeth.JSBlock + if args.BlockNumber > 0 { + // block := p.pipe.BlockByNumber(int32(args.BlockNumber)) + *reply = p.pipe.BlockByNumber(args.BlockNumber) + } else { + // block := p.pipe.BlockByHash(args.Hash) + *reply = p.pipe.BlockByHash(args.Hash) + } + return nil } -type ErrorResponse struct { - Error bool `json:"error"` - ErrorText string `json:"errorText"` +func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error { + err := args.requirements() + if err != nil { + return err + } + result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body) + *reply = result + return nil } -type JsonResponse interface { -} +func (p *EthereumApi) Create(args *NewTxArgs, reply *interface{}) error { + err := args.requirementsContract() + if err != nil { + return err + } -type SuccessRes struct { - Error bool `json:"error"` - Result JsonResponse `json:"result"` + result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, "", args.Value, args.Gas, args.GasPrice, args.Body) + *reply = result + return nil } -func NewSuccessRes(object JsonResponse) string { - e := SuccessRes{Error: false, Result: object} - res, err := json.Marshal(e) +func (p *EthereumApi) PushTx(args *PushTxArgs, reply *interface{}) error { + err := args.requirementsPushTx() if err != nil { - // This should never happen - panic("Creating json error response failed, help") + return err } - success := string(res) - return success + result, _ := p.pipe.PushTx(args.Tx) + *reply = result + return nil } -func NewErrorResponse(msg string) error { - e := ErrorResponse{Error: true, ErrorText: msg} - res, err := json.Marshal(e) +func (p *EthereumApi) GetKey(args interface{}, reply *interface{}) error { + *reply = p.pipe.Key() + return nil +} + +func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *interface{}) error { + err := args.requirements() if err != nil { - // This should never happen - panic("Creating json error response failed, help") + return err } - newErr := errors.New(string(res)) - return newErr + + state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address)) + + var hx string + if strings.Index(args.Key, "0x") == 0 { + hx = string([]byte(args.Key)[2:]) + } else { + // Convert the incoming string (which is a bigint) into hex + i, _ := new(big.Int).SetString(args.Key, 10) + hx = ethutil.Bytes2Hex(i.Bytes()) + } + jsonlogger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx) + value := state.Storage(ethutil.Hex2Bytes(hx)) + *reply = GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()} + return nil } -func (b *GetBlockArgs) requirements() error { - if b.BlockNumber == 0 && b.Hash == "" { - return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument") +func (p *EthereumApi) GetPeerCount(reply *interface{}) error { + *reply = p.pipe.PeerCount() + return nil +} + +func (p *EthereumApi) GetIsListening(reply *interface{}) error { + *reply = p.pipe.IsListening() + // *reply = NewSuccessRes(GetListeningRes{IsListening: p.pipe.IsListening()}) + return nil +} + +func (p *EthereumApi) GetCoinbase(reply *interface{}) error { + *reply = p.pipe.CoinBase() + // *reply = p.pipe.CoinBase() + return nil +} + +func (p *EthereumApi) GetIsMining(reply *interface{}) error { + *reply = p.pipe.IsMining() + return nil +} + +func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *interface{}) error { + err := args.requirements() + if err != nil { + return err } + *reply = p.pipe.TxCountAt(args.Address) return nil } -func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *string) error { +func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *interface{}) error { err := args.requirements() if err != nil { return err } + state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address)) + *reply = BalanceRes{Balance: state.Balance().String(), Address: args.Address} + return nil +} + +// type JsonArgs interface { +// requirements() error +// } + +// type BlockResponse struct { +// JsonResponse +// } + +type GetBlockArgs struct { + BlockNumber int32 + Hash string +} + +func (obj *GetBlockArgs) UnmarshalJSON(b []byte) (err error) { + argint, argstr := int32(0), "" + if err = json.Unmarshal(b, &argint); err == nil { + obj.BlockNumber = argint + return + } + if err = json.Unmarshal(b, &argstr); err == nil { + obj.Hash = argstr + return + } + return NewErrorResponse("Could not determine JSON parameters") +} - block := p.pipe.BlockByHash(args.Hash) - *reply = NewSuccessRes(block) +func (obj *GetBlockArgs) requirements() error { + if obj.BlockNumber == 0 && obj.Hash == "" { + return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument") + } return nil } type NewTxArgs struct { - Sec string - Recipient string - Value string - Gas string - GasPrice string - Init string - Body string -} -type TxResponse struct { - Hash string + Sec string `json:"sec"` + Recipient string `json:"recipient"` + Value string `json:"value"` + Gas string `json:"gas"` + GasPrice string `json:"gasprice"` + Init string `json:"init"` + Body string `json:"body"` } +// type TxResponse struct { +// Hash string +// } + func (a *NewTxArgs) requirements() error { if a.Recipient == "" { return NewErrorResponse("Transact requires a 'recipient' address as argument") @@ -124,29 +210,8 @@ func (a *NewTxArgs) requirementsContract() error { return nil } -func (p *EthereumApi) Transact(args *NewTxArgs, reply *string) error { - err := args.requirements() - if err != nil { - return err - } - result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, args.Recipient, args.Value, args.Gas, args.GasPrice, args.Body) - *reply = NewSuccessRes(result) - return nil -} - -func (p *EthereumApi) Create(args *NewTxArgs, reply *string) error { - err := args.requirementsContract() - if err != nil { - return err - } - - result, _ := p.pipe.Transact(p.pipe.Key().PrivateKey, "", args.Value, args.Gas, args.GasPrice, args.Body) - *reply = NewSuccessRes(result) - return nil -} - type PushTxArgs struct { - Tx string + Tx string `json:"tx"` } func (a *PushTxArgs) requirementsPushTx() error { @@ -156,21 +221,6 @@ func (a *PushTxArgs) requirementsPushTx() error { return nil } -func (p *EthereumApi) PushTx(args *PushTxArgs, reply *string) error { - err := args.requirementsPushTx() - if err != nil { - return err - } - result, _ := p.pipe.PushTx(args.Tx) - *reply = NewSuccessRes(result) - return nil -} - -func (p *EthereumApi) GetKey(args interface{}, reply *string) error { - *reply = NewSuccessRes(p.pipe.Key()) - return nil -} - type GetStorageArgs struct { Address string Key string @@ -192,33 +242,21 @@ type GetStorageAtRes struct { Address string `json:"address"` } -func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *string) error { - err := args.requirements() - if err != nil { - return err - } - - state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address)) - - var hx string - if strings.Index(args.Key, "0x") == 0 { - hx = string([]byte(args.Key)[2:]) - } else { - // Convert the incoming string (which is a bigint) into hex - i, _ := new(big.Int).SetString(args.Key, 10) - hx = ethutil.Bytes2Hex(i.Bytes()) - } - jsonlogger.Debugf("GetStorageAt(%s, %s)\n", args.Address, hx) - value := state.Storage(ethutil.Hex2Bytes(hx)) - *reply = NewSuccessRes(GetStorageAtRes{Address: args.Address, Key: args.Key, Value: value.Str()}) - return nil -} - type GetTxCountArgs struct { Address string `json:"address"` } -type GetTxCountRes struct { - Nonce int `json:"nonce"` + +// type GetTxCountRes struct { +// Nonce int `json:"nonce"` +// } + +func (obj *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { + arg0 := "" + if err = json.Unmarshal(b, arg0); err == nil { + obj.Address = arg0 + return + } + return NewErrorResponse("Could not determine JSON parameters") } func (a *GetTxCountArgs) requirements() error { @@ -228,54 +266,33 @@ func (a *GetTxCountArgs) requirements() error { return nil } -type GetPeerCountRes struct { - PeerCount int `json:"peerCount"` -} +// type GetPeerCountRes struct { +// PeerCount int `json:"peerCount"` +// } -func (p *EthereumApi) GetPeerCount(args *interface{}, reply *string) error { - *reply = NewSuccessRes(GetPeerCountRes{PeerCount: p.pipe.PeerCount()}) - return nil -} +// type GetListeningRes struct { +// IsListening bool `json:"isListening"` +// } -type GetListeningRes struct { - IsListening bool `json:"isListening"` -} +// type GetCoinbaseRes struct { +// Coinbase string `json:"coinbase"` +// } -func (p *EthereumApi) GetIsListening(args *interface{}, reply *string) error { - *reply = NewSuccessRes(GetListeningRes{IsListening: p.pipe.IsListening()}) - return nil -} - -type GetCoinbaseRes struct { - Coinbase string `json:"coinbase"` -} - -func (p *EthereumApi) GetCoinbase(args *interface{}, reply *string) error { - *reply = NewSuccessRes(GetCoinbaseRes{Coinbase: p.pipe.CoinBase()}) - return nil -} - -type GetMiningRes struct { - IsMining bool `json:"isMining"` -} +// type GetMiningRes struct { +// IsMining bool `json:"isMining"` +// } -func (p *EthereumApi) GetIsMining(args *interface{}, reply *string) error { - *reply = NewSuccessRes(GetMiningRes{IsMining: p.pipe.IsMining()}) - return nil +type GetBalanceArgs struct { + Address string } -func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *string) error { - err := args.requirements() - if err != nil { - return err +func (obj *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { + arg0 := "" + if err = json.Unmarshal(b, &arg0); err == nil { + obj.Address = arg0 + return } - state := p.pipe.TxCountAt(args.Address) - *reply = NewSuccessRes(GetTxCountRes{Nonce: state}) - return nil -} - -type GetBalanceArgs struct { - Address string + return NewErrorResponse("Could not determine JSON parameters") } func (a *GetBalanceArgs) requirements() error { @@ -290,22 +307,12 @@ type BalanceRes struct { Address string `json:"address"` } -func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *string) error { - err := args.requirements() - if err != nil { - return err - } - state := p.pipe.World().SafeGet(ethutil.Hex2Bytes(args.Address)) - *reply = NewSuccessRes(BalanceRes{Balance: state.Balance().String(), Address: args.Address}) - return nil -} - -type TestRes struct { - JsonResponse `json:"-"` - Answer int `json:"answer"` -} +// type TestRes struct { +// JsonResponse `json:"-"` +// Answer int `json:"answer"` +// } -func (p *EthereumApi) Test(args *GetBlockArgs, reply *string) error { - *reply = NewSuccessRes(TestRes{Answer: 15}) - return nil -} +// func (p *EthereumApi) Test(args *GetBlockArgs, reply *interface{}) error { +// *reply = NewSuccessRes(TestRes{Answer: 15}) +// return nil +// } -- cgit v1.2.3 From b2112729faa2263fe0dbf6f735339e27608ae614 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 12 Jan 2015 23:44:56 -0600 Subject: cleanup --- rpc/packages.go | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index 06f00678c..4414abf19 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -1,12 +1,19 @@ +/* + +For each request type, define the following: + +1. RpcRequest "To" method [message.go], which does basic validation and conversion to "Args" type via json.Decoder() +2. json.Decoder() calls "UnmarshalJSON" defined on each "Args" struct +3. EthereumApi "Get" method, taking the "Args" type and replying with an interface to be marshalled to JSON + +*/ package rpc import ( - // "bytes" "encoding/json" "math/big" "strings" - // "errors" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/xeth" ) @@ -21,12 +28,9 @@ func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *interface{}) error { return err } - // var block xeth.JSBlock if args.BlockNumber > 0 { - // block := p.pipe.BlockByNumber(int32(args.BlockNumber)) *reply = p.pipe.BlockByNumber(args.BlockNumber) } else { - // block := p.pipe.BlockByHash(args.Hash) *reply = p.pipe.BlockByHash(args.Hash) } return nil @@ -97,13 +101,11 @@ func (p *EthereumApi) GetPeerCount(reply *interface{}) error { func (p *EthereumApi) GetIsListening(reply *interface{}) error { *reply = p.pipe.IsListening() - // *reply = NewSuccessRes(GetListeningRes{IsListening: p.pipe.IsListening()}) return nil } func (p *EthereumApi) GetCoinbase(reply *interface{}) error { *reply = p.pipe.CoinBase() - // *reply = p.pipe.CoinBase() return nil } @@ -131,14 +133,6 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *interface{}) err return nil } -// type JsonArgs interface { -// requirements() error -// } - -// type BlockResponse struct { -// JsonResponse -// } - type GetBlockArgs struct { BlockNumber int32 Hash string @@ -306,13 +300,3 @@ type BalanceRes struct { Balance string `json:"balance"` Address string `json:"address"` } - -// type TestRes struct { -// JsonResponse `json:"-"` -// Answer int `json:"answer"` -// } - -// func (p *EthereumApi) Test(args *GetBlockArgs, reply *interface{}) error { -// *reply = NewSuccessRes(TestRes{Answer: 15}) -// return nil -// } -- cgit v1.2.3 From b178414a475aa48764622487223237a7d28edd46 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 13 Jan 2015 09:13:43 -0600 Subject: Added license headers --- rpc/packages.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index 4414abf19..8a58700b2 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -1,3 +1,19 @@ +/* + This file is part of go-ethereum + + go-ethereum is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + go-ethereum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with go-ethereum. If not, see . +*/ /* For each request type, define the following: -- cgit v1.2.3 From 961e4da7d885a6d5d00fc7c3ab2e11c80c9eeecc Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 13 Jan 2015 09:27:36 -0600 Subject: Add support for CodeAt --- rpc/packages.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index 8a58700b2..4e6016b9e 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -149,6 +149,15 @@ func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *interface{}) err return nil } +func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error { + err := args.requirements() + if err != nil { + return err + } + *reply = p.pipe.CodeAt(args.Address) + return nil +} + type GetBlockArgs struct { BlockNumber int32 Hash string @@ -236,6 +245,15 @@ type GetStorageArgs struct { Key string } +func (obj *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { + arg0 := "" + if err = json.Unmarshal(b, arg0); err == nil { + obj.Address = arg0 + return + } + return NewErrorResponse(ErrorDecodeArgs) +} + func (a *GetStorageArgs) requirements() error { if a.Address == "" { return NewErrorResponse("GetStorageAt requires an 'address' value as argument") @@ -316,3 +334,22 @@ type BalanceRes struct { Balance string `json:"balance"` Address string `json:"address"` } +type GetCodeAtArgs struct { + Address string +} + +func (obj *GetCodeAtArgs) UnmarshalJSON(b []byte) (err error) { + arg0 := "" + if err = json.Unmarshal(b, &arg0); err == nil { + obj.Address = arg0 + return + } + return NewErrorResponse(ErrorDecodeArgs) +} + +func (a *GetCodeAtArgs) requirements() error { + if a.Address == "" { + return NewErrorResponse("GetCodeAt requires an 'address' value as argument") + } + return nil +} -- cgit v1.2.3 From a81d835e4d27f600fac31f74d938d0b6502c3072 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 13 Jan 2015 09:37:08 -0600 Subject: cleanup --- rpc/packages.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index 4e6016b9e..e5ed995e7 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -20,7 +20,7 @@ For each request type, define the following: 1. RpcRequest "To" method [message.go], which does basic validation and conversion to "Args" type via json.Decoder() 2. json.Decoder() calls "UnmarshalJSON" defined on each "Args" struct -3. EthereumApi "Get" method, taking the "Args" type and replying with an interface to be marshalled to JSON +3. EthereumApi method, taking the "Args" type and replying with an interface to be marshalled to JSON */ package rpc @@ -173,7 +173,7 @@ func (obj *GetBlockArgs) UnmarshalJSON(b []byte) (err error) { obj.Hash = argstr return } - return NewErrorResponse("Could not determine JSON parameters") + return NewErrorResponse(ErrorDecodeArgs) } func (obj *GetBlockArgs) requirements() error { @@ -334,6 +334,7 @@ type BalanceRes struct { Balance string `json:"balance"` Address string `json:"address"` } + type GetCodeAtArgs struct { Address string } -- cgit v1.2.3 From 499bc404e818848e53c8c7f4f6d1bfe2349e97ae Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 13 Jan 2015 09:37:30 -0600 Subject: Stub missing UnmarshalJSON methods --- rpc/packages.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index e5ed995e7..d371c4ca1 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -197,6 +197,13 @@ type NewTxArgs struct { // Hash string // } +func (obj *NewTxArgs) UnmarshalJSON(b []byte) (err error) { + if err = json.Unmarshal(b, obj); err == nil { + return + } + return NewErrorResponse(ErrorDecodeArgs) +} + func (a *NewTxArgs) requirements() error { if a.Recipient == "" { return NewErrorResponse("Transact requires a 'recipient' address as argument") @@ -233,6 +240,15 @@ type PushTxArgs struct { Tx string `json:"tx"` } +func (obj *PushTxArgs) UnmarshalJSON(b []byte) (err error) { + arg0 := "" + if err = json.Unmarshal(b, arg0); err == nil { + obj.Tx = arg0 + return + } + return NewErrorResponse(ErrorDecodeArgs) +} + func (a *PushTxArgs) requirementsPushTx() error { if a.Tx == "" { return NewErrorResponse("PushTx requires a 'tx' as argument") -- cgit v1.2.3 From a6d4ce263012ef160c9a897ac6ba032ddac526c7 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 20 Jan 2015 13:57:51 -0600 Subject: Move argument types to separate file --- rpc/packages.go | 211 -------------------------------------------------------- 1 file changed, 211 deletions(-) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index d371c4ca1..34a4467b1 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -26,7 +26,6 @@ For each request type, define the following: package rpc import ( - "encoding/json" "math/big" "strings" @@ -158,215 +157,5 @@ func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error { return nil } -type GetBlockArgs struct { - BlockNumber int32 - Hash string -} - -func (obj *GetBlockArgs) UnmarshalJSON(b []byte) (err error) { - argint, argstr := int32(0), "" - if err = json.Unmarshal(b, &argint); err == nil { - obj.BlockNumber = argint - return - } - if err = json.Unmarshal(b, &argstr); err == nil { - obj.Hash = argstr - return - } - return NewErrorResponse(ErrorDecodeArgs) -} - -func (obj *GetBlockArgs) requirements() error { - if obj.BlockNumber == 0 && obj.Hash == "" { - return NewErrorResponse("GetBlock requires either a block 'number' or a block 'hash' as argument") - } - return nil -} - -type NewTxArgs struct { - Sec string `json:"sec"` - Recipient string `json:"recipient"` - Value string `json:"value"` - Gas string `json:"gas"` - GasPrice string `json:"gasprice"` - Init string `json:"init"` - Body string `json:"body"` -} - -// type TxResponse struct { -// Hash string -// } - -func (obj *NewTxArgs) UnmarshalJSON(b []byte) (err error) { - if err = json.Unmarshal(b, obj); err == nil { - return - } - return NewErrorResponse(ErrorDecodeArgs) -} - -func (a *NewTxArgs) requirements() error { - if a.Recipient == "" { - return NewErrorResponse("Transact requires a 'recipient' address as argument") - } - if a.Value == "" { - return NewErrorResponse("Transact requires a 'value' as argument") - } - if a.Gas == "" { - return NewErrorResponse("Transact requires a 'gas' value as argument") - } - if a.GasPrice == "" { - return NewErrorResponse("Transact requires a 'gasprice' value as argument") - } - return nil -} - -func (a *NewTxArgs) requirementsContract() error { - if a.Value == "" { - return NewErrorResponse("Create requires a 'value' as argument") - } - if a.Gas == "" { - return NewErrorResponse("Create requires a 'gas' value as argument") - } - if a.GasPrice == "" { - return NewErrorResponse("Create requires a 'gasprice' value as argument") - } - if a.Body == "" { - return NewErrorResponse("Create requires a 'body' value as argument") - } - return nil -} - -type PushTxArgs struct { - Tx string `json:"tx"` -} - -func (obj *PushTxArgs) UnmarshalJSON(b []byte) (err error) { - arg0 := "" - if err = json.Unmarshal(b, arg0); err == nil { - obj.Tx = arg0 - return - } - return NewErrorResponse(ErrorDecodeArgs) -} - -func (a *PushTxArgs) requirementsPushTx() error { - if a.Tx == "" { - return NewErrorResponse("PushTx requires a 'tx' as argument") - } - return nil -} - -type GetStorageArgs struct { - Address string - Key string -} - -func (obj *GetStorageArgs) UnmarshalJSON(b []byte) (err error) { - arg0 := "" - if err = json.Unmarshal(b, arg0); err == nil { - obj.Address = arg0 - return - } - return NewErrorResponse(ErrorDecodeArgs) -} - -func (a *GetStorageArgs) requirements() error { - if a.Address == "" { - return NewErrorResponse("GetStorageAt requires an 'address' value as argument") - } - if a.Key == "" { - return NewErrorResponse("GetStorageAt requires an 'key' value as argument") - } - return nil -} - -type GetStorageAtRes struct { - Key string `json:"key"` - Value string `json:"value"` - Address string `json:"address"` -} - -type GetTxCountArgs struct { - Address string `json:"address"` -} - -// type GetTxCountRes struct { -// Nonce int `json:"nonce"` -// } - -func (obj *GetTxCountArgs) UnmarshalJSON(b []byte) (err error) { - arg0 := "" - if err = json.Unmarshal(b, arg0); err == nil { - obj.Address = arg0 - return - } - return NewErrorResponse("Could not determine JSON parameters") -} - -func (a *GetTxCountArgs) requirements() error { - if a.Address == "" { - return NewErrorResponse("GetTxCountAt requires an 'address' value as argument") - } - return nil -} - -// type GetPeerCountRes struct { -// PeerCount int `json:"peerCount"` -// } - -// type GetListeningRes struct { -// IsListening bool `json:"isListening"` -// } - -// type GetCoinbaseRes struct { -// Coinbase string `json:"coinbase"` -// } - -// type GetMiningRes struct { -// IsMining bool `json:"isMining"` -// } - -type GetBalanceArgs struct { - Address string -} - -func (obj *GetBalanceArgs) UnmarshalJSON(b []byte) (err error) { - arg0 := "" - if err = json.Unmarshal(b, &arg0); err == nil { - obj.Address = arg0 - return - } - return NewErrorResponse("Could not determine JSON parameters") -} - -func (a *GetBalanceArgs) requirements() error { - if a.Address == "" { - return NewErrorResponse("GetBalanceAt requires an 'address' value as argument") - } - return nil -} - -type BalanceRes struct { - Balance string `json:"balance"` - Address string `json:"address"` -} - -type GetCodeAtArgs struct { - Address string -} - -func (obj *GetCodeAtArgs) UnmarshalJSON(b []byte) (err error) { - arg0 := "" - if err = json.Unmarshal(b, &arg0); err == nil { - obj.Address = arg0 - return - } - return NewErrorResponse(ErrorDecodeArgs) -} - -func (a *GetCodeAtArgs) requirements() error { - if a.Address == "" { - return NewErrorResponse("GetCodeAt requires an 'address' value as argument") - } return nil } -- cgit v1.2.3 From 215780ab562b940bfc653c16bf84f812ef062821 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 20 Jan 2015 13:58:51 -0600 Subject: Move GetRequestReply to EthereumApi Off of jsonWrapper --- rpc/packages.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'rpc/packages.go') diff --git a/rpc/packages.go b/rpc/packages.go index 34a4467b1..e87e0db7c 100644 --- a/rpc/packages.go +++ b/rpc/packages.go @@ -157,5 +157,52 @@ func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error { return nil } +func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error { + // Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC + jsonlogger.DebugDetailf("%T %s", req.Params, req.Params) + switch req.Method { + case "eth_coinbase": + return p.GetCoinbase(reply) + case "eth_listening": + return p.GetIsListening(reply) + case "eth_mining": + return p.GetIsMining(reply) + case "eth_peerCount": + return p.GetPeerCount(reply) + case "eth_countAt": + args, err := req.ToGetTxCountArgs() + if err != nil { + return err + } + return p.GetTxCountAt(args, reply) + case "eth_codeAt": + args, err := req.ToGetCodeAtArgs() + if err != nil { + return err + } + return p.GetCodeAt(args, reply) + case "eth_balanceAt": + args, err := req.ToGetBalanceArgs() + if err != nil { + return err + } + return p.GetBalanceAt(args, reply) + case "eth_stateAt": + args, err := req.ToGetStorageArgs() + if err != nil { + return err + } + return p.GetStorageAt(args, reply) + case "eth_blockByNumber", "eth_blockByHash": + args, err := req.ToGetBlockArgs() + if err != nil { + return err + } + return p.GetBlock(args, reply) + default: + return NewErrorResponse(ErrorNotImplemented) + } + + jsonlogger.DebugDetailf("Reply: %T %s", reply, reply) return nil } -- cgit v1.2.3