aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/blocktest/flags.go41
-rw-r--r--cmd/blocktest/main.go186
-rw-r--r--cmd/ethereum/main.go89
-rw-r--r--cmd/mist/assets/qml/main.qml5
-rw-r--r--cmd/mist/assets/qml/views/info.qml41
-rw-r--r--cmd/mist/bindings.go33
-rw-r--r--cmd/mist/debugger.go8
-rw-r--r--cmd/mist/flags.go130
-rw-r--r--cmd/mist/gui.go56
-rw-r--r--cmd/mist/main.go101
-rw-r--r--cmd/mist/ui_lib.go1
-rw-r--r--cmd/utils/cmd.go52
-rw-r--r--cmd/utils/flags.go79
13 files changed, 234 insertions, 588 deletions
diff --git a/cmd/blocktest/flags.go b/cmd/blocktest/flags.go
deleted file mode 100644
index c811e5b85..000000000
--- a/cmd/blocktest/flags.go
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- 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 <http://www.gnu.org/licenses/>.
-*/
-/**
- * @authors
- * Gustav Simonsson <gustav.simonsson@gmail.com>
- */
-package main
-
-import (
- "flag"
- "fmt"
- "os"
-)
-
-var (
- TestFile string
-)
-
-func Init() {
- flag.Usage = func() {
- fmt.Fprintf(os.Stderr, "%s <testfile>\n", os.Args[0])
- flag.PrintDefaults()
- }
- flag.Parse()
-
- TestFile = flag.Arg(0)
-}
diff --git a/cmd/blocktest/main.go b/cmd/blocktest/main.go
index 4a05b8bee..d9d97abc9 100644
--- a/cmd/blocktest/main.go
+++ b/cmd/blocktest/main.go
@@ -25,34 +25,26 @@ package main
import (
"bytes"
- "crypto/ecdsa"
"encoding/hex"
"encoding/json"
+ "flag"
"fmt"
"io/ioutil"
"log"
"math/big"
- "path"
+ "os"
"runtime"
- "strconv"
"strings"
- "time"
"github.com/ethereum/go-ethereum/cmd/utils"
+ "github.com/ethereum/go-ethereum/core"
types "github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/eth"
- "github.com/ethereum/go-ethereum/ethutil"
+ "github.com/ethereum/go-ethereum/ethdb"
+ "github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/logger"
- "github.com/ethereum/go-ethereum/p2p"
- "github.com/ethereum/go-ethereum/p2p/nat"
"github.com/ethereum/go-ethereum/rlp"
)
-const (
- ClientIdentifier = "Ethereum(G)"
- Version = "0.8.6"
-)
-
type Account struct {
Balance string
Code string
@@ -78,6 +70,7 @@ type BlockHeader struct {
TransactionsTrie string
UncleHash string
}
+
type Tx struct {
Data string
GasLimit string
@@ -103,103 +96,44 @@ type Test struct {
Pre map[string]Account
}
-var (
- Identifier string
- KeyRing string
- DiffTool bool
- DiffType string
- KeyStore string
- StartRpc bool
- StartWebSockets bool
- RpcListenAddress string
- RpcPort int
- WsPort int
- OutboundPort string
- ShowGenesis bool
- AddPeer string
- MaxPeer int
- GenAddr bool
- BootNodes string
- NodeKey *ecdsa.PrivateKey
- NAT nat.Interface
- SecretFile string
- ExportDir string
- NonInteractive bool
- Datadir string
- LogFile string
- ConfigFile string
- DebugFile string
- LogLevel int
- LogFormat string
- Dump bool
- DumpHash string
- DumpNumber int
- VmType int
- ImportChain string
- SHH bool
- Dial bool
- PrintVersion bool
- MinerThreads int
-)
-
-// flags specific to cli client
-var (
- StartMining bool
- StartJsConsole bool
- InputFile string
-)
-
func main() {
- init_vars()
+ flag.Usage = func() {
+ fmt.Fprintf(os.Stderr, "%s <testfile>\n", os.Args[0])
+ flag.PrintDefaults()
+ }
+ flag.Parse()
- Init()
+ runtime.GOMAXPROCS(runtime.NumCPU())
+ logger.AddLogSystem(logger.NewStdLogSystem(os.Stderr, log.LstdFlags, logger.DebugDetailLevel))
+ defer func() { logger.Flush() }()
- if len(TestFile) < 1 {
- log.Fatal("Please specify test file")
+ if len(os.Args) < 2 {
+ utils.Fatalf("Please specify a test file as the first argument.")
}
- blocks, err := loadBlocksFromTestFile(TestFile)
+ blocks, err := loadBlocksFromTestFile(os.Args[1])
if err != nil {
- panic(err)
+ utils.Fatalf("Could not load blocks: %v", err)
}
- runtime.GOMAXPROCS(runtime.NumCPU())
+ chain := memchain()
+ chain.ResetWithGenesisBlock(blocks[0])
+ if err = chain.InsertChain(types.Blocks{blocks[1]}); err != nil {
+ utils.Fatalf("Error: %v", err)
+ } else {
+ fmt.Println("PASS")
+ }
+}
- defer func() {
- logger.Flush()
- }()
-
- utils.HandleInterrupt()
-
- utils.InitConfig(VmType, ConfigFile, Datadir, "ethblocktest")
-
- ethereum, err := eth.New(&eth.Config{
- Name: p2p.MakeName(ClientIdentifier, Version),
- KeyStore: KeyStore,
- DataDir: Datadir,
- LogFile: LogFile,
- LogLevel: LogLevel,
- LogFormat: LogFormat,
- MaxPeers: MaxPeer,
- Port: OutboundPort,
- NAT: NAT,
- KeyRing: KeyRing,
- Shh: true,
- Dial: Dial,
- BootNodes: BootNodes,
- NodeKey: NodeKey,
- MinerThreads: MinerThreads,
- })
-
- utils.StartRpc(ethereum, RpcListenAddress, RpcPort)
- utils.StartEthereum(ethereum)
-
- ethereum.ChainManager().ResetWithGenesisBlock(blocks[0])
-
- // fmt.Println("HURR: ", hex.EncodeToString(ethutil.Encode(blocks[0].RlpData())))
-
- go ethereum.ChainManager().InsertChain(types.Blocks{blocks[1]})
- fmt.Println("OK! ")
- ethereum.WaitForShutdown()
+func memchain() *core.ChainManager {
+ blockdb, err := ethdb.NewMemDatabase()
+ if err != nil {
+ utils.Fatalf("Could not create in-memory database: %v", err)
+ }
+ statedb, err := ethdb.NewMemDatabase()
+ if err != nil {
+ utils.Fatalf("Could not create in-memory database: %v", err)
+ }
+ return core.NewChainManager(blockdb, statedb, new(event.TypeMux))
}
func loadBlocksFromTestFile(filePath string) (blocks types.Blocks, err error) {
@@ -207,9 +141,8 @@ func loadBlocksFromTestFile(filePath string) (blocks types.Blocks, err error) {
if err != nil {
return
}
- bt := *new(map[string]Test)
- err = json.Unmarshal(fileContent, &bt)
- if err != nil {
+ bt := make(map[string]Test)
+ if err = json.Unmarshal(fileContent, &bt); err != nil {
return
}
@@ -272,49 +205,6 @@ func loadBlocksFromTestFile(filePath string) (blocks types.Blocks, err error) {
return
}
-func init_vars() {
- VmType = 0
- Identifier = ""
- KeyRing = ""
- KeyStore = "db"
- RpcListenAddress = "127.0.0.1"
- RpcPort = 8545
- WsPort = 40404
- StartRpc = true
- StartWebSockets = false
- NonInteractive = false
- GenAddr = false
- SecretFile = ""
- ExportDir = ""
- LogFile = ""
-
- timeStr := strconv.FormatInt(time.Now().UnixNano(), 10)
-
- Datadir = path.Join(ethutil.DefaultDataDir(), timeStr)
- ConfigFile = path.Join(ethutil.DefaultDataDir(), timeStr, "conf.ini")
-
- DebugFile = ""
- LogLevel = 5
- LogFormat = "std"
- DiffTool = false
- DiffType = "all"
- ShowGenesis = false
- ImportChain = ""
- Dump = false
- DumpHash = ""
- DumpNumber = -1
- StartMining = false
- StartJsConsole = false
- PrintVersion = false
- MinerThreads = runtime.NumCPU()
-
- Dial = false
- OutboundPort = "30303"
- BootNodes = ""
- MaxPeer = 1
-
-}
-
func hex_decode(s string) (res []byte, err error) {
return hex.DecodeString(strings.TrimPrefix(s, "0x"))
}
diff --git a/cmd/ethereum/main.go b/cmd/ethereum/main.go
index 8b361f7ae..1ae8e46a2 100644
--- a/cmd/ethereum/main.go
+++ b/cmd/ethereum/main.go
@@ -21,6 +21,7 @@
package main
import (
+ "bufio"
"fmt"
"os"
"runtime"
@@ -34,6 +35,7 @@ import (
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
+ "github.com/peterh/liner"
)
const (
@@ -43,12 +45,10 @@ const (
var (
clilogger = logger.NewLogger("CLI")
- app = cli.NewApp()
+ app = utils.NewApp(Version, "the go-ethereum command line interface")
)
func init() {
- app.Version = Version
- app.Usage = "the go-ethereum command-line client"
app.Action = run
app.HideVersion = true // we have a command to print the version
app.Commands = []cli.Command{
@@ -61,6 +61,23 @@ The output of this command is supposed to be machine-readable.
`,
},
{
+ Action: accountList,
+ Name: "account",
+ Usage: "manage accounts",
+ Subcommands: []cli.Command{
+ {
+ Action: accountList,
+ Name: "list",
+ Usage: "print account addresses",
+ },
+ {
+ Action: accountCreate,
+ Name: "new",
+ Usage: "create a new account",
+ },
+ },
+ },
+ {
Action: dump,
Name: "dump",
Usage: `dump a specific block from storage`,
@@ -88,13 +105,9 @@ runtime will execute the file and exit.
Usage: `import a blockchain file`,
},
}
- app.Author = ""
- app.Email = ""
app.Flags = []cli.Flag{
utils.BootnodesFlag,
utils.DataDirFlag,
- utils.KeyRingFlag,
- utils.KeyStoreFlag,
utils.ListenPortFlag,
utils.LogFileFlag,
utils.LogFormatFlag,
@@ -158,15 +171,44 @@ func runjs(ctx *cli.Context) {
func startEth(ctx *cli.Context, eth *eth.Ethereum) {
utils.StartEthereum(eth)
if ctx.GlobalBool(utils.RPCEnabledFlag.Name) {
- addr := ctx.GlobalString(utils.RPCListenAddrFlag.Name)
- port := ctx.GlobalInt(utils.RPCPortFlag.Name)
- utils.StartRpc(eth, addr, port)
+ utils.StartRPC(eth, ctx)
}
if ctx.GlobalBool(utils.MiningEnabledFlag.Name) {
eth.Miner().Start()
}
}
+func accountList(ctx *cli.Context) {
+ am := utils.GetAccountManager(ctx)
+ accts, err := am.Accounts()
+ if err != nil {
+ utils.Fatalf("Could not list accounts: %v", err)
+ }
+ for _, acct := range accts {
+ fmt.Printf("Address: %#x\n", acct)
+ }
+}
+
+func accountCreate(ctx *cli.Context) {
+ am := utils.GetAccountManager(ctx)
+ auth, err := readPassword("Passphrase: ", true)
+ if err != nil {
+ utils.Fatalf("%v", err)
+ }
+ confirm, err := readPassword("Repeat Passphrase: ", false)
+ if err != nil {
+ utils.Fatalf("%v", err)
+ }
+ if auth != confirm {
+ utils.Fatalf("Passphrases did not match.")
+ }
+ acct, err := am.NewAccount(auth)
+ if err != nil {
+ utils.Fatalf("Could not create the account: %v", err)
+ }
+ fmt.Printf("Address: %#x\n", acct.Address)
+}
+
func importchain(ctx *cli.Context) {
if len(ctx.Args()) != 1 {
utils.Fatalf("This command requires an argument.")
@@ -202,12 +244,6 @@ func dump(ctx *cli.Context) {
}
}
-// hashish returns true for strings that look like hashes.
-func hashish(x string) bool {
- _, err := strconv.Atoi(x)
- return err != nil
-}
-
func version(c *cli.Context) {
fmt.Printf(`%v %v
PV=%d
@@ -217,3 +253,24 @@ GOPATH=%s
GOROOT=%s
`, ClientIdentifier, Version, eth.ProtocolVersion, runtime.GOOS, runtime.Version(), os.Getenv("GOPATH"), runtime.GOROOT())
}
+
+// hashish returns true for strings that look like hashes.
+func hashish(x string) bool {
+ _, err := strconv.Atoi(x)
+ return err != nil
+}
+
+func readPassword(prompt string, warnTerm bool) (string, error) {
+ if liner.TerminalSupported() {
+ lr := liner.NewLiner()
+ defer lr.Close()
+ return lr.PasswordPrompt(prompt)
+ }
+ if warnTerm {
+ fmt.Println("!! Unsupported terminal, password will be echoed.")
+ }
+ fmt.Print(prompt)
+ input, err := bufio.NewReader(os.Stdin).ReadString('\n')
+ fmt.Println()
+ return input, err
+}
diff --git a/cmd/mist/assets/qml/main.qml b/cmd/mist/assets/qml/main.qml
index 6824d2ba9..1626a63a9 100644
--- a/cmd/mist/assets/qml/main.qml
+++ b/cmd/mist/assets/qml/main.qml
@@ -190,6 +190,11 @@ ApplicationWindow {
}
}
+ MenuItem {
+ text: "Generate key"
+ shortcut: "Ctrl+k"
+ onTriggered: gui.generateKey()
+ }
}
Menu {
diff --git a/cmd/mist/assets/qml/views/info.qml b/cmd/mist/assets/qml/views/info.qml
index b2d2f521c..0187bba6d 100644
--- a/cmd/mist/assets/qml/views/info.qml
+++ b/cmd/mist/assets/qml/views/info.qml
@@ -54,7 +54,6 @@ Rectangle {
height: 200
anchors {
left: parent.left
- right: logLevelSlider.left
bottom: parent.bottom
top: parent.top
}
@@ -107,46 +106,6 @@ Rectangle {
}
}
}
-
- /*
- TableView {
- id: logView
- headerVisible: false
- anchors {
- right: logLevelSlider.left
- left: parent.left
- bottom: parent.bottom
- top: parent.top
- }
-
- TableViewColumn{ role: "description" ; title: "log" }
-
- model: logModel
- }
- */
-
- Slider {
- id: logLevelSlider
- value: gui.getLogLevelInt()
- anchors {
- right: parent.right
- top: parent.top
- bottom: parent.bottom
-
- rightMargin: 5
- leftMargin: 5
- topMargin: 5
- bottomMargin: 5
- }
-
- orientation: Qt.Vertical
- maximumValue: 5
- stepSize: 1
-
- onValueChanged: {
- gui.setLogLevel(value)
- }
- }
}
property var logModel: ListModel {
diff --git a/cmd/mist/bindings.go b/cmd/mist/bindings.go
index c63f11591..b56c0dddf 100644
--- a/cmd/mist/bindings.go
+++ b/cmd/mist/bindings.go
@@ -28,7 +28,6 @@ import (
"github.com/ethereum/go-ethereum/cmd/utils"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethutil"
- "github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/state"
)
@@ -37,19 +36,7 @@ type plugin struct {
Path string `json:"path"`
}
-// LogPrint writes to the GUI log.
-func (gui *Gui) LogPrint(level logger.LogLevel, msg string) {
- /*
- str := strings.TrimRight(s, "\n")
- lines := strings.Split(str, "\n")
-
- view := gui.getObjectByName("infoView")
- for _, line := range lines {
- view.Call("addLog", line)
- }
- */
-}
-func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (string, error) {
+func (gui *Gui) Transact(from, recipient, value, gas, gasPrice, d string) (string, error) {
var data string
if len(recipient) == 0 {
code, err := ethutil.Compile(d, false)
@@ -61,18 +48,7 @@ func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (string, err
data = ethutil.Bytes2Hex(utils.FormatTransactionData(d))
}
- return gui.xeth.Transact(recipient, value, gas, gasPrice, data)
-}
-
-// functions that allow Gui to implement interface guilogger.LogSystem
-func (gui *Gui) SetLogLevel(level logger.LogLevel) {
- gui.logLevel = level
- gui.eth.Logger().SetLogLevel(level)
- gui.config.Save("loglevel", level)
-}
-
-func (gui *Gui) GetLogLevel() logger.LogLevel {
- return gui.logLevel
+ return gui.xeth.Transact(from, recipient, value, gas, gasPrice, data)
}
func (self *Gui) AddPlugin(pluginPath string) {
@@ -89,11 +65,6 @@ func (self *Gui) RemovePlugin(pluginPath string) {
ethutil.WriteFile(self.eth.DataDir+"/plugins.json", json)
}
-// this extra function needed to give int typecast value to gui widget
-// that sets initial loglevel to default
-func (gui *Gui) GetLogLevelInt() int {
- return int(gui.logLevel)
-}
func (self *Gui) DumpState(hash, path string) {
var stateDump []byte
diff --git a/cmd/mist/debugger.go b/cmd/mist/debugger.go
index c1ab2f3f1..bd8ddde37 100644
--- a/cmd/mist/debugger.go
+++ b/cmd/mist/debugger.go
@@ -137,16 +137,18 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
return
}
+ // TODO: improve this
+ allAccounts, _ := self.lib.eth.AccountManager().Accounts()
+
var (
gas = ethutil.Big(gasStr)
gasPrice = ethutil.Big(gasPriceStr)
value = ethutil.Big(valueStr)
- // Contract addr as test address
- keyPair = self.lib.eth.KeyManager().KeyPair()
+ acc = allAccounts[0]
)
statedb := self.lib.eth.ChainManager().TransState()
- account := self.lib.eth.ChainManager().TransState().GetAccount(keyPair.Address())
+ account := self.lib.eth.ChainManager().TransState().GetAccount(acc.Address)
contract := statedb.NewStateObject([]byte{0})
contract.SetCode(script)
contract.SetBalance(value)
diff --git a/cmd/mist/flags.go b/cmd/mist/flags.go
deleted file mode 100644
index 139af5923..000000000
--- a/cmd/mist/flags.go
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- 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 <http://www.gnu.org/licenses/>.
-*/
-/**
- * @authors
- * Jeffrey Wilcke <i@jev.io>
- */
-package main
-
-import (
- "crypto/ecdsa"
- "flag"
- "fmt"
- "log"
- "os"
- "path"
- "runtime"
-
- "github.com/ethereum/go-ethereum/crypto"
- "github.com/ethereum/go-ethereum/ethutil"
- "github.com/ethereum/go-ethereum/logger"
- "github.com/ethereum/go-ethereum/p2p/nat"
- "github.com/ethereum/go-ethereum/vm"
-)
-
-var (
- Identifier string
- KeyRing string
- KeyStore string
- StartRpc bool
- RpcListenAddress string
- RpcPort int
- OutboundPort string
- ShowGenesis bool
- AddPeer string
- MaxPeer int
- GenAddr bool
- BootNodes string
- NodeKey *ecdsa.PrivateKey
- NAT nat.Interface
- SecretFile string
- ExportDir string
- NonInteractive bool
- Datadir string
- LogFile string
- ConfigFile string
- DebugFile string
- LogLevel int
- VmType int
- MinerThreads int
-)
-
-// flags specific to gui client
-var AssetPath string
-var defaultConfigFile = path.Join(ethutil.DefaultDataDir(), "conf.ini")
-
-func Init() {
- // TODO: move common flag processing to cmd/utils
- flag.Usage = func() {
- fmt.Fprintf(os.Stderr, "%s [options] [filename]:\noptions precedence: default < config file < environment variables < command line\n", os.Args[0])
- flag.PrintDefaults()
- }
-
- flag.IntVar(&VmType, "vm", 0, "Virtual Machine type: 0-1: standard, debug")
- flag.StringVar(&Identifier, "id", "", "Custom client identifier")
- flag.StringVar(&KeyRing, "keyring", "", "identifier for keyring to use")
- flag.StringVar(&KeyStore, "keystore", "db", "system to store keyrings: db|file")
- flag.StringVar(&RpcListenAddress, "rpcaddr", "127.0.0.1", "address for json-rpc server to listen on")
- flag.IntVar(&RpcPort, "rpcport", 8545, "port to start json-rpc server on")
- flag.BoolVar(&StartRpc, "rpc", true, "start rpc server")
- flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)")
- flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key")
- flag.StringVar(&SecretFile, "import", "", "imports the file given (hex or mnemonic formats)")
- flag.StringVar(&ExportDir, "export", "", "exports the session keyring to files in the directory given")
- flag.StringVar(&LogFile, "logfile", "", "log file (defaults to standard output)")
- flag.StringVar(&Datadir, "datadir", ethutil.DefaultDataDir(), "specifies the datadir to use")
- flag.StringVar(&ConfigFile, "conf", defaultConfigFile, "config file")
- flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
- flag.IntVar(&LogLevel, "loglevel", int(logger.InfoLevel), "loglevel: 0-5 (= silent,error,warn,info,debug,debug detail)")
-
- flag.StringVar(&AssetPath, "asset_path", ethutil.DefaultAssetPath(), "absolute path to GUI assets directory")
-
- // Network stuff
- var (
- nodeKeyFile = flag.String("nodekey", "", "network private key file")
- nodeKeyHex = flag.String("nodekeyhex", "", "network private key (for testing)")
- natstr = flag.String("nat", "any", "port mapping mechanism (any|none|upnp|pmp|extip:<IP>)")
- )
- flag.StringVar(&OutboundPort, "port", "30303", "listening port")
- flag.StringVar(&BootNodes, "bootnodes", "", "space-separated node URLs for discovery bootstrap")
- flag.IntVar(&MaxPeer, "maxpeer", 30, "maximum desired peers")
-
- flag.IntVar(&MinerThreads, "minerthreads", runtime.NumCPU(), "number of miner threads")
-
- flag.Parse()
-
- var err error
- if NAT, err = nat.Parse(*natstr); err != nil {
- log.Fatalf("-nat: %v", err)
- }
- switch {
- case *nodeKeyFile != "" && *nodeKeyHex != "":
- log.Fatal("Options -nodekey and -nodekeyhex are mutually exclusive")
- case *nodeKeyFile != "":
- if NodeKey, err = crypto.LoadECDSA(*nodeKeyFile); err != nil {
- log.Fatalf("-nodekey: %v", err)
- }
- case *nodeKeyHex != "":
- if NodeKey, err = crypto.HexToECDSA(*nodeKeyHex); err != nil {
- log.Fatalf("-nodekeyhex: %v", err)
- }
- }
-
- if VmType >= int(vm.MaxVmTy) {
- log.Fatal("Invalid VM type ", VmType)
- }
-}
diff --git a/cmd/mist/gui.go b/cmd/mist/gui.go
index 53ca35574..a49e9f6f8 100644
--- a/cmd/mist/gui.go
+++ b/cmd/mist/gui.go
@@ -23,7 +23,6 @@ package main
import "C"
import (
- "bytes"
"encoding/json"
"fmt"
"io/ioutil"
@@ -70,20 +69,18 @@ type Gui struct {
txDb *ethdb.LDBDatabase
- logLevel logger.LogLevel
- open bool
+ open bool
xeth *xeth.XEth
Session string
- config *ethutil.ConfigManager
plugins map[string]plugin
}
// Create GUI, but doesn't start it
-func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, session string, logLevel int) *Gui {
- db, err := ethdb.NewLDBDatabase("tx_database")
+func NewWindow(ethereum *eth.Ethereum) *Gui {
+ db, err := ethdb.NewLDBDatabase(path.Join(ethereum.DataDir, "tx_database"))
if err != nil {
panic(err)
}
@@ -92,10 +89,7 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, session st
gui := &Gui{eth: ethereum,
txDb: db,
xeth: xeth,
- logLevel: logger.LogLevel(logLevel),
- Session: session,
open: false,
- config: config,
plugins: make(map[string]plugin),
serviceEvents: make(chan ServEv, 1),
}
@@ -142,18 +136,12 @@ func (gui *Gui) Start(assetPath string) {
gui.open = true
win.Show()
- // only add the gui guilogger after window is shown otherwise slider wont be shown
- logger.AddLogSystem(gui)
win.Wait()
-
- // need to silence gui guilogger after window closed otherwise logsystem hangs (but do not save loglevel)
- gui.logLevel = logger.Silence
gui.open = false
}
func (gui *Gui) Stop() {
if gui.open {
- gui.logLevel = logger.Silence
gui.open = false
gui.win.Hide()
}
@@ -172,7 +160,11 @@ func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) {
return gui.win, nil
}
-func (gui *Gui) ImportKey(filePath string) {
+func (gui *Gui) GenerateKey() {
+ _, err := gui.eth.AccountManager().NewAccount("hurr")
+ if err != nil {
+ // TODO: UI feedback?
+ }
}
func (gui *Gui) showKeyImport(context *qml.Context) (*qml.Window, error) {
@@ -191,31 +183,11 @@ func (gui *Gui) createWindow(comp qml.Object) *qml.Window {
return gui.win
}
-func (gui *Gui) ImportAndSetPrivKey(secret string) bool {
- err := gui.eth.KeyManager().InitFromString(gui.Session, 0, secret)
- if err != nil {
- guilogger.Errorln("unable to import: ", err)
- return false
- }
- guilogger.Errorln("successfully imported: ", err)
- return true
-}
-
-func (gui *Gui) CreateAndSetPrivKey() (string, string, string, string) {
- err := gui.eth.KeyManager().Init(gui.Session, 0, true)
- if err != nil {
- guilogger.Errorln("unable to create key: ", err)
- return "", "", "", ""
- }
- return gui.eth.KeyManager().KeyPair().AsStrings()
-}
-
func (gui *Gui) setInitialChain(ancientBlocks bool) {
sBlk := gui.eth.ChainManager().LastBlockHash()
blk := gui.eth.ChainManager().GetBlock(sBlk)
for ; blk != nil; blk = gui.eth.ChainManager().GetBlock(sBlk) {
sBlk = blk.ParentHash()
-
gui.processBlock(blk, true)
}
}
@@ -259,10 +231,8 @@ func (self *Gui) loadMergedMiningOptions() {
}
func (gui *Gui) insertTransaction(window string, tx *types.Transaction) {
- addr := gui.address()
-
var inout string
- if bytes.Compare(tx.From(), addr) == 0 {
+ if gui.eth.AccountManager().HasAccount(tx.From()) {
inout = "send"
} else {
inout = "recv"
@@ -480,14 +450,6 @@ func (gui *Gui) setPeerInfo() {
}
}
-func (gui *Gui) privateKey() string {
- return ethutil.Bytes2Hex(gui.eth.KeyManager().PrivateKey())
-}
-
-func (gui *Gui) address() []byte {
- return gui.eth.KeyManager().Address()
-}
-
/*
func LoadExtension(path string) (uintptr, error) {
lib, err := ffi.NewLibrary(path)
diff --git a/cmd/mist/main.go b/cmd/mist/main.go
index 7d78c9c02..c27f1dba9 100644
--- a/cmd/mist/main.go
+++ b/cmd/mist/main.go
@@ -26,10 +26,10 @@ import (
"runtime"
"time"
+ "github.com/codegangsta/cli"
"github.com/ethereum/go-ethereum/cmd/utils"
- "github.com/ethereum/go-ethereum/eth"
+ "github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
- "github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/ui/qt/webengine"
"github.com/obscuren/qml"
)
@@ -39,56 +39,32 @@ const (
Version = "0.9.0"
)
-var ethereum *eth.Ethereum
-var mainlogger = logger.NewLogger("MAIN")
-
-func run() error {
- webengine.Initialize()
-
- // precedence: code-internal flag default < config file < environment variables < command line
- Init() // parsing command line
-
- tstart := time.Now()
- config := utils.InitConfig(VmType, ConfigFile, Datadir, "ETH")
-
- ethereum, err := eth.New(&eth.Config{
- Name: p2p.MakeName(ClientIdentifier, Version),
- KeyStore: KeyStore,
- DataDir: Datadir,
- LogFile: LogFile,
- LogLevel: LogLevel,
- MaxPeers: MaxPeer,
- Port: OutboundPort,
- NAT: NAT,
- Shh: true,
- BootNodes: BootNodes,
- NodeKey: NodeKey,
- KeyRing: KeyRing,
- Dial: true,
- MinerThreads: MinerThreads,
- })
- if err != nil {
- mainlogger.Fatalln(err)
+var (
+ app = utils.NewApp(Version, "the ether browser")
+ assetPathFlag = cli.StringFlag{
+ Name: "asset_path",
+ Usage: "absolute path to GUI assets directory",
+ Value: ethutil.DefaultAssetPath(),
}
- utils.KeyTasks(ethereum.KeyManager(), KeyRing, GenAddr, SecretFile, ExportDir, NonInteractive)
+)
- if StartRpc {
- utils.StartRpc(ethereum, RpcListenAddress, RpcPort)
+func init() {
+ app.Action = run
+ app.Flags = []cli.Flag{
+ assetPathFlag,
+
+ utils.BootnodesFlag,
+ utils.DataDirFlag,
+ utils.ListenPortFlag,
+ utils.LogFileFlag,
+ utils.LogLevelFlag,
+ utils.MaxPeersFlag,
+ utils.MinerThreadsFlag,
+ utils.NATFlag,
+ utils.NodeKeyFileFlag,
+ utils.RPCListenAddrFlag,
+ utils.RPCPortFlag,
}
-
- gui := NewWindow(ethereum, config, KeyRing, LogLevel)
-
- utils.RegisterInterrupt(func(os.Signal) {
- gui.Stop()
- })
- go utils.StartEthereum(ethereum)
-
- fmt.Println("ETH stack took", time.Since(tstart))
-
- // gui blocks the main thread
- gui.Start(AssetPath)
-
- return nil
}
func main() {
@@ -97,15 +73,16 @@ func main() {
// This is a bit of a cheat, but ey!
os.Setenv("QTWEBKIT_INSPECTOR_SERVER", "127.0.0.1:99999")
- qml.Run(run)
-
var interrupted = false
utils.RegisterInterrupt(func(os.Signal) {
interrupted = true
})
-
utils.HandleInterrupt()
+ if err := app.Run(os.Args); err != nil {
+ fmt.Fprintln(os.Stderr, "Error: ", err)
+ }
+
// we need to run the interrupt callbacks in case gui is closed
// this skips if we got here by actual interrupt stopping the GUI
if !interrupted {
@@ -113,3 +90,23 @@ func main() {
}
logger.Flush()
}
+
+func run(ctx *cli.Context) {
+ tstart := time.Now()
+
+ // TODO: show qml popup instead of exiting if initialization fails.
+ ethereum := utils.GetEthereum(ClientIdentifier, Version, ctx)
+ utils.StartRPC(ethereum, ctx)
+ go utils.StartEthereum(ethereum)
+ fmt.Println("initializing eth stack took", time.Since(tstart))
+
+ // Open the window
+ qml.Run(func() error {
+ webengine.Initialize()
+ gui := NewWindow(ethereum)
+ utils.RegisterInterrupt(func(os.Signal) { gui.Stop() })
+ // gui blocks the main thread
+ gui.Start(ctx.GlobalString(assetPathFlag.Name))
+ return nil
+ })
+}
diff --git a/cmd/mist/ui_lib.go b/cmd/mist/ui_lib.go
index 187d5b2d6..32e8ce5af 100644
--- a/cmd/mist/ui_lib.go
+++ b/cmd/mist/ui_lib.go
@@ -153,6 +153,7 @@ func (self *UiLib) Transact(params map[string]interface{}) (string, error) {
object := mapToTxParams(params)
return self.XEth.Transact(
+ object["from"],
object["to"],
object["value"],
object["gas"],
diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go
index a77c6ad4d..a802a08da 100644
--- a/cmd/utils/cmd.go
+++ b/cmd/utils/cmd.go
@@ -29,14 +29,11 @@ import (
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/types"
- "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/eth"
"github.com/ethereum/go-ethereum/ethutil"
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/rlp"
- rpchttp "github.com/ethereum/go-ethereum/rpc/http"
"github.com/ethereum/go-ethereum/state"
- "github.com/ethereum/go-ethereum/xeth"
)
var clilogger = logger.NewLogger("CLI")
@@ -98,14 +95,6 @@ func initDataDir(Datadir string) {
}
}
-func InitConfig(vmType int, ConfigFile string, Datadir string, EnvPrefix string) *ethutil.ConfigManager {
- initDataDir(Datadir)
- cfg := ethutil.ReadConfig(ConfigFile, Datadir, EnvPrefix)
- cfg.VmType = vmType
-
- return cfg
-}
-
func exit(err error) {
status := 0
if err != nil {
@@ -134,47 +123,6 @@ func StartEthereum(ethereum *eth.Ethereum) {
})
}
-func KeyTasks(keyManager *crypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) {
- var err error
- switch {
- case GenAddr:
- if NonInteractive || confirm("This action overwrites your old private key.") {
- err = keyManager.Init(KeyRing, 0, true)
- }
- exit(err)
- case len(SecretFile) > 0:
- SecretFile = ethutil.ExpandHomePath(SecretFile)
-
- if NonInteractive || confirm("This action overwrites your old private key.") {
- err = keyManager.InitFromSecretsFile(KeyRing, 0, SecretFile)
- }
- exit(err)
- case len(ExportDir) > 0:
- err = keyManager.Init(KeyRing, 0, false)
- if err == nil {
- err = keyManager.Export(ExportDir)
- }
- exit(err)
- default:
- // Creates a keypair if none exists
- err = keyManager.Init(KeyRing, 0, false)
- if err != nil {
- exit(err)
- }
- }
- clilogger.Infof("Main address %x\n", keyManager.Address())
-}
-
-func StartRpc(ethereum *eth.Ethereum, RpcListenAddress string, RpcPort int) {
- var err error
- ethereum.RpcServer, err = rpchttp.NewRpcHttpServer(xeth.New(ethereum, nil), RpcListenAddress, RpcPort)
- if err != nil {
- clilogger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err)
- } else {
- go ethereum.RpcServer.Start()
- }
-}
-
func FormatTransactionData(data string) []byte {
d := ethutil.StringToByteFunc(data, func(s string) (ret []byte) {
slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000)
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 88ff3558d..ee7ea4c79 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -2,10 +2,16 @@ package utils
import (
"crypto/ecdsa"
+ "fmt"
+ "net"
+ "net/http"
+ "os"
"path"
"runtime"
+ "time"
"github.com/codegangsta/cli"
+ "github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/eth"
@@ -15,8 +21,21 @@ import (
"github.com/ethereum/go-ethereum/logger"
"github.com/ethereum/go-ethereum/p2p"
"github.com/ethereum/go-ethereum/p2p/nat"
+ "github.com/ethereum/go-ethereum/rpc"
+ "github.com/ethereum/go-ethereum/xeth"
)
+// NewApp creates an app with sane defaults.
+func NewApp(version, usage string) *cli.App {
+ app := cli.NewApp()
+ app.Name = path.Base(os.Args[0])
+ app.Author = ""
+ app.Email = ""
+ app.Version = version
+ app.Usage = usage
+ return app
+}
+
// These are all the command line flags we support.
// If you add to this list, please remember to include the
// flag in the appropriate command definition.
@@ -36,16 +55,6 @@ var (
Name: "vmdebug",
Usage: "Virtual Machine debug output",
}
- KeyRingFlag = cli.StringFlag{
- Name: "keyring",
- Usage: "Name of keyring to be used",
- Value: "",
- }
- KeyStoreFlag = cli.StringFlag{
- Name: "keystore",
- Usage: `Where to store keyrings: "db" or "file"`,
- Value: "db",
- }
DataDirFlag = cli.StringFlag{
Name: "datadir",
Usage: "Data directory to be used",
@@ -151,23 +160,21 @@ func GetNodeKey(ctx *cli.Context) (key *ecdsa.PrivateKey) {
func GetEthereum(clientID, version string, ctx *cli.Context) *eth.Ethereum {
ethereum, err := eth.New(&eth.Config{
- Name: p2p.MakeName(clientID, version),
- KeyStore: ctx.GlobalString(KeyStoreFlag.Name),
- DataDir: ctx.GlobalString(DataDirFlag.Name),
- LogFile: ctx.GlobalString(LogFileFlag.Name),
- LogLevel: ctx.GlobalInt(LogLevelFlag.Name),
- LogFormat: ctx.GlobalString(LogFormatFlag.Name),
- MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name),
- VmDebug: ctx.GlobalBool(VMDebugFlag.Name),
-
- MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name),
- Port: ctx.GlobalString(ListenPortFlag.Name),
- NAT: GetNAT(ctx),
- NodeKey: GetNodeKey(ctx),
- KeyRing: ctx.GlobalString(KeyRingFlag.Name),
- Shh: true,
- Dial: true,
- BootNodes: ctx.GlobalString(BootnodesFlag.Name),
+ Name: p2p.MakeName(clientID, version),
+ DataDir: ctx.GlobalString(DataDirFlag.Name),
+ LogFile: ctx.GlobalString(LogFileFlag.Name),
+ LogLevel: ctx.GlobalInt(LogLevelFlag.Name),
+ LogFormat: ctx.GlobalString(LogFormatFlag.Name),
+ MinerThreads: ctx.GlobalInt(MinerThreadsFlag.Name),
+ AccountManager: GetAccountManager(ctx),
+ VmDebug: ctx.GlobalBool(VMDebugFlag.Name),
+ MaxPeers: ctx.GlobalInt(MaxPeersFlag.Name),
+ Port: ctx.GlobalString(ListenPortFlag.Name),
+ NAT: GetNAT(ctx),
+ NodeKey: GetNodeKey(ctx),
+ Shh: true,
+ Dial: true,
+ BootNodes: ctx.GlobalString(BootnodesFlag.Name),
})
if err != nil {
exit(err)
@@ -188,3 +195,21 @@ func GetChain(ctx *cli.Context) (*core.ChainManager, ethutil.Database, ethutil.D
}
return core.NewChainManager(blockDb, stateDb, new(event.TypeMux)), blockDb, stateDb
}
+
+func GetAccountManager(ctx *cli.Context) *accounts.Manager {
+ dataDir := ctx.GlobalString(DataDirFlag.Name)
+ ks := crypto.NewKeyStorePassphrase(path.Join(dataDir, "keys"))
+ return accounts.NewManager(ks, 300*time.Second)
+}
+
+func StartRPC(eth *eth.Ethereum, ctx *cli.Context) {
+ addr := ctx.GlobalString(RPCListenAddrFlag.Name)
+ port := ctx.GlobalInt(RPCPortFlag.Name)
+ dataDir := ctx.GlobalString(DataDirFlag.Name)
+
+ l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", addr, port))
+ if err != nil {
+ Fatalf("Can't listen on %s:%d: %v", addr, port, err)
+ }
+ go http.Serve(l, rpc.JSONRPC(xeth.New(eth, nil), dataDir))
+}