diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/ethereum/cmd.go | 51 | ||||
-rw-r--r-- | cmd/ethereum/main.go | 8 | ||||
-rw-r--r-- | cmd/ethereum/repl/repl.go | 104 | ||||
-rw-r--r-- | cmd/evm/main.go | 1 | ||||
-rw-r--r-- | cmd/mist/gui.go | 2 | ||||
-rw-r--r-- | cmd/mist/ui_lib.go | 3 | ||||
-rw-r--r-- | cmd/utils/cmd.go | 39 |
7 files changed, 128 insertions, 80 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/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() +} diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 432cbd001..d6a93460e 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -65,7 +65,6 @@ func main() { statedb := state.New(nil, db) sender := statedb.NewStateObject([]byte("sender")) receiver := statedb.NewStateObject([]byte("receiver")) - //receiver.SetCode([]byte(*code)) receiver.SetCode(ethutil.Hex2Bytes(*code)) vmenv := NewEnv(statedb, []byte("evmuser"), ethutil.Big(*value)) diff --git a/cmd/mist/gui.go b/cmd/mist/gui.go index 35bfdf9a3..a69049894 100644 --- a/cmd/mist/gui.go +++ b/cmd/mist/gui.go @@ -158,8 +158,6 @@ func (gui *Gui) Stop() { gui.win.Hide() } - gui.uiLib.jsEngine.Stop() - guilogger.Infoln("Stopped") } diff --git a/cmd/mist/ui_lib.go b/cmd/mist/ui_lib.go index 4fa6e8e55..098e8fca5 100644 --- a/cmd/mist/ui_lib.go +++ b/cmd/mist/ui_lib.go @@ -58,7 +58,8 @@ type UiLib struct { } func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { - lib := &UiLib{XEth: xeth.New(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)} + x := xeth.New(eth) + lib := &UiLib{XEth: x, engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(x), filterCallbacks: make(map[int][]int)} //, filters: make(map[int]*xeth.JSFilter)} lib.filterManager = filter.NewFilterManager(eth.EventMux()) go lib.filterManager.Start() diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 723cfa887..2bd34d792 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -32,7 +32,6 @@ import ( "github.com/ethereum/go-ethereum/eth" "github.com/ethereum/go-ethereum/ethutil" "github.com/ethereum/go-ethereum/logger" - "github.com/ethereum/go-ethereum/miner" "github.com/ethereum/go-ethereum/rlp" rpchttp "github.com/ethereum/go-ethereum/rpc/http" "github.com/ethereum/go-ethereum/state" @@ -169,32 +168,6 @@ func StartRpc(ethereum *eth.Ethereum, RpcListenAddress string, RpcPort int) { } } -var gminer *miner.Miner - -func GetMiner() *miner.Miner { - return gminer -} - -func StartMining(ethereum *eth.Ethereum) bool { - if !ethereum.Mining { - ethereum.Mining = true - addr := ethereum.KeyManager().Address() - - go func() { - clilogger.Infoln("Start mining") - if gminer == nil { - gminer = miner.New(addr, ethereum, 4) - } - gminer.Start() - }() - RegisterInterrupt(func(os.Signal) { - StopMining(ethereum) - }) - return true - } - return false -} - func FormatTransactionData(data string) []byte { d := ethutil.StringToByteFunc(data, func(s string) (ret []byte) { slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000) @@ -208,18 +181,6 @@ func FormatTransactionData(data string) []byte { return d } -func StopMining(ethereum *eth.Ethereum) bool { - if ethereum.Mining && gminer != nil { - gminer.Stop() - clilogger.Infoln("Stopped mining") - ethereum.Mining = false - - return true - } - - return false -} - // Replay block func BlockDo(ethereum *eth.Ethereum, hash []byte) error { block := ethereum.ChainManager().GetBlock(hash) |