From 540c79e6adbb5b616e6a1e0612d69dfba07776c9 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 2 Mar 2015 09:36:14 -0600 Subject: Rename "net" methods --- rpc/api.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 28024c206..782b5848c 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -513,8 +513,6 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error 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_setMining": @@ -531,8 +529,6 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.SetDefaultBlockAge(int64(args), reply) - case "eth_peerCount": - return p.GetPeerCount(reply) case "eth_number": return p.BlockNumber(reply) case "eth_accounts": @@ -668,6 +664,10 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.DbGet(args, reply) + case "net_listening": + return p.GetIsListening(reply) + case "net_peerCount": + return p.GetPeerCount(reply) case "shh_newIdentity": return p.NewWhisperIdentity(reply) case "shh_newFilter": -- cgit v1.2.3 From fb2488235a9cc187047810817ce3fa34c5087c67 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 2 Mar 2015 09:36:48 -0600 Subject: Remove defunct calls --- rpc/api.go | 92 ++++++++++++++++++++------------------------------------------ 1 file changed, 30 insertions(+), 62 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 782b5848c..28ec04916 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -52,20 +52,20 @@ type EthereumApi struct { db ethutil.Database - defaultBlockAge int64 + // defaultBlockAge int64 } func NewEthereumApi(eth *xeth.XEth) *EthereumApi { db, _ := ethdb.NewLDBDatabase("dapps") api := &EthereumApi{ - eth: eth, - mux: eth.Backend().EventMux(), - quit: make(chan struct{}), - filterManager: filter.NewFilterManager(eth.Backend().EventMux()), - logs: make(map[int]*logFilter), - messages: make(map[int]*whisperFilter), - db: db, - defaultBlockAge: -1, + eth: eth, + mux: eth.Backend().EventMux(), + quit: make(chan struct{}), + filterManager: filter.NewFilterManager(eth.Backend().EventMux()), + logs: make(map[int]*logFilter), + messages: make(map[int]*whisperFilter), + db: db, + // defaultBlockAge: -1, } go api.filterManager.Start() go api.start() @@ -73,36 +73,36 @@ func NewEthereumApi(eth *xeth.XEth) *EthereumApi { return api } -func (self *EthereumApi) setStateByBlockNumber(num int64) { - chain := self.xeth().Backend().ChainManager() - var block *types.Block +// func (self *EthereumApi) setStateByBlockNumber(num int64) { +// chain := self.xeth().Backend().ChainManager() +// var block *types.Block - if self.defaultBlockAge < 0 { - num = chain.CurrentBlock().Number().Int64() + num + 1 - } - block = chain.GetBlockByNumber(uint64(num)) +// if self.defaultBlockAge < 0 { +// num = chain.CurrentBlock().Number().Int64() + num + 1 +// } +// block = chain.GetBlockByNumber(uint64(num)) - if block != nil { - self.useState(state.New(block.Root(), self.xeth().Backend().Db())) - } else { - self.useState(chain.State()) - } -} +// if block != nil { +// self.useState(state.New(block.Root(), self.xeth().Backend().Db())) +// } else { +// self.useState(chain.State()) +// } +// } func (self *EthereumApi) start() { timer := time.NewTicker(filterTickerTime) - events := self.mux.Subscribe(core.ChainEvent{}) + // events := self.mux.Subscribe(core.ChainEvent{}) done: for { select { - case ev := <-events.Chan(): - switch ev.(type) { - case core.ChainEvent: - if self.defaultBlockAge < 0 { - self.setStateByBlockNumber(self.defaultBlockAge) - } - } + // case ev := <-events.Chan(): + // switch ev.(type) { + // case core.ChainEvent: + // if self.defaultBlockAge < 0 { + // self.setStateByBlockNumber(self.defaultBlockAge) + // } + // } case <-timer.C: self.logMut.Lock() self.messagesMut.Lock() @@ -365,24 +365,6 @@ func (p *EthereumApi) GetIsMining(reply *interface{}) error { return nil } -func (p *EthereumApi) SetMining(shouldmine bool, reply *interface{}) error { - *reply = p.xeth().SetMining(shouldmine) - return nil -} - -func (p *EthereumApi) GetDefaultBlockAge(reply *interface{}) error { - *reply = p.defaultBlockAge - return nil -} - -func (p *EthereumApi) SetDefaultBlockAge(defaultBlockAge int64, reply *interface{}) error { - p.defaultBlockAge = defaultBlockAge - p.setStateByBlockNumber(p.defaultBlockAge) - - *reply = true - return nil -} - func (p *EthereumApi) BlockNumber(reply *interface{}) error { *reply = p.xeth().Backend().ChainManager().CurrentBlock().Number() return nil @@ -515,20 +497,6 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return p.GetCoinbase(reply) case "eth_mining": return p.GetIsMining(reply) - case "eth_setMining": - args, err := req.ToBoolArgs() - if err != nil { - return err - } - return p.SetMining(args, reply) - case "eth_defaultBlock": - return p.GetDefaultBlockAge(reply) - case "eth_setDefaultBlock": - args, err := req.ToIntArgs() - if err != nil { - return err - } - return p.SetDefaultBlockAge(int64(args), reply) case "eth_number": return p.BlockNumber(reply) case "eth_accounts": -- cgit v1.2.3 From c92e48ce3f9de2196a713b24d5c27d6c664826d9 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 4 Mar 2015 07:54:10 -0600 Subject: Add client_version RPC message --- rpc/api.go | 2 ++ 1 file changed, 2 insertions(+) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 28ec04916..f023709ca 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -668,6 +668,8 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.WhisperMessages(args, reply) + case "client_version": + *reply = p.eth.GetClientVersion() default: return NewErrorWithMessage(errNotImplemented, req.Method) } -- cgit v1.2.3 From c3deafabda6e97c0077609ab375be69936d512d4 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 4 Mar 2015 08:22:59 -0600 Subject: Update NewTXArgs to accept hex --- rpc/api.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index f023709ca..406960fce 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -252,12 +252,12 @@ func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *interface{}) error { } func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error { - if len(args.Gas) == 0 { - args.Gas = defaultGas.String() + if args.Gas == ethutil.Big0 { + args.Gas = defaultGas } - if len(args.GasPrice) == 0 { - args.GasPrice = defaultGasPrice.String() + if args.GasPrice == ethutil.Big0 { + args.GasPrice = defaultGasPrice } // TODO if no_private_key then @@ -281,7 +281,10 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error { p.register[ags.From] = append(p.register[args.From], args) } */ - result, _ := p.xeth().Transact( /* TODO specify account */ args.To, args.Value, args.Gas, args.GasPrice, args.Data) + result, err := p.xeth().Transact( /* TODO specify account */ args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) + if err != nil { + return err + } *reply = result //} @@ -289,7 +292,7 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error { } func (p *EthereumApi) Call(args *NewTxArgs, reply *interface{}) error { - result, err := p.xeth().Call( /* TODO specify account */ args.To, args.Value, args.Gas, args.GasPrice, args.Data) + result, err := p.xeth().Call( /* TODO specify account */ args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) if err != nil { return err } -- cgit v1.2.3 From 93141f4b6d0b986138853af58aacb08be1ca2bfb Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 4 Mar 2015 08:27:34 -0600 Subject: Return block number as hex --- rpc/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 406960fce..d1158afe9 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -369,7 +369,7 @@ func (p *EthereumApi) GetIsMining(reply *interface{}) error { } func (p *EthereumApi) BlockNumber(reply *interface{}) error { - *reply = p.xeth().Backend().ChainManager().CurrentBlock().Number() + *reply = toHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes()) return nil } -- cgit v1.2.3 From 9b0f00baf35b7eaa323f2679a07da198369b249e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 4 Mar 2015 08:41:13 -0600 Subject: Output net_peerCount as hex --- rpc/api.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index d1158afe9..d82432d79 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -344,7 +344,8 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *interface{}) err } func (p *EthereumApi) GetPeerCount(reply *interface{}) error { - *reply = p.xeth().PeerCount() + c := p.xeth().PeerCount() + *reply = toHex(big.NewInt(int64(c)).Bytes()) return nil } -- cgit v1.2.3 From 90ceb5218cec788de83842e9b38d63af24af5ffd Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 5 Mar 2015 08:58:46 -0600 Subject: Update RPC methods Re-order to match spec and explicitly list unimplemented methods --- rpc/api.go | 199 +++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 115 insertions(+), 84 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index d82432d79..d0181463d 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -344,8 +344,7 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *interface{}) err } func (p *EthereumApi) GetPeerCount(reply *interface{}) error { - c := p.xeth().PeerCount() - *reply = toHex(big.NewInt(int64(c)).Bytes()) + *reply = p.xeth().PeerCount() return nil } @@ -370,7 +369,7 @@ func (p *EthereumApi) GetIsMining(reply *interface{}) error { } func (p *EthereumApi) BlockNumber(reply *interface{}) error { - *reply = toHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes()) + *reply = p.xeth().Backend().ChainManager().CurrentBlock().Number() return nil } @@ -497,51 +496,68 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error // Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC rpclogger.DebugDetailf("%T %s", req.Params, req.Params) switch req.Method { + case "web3_sha3": + args, err := req.ToSha3Args() + if err != nil { + return err + } + return p.Sha3(args, reply) + case "net_listening": + return p.GetIsListening(reply) + case "net_peerCount": + return p.GetPeerCount(reply) case "eth_coinbase": return p.GetCoinbase(reply) case "eth_mining": return p.GetIsMining(reply) - case "eth_number": - return p.BlockNumber(reply) + case "eth_gasPrice": + *reply = toHex(defaultGasPrice.Bytes()) + return nil case "eth_accounts": return p.Accounts(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": + case "eth_blockNumber": + return p.BlockNumber(reply) + case "eth_getBalance": + // TODO handle defaultBlock args, err := req.ToGetBalanceArgs() if err != nil { return err } return p.GetBalanceAt(args, reply) - case "eth_stateAt": + case "eth_getStorage": + // TODO handle defaultBlock args, err := req.ToGetStateArgs() if err != nil { return err } return p.GetStateAt(args, reply) - case "eth_storageAt": + case "eth_getStorageAt": + // TODO handle defaultBlock args, err := req.ToStorageAtArgs() if err != nil { return err } return p.GetStorageAt(args, reply) - case "eth_blockByNumber", "eth_blockByHash": - args, err := req.ToGetBlockArgs() + case "eth_getTransactionCount": + // TODO handle defaultBlock + args, err := req.ToGetTxCountArgs() if err != nil { return err } - return p.GetBlock(args, reply) - case "eth_transact": + return p.GetTxCountAt(args, reply) + case "eth_getBlockTransactionCountByHash": + case "eth_getBlockTransactionCountByNumber": + case "eth_getUncleCountByBlockHash": + case "eth_getUncleCountByBlockNumber": + return errNotImplemented + case "eth_getData": + // TODO handle defaultBlock + args, err := req.ToGetCodeAtArgs() + if err != nil { + return err + } + return p.GetCodeAt(args, reply) + case "eth_sendTransaction": args, err := req.ToNewTxArgs() if err != nil { return err @@ -553,77 +569,91 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.Call(args, reply) - case "eth_newFilter": - args, err := req.ToFilterArgs() + case "eth_flush": + return errNotImplemented + case "eth_getBlockByNumber", "eth_getBlockByHash": + // TODO handle second param for "include transaction objects" + args, err := req.ToGetBlockArgs() if err != nil { return err } - return p.NewFilter(args, reply) - case "eth_newFilterString": - args, err := req.ToFilterStringArgs() + return p.GetBlock(args, reply) + case "eth_getTransactionByHash": + case "eth_getTransactionByBlockHashAndIndex": + case "eth_getTransactionByBlockNumberAndIndex": + case "eth_getUncleByBlockHashAndIndex": + case "eth_getUncleByBlockNumberAndIndex": + return errNotImplemented + case "eth_getCompilers": + return p.GetCompilers(reply) + case "eth_compileSolidity": + case "eth_compileLLL": + return errNotImplemented + case "eth_compileSerpent": + args, err := req.ToCompileArgs() + if err != nil { + return err + } + return p.CompileSerpent(args, reply) + case "eth_newFilter": + args, err := req.ToFilterArgs() if err != nil { return err } - return p.NewFilterString(args, reply) + return p.NewFilter(args, reply) + // case "eth_newFilterString": + // args, err := req.ToFilterStringArgs() + // if err != nil { + // return err + // } + // return p.NewFilterString(args, reply) + case "eth_newBlockFilter": + return errNotImplemented case "eth_uninstallFilter": args, err := req.ToUninstallFilterArgs() if err != nil { return err } return p.UninstallFilter(args, reply) - case "eth_changed": + case "eth_getFilterChanges": args, err := req.ToIdArgs() if err != nil { return err } return p.FilterChanged(args, reply) - case "eth_filterLogs": + case "eth_getFilterLogs": args, err := req.ToIdArgs() if err != nil { return err } return p.Logs(args, reply) - case "eth_logs": + case "eth_getLogs": args, err := req.ToFilterArgs() if err != nil { return err } return p.AllLogs(args, reply) - case "eth_gasPrice": - *reply = toHex(defaultGasPrice.Bytes()) - return nil - case "eth_register": - args, err := req.ToRegisterArgs() - if err != nil { - return err - } - return p.Register(args, reply) - case "eth_unregister": - args, err := req.ToRegisterArgs() - if err != nil { - return err - } - return p.Unregister(args, reply) - case "eth_watchTx": - args, err := req.ToWatchTxArgs() - if err != nil { - return err - } - return p.WatchTx(args, reply) - case "eth_compilers": - return p.GetCompilers(reply) - case "eth_serpent": - args, err := req.ToCompileArgs() - if err != nil { - return err - } - return p.CompileSerpent(args, reply) - case "web3_sha3": - args, err := req.ToSha3Args() - if err != nil { - return err - } - return p.Sha3(args, reply) + case "eth_getWork": + case "eth_submitWork": + return errNotImplemented + // case "eth_register": + // args, err := req.ToRegisterArgs() + // if err != nil { + // return err + // } + // return p.Register(args, reply) + // case "eth_unregister": + // args, err := req.ToRegisterArgs() + // if err != nil { + // return err + // } + // return p.Unregister(args, reply) + // case "eth_watchTx": + // args, err := req.ToWatchTxArgs() + // if err != nil { + // return err + // } + // return p.WatchTx(args, reply) case "db_put": args, err := req.ToDbPutArgs() if err != nil { @@ -636,36 +666,37 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.DbGet(args, reply) - case "net_listening": - return p.GetIsListening(reply) - case "net_peerCount": - return p.GetPeerCount(reply) + case "shh_post": + args, err := req.ToWhisperPostArgs() + if err != nil { + return err + } + return p.WhisperPost(args, reply) case "shh_newIdentity": return p.NewWhisperIdentity(reply) + case "shh_hasIdentity": + args, err := req.ToWhisperHasIdentityArgs() + if err != nil { + return err + } + return p.HasWhisperIdentity(args, reply) + case "shh_newGroup": + case "shh_addToGroup": + return errNotImplemented case "shh_newFilter": args, err := req.ToWhisperFilterArgs() if err != nil { return err } return p.NewWhisperFilter(args, reply) + case "shh_uninstallFilter": + return errNotImplemented case "shh_changed": args, err := req.ToIdArgs() if err != nil { return err } return p.MessagesChanged(args, reply) - case "shh_post": - args, err := req.ToWhisperPostArgs() - if err != nil { - return err - } - return p.WhisperPost(args, reply) - case "shh_haveIdentity": - args, err := req.ToWhisperHasIdentityArgs() - if err != nil { - return err - } - return p.HasWhisperIdentity(args, reply) case "shh_getMessages": args, err := req.ToIdArgs() if err != nil { -- cgit v1.2.3 From 0d8d51084f2e6622170f5c2b03c92450cb35b25f Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 5 Mar 2015 11:07:05 -0600 Subject: Final name changes --- rpc/api.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index d0181463d..9d00ae340 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -571,7 +571,8 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return p.Call(args, reply) case "eth_flush": return errNotImplemented - case "eth_getBlockByNumber", "eth_getBlockByHash": + case "eth_getBlockByNumber": + case "eth_getBlockByHash": // TODO handle second param for "include transaction objects" args, err := req.ToGetBlockArgs() if err != nil { @@ -601,12 +602,12 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.NewFilter(args, reply) - // case "eth_newFilterString": - // args, err := req.ToFilterStringArgs() - // if err != nil { - // return err - // } - // return p.NewFilterString(args, reply) + case "eth_newBlockFilter": + args, err := req.ToFilterStringArgs() + if err != nil { + return err + } + return p.NewFilterString(args, reply) case "eth_newBlockFilter": return errNotImplemented case "eth_uninstallFilter": @@ -691,7 +692,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return p.NewWhisperFilter(args, reply) case "shh_uninstallFilter": return errNotImplemented - case "shh_changed": + case "shh_getFilterChanges": args, err := req.ToIdArgs() if err != nil { return err -- cgit v1.2.3 From a6599404e49387af8cc5302b7f22005133af4ebf Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 5 Mar 2015 11:14:47 -0600 Subject: Revert to hex response --- rpc/api.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 9d00ae340..b97558bda 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -344,7 +344,8 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *interface{}) err } func (p *EthereumApi) GetPeerCount(reply *interface{}) error { - *reply = p.xeth().PeerCount() + c := p.xeth().PeerCount() + *reply = toHex(big.NewInt(int64(c)).Bytes()) return nil } @@ -369,7 +370,7 @@ func (p *EthereumApi) GetIsMining(reply *interface{}) error { } func (p *EthereumApi) BlockNumber(reply *interface{}) error { - *reply = p.xeth().Backend().ChainManager().CurrentBlock().Number() + *reply = toHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes()) return nil } @@ -608,8 +609,6 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.NewFilterString(args, reply) - case "eth_newBlockFilter": - return errNotImplemented case "eth_uninstallFilter": args, err := req.ToUninstallFilterArgs() if err != nil { -- cgit v1.2.3 From 9f5e9eb38d7bf00ec24ce4ae09f910236f776641 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 5 Mar 2015 12:26:21 -0600 Subject: Resolve storage/storageat --- rpc/api.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index b97558bda..24491833d 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -311,7 +311,7 @@ func (p *EthereumApi) PushTx(args *PushTxArgs, reply *interface{}) error { return nil } -func (p *EthereumApi) GetStateAt(args *GetStateArgs, reply *interface{}) error { +func (p *EthereumApi) GetStorageAt(args *GetStorageAtArgs, reply *interface{}) error { err := args.requirements() if err != nil { return err @@ -333,7 +333,7 @@ func (p *EthereumApi) GetStateAt(args *GetStateArgs, reply *interface{}) error { return nil } -func (p *EthereumApi) GetStorageAt(args *GetStorageArgs, reply *interface{}) error { +func (p *EthereumApi) GetStorage(args *GetStorageArgs, reply *interface{}) error { err := args.requirements() if err != nil { return err @@ -527,14 +527,14 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return p.GetBalanceAt(args, reply) case "eth_getStorage": // TODO handle defaultBlock - args, err := req.ToGetStateArgs() + args, err := req.ToStorageArgs() if err != nil { return err } - return p.GetStateAt(args, reply) + return p.GetStorage(args, reply) case "eth_getStorageAt": // TODO handle defaultBlock - args, err := req.ToStorageAtArgs() + args, err := req.ToGetStorageAtArgs() if err != nil { return err } -- cgit v1.2.3 From ef9d825cfaa274a4063bf7dcbf19c033e29b90aa Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 5 Mar 2015 21:37:45 -0600 Subject: Refactor & cleanup --- rpc/api.go | 282 ++++++++++++++++++++++++------------------------------------- 1 file changed, 110 insertions(+), 172 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 24491833d..35c9c51d7 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -1,14 +1,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 "UnmarshalON" defined on each "Args" struct -3. EthereumApi method, taking the "Args" type and replying with an interface to be marshalled to ON - -*/ package rpc import ( + "encoding/json" "fmt" "math/big" "strings" @@ -150,16 +143,16 @@ func (self *EthereumApi) Unregister(args string, reply *interface{}) error { return nil } -func (self *EthereumApi) WatchTx(args string, reply *interface{}) error { - self.regmut.Lock() - defer self.regmut.Unlock() +// func (self *EthereumApi) WatchTx(args string, reply *interface{}) error { +// self.regmut.Lock() +// defer self.regmut.Unlock() - txs := self.register[args] - self.register[args] = nil +// txs := self.register[args] +// self.register[args] = nil - *reply = txs - return nil -} +// *reply = txs +// return nil +// } func (self *EthereumApi) NewFilter(args *FilterOptions, reply *interface{}) error { var id int @@ -241,16 +234,6 @@ func (self *EthereumApi) AllLogs(args *FilterOptions, reply *interface{}) error return nil } -func (p *EthereumApi) GetBlock(args *GetBlockArgs, reply *interface{}) error { - // This seems a bit precarious Maybe worth splitting to discrete functions - if len(args.Hash) > 0 { - *reply = p.xeth().BlockByHash(args.Hash) - } else { - *reply = p.xeth().BlockByNumber(args.BlockNumber) - } - return nil -} - func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) error { if args.Gas == ethutil.Big0 { args.Gas = defaultGas @@ -301,22 +284,27 @@ func (p *EthereumApi) Call(args *NewTxArgs, reply *interface{}) error { return nil } -func (p *EthereumApi) PushTx(args *PushTxArgs, reply *interface{}) error { - err := args.requirementsPushTx() - if err != nil { +func (p *EthereumApi) GetBalance(args *GetBalanceArgs, reply *interface{}) error { + if err := args.requirements(); err != nil { return err } - result, _ := p.xeth().PushTx(args.Tx) - *reply = result + state := p.xeth().State().SafeGet(args.Address) + *reply = toHex(state.Balance().Bytes()) return nil } -func (p *EthereumApi) GetStorageAt(args *GetStorageAtArgs, reply *interface{}) error { - err := args.requirements() - if err != nil { +func (p *EthereumApi) GetStorage(args *GetStorageArgs, reply *interface{}) error { + if err := args.requirements(); err != nil { return err } + *reply = p.xeth().State().SafeGet(args.Address).Storage() + return nil +} +func (p *EthereumApi) GetStorageAt(args *GetStorageAtArgs, reply *interface{}) error { + if err := args.requirements(); err != nil { + return err + } state := p.xeth().State().SafeGet(args.Address) value := state.StorageString(args.Key) @@ -333,47 +321,6 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageAtArgs, reply *interface{}) e return nil } -func (p *EthereumApi) GetStorage(args *GetStorageArgs, reply *interface{}) error { - err := args.requirements() - if err != nil { - return err - } - - *reply = p.xeth().State().SafeGet(args.Address).Storage() - return nil -} - -func (p *EthereumApi) GetPeerCount(reply *interface{}) error { - c := p.xeth().PeerCount() - *reply = toHex(big.NewInt(int64(c)).Bytes()) - return nil -} - -func (p *EthereumApi) GetIsListening(reply *interface{}) error { - *reply = p.xeth().IsListening() - return nil -} - -func (p *EthereumApi) GetCoinbase(reply *interface{}) error { - *reply = p.xeth().Coinbase() - return nil -} - -func (p *EthereumApi) Accounts(reply *interface{}) error { - *reply = p.xeth().Accounts() - return nil -} - -func (p *EthereumApi) GetIsMining(reply *interface{}) error { - *reply = p.xeth().IsMining() - return nil -} - -func (p *EthereumApi) BlockNumber(reply *interface{}) error { - *reply = toHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes()) - return nil -} - func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *interface{}) error { err := args.requirements() if err != nil { @@ -383,19 +330,8 @@ func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *interface{}) err return nil } -func (p *EthereumApi) GetBalanceAt(args *GetBalanceArgs, reply *interface{}) error { - err := args.requirements() - if err != nil { - return err - } - state := p.xeth().State().SafeGet(args.Address) - *reply = toHex(state.Balance().Bytes()) - return nil -} - -func (p *EthereumApi) GetCodeAt(args *GetCodeAtArgs, reply *interface{}) error { - err := args.requirements() - if err != nil { +func (p *EthereumApi) GetData(args *GetDataArgs, reply *interface{}) error { + if err := args.requirements(); err != nil { return err } *reply = p.xeth().CodeAt(args.Address) @@ -408,8 +344,8 @@ func (p *EthereumApi) GetCompilers(reply *interface{}) error { return nil } -func (p *EthereumApi) CompileSerpent(script string, reply *interface{}) error { - res, err := ethutil.Compile(script, false) +func (p *EthereumApi) CompileSerpent(args *CompileArgs, reply *interface{}) error { + res, err := ethutil.Compile(args.Source, false) if err != nil { return err } @@ -417,14 +353,8 @@ func (p *EthereumApi) CompileSerpent(script string, reply *interface{}) error { return nil } -func (p *EthereumApi) Sha3(args *Sha3Args, reply *interface{}) error { - *reply = toHex(crypto.Sha3(fromHex(args.Data))) - return nil -} - func (p *EthereumApi) DbPut(args *DbArgs, reply *interface{}) error { - err := args.requirements() - if err != nil { + if err := args.requirements(); err != nil { return err } @@ -434,8 +364,7 @@ func (p *EthereumApi) DbPut(args *DbArgs, reply *interface{}) error { } func (p *EthereumApi) DbGet(args *DbArgs, reply *interface{}) error { - err := args.requirements() - if err != nil { + if err := args.requirements(); err != nil { return err } @@ -449,14 +378,18 @@ func (p *EthereumApi) NewWhisperIdentity(reply *interface{}) error { return nil } -func (p *EthereumApi) NewWhisperFilter(args *xeth.Options, reply *interface{}) error { +func (p *EthereumApi) NewWhisperFilter(args *WhisperFilterArgs, reply *interface{}) error { var id int - args.Fn = func(msg xeth.WhisperMessage) { + opts := new(xeth.Options) + opts.From = args.From + opts.To = args.To + opts.Topics = args.Topics + opts.Fn = func(msg xeth.WhisperMessage) { p.messagesMut.Lock() defer p.messagesMut.Unlock() p.messages[id].add(msg) // = append(p.messages[id], msg) } - id = p.xeth().Whisper().Watch(args) + id = p.xeth().Whisper().Watch(opts) p.messages[id] = &whisperFilter{timeout: time.Now()} *reply = id return nil @@ -498,51 +431,50 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error rpclogger.DebugDetailf("%T %s", req.Params, req.Params) switch req.Method { case "web3_sha3": - args, err := req.ToSha3Args() - if err != nil { + args := new(Sha3Args) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.Sha3(args, reply) + *reply = toHex(crypto.Sha3(fromHex(args.Data))) case "net_listening": - return p.GetIsListening(reply) + *reply = p.xeth().IsListening() case "net_peerCount": - return p.GetPeerCount(reply) + *reply = toHex(big.NewInt(int64(p.xeth().PeerCount())).Bytes()) case "eth_coinbase": - return p.GetCoinbase(reply) + *reply = p.xeth().Coinbase() case "eth_mining": - return p.GetIsMining(reply) + *reply = p.xeth().IsMining() case "eth_gasPrice": *reply = toHex(defaultGasPrice.Bytes()) - return nil case "eth_accounts": - return p.Accounts(reply) + *reply = p.xeth().Accounts() case "eth_blockNumber": - return p.BlockNumber(reply) + *reply = toHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes()) case "eth_getBalance": - // TODO handle defaultBlock - args, err := req.ToGetBalanceArgs() - if err != nil { + // TODO handle BlockNumber + args := new(GetBalanceArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.GetBalanceAt(args, reply) + return p.GetBalance(args, reply) case "eth_getStorage": - // TODO handle defaultBlock - args, err := req.ToStorageArgs() - if err != nil { + // TODO handle BlockNumber + args := new(GetStorageArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.GetStorage(args, reply) case "eth_getStorageAt": - // TODO handle defaultBlock - args, err := req.ToGetStorageAtArgs() - if err != nil { + // TODO handle BlockNumber + args := new(GetStorageAtArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.GetStorageAt(args, reply) case "eth_getTransactionCount": - // TODO handle defaultBlock - args, err := req.ToGetTxCountArgs() - if err != nil { + // TODO handle BlockNumber + args := new(GetTxCountArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.GetTxCountAt(args, reply) @@ -552,34 +484,40 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error case "eth_getUncleCountByBlockNumber": return errNotImplemented case "eth_getData": - // TODO handle defaultBlock - args, err := req.ToGetCodeAtArgs() - if err != nil { + // TODO handle BlockNumber + args := new(GetDataArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.GetCodeAt(args, reply) + return p.GetData(args, reply) case "eth_sendTransaction": - args, err := req.ToNewTxArgs() - if err != nil { + args := new(NewTxArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.Transact(args, reply) case "eth_call": - args, err := req.ToNewTxArgs() - if err != nil { + args := new(NewTxArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.Call(args, reply) case "eth_flush": return errNotImplemented - case "eth_getBlockByNumber": case "eth_getBlockByHash": // TODO handle second param for "include transaction objects" - args, err := req.ToGetBlockArgs() - if err != nil { + args := new(GetBlockByHashArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.GetBlock(args, reply) + *reply = p.xeth().BlockByHash(args.BlockHash) + case "eth_getBlockByNumber": + // TODO handle second param for "include transaction objects" + args := new(GetBlockByNumberArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + *reply = p.xeth().BlockByNumber(args.BlockNumber) case "eth_getTransactionByHash": case "eth_getTransactionByBlockHashAndIndex": case "eth_getTransactionByBlockNumberAndIndex": @@ -592,44 +530,44 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error case "eth_compileLLL": return errNotImplemented case "eth_compileSerpent": - args, err := req.ToCompileArgs() - if err != nil { + args := new(CompileArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.CompileSerpent(args, reply) case "eth_newFilter": - args, err := req.ToFilterArgs() - if err != nil { + args := new(FilterOptions) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.NewFilter(args, reply) case "eth_newBlockFilter": - args, err := req.ToFilterStringArgs() - if err != nil { + args := new(FilterStringArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.NewFilterString(args, reply) + return p.NewFilterString(args.Word, reply) case "eth_uninstallFilter": - args, err := req.ToUninstallFilterArgs() - if err != nil { + args := new(FilterIdArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.UninstallFilter(args, reply) + return p.UninstallFilter(args.Id, reply) case "eth_getFilterChanges": - args, err := req.ToIdArgs() - if err != nil { + args := new(FilterIdArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.FilterChanged(args, reply) + return p.FilterChanged(args.Id, reply) case "eth_getFilterLogs": - args, err := req.ToIdArgs() - if err != nil { + args := new(FilterIdArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.Logs(args, reply) + return p.Logs(args.Id, reply) case "eth_getLogs": - args, err := req.ToFilterArgs() - if err != nil { + args := new(FilterOptions) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.AllLogs(args, reply) @@ -655,54 +593,54 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error // } // return p.WatchTx(args, reply) case "db_put": - args, err := req.ToDbPutArgs() - if err != nil { + args := new(DbArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.DbPut(args, reply) case "db_get": - args, err := req.ToDbGetArgs() - if err != nil { + args := new(DbArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.DbGet(args, reply) case "shh_post": - args, err := req.ToWhisperPostArgs() - if err != nil { + args := new(WhisperMessageArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.WhisperPost(args, reply) case "shh_newIdentity": return p.NewWhisperIdentity(reply) case "shh_hasIdentity": - args, err := req.ToWhisperHasIdentityArgs() - if err != nil { + args := new(WhisperIdentityArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.HasWhisperIdentity(args, reply) + return p.HasWhisperIdentity(args.Identity, reply) case "shh_newGroup": case "shh_addToGroup": return errNotImplemented case "shh_newFilter": - args, err := req.ToWhisperFilterArgs() - if err != nil { + args := new(WhisperFilterArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.NewWhisperFilter(args, reply) case "shh_uninstallFilter": return errNotImplemented case "shh_getFilterChanges": - args, err := req.ToIdArgs() - if err != nil { + args := new(FilterIdArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.MessagesChanged(args, reply) + return p.MessagesChanged(args.Id, reply) case "shh_getMessages": - args, err := req.ToIdArgs() - if err != nil { + args := new(FilterIdArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { return err } - return p.WhisperMessages(args, reply) + return p.WhisperMessages(args.Id, reply) case "client_version": *reply = p.eth.GetClientVersion() default: -- cgit v1.2.3 From 03dc760ca07682a61ed547c11a1c650a324a1b14 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Thu, 5 Mar 2015 21:48:03 -0600 Subject: Tidy --- rpc/api.go | 90 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 32 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 35c9c51d7..ded91def1 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -124,24 +124,24 @@ func (self *EthereumApi) stop() { close(self.quit) } -func (self *EthereumApi) Register(args string, reply *interface{}) error { - self.regmut.Lock() - defer self.regmut.Unlock() +// func (self *EthereumApi) Register(args string, reply *interface{}) error { +// self.regmut.Lock() +// defer self.regmut.Unlock() - if _, ok := self.register[args]; ok { - self.register[args] = nil // register with empty - } - return nil -} +// if _, ok := self.register[args]; ok { +// self.register[args] = nil // register with empty +// } +// return nil +// } -func (self *EthereumApi) Unregister(args string, reply *interface{}) error { - self.regmut.Lock() - defer self.regmut.Unlock() +// func (self *EthereumApi) Unregister(args string, reply *interface{}) error { +// self.regmut.Lock() +// defer self.regmut.Unlock() - delete(self.register, args) +// delete(self.register, args) - return nil -} +// return nil +// } // func (self *EthereumApi) WatchTx(args string, reply *interface{}) error { // self.regmut.Lock() @@ -574,24 +574,6 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error case "eth_getWork": case "eth_submitWork": return errNotImplemented - // case "eth_register": - // args, err := req.ToRegisterArgs() - // if err != nil { - // return err - // } - // return p.Register(args, reply) - // case "eth_unregister": - // args, err := req.ToRegisterArgs() - // if err != nil { - // return err - // } - // return p.Unregister(args, reply) - // case "eth_watchTx": - // args, err := req.ToWatchTxArgs() - // if err != nil { - // return err - // } - // return p.WatchTx(args, reply) case "db_put": args := new(DbArgs) if err := json.Unmarshal(req.Params, &args); err != nil { @@ -643,6 +625,24 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return p.WhisperMessages(args.Id, reply) case "client_version": *reply = p.eth.GetClientVersion() + // case "eth_register": + // args, err := req.ToRegisterArgs() + // if err != nil { + // return err + // } + // return p.Register(args, reply) + // case "eth_unregister": + // args, err := req.ToRegisterArgs() + // if err != nil { + // return err + // } + // return p.Unregister(args, reply) + // case "eth_watchTx": + // args, err := req.ToWatchTxArgs() + // if err != nil { + // return err + // } + // return p.WatchTx(args, reply) default: return NewErrorWithMessage(errNotImplemented, req.Method) } @@ -675,3 +675,29 @@ func t(f ui.Frontend) { t, _ := ret.Get(0) fmt.Println("return:", t) } + +func toFilterOptions(options *FilterOptions) core.FilterOptions { + var opts core.FilterOptions + + // Convert optional address slice/string to byte slice + if str, ok := options.Address.(string); ok { + opts.Address = [][]byte{fromHex(str)} + } else if slice, ok := options.Address.([]interface{}); ok { + bslice := make([][]byte, len(slice)) + for i, addr := range slice { + if saddr, ok := addr.(string); ok { + bslice[i] = fromHex(saddr) + } + } + opts.Address = bslice + } + + opts.Earliest = options.Earliest + opts.Latest = options.Latest + opts.Topics = make([][]byte, len(options.Topic)) + for i, topic := range options.Topic { + opts.Topics[i] = fromHex(topic) + } + + return opts +} -- cgit v1.2.3 From fb23a0cfe06b52919107879e646e7d9b066acb0e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 9 Mar 2015 10:55:18 -0500 Subject: Remove support for compiling serpent --- rpc/api.go | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index ded91def1..64e9ed285 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -339,20 +339,11 @@ func (p *EthereumApi) GetData(args *GetDataArgs, reply *interface{}) error { } func (p *EthereumApi) GetCompilers(reply *interface{}) error { - c := []string{"serpent"} + c := []string{""} *reply = c return nil } -func (p *EthereumApi) CompileSerpent(args *CompileArgs, reply *interface{}) error { - res, err := ethutil.Compile(args.Source, false) - if err != nil { - return err - } - *reply = res - return nil -} - func (p *EthereumApi) DbPut(args *DbArgs, reply *interface{}) error { if err := args.requirements(); err != nil { return err @@ -528,13 +519,8 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return p.GetCompilers(reply) case "eth_compileSolidity": case "eth_compileLLL": - return errNotImplemented case "eth_compileSerpent": - args := new(CompileArgs) - if err := json.Unmarshal(req.Params, &args); err != nil { - return err - } - return p.CompileSerpent(args, reply) + return errNotImplemented case "eth_newFilter": args := new(FilterOptions) if err := json.Unmarshal(req.Params, &args); err != nil { -- cgit v1.2.3 From 9723191b19f6ddc12f0c3376ede7529b2d72e6a2 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Mon, 9 Mar 2015 11:04:38 -0500 Subject: Undo client_version changes --- rpc/api.go | 2 -- 1 file changed, 2 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 64e9ed285..ddba422f8 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -609,8 +609,6 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.WhisperMessages(args.Id, reply) - case "client_version": - *reply = p.eth.GetClientVersion() // case "eth_register": // args, err := req.ToRegisterArgs() // if err != nil { -- cgit v1.2.3 From a7538d0020d3a51ab3b25997b3c4f01db87d4c7a Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 9 Mar 2015 18:19:35 +0100 Subject: merge --- rpc/api.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 617e4998d..dc0945d19 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -665,10 +665,20 @@ func toFilterOptions(options *FilterOptions) core.FilterOptions { opts.Earliest = options.Earliest opts.Latest = options.Latest - opts.Topics = make([][][]byte, len(options.Topic)) - for i, topic := range options.Topic { - opts.Topics[i] = fromHex(topic) + + topics := make([][][]byte, len(options.Topics)) + for i, topicDat := range options.Topics { + if slice, ok := topicDat.([]interface{}); ok { + topics[i] = make([][]byte, len(slice)) + for j, topic := range slice { + topics[i][j] = fromHex(topic.(string)) + } + } else if str, ok := topicDat.(string); ok { + topics[i] = make([][]byte, 1) + topics[i][0] = fromHex(str) + } } + opts.Topics = topics return opts } -- cgit v1.2.3 From 3d6519e45bbd689b75c3ad6966c2044f29c649df Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 10 Mar 2015 12:52:45 -0500 Subject: Update response types --- rpc/api.go | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 90 insertions(+), 5 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index dc0945d19..20e0e705c 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -415,6 +415,44 @@ func (p *EthereumApi) WhisperMessages(id int, reply *interface{}) error { return nil } +func (p *EthereumApi) GetBlockByHash(blockhash string, includetx bool) (*BlockRes, error) { + block := p.xeth().EthBlockByHash(blockhash) + br := NewBlockRes(block) + br.fullTx = includetx + return br, nil +} + +func (p *EthereumApi) GetBlockByNumber(blocknum int64, includetx bool) (*BlockRes, error) { + block := p.xeth().EthBlockByNumber(blocknum) + br := NewBlockRes(block) + br.fullTx = includetx + return br, nil +} + +func (p *EthereumApi) GetBlockTransactionCountByHash(blockhash string) (int64, error) { + block := p.xeth().EthBlockByHash(blockhash) + br := NewBlockRes(block) + return int64(len(br.Transactions)), nil +} + +func (p *EthereumApi) GetBlockTransactionCountByNumber(blocknum int64) (int64, error) { + block := p.xeth().EthBlockByNumber(blocknum) + br := NewBlockRes(block) + return int64(len(br.Transactions)), nil +} + +func (p *EthereumApi) GetBlockUncleCountByHash(blockhash string) (int64, error) { + block := p.xeth().EthBlockByHash(blockhash) + br := NewBlockRes(block) + return int64(len(br.Uncles)), nil +} + +func (p *EthereumApi) GetBlockUncleCountByNumber(blocknum int64) (int64, error) { + block := p.xeth().EthBlockByNumber(blocknum) + br := NewBlockRes(block) + return int64(len(br.Uncles)), nil +} + func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error { // Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC rpclogger.DebugDetailf("%T %s", req.Params, req.Params) @@ -468,10 +506,49 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error } return p.GetTxCountAt(args, reply) case "eth_getBlockTransactionCountByHash": + args := new(GetBlockByHashArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockTransactionCountByHash(args.BlockHash) + if err != nil { + return err + } + *reply = toHex(big.NewInt(v).Bytes()) case "eth_getBlockTransactionCountByNumber": + args := new(GetBlockByNumberArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockTransactionCountByNumber(args.BlockNumber) + if err != nil { + return err + } + *reply = toHex(big.NewInt(v).Bytes()) case "eth_getUncleCountByBlockHash": + args := new(GetBlockByHashArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockUncleCountByHash(args.BlockHash) + if err != nil { + return err + } + *reply = toHex(big.NewInt(v).Bytes()) case "eth_getUncleCountByBlockNumber": - return errNotImplemented + args := new(GetBlockByNumberArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockUncleCountByNumber(args.BlockNumber) + if err != nil { + return err + } + *reply = toHex(big.NewInt(v).Bytes()) case "eth_getData": // TODO handle BlockNumber args := new(GetDataArgs) @@ -494,19 +571,27 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error case "eth_flush": return errNotImplemented case "eth_getBlockByHash": - // TODO handle second param for "include transaction objects" args := new(GetBlockByHashArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } - *reply = p.xeth().BlockByHash(args.BlockHash) + + v, err := p.GetBlockByHash(args.BlockHash, args.Transactions) + if err != nil { + return err + } + *reply = v case "eth_getBlockByNumber": - // TODO handle second param for "include transaction objects" args := new(GetBlockByNumberArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } - *reply = p.xeth().BlockByNumber(args.BlockNumber) + + v, err := p.GetBlockByNumber(args.BlockNumber, args.Transactions) + if err != nil { + return err + } + *reply = v case "eth_getTransactionByHash": case "eth_getTransactionByBlockHashAndIndex": case "eth_getTransactionByBlockNumberAndIndex": -- cgit v1.2.3 From f22684439a807f88406e90718e61d536edd469f1 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 10 Mar 2015 20:14:38 +0100 Subject: Updated RPC * Added a generic RawMessage deserialiser * Updated ethereum.js * Updated coin test app --- rpc/api.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index dc0945d19..c03168863 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -165,7 +165,7 @@ func (self *EthereumApi) NewFilter(args *FilterOptions, reply *interface{}) erro id = self.filterManager.InstallFilter(filter) self.logs[id] = &logFilter{timeout: time.Now()} - *reply = id + *reply = i2hex(id) return nil } @@ -417,7 +417,7 @@ func (p *EthereumApi) WhisperMessages(id int, reply *interface{}) error { func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error { // Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC - rpclogger.DebugDetailf("%T %s", req.Params, req.Params) + rpclogger.Infof("%s %s", req.Method, req.Params) switch req.Method { case "web3_sha3": args := new(Sha3Args) @@ -446,7 +446,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.GetBalance(args, reply) - case "eth_getStorage": + case "eth_getStorage", "eth_storageAt": // TODO handle BlockNumber args := new(GetStorageArgs) if err := json.Unmarshal(req.Params, &args); err != nil { -- cgit v1.2.3 From 35841e51901149a496645b3c3c6be4ec7a58e6c6 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 10 Mar 2015 20:16:53 +0100 Subject: id to hex --- rpc/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 0abed3c14..511b819c1 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -195,7 +195,7 @@ func (self *EthereumApi) NewFilterString(args string, reply *interface{}) error id = self.filterManager.InstallFilter(filter) self.logs[id] = &logFilter{timeout: time.Now()} - *reply = id + *reply = i2hex(id) return nil } -- cgit v1.2.3 From ce595b9266d658a5eae626d78aec7f47c04222ca Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 10 Mar 2015 20:28:20 +0100 Subject: fallback --- rpc/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 511b819c1..38f02a473 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -556,7 +556,7 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error return err } return p.GetData(args, reply) - case "eth_sendTransaction": + case "eth_sendTransaction", "eth_transact": args := new(NewTxArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err -- cgit v1.2.3 From 499f816e3034c3e781f8ad35da070c9989cf6e3c Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 10 Mar 2015 19:10:02 -0500 Subject: Output hex should be prepended with 0x --- rpc/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 511b819c1..a8c365b22 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -455,7 +455,7 @@ func (p *EthereumApi) GetBlockUncleCountByNumber(blocknum int64) (int64, error) func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error { // Spec at https://github.com/ethereum/wiki/wiki/Generic-JSON-RPC - rpclogger.Infof("%s %s", req.Method, req.Params) + rpclogger.Debugf("%s %s", req.Method, req.Params) switch req.Method { case "web3_sha3": args := new(Sha3Args) -- cgit v1.2.3 From 9ce5229ddfccfccf1215e44477b665de031e4e1e Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Tue, 10 Mar 2015 22:25:07 -0500 Subject: Get transaction via block & index --- rpc/api.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index a8c365b22..510939cd7 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -593,8 +593,35 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error } *reply = v case "eth_getTransactionByHash": + return errNotImplemented case "eth_getTransactionByBlockHashAndIndex": + args := new(HashIndexArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockByHash(args.BlockHash, true) + if err != nil { + return err + } + if args.TxIndex > int64(len(v.Transactions)) || args.TxIndex < 0 { + return NewErrorWithMessage(errDecodeArgs, "Transaction index does not exist") + } + *reply = v.Transactions[args.TxIndex] case "eth_getTransactionByBlockNumberAndIndex": + args := new(BlockNumIndexArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockByNumber(args.BlockNumber, true) + if err != nil { + return err + } + if args.TxIndex > int64(len(v.Transactions)) || args.TxIndex < 0 { + return NewErrorWithMessage(errDecodeArgs, "Transaction index does not exist") + } + *reply = v.Transactions[args.TxIndex] case "eth_getUncleByBlockHashAndIndex": case "eth_getUncleByBlockNumberAndIndex": return errNotImplemented -- cgit v1.2.3 From d465e410eff0ab255d0e427a8cf2f37ac10311da Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 11 Mar 2015 10:25:15 -0500 Subject: TxIndex -> Index --- rpc/api.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index f552b3ef3..335f6cabd 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -608,10 +608,10 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error if err != nil { return err } - if args.TxIndex > int64(len(v.Transactions)) || args.TxIndex < 0 { + if args.Index > int64(len(v.Transactions)) || args.Index < 0 { return NewErrorWithMessage(errDecodeArgs, "Transaction index does not exist") } - *reply = v.Transactions[args.TxIndex] + *reply = v.Transactions[args.Index] case "eth_getTransactionByBlockNumberAndIndex": args := new(BlockNumIndexArgs) if err := json.Unmarshal(req.Params, &args); err != nil { @@ -622,10 +622,10 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error if err != nil { return err } - if args.TxIndex > int64(len(v.Transactions)) || args.TxIndex < 0 { + if args.Index > int64(len(v.Transactions)) || args.Index < 0 { return NewErrorWithMessage(errDecodeArgs, "Transaction index does not exist") } - *reply = v.Transactions[args.TxIndex] + *reply = v.Transactions[args.Index] case "eth_getUncleByBlockHashAndIndex": case "eth_getUncleByBlockNumberAndIndex": return errNotImplemented -- cgit v1.2.3 From 9e89c803f124e98530067c409a67c03d7ab99ef3 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 11 Mar 2015 10:27:32 -0500 Subject: Get Uncles --- rpc/api.go | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 335f6cabd..90d09d281 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -627,8 +627,43 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error } *reply = v.Transactions[args.Index] case "eth_getUncleByBlockHashAndIndex": + args := new(HashIndexArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockByHash(args.BlockHash, false) + if err != nil { + return err + } + if args.Index > int64(len(v.Uncles)) || args.Index < 0 { + return NewErrorWithMessage(errDecodeArgs, "Uncle index does not exist") + } + + uncle, err := p.GetBlockByHash(toHex(v.Uncles[args.Index]), false) + if err != nil { + return err + } + *reply = uncle case "eth_getUncleByBlockNumberAndIndex": - return errNotImplemented + args := new(BlockNumIndexArgs) + if err := json.Unmarshal(req.Params, &args); err != nil { + return err + } + + v, err := p.GetBlockByNumber(args.BlockNumber, true) + if err != nil { + return err + } + if args.Index > int64(len(v.Uncles)) || args.Index < 0 { + return NewErrorWithMessage(errDecodeArgs, "Uncle index does not exist") + } + + uncle, err := p.GetBlockByHash(toHex(v.Uncles[args.Index]), false) + if err != nil { + return err + } + *reply = uncle case "eth_getCompilers": return p.GetCompilers(reply) case "eth_compileSolidity": -- cgit v1.2.3 From 90f34ed40a1b3c87073d7e2e13b5515cc4cb3940 Mon Sep 17 00:00:00 2001 From: Taylor Gerring Date: Wed, 11 Mar 2015 10:56:44 -0500 Subject: Rename Topic to Topics --- rpc/api.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index 90d09d281..337611114 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -400,7 +400,7 @@ func (self *EthereumApi) MessagesChanged(id int, reply *interface{}) error { } func (p *EthereumApi) WhisperPost(args *WhisperMessageArgs, reply *interface{}) error { - err := p.xeth().Whisper().Post(args.Payload, args.To, args.From, args.Topic, args.Priority, args.Ttl) + err := p.xeth().Whisper().Post(args.Payload, args.To, args.From, args.Topics, args.Priority, args.Ttl) if err != nil { return err } -- cgit v1.2.3 From e8d1b622d9381a2717f1a09f29078e07c23b01bd Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 11 Mar 2015 17:00:20 +0100 Subject: Default block number changes --- rpc/api.go | 70 +++++++++++++++++++++++--------------------------------------- 1 file changed, 26 insertions(+), 44 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index f552b3ef3..f214c212b 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -22,7 +22,7 @@ import ( var ( defaultGasPrice = big.NewInt(10000000000000) - defaultGas = big.NewInt(10000) + defaultGas = big.NewInt(50000) filterTickerTime = 15 * time.Second ) @@ -44,8 +44,6 @@ type EthereumApi struct { register map[string][]*NewTxArgs db ethutil.Database - - // defaultBlockAge int64 } func NewEthereumApi(eth *xeth.XEth, dataDir string) *EthereumApi { @@ -58,7 +56,6 @@ func NewEthereumApi(eth *xeth.XEth, dataDir string) *EthereumApi { logs: make(map[int]*logFilter), messages: make(map[int]*whisperFilter), db: db, - // defaultBlockAge: -1, } go api.filterManager.Start() go api.start() @@ -66,36 +63,33 @@ func NewEthereumApi(eth *xeth.XEth, dataDir string) *EthereumApi { return api } -// func (self *EthereumApi) setStateByBlockNumber(num int64) { -// chain := self.xeth().Backend().ChainManager() -// var block *types.Block +func (self *EthereumApi) xethWithStateNum(num int64) *xeth.XEth { + chain := self.xeth().Backend().ChainManager() + var block *types.Block -// if self.defaultBlockAge < 0 { -// num = chain.CurrentBlock().Number().Int64() + num + 1 -// } -// block = chain.GetBlockByNumber(uint64(num)) + if num < 0 { + num = chain.CurrentBlock().Number().Int64() + num + 1 + } + block = chain.GetBlockByNumber(uint64(num)) -// if block != nil { -// self.useState(state.New(block.Root(), self.xeth().Backend().StateDb())) -// } else { -// self.useState(chain.State()) -// } -// } + var st *state.StateDB + if block != nil { + st = state.New(block.Root(), self.xeth().Backend().StateDb()) + } else { + st = chain.State() + } + return self.xeth().WithState(st) +} + +func (self *EthereumApi) getStateWithNum(num int64) *xeth.State { + return self.xethWithStateNum(num).State() +} func (self *EthereumApi) start() { timer := time.NewTicker(filterTickerTime) - // events := self.mux.Subscribe(core.ChainEvent{}) - done: for { select { - // case ev := <-events.Chan(): - // switch ev.(type) { - // case core.ChainEvent: - // if self.defaultBlockAge < 0 { - // self.setStateByBlockNumber(self.defaultBlockAge) - // } - // } case <-timer.C: self.logMut.Lock() self.messagesMut.Lock() @@ -277,7 +271,7 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) (err error) } func (p *EthereumApi) Call(args *NewTxArgs, reply *interface{}) error { - result, err := p.xeth().Call(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) + result, err := p.xethWithStateNum(args.BlockNumber).Call(args.From, args.To, args.Value.String(), args.Gas.String(), args.GasPrice.String(), args.Data) if err != nil { return err } @@ -290,7 +284,7 @@ func (p *EthereumApi) GetBalance(args *GetBalanceArgs, reply *interface{}) error if err := args.requirements(); err != nil { return err } - state := p.xeth().State().SafeGet(args.Address) + state := p.getStateWithNum(args.BlockNumber).SafeGet(args.Address) *reply = toHex(state.Balance().Bytes()) return nil } @@ -299,7 +293,7 @@ func (p *EthereumApi) GetStorage(args *GetStorageArgs, reply *interface{}) error if err := args.requirements(); err != nil { return err } - *reply = p.xeth().State().SafeGet(args.Address).Storage() + *reply = p.getStateWithNum(args.BlockNumber).SafeGet(args.Address).Storage() return nil } @@ -307,7 +301,7 @@ func (p *EthereumApi) GetStorageAt(args *GetStorageAtArgs, reply *interface{}) e if err := args.requirements(); err != nil { return err } - state := p.xeth().State().SafeGet(args.Address) + state := p.getStateWithNum(args.BlockNumber).SafeGet(args.Address) value := state.StorageString(args.Key) var hx string @@ -328,7 +322,7 @@ func (p *EthereumApi) GetTxCountAt(args *GetTxCountArgs, reply *interface{}) err if err != nil { return err } - *reply = p.xeth().TxCountAt(args.Address) + *reply = p.xethWithStateNum(args.BlockNumber).TxCountAt(args.Address) return nil } @@ -336,7 +330,7 @@ func (p *EthereumApi) GetData(args *GetDataArgs, reply *interface{}) error { if err := args.requirements(); err != nil { return err } - *reply = p.xeth().CodeAt(args.Address) + *reply = p.xethWithStateNum(args.BlockNumber).CodeAt(args.Address) return nil } @@ -482,28 +476,24 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error case "eth_blockNumber": *reply = toHex(p.xeth().Backend().ChainManager().CurrentBlock().Number().Bytes()) case "eth_getBalance": - // TODO handle BlockNumber args := new(GetBalanceArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.GetBalance(args, reply) case "eth_getStorage", "eth_storageAt": - // TODO handle BlockNumber args := new(GetStorageArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.GetStorage(args, reply) case "eth_getStorageAt": - // TODO handle BlockNumber args := new(GetStorageAtArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err } return p.GetStorageAt(args, reply) case "eth_getTransactionCount": - // TODO handle BlockNumber args := new(GetTxCountArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err @@ -554,7 +544,6 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error } *reply = toHex(big.NewInt(v).Bytes()) case "eth_getData": - // TODO handle BlockNumber args := new(GetDataArgs) if err := json.Unmarshal(req.Params, &args); err != nil { return err @@ -756,13 +745,6 @@ func (self *EthereumApi) xeth() *xeth.XEth { return self.eth } -func (self *EthereumApi) useState(statedb *state.StateDB) { - self.xethMu.Lock() - defer self.xethMu.Unlock() - - self.eth = self.eth.UseState(statedb) -} - func toFilterOptions(options *FilterOptions) core.FilterOptions { var opts core.FilterOptions -- cgit v1.2.3 From c01d4c2f4c8704656e407ab4d80d9ec82e016731 Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 11 Mar 2015 17:36:35 +0100 Subject: Lowered default gas price and increased default gas limit --- rpc/api.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'rpc/api.go') diff --git a/rpc/api.go b/rpc/api.go index fb974883a..8bbe80bd8 100644 --- a/rpc/api.go +++ b/rpc/api.go @@ -21,8 +21,8 @@ import ( ) var ( - defaultGasPrice = big.NewInt(10000000000000) - defaultGas = big.NewInt(50000) + defaultGasPrice = big.NewInt(150000000000) + defaultGas = big.NewInt(500000) filterTickerTime = 15 * time.Second ) @@ -252,7 +252,6 @@ func (p *EthereumApi) Transact(args *NewTxArgs, reply *interface{}) (err error) */ // TODO: align default values to have the same type, e.g. not depend on // ethutil.Value conversions later on - fmt.Println("gas", args.Gas) if args.Gas.Cmp(big.NewInt(0)) == 0 { args.Gas = defaultGas } -- cgit v1.2.3