diff options
author | obscuren <geffobscura@gmail.com> | 2015-03-04 19:18:26 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-03-04 19:18:26 +0800 |
commit | 15f491e5007d1507f20d0edce36cc9c0bd5cbd37 (patch) | |
tree | db8fcf0b0066ff66d91f6e89d7c89951c440b395 /cmd | |
parent | 5817dab89e404847764eb74b35539c01747743f3 (diff) | |
download | dexon-15f491e5007d1507f20d0edce36cc9c0bd5cbd37.tar.gz dexon-15f491e5007d1507f20d0edce36cc9c0bd5cbd37.tar.zst dexon-15f491e5007d1507f20d0edce36cc9c0bd5cbd37.zip |
Clean up REPL
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/ethereum/cmd.go | 51 | ||||
-rw-r--r-- | cmd/ethereum/flags.go | 1 | ||||
-rw-r--r-- | cmd/ethereum/main.go | 8 | ||||
-rw-r--r-- | cmd/ethereum/repl/repl.go | 104 |
4 files changed, 127 insertions, 37 deletions
diff --git a/cmd/ethereum/cmd.go b/cmd/ethereum/cmd.go index 8ffd868ed..7bb7c3ef7 100644 --- a/cmd/ethereum/cmd.go +++ b/cmd/ethereum/cmd.go @@ -1,43 +1,31 @@ -/* - This file is part of go-ethereum +// Copyright (c) 2013-2014, Jeffrey Wilcke. All rights reserved. +// +// This library 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 2.1 of the License, or (at your option) any later version. +// +// This library 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 this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +// MA 02110-1301 USA - 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 <http://www.gnu.org/licenses/>. -*/ -/** - * @authors - * Jeffrey Wilcke <i@jev.io> - */ package main import ( "io/ioutil" "os" - "github.com/ethereum/go-ethereum/cmd/ethereum/repl" - "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/javascript" + "github.com/ethereum/go-ethereum/xeth" ) -func InitJsConsole(ethereum *eth.Ethereum) { - repl := ethrepl.NewJSRepl(ethereum) - go repl.Start() - utils.RegisterInterrupt(func(os.Signal) { - repl.Stop() - }) -} - func ExecJsFile(ethereum *eth.Ethereum, InputFile string) { file, err := os.Open(InputFile) if err != nil { @@ -47,9 +35,6 @@ func ExecJsFile(ethereum *eth.Ethereum, InputFile string) { if err != nil { clilogger.Fatalln(err) } - re := javascript.NewJSRE(ethereum) - utils.RegisterInterrupt(func(os.Signal) { - re.Stop() - }) + re := javascript.NewJSRE(xeth.New(ethereum)) re.Run(string(content)) } diff --git a/cmd/ethereum/flags.go b/cmd/ethereum/flags.go index 0866ef3dd..a3004f503 100644 --- a/cmd/ethereum/flags.go +++ b/cmd/ethereum/flags.go @@ -120,6 +120,7 @@ func Init() { flag.BoolVar(&StartMining, "mine", false, "start mining") flag.BoolVar(&StartJsConsole, "js", false, "launches javascript console") flag.BoolVar(&PrintVersion, "version", false, "prints version number") + flag.IntVar(&MinerThreads, "minerthreads", runtime.NumCPU(), "number of miner threads") // Network stuff var ( diff --git a/cmd/ethereum/main.go b/cmd/ethereum/main.go index ff306b10f..b9e69f700 100644 --- a/cmd/ethereum/main.go +++ b/cmd/ethereum/main.go @@ -26,6 +26,7 @@ import ( "runtime" "time" + "github.com/ethereum/go-ethereum/cmd/ethereum/repl" "github.com/ethereum/go-ethereum/cmd/utils" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" @@ -137,7 +138,12 @@ func main() { } if StartJsConsole { - InitJsConsole(ethereum) + repl := ethrepl.NewJSRepl(ethereum) + repl.Start() + utils.RegisterInterrupt(func(os.Signal) { + repl.Stop() + }) + } else if len(InputFile) > 0 { ExecJsFile(ethereum, InputFile) } diff --git a/cmd/ethereum/repl/repl.go b/cmd/ethereum/repl/repl.go index 11b812617..ec1aa6918 100644 --- a/cmd/ethereum/repl/repl.go +++ b/cmd/ethereum/repl/repl.go @@ -24,10 +24,14 @@ import ( "os" "path" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/javascript" "github.com/ethereum/go-ethereum/logger" + "github.com/ethereum/go-ethereum/state" + "github.com/ethereum/go-ethereum/xeth" + "github.com/obscuren/otto" ) var repllogger = logger.NewLogger("REPL") @@ -38,7 +42,9 @@ type Repl interface { } type JSRepl struct { - re *javascript.JSRE + re *javascript.JSRE + ethereum *eth.Ethereum + xeth *xeth.XEth prompt string @@ -53,7 +59,11 @@ func NewJSRepl(ethereum *eth.Ethereum) *JSRepl { panic(err) } - return &JSRepl{re: javascript.NewJSRE(ethereum), prompt: "> ", history: hist} + xeth := xeth.New(ethereum) + repl := &JSRepl{re: javascript.NewJSRE(xeth), xeth: xeth, ethereum: ethereum, prompt: "> ", history: hist} + repl.initStdFuncs() + + return repl } func (self *JSRepl) Start() { @@ -80,7 +90,6 @@ func (self *JSRepl) Start() { func (self *JSRepl) Stop() { if self.running { self.running = false - self.re.Stop() repllogger.Infoln("exit JS Console") self.history.Close() } @@ -101,3 +110,92 @@ func (self *JSRepl) parseInput(code string) { self.PrintValue(value) } + +func (self *JSRepl) initStdFuncs() { + t, _ := self.re.Vm.Get("eth") + eth := t.Object() + eth.Set("connect", self.connect) + eth.Set("stopMining", self.stopMining) + eth.Set("startMining", self.startMining) + eth.Set("dump", self.dump) + eth.Set("export", self.export) +} + +/* + * The following methods are natively implemented javascript functions + */ + +func (self *JSRepl) dump(call otto.FunctionCall) otto.Value { + var block *types.Block + + if len(call.ArgumentList) > 0 { + if call.Argument(0).IsNumber() { + num, _ := call.Argument(0).ToInteger() + block = self.ethereum.ChainManager().GetBlockByNumber(uint64(num)) + } else if call.Argument(0).IsString() { + hash, _ := call.Argument(0).ToString() + block = self.ethereum.ChainManager().GetBlock(ethutil.Hex2Bytes(hash)) + } else { + fmt.Println("invalid argument for dump. Either hex string or number") + } + + if block == nil { + fmt.Println("block not found") + + return otto.UndefinedValue() + } + + } else { + block = self.ethereum.ChainManager().CurrentBlock() + } + + statedb := state.New(block.Root(), self.ethereum.Db()) + + v, _ := self.re.Vm.ToValue(statedb.RawDump()) + + return v +} + +func (self *JSRepl) stopMining(call otto.FunctionCall) otto.Value { + self.xeth.Miner().Stop() + + return otto.TrueValue() +} + +func (self *JSRepl) startMining(call otto.FunctionCall) otto.Value { + self.xeth.Miner().Start() + return otto.TrueValue() +} + +func (self *JSRepl) connect(call otto.FunctionCall) otto.Value { + nodeURL, err := call.Argument(0).ToString() + if err != nil { + return otto.FalseValue() + } + if err := self.ethereum.SuggestPeer(nodeURL); err != nil { + return otto.FalseValue() + } + return otto.TrueValue() +} + +func (self *JSRepl) export(call otto.FunctionCall) otto.Value { + if len(call.ArgumentList) == 0 { + fmt.Println("err: require file name") + return otto.FalseValue() + } + + fn, err := call.Argument(0).ToString() + if err != nil { + fmt.Println(err) + return otto.FalseValue() + } + + data := self.ethereum.ChainManager().Export() + + if err := ethutil.WriteFile(fn, data); err != nil { + fmt.Println(err) + return otto.FalseValue() + } + + return otto.TrueValue() +} |