diff --git a/ethereal/config.go b/ethereal/config.go index ac4484d0b..94f896c5f 100644 --- a/ethereal/config.go +++ b/ethereal/config.go @@ -6,6 +6,7 @@ import ( var StartConsole bool var StartMining bool +var StartRpc bool var UseUPnP bool var OutboundPort string var ShowGenesis bool @@ -21,6 +22,7 @@ var AssetPath string func Init() { flag.BoolVar(&StartConsole, "c", false, "debug and testing console") flag.BoolVar(&StartMining, "m", false, "start dagger mining") + flag.BoolVar(&StartRpc, "r", false, "start rpc server") flag.BoolVar(&ShowGenesis, "g", false, "prints genesis header and exits") flag.BoolVar(&UseUPnP, "upnp", false, "enable UPnP support") flag.BoolVar(&UseSeed, "seed", true, "seed peers") diff --git a/ethereum/config.go b/ethereum/config.go index b796af5cd..234e79f12 100644 --- a/ethereum/config.go +++ b/ethereum/config.go @@ -6,6 +6,7 @@ import ( var StartConsole bool var StartMining bool +var StartRpc bool var UseUPnP bool var OutboundPort string var ShowGenesis bool @@ -24,6 +25,7 @@ func Init() { flag.BoolVar(&StartMining, "m", false, "start dagger mining") flag.BoolVar(&ShowGenesis, "g", false, "prints genesis header and exits") //flag.BoolVar(&UseGui, "gui", true, "use the gui") + flag.BoolVar(&StartRpc, "r", false, "start rpc server") flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)") flag.BoolVar(&UseUPnP, "upnp", false, "enable UPnP support") flag.BoolVar(&UseSeed, "seed", true, "seed peers") diff --git a/ethereum/ethereum.go b/ethereum/ethereum.go index 04851d2bd..0b56855e0 100644 --- a/ethereum/ethereum.go +++ b/ethereum/ethereum.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethchain" + "github.com/ethereum/eth-go/etherpc" "github.com/ethereum/eth-go/ethminer" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/go-ethereum/utils" @@ -131,6 +132,10 @@ func main() { console := NewConsole(ethereum) go console.Start() } + if StartRpc { + ethereum.RpcServer = etherpc.NewJsonRpcServer() + go ethereum.RpcServer.Start() + } RegisterInterrupts(ethereum) ethereum.Start() diff --git a/etherpc/packages.go b/etherpc/packages.go deleted file mode 100644 index 283da1a18..000000000 --- a/etherpc/packages.go +++ /dev/null @@ -1,185 +0,0 @@ -package main - -import ( - "encoding/json" - "errors" - "math/big" -) - -type MainPackage struct{} - -type JsonResponse interface { - requirements() error -} - -type BlockResponse struct { - Name string - Id int -} -type GetBlockArgs struct { - JsonResponse - BlockNumber int - Hash string -} - -type ErrorResponse struct { - Error bool - ErrorText string -} - -type SuccessRes struct { - Error bool - Message string -} - -func NewSuccessRes(msg string) string { - e := SuccessRes{Error: true, Message: msg} - res, err := json.Marshal(e) - if err != nil { - // This should never happen - panic("Creating json error response failed, help") - } - return string(res) -} - -func NewErrorResponse(msg string) error { - e := ErrorResponse{Error: true, ErrorText: msg} - res, err := json.Marshal(e) - if err != nil { - // This should never happen - panic("Creating json error response failed, help") - } - newErr := errors.New(string(res)) - return newErr -} - -func (b *GetBlockArgs) requirements() error { - if b.BlockNumber == 0 && b.Hash == "" { - return NewErrorResponse("This call requires either a block 'number' or a block 'hash' as argument") - } - return nil -} - -func (p *MainPackage) GetBlock(args *GetBlockArgs, reply *BlockResponse) error { - err := args.requirements() - if err != nil { - return err - } - // Do something - - return nil -} - -type NewTxArgs struct { - Sec string - Recipient string - Value *big.Int - Gas *big.Int - GasPrice *big.Int - Init string - Body string -} -type TxResponse struct { -} - -func (a *NewTxArgs) requirements() error { - if a.Recipient == "" { - return NewErrorResponse("Transact requires a 'recipient' address as argument") - } - if a.Value == nil { - return NewErrorResponse("Transact requires a 'value' as argument") - } - if a.Gas == nil { - return NewErrorResponse("Transact requires a 'gas' value as argument") - } - if a.GasPrice == nil { - return NewErrorResponse("Transact requires a 'gasprice' value as argument") - } - return nil -} - -func (a *NewTxArgs) requirementsContract() error { - if a.Value == nil { - return NewErrorResponse("Create requires a 'value' as argument") - } - if a.Gas == nil { - return NewErrorResponse("Create requires a 'gas' value as argument") - } - if a.GasPrice == nil { - return NewErrorResponse("Create requires a 'gasprice' value as argument") - } - if a.Init == "" { - return NewErrorResponse("Create requires a 'init' value as argument") - } - if a.Body == "" { - return NewErrorResponse("Create requires a 'body' value as argument") - } - return nil -} - -func (p *MainPackage) Transact(args *NewTxArgs, reply *TxResponse) error { - err := args.requirements() - if err != nil { - return err - } - return nil -} - -func (p *MainPackage) Create(args *NewTxArgs, reply *string) error { - err := args.requirementsContract() - if err != nil { - return err - } - return nil -} - -func (p *MainPackage) getKey(args interface{}, reply *string) error { - return nil -} - -type GetStorageArgs struct { - Address string - Key string -} - -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 -} - -func (p *MainPackage) getStorageAt(args *GetStorageArgs, reply *string) error { - err := args.requirements() - if err != nil { - return err - } - return nil -} - -type GetBalanceArgs struct { - Address string -} - -func (a *GetBalanceArgs) requirements() error { - if a.Address == "" { - return NewErrorResponse("GetBalanceAt requires an 'address' value as argument") - } - return nil -} - -func (p *MainPackage) GetBalanceAt(args *GetBalanceArgs, reply *string) error { - err := args.requirements() - if err != nil { - return err - } - return nil -} - -func (p *MainPackage) Test(args *GetBlockArgs, reply *int) error { - *reply = 15 - return nil -} diff --git a/etherpc/server.go b/etherpc/server.go deleted file mode 100644 index 291ca2d95..000000000 --- a/etherpc/server.go +++ /dev/null @@ -1,82 +0,0 @@ -package main - -import ( - "log" - "net" - "net/rpc" - "net/rpc/jsonrpc" -) - -type JsonRpcServer struct { - quit chan bool - listener net.Listener -} - -func (s *JsonRpcServer) exitHandler() { -out: - for { - select { - case <-s.quit: - s.listener.Close() - break out - } - } - - // ethutil.Config.Log.Infoln("[JSON] Shutdown JSON-RPC server") - log.Println("[JSON] Shutdown JSON-RPC server") -} - -func (s *JsonRpcServer) Stop() { - close(s.quit) -} - -func (s *JsonRpcServer) Start() { - // ethutil.Config.Log.Infoln("[JSON] Starting JSON-RPC server") - log.Println("[JSON] Starting JSON-RPC server") - go s.exitHandler() - rpc.Register(new(MainPackage)) - rpc.HandleHTTP() - - for { - conn, err := s.listener.Accept() - if err != nil { - // ethutil.Config.Log.Infoln("[JSON] Error starting JSON-RPC:", err) - log.Println("[JSON] Error starting JSON-RPC:", err) - continue - } - log.Println("Incoming request") - go jsonrpc.ServeConn(conn) - } -} - -func NewJsonRpcServer() *JsonRpcServer { - l, err := net.Listen("tcp", ":30304") - if err != nil { - // ethutil.Config.Log.Infoln("Error starting JSON-RPC") - log.Println("Error starting JSON-RPC") - } - - return &JsonRpcServer{ - listener: l, - quit: make(chan bool), - } -} - -func main() { - s := NewJsonRpcServer() - s.Start() - /* - - conn, err := net.Dial("tcp", "localhost:30304") - - if err != nil { - panic(err) - } - defer conn.Close() - c := jsonrpc.NewClient(conn) - var reply int - err = c.Call("MainPackage.Test", nil, &reply) - log.Println("ERR:", err) - log.Println("result:", reply) - */ -}