diff --git a/README.md b/README.md
index 11b7ed7e94..29dae73418 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Ethereum
Ethereum Go Client © 2014 Jeffrey Wilcke.
-Current state: Proof of Concept 0.5.16.
+Current state: Proof of Concept 0.5.17.
For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).
diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml
index fa56737a22..34fe01253d 100644
--- a/ethereal/assets/debugger/debugger.qml
+++ b/ethereal/assets/debugger/debugger.qml
@@ -86,7 +86,7 @@ ApplicationWindow {
TableView {
id: asmTableView
width: 200
- TableViewColumn{ role: "value" ; title: "" ; width: 200 }
+ TableViewColumn{ role: "value" ; title: "" ; width: asmTableView.width - 2 }
model: asmModel
}
diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml
index c783cde830..a79e4708c1 100644
--- a/ethereal/assets/qml/wallet.qml
+++ b/ethereal/assets/qml/wallet.qml
@@ -419,30 +419,54 @@ ApplicationWindow {
}
}
- Label {
- y: 7
- anchors.right: peerImage.left
- anchors.rightMargin: 5
- id: peerLabel
- font.pixelSize: 8
- text: "0 / 0"
- }
- Image {
- y: 7
- id: peerImage
- anchors.right: parent.right
- width: 10; height: 10
- MouseArea {
- onDoubleClicked: peerWindow.visible = true
- anchors.fill: parent
- }
- source: "../network.png"
- }
+ Label {
+ y: 6
+ id: lastBlockLabel
+ objectName: "lastBlockLabel"
+ visible: true
+ text: ""
+ font.pixelSize: 10
+ anchors.right: peerGroup.left
+ anchors.rightMargin: 5
+ }
+
+ ProgressBar {
+ id: syncProgressIndicator
+ visible: false
+ objectName: "syncProgressIndicator"
+ y: 3
+ width: 140
+ indeterminate: true
+ anchors.right: peerGroup.left
+ anchors.rightMargin: 5
+ }
+
+ RowLayout {
+ id: peerGroup
+ y: 7
+ anchors.right: parent.right
+ MouseArea {
+ onDoubleClicked: peerWindow.visible = true
+ anchors.fill: parent
+ }
+
+ Label {
+ id: peerLabel
+ font.pixelSize: 8
+ text: "0 / 0"
+ }
+ Image {
+ id: peerImage
+ width: 10; height: 10
+ source: "../network.png"
+ }
+ }
}
Window {
id: popup
visible: false
+ //flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
property var block
width: root.width
height: 300
@@ -460,7 +484,7 @@ ApplicationWindow {
Text { text: '
Block details
'; color: "#F2F2F2"}
Text { text: 'Block number: ' + number; color: "#F2F2F2"}
Text { text: 'Hash: ' + hash; color: "#F2F2F2"}
- Text { text: 'Coinbase: ' + coinbase; color: "#F2F2F2"}
+ Text { text: 'Coinbase: <' + name + '> ' + coinbase; color: "#F2F2F2"}
Text { text: 'Block found at: ' + prettyTime; color: "#F2F2F2"}
Text { text: 'Gas used: ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"}
}
@@ -577,6 +601,7 @@ ApplicationWindow {
Window {
id: addPeerWin
+ //flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
visible: false
minimumWidth: 230
maximumWidth: 230
@@ -686,9 +711,9 @@ ApplicationWindow {
}
if(initial){
- blockModel.append({number: block.number, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+ blockModel.append({number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
}else{
- blockModel.insert(0, {number: block.number, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
+ blockModel.insert(0, {number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
}
}
@@ -743,6 +768,7 @@ ApplicationWindow {
// ******************************************
Window {
id: peerWindow
+ //flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
height: 200
width: 700
Rectangle {
diff --git a/ethereal/assets/samplecoin b/ethereal/assets/samplecoin
deleted file mode 160000
index 944fbaa31d..0000000000
--- a/ethereal/assets/samplecoin
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 944fbaa31d51328b522c0cd55113716630b4cbcb
diff --git a/ethereal/debugger.go b/ethereal/debugger.go
index 997c2e8dd2..7742b16271 100644
--- a/ethereal/debugger.go
+++ b/ethereal/debugger.go
@@ -17,6 +17,8 @@ type DebuggerWindow struct {
vm *ethchain.Vm
Db *Debugger
+
+ state *ethchain.State
}
func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
@@ -53,6 +55,7 @@ func (self *DebuggerWindow) SetCode(code string) {
func (self *DebuggerWindow) SetData(data string) {
self.win.Set("dataText", data)
}
+
func (self *DebuggerWindow) SetAsm(data []byte) {
self.win.Root().Call("clearAsm")
diff --git a/ethereal/flags.go b/ethereal/flags.go
index d5ca9f336a..c9327c3d31 100644
--- a/ethereal/flags.go
+++ b/ethereal/flags.go
@@ -36,6 +36,7 @@ var LogLevel int
// flags specific to gui client
var AssetPath string
+//TODO: If we re-use the one defined in cmd.go the binary osx image crashes. If somebody finds out why we can dry this up.
func defaultAssetPath() string {
var assetPath string
// If the current working directory is the go-ethereum dir
@@ -60,7 +61,6 @@ func defaultAssetPath() string {
}
return assetPath
}
-
func defaultDataDir() string {
usr, _ := user.Current()
return path.Join(usr.HomeDir, ".ethereal")
diff --git a/ethereal/gui.go b/ethereal/gui.go
index eb0c50cc36..815bb267cf 100644
--- a/ethereal/gui.go
+++ b/ethereal/gui.go
@@ -7,6 +7,7 @@ import (
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethdb"
"github.com/ethereum/eth-go/ethlog"
+ "github.com/ethereum/eth-go/ethminer"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethreact"
"github.com/ethereum/eth-go/ethutil"
@@ -14,6 +15,7 @@ import (
"github.com/ethereum/go-ethereum/utils"
"github.com/go-qml/qml"
"math/big"
+ "strconv"
"strings"
"time"
)
@@ -41,6 +43,8 @@ type Gui struct {
Session string
clientIdentity *ethwire.SimpleClientIdentity
config *ethutil.ConfigManager
+
+ miner *ethminer.Miner
}
// Create GUI, but doesn't start it
@@ -125,6 +129,7 @@ func (gui *Gui) ToggleMining() {
txt = "Start mining"
} else {
utils.StartMining(gui.eth)
+ gui.miner = utils.GetMiner()
txt = "Stop mining"
}
@@ -244,7 +249,11 @@ func (gui *Gui) readPreviousTransactions() {
}
func (gui *Gui) processBlock(block *ethchain.Block, initial bool) {
- gui.win.Root().Call("addBlock", ethpub.NewPBlock(block), initial)
+ name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase)
+ b := ethpub.NewPBlock(block)
+ b.Name = name
+
+ gui.win.Root().Call("addBlock", b, initial)
}
func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
@@ -263,20 +272,32 @@ func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
gui.win.Root().Call("setWalletValue", str)
}
+func (self *Gui) getObjectByName(objectName string) qml.Object {
+ return self.win.Root().ObjectByName(objectName)
+}
+
// Simple go routine function that updates the list of peers in the GUI
func (gui *Gui) update() {
- reactor := gui.eth.Reactor()
- blockChan := make(chan ethreact.Event, 1)
- txChan := make(chan ethreact.Event, 1)
- objectChan := make(chan ethreact.Event, 1)
- peerChan := make(chan ethreact.Event, 1)
- ticker := time.NewTicker(5 * time.Second)
+ var (
+ blockChan = make(chan ethreact.Event, 1)
+ txChan = make(chan ethreact.Event, 1)
+ objectChan = make(chan ethreact.Event, 1)
+ peerChan = make(chan ethreact.Event, 1)
+ chainSyncChan = make(chan ethreact.Event, 1)
+ miningChan = make(chan ethreact.Event, 1)
+ )
+
+ peerUpdateTicker := time.NewTicker(5 * time.Second)
+ generalUpdateTicker := time.NewTicker(1 * time.Second)
state := gui.eth.StateManager().TransState()
unconfirmedFunds := new(big.Int)
gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Amount)))
+ gui.getObjectByName("syncProgressIndicator").Set("visible", !gui.eth.IsUpToDate())
+
+ lastBlockLabel := gui.getObjectByName("lastBlockLabel")
go func() {
for {
@@ -319,18 +340,43 @@ func (gui *Gui) update() {
state.UpdateStateObject(object)
}
+ case msg := <-chainSyncChan:
+ sync := msg.Resource.(bool)
+ gui.win.Root().ObjectByName("syncProgressIndicator").Set("visible", sync)
+
case <-objectChan:
gui.loadAddressBook()
case <-peerChan:
gui.setPeerInfo()
- case <-ticker.C:
+ case <-peerUpdateTicker.C:
gui.setPeerInfo()
+ case msg := <-miningChan:
+ if msg.Name == "miner:start" {
+ gui.miner = msg.Resource.(*ethminer.Miner)
+ } else {
+ gui.miner = nil
+ }
+ case <-generalUpdateTicker.C:
+ statusText := "#" + gui.eth.BlockChain().CurrentBlock.Number.String()
+ if gui.miner != nil {
+ pow := gui.miner.GetPow()
+ if pow.GetHashrate() != 0 {
+ statusText = "Mining @ " + strconv.FormatInt(pow.GetHashrate(), 10) + "Khash - " + statusText
+ }
+ }
+ lastBlockLabel.Set("text", statusText)
}
}
}()
+
+ reactor := gui.eth.Reactor()
+
reactor.Subscribe("newBlock", blockChan)
reactor.Subscribe("newTx:pre", txChan)
reactor.Subscribe("newTx:post", txChan)
+ reactor.Subscribe("chainSync", chainSyncChan)
+ reactor.Subscribe("miner:start", miningChan)
+ reactor.Subscribe("miner:stop", miningChan)
nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg()
if nameReg != nil {
@@ -357,7 +403,7 @@ func (gui *Gui) address() []byte {
}
func (gui *Gui) RegisterName(name string) {
- name = fmt.Sprintf("\"%s\"", name)
+ name = fmt.Sprintf("\"register\"\n\"%s\"", name)
gui.pub.Transact(gui.privateKey(), "NameReg", "", "10000", "10000000000000", name)
}
diff --git a/ethereal/main.go b/ethereal/main.go
index 645e8f2ce5..e1cd43acec 100644
--- a/ethereal/main.go
+++ b/ethereal/main.go
@@ -10,7 +10,7 @@ import (
const (
ClientIdentifier = "Ethereal"
- Version = "0.5.16"
+ Version = "0.5.17"
)
func main() {
diff --git a/ethereum/cmd.go b/ethereum/cmd.go
index 08147824dc..ff2b8409cf 100644
--- a/ethereum/cmd.go
+++ b/ethereum/cmd.go
@@ -2,13 +2,14 @@ package main
import (
"github.com/ethereum/eth-go"
+ "github.com/ethereum/go-ethereum/ethereum/repl"
"github.com/ethereum/go-ethereum/utils"
"io/ioutil"
"os"
)
func InitJsConsole(ethereum *eth.Ethereum) {
- repl := NewJSRepl(ethereum)
+ repl := ethrepl.NewJSRepl(ethereum)
go repl.Start()
utils.RegisterInterrupt(func(os.Signal) {
repl.Stop()
@@ -24,7 +25,7 @@ func ExecJsFile(ethereum *eth.Ethereum, InputFile string) {
if err != nil {
logger.Fatalln(err)
}
- re := NewJSRE(ethereum)
+ re := ethrepl.NewJSRE(ethereum)
utils.RegisterInterrupt(func(os.Signal) {
re.Stop()
})
diff --git a/ethereum/flags.go b/ethereum/flags.go
index af0fd9a698..4f59ddf060 100644
--- a/ethereum/flags.go
+++ b/ethereum/flags.go
@@ -12,6 +12,7 @@ import (
var Identifier string
var KeyRing string
var DiffTool bool
+var DiffType string
var KeyStore string
var StartRpc bool
var RpcPort int
@@ -68,6 +69,7 @@ func Init() {
flag.StringVar(&DebugFile, "debug", "", "debug file (no debugging if not set)")
flag.IntVar(&LogLevel, "loglevel", int(ethlog.InfoLevel), "loglevel: 0-5: silent,error,warn,info,debug,debug detail)")
flag.BoolVar(&DiffTool, "difftool", false, "creates output for diff'ing. Sets LogLevel=0")
+ flag.StringVar(&DiffType, "diff", "all", "sets the level of diff output [vm, all]. Has no effect if difftool=false")
flag.BoolVar(&StartMining, "mine", false, "start dagger mining")
flag.BoolVar(&StartJsConsole, "js", false, "launches javascript console")
diff --git a/ethereum/main.go b/ethereum/main.go
index 39226c1d2b..b670cb495b 100644
--- a/ethereum/main.go
+++ b/ethereum/main.go
@@ -9,7 +9,7 @@ import (
const (
ClientIdentifier = "Ethereum(G)"
- Version = "0.5.16"
+ Version = "0.5.17"
)
var logger = ethlog.NewLogger("CLI")
@@ -29,6 +29,7 @@ func main() {
utils.InitConfig(ConfigFile, Datadir, "ETH")
ethutil.Config.Diff = DiffTool
+ ethutil.Config.DiffType = DiffType
utils.InitDataDir(Datadir)
diff --git a/ethereum/javascript_runtime.go b/ethereum/repl/javascript_runtime.go
similarity index 99%
rename from ethereum/javascript_runtime.go
rename to ethereum/repl/javascript_runtime.go
index 998ff7520e..091e758e10 100644
--- a/ethereum/javascript_runtime.go
+++ b/ethereum/repl/javascript_runtime.go
@@ -1,4 +1,4 @@
-package main
+package ethrepl
import (
"fmt"
diff --git a/ethereum/js_lib.go b/ethereum/repl/js_lib.go
similarity index 98%
rename from ethereum/js_lib.go
rename to ethereum/repl/js_lib.go
index 189dcc3a0b..c781c43d0c 100644
--- a/ethereum/js_lib.go
+++ b/ethereum/repl/js_lib.go
@@ -1,4 +1,4 @@
-package main
+package ethrepl
const jsLib = `
function pp(object) {
diff --git a/ethereum/repl/repl.go b/ethereum/repl/repl.go
new file mode 100644
index 0000000000..92d4ad86a3
--- /dev/null
+++ b/ethereum/repl/repl.go
@@ -0,0 +1,83 @@
+package ethrepl
+
+import (
+ "bufio"
+ "fmt"
+ "github.com/ethereum/eth-go"
+ "github.com/ethereum/eth-go/ethlog"
+ "github.com/ethereum/eth-go/ethutil"
+ "io"
+ "os"
+ "path"
+)
+
+var logger = ethlog.NewLogger("REPL")
+
+type Repl interface {
+ Start()
+ Stop()
+}
+
+type JSRepl struct {
+ re *JSRE
+
+ prompt string
+
+ history *os.File
+
+ running bool
+}
+
+func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
+ hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm)
+ if err != nil {
+ panic(err)
+ }
+
+ return &JSRepl{re: NewJSRE(ethereum), prompt: "> ", history: hist}
+}
+
+func (self *JSRepl) Start() {
+ if !self.running {
+ self.running = true
+ logger.Infoln("init JS Console")
+ reader := bufio.NewReader(self.history)
+ for {
+ line, err := reader.ReadString('\n')
+ if err != nil && err == io.EOF {
+ break
+ } else if err != nil {
+ fmt.Println("error reading history", err)
+ break
+ }
+
+ addHistory(line[:len(line)-1])
+ }
+ self.read()
+ }
+}
+
+func (self *JSRepl) Stop() {
+ if self.running {
+ self.running = false
+ self.re.Stop()
+ logger.Infoln("exit JS Console")
+ self.history.Close()
+ }
+}
+
+func (self *JSRepl) parseInput(code string) {
+ defer func() {
+ if r := recover(); r != nil {
+ fmt.Println("[native] error", r)
+ }
+ }()
+
+ value, err := self.re.Run(code)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+
+ self.PrintValue(value)
+}
diff --git a/ethereum/repl_darwin.go b/ethereum/repl/repl_darwin.go
similarity index 99%
rename from ethereum/repl_darwin.go
rename to ethereum/repl/repl_darwin.go
index 62b40059ac..3a91b0d442 100644
--- a/ethereum/repl_darwin.go
+++ b/ethereum/repl/repl_darwin.go
@@ -1,4 +1,4 @@
-package main
+package ethrepl
// #cgo darwin CFLAGS: -I/usr/local/opt/readline/include
// #cgo darwin LDFLAGS: -L/usr/local/opt/readline/lib
diff --git a/ethereum/repl_linux.go b/ethereum/repl/repl_linux.go
similarity index 100%
rename from ethereum/repl_linux.go
rename to ethereum/repl/repl_linux.go
diff --git a/ethereum/repl_windows.go b/ethereum/repl/repl_windows.go
similarity index 95%
rename from ethereum/repl_windows.go
rename to ethereum/repl/repl_windows.go
index 9d4787772f..4106c89bc3 100644
--- a/ethereum/repl_windows.go
+++ b/ethereum/repl/repl_windows.go
@@ -1,4 +1,4 @@
-package main
+package ethrepl
import (
"bufio"
diff --git a/ethereum/repl.go b/ethereum/repl/types.go
similarity index 57%
rename from ethereum/repl.go
rename to ethereum/repl/types.go
index 34380a06f4..16a18e6e5d 100644
--- a/ethereum/repl.go
+++ b/ethereum/repl/types.go
@@ -1,84 +1,26 @@
-package main
+package ethrepl
import (
- "bufio"
"fmt"
- "github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethutil"
"github.com/obscuren/otto"
- "io"
- "os"
- "path"
)
-type Repl interface {
- Start()
- Stop()
-}
-
-type JSRepl struct {
- re *JSRE
-
- prompt string
-
- history *os.File
-
- running bool
-}
-
-func NewJSRepl(ethereum *eth.Ethereum) *JSRepl {
- hist, err := os.OpenFile(path.Join(ethutil.Config.ExecPath, "history"), os.O_RDWR|os.O_CREATE, os.ModePerm)
- if err != nil {
- panic(err)
- }
-
- return &JSRepl{re: NewJSRE(ethereum), prompt: "> ", history: hist}
-}
-
-func (self *JSRepl) Start() {
- if !self.running {
- self.running = true
- logger.Infoln("init JS Console")
- reader := bufio.NewReader(self.history)
- for {
- line, err := reader.ReadString('\n')
- if err != nil && err == io.EOF {
- break
- } else if err != nil {
- fmt.Println("error reading history", err)
- break
- }
-
- addHistory(line[:len(line)-1])
- }
- self.read()
- }
-}
-
-func (self *JSRepl) Stop() {
- if self.running {
- self.running = false
- self.re.Stop()
- logger.Infoln("exit JS Console")
- self.history.Close()
- }
+type JSStateObject struct {
+ *ethpub.PStateObject
+ eth *JSEthereum
}
-func (self *JSRepl) parseInput(code string) {
- defer func() {
- if r := recover(); r != nil {
- fmt.Println("[native] error", r)
- }
- }()
+func (self *JSStateObject) EachStorage(call otto.FunctionCall) otto.Value {
+ cb := call.Argument(0)
+ self.PStateObject.EachStorage(func(key string, value *ethutil.Value) {
+ value.Decode()
- value, err := self.re.Run(code)
- if err != nil {
- fmt.Println(err)
- return
- }
+ cb.Call(self.eth.toVal(self), self.eth.toVal(key), self.eth.toVal(ethutil.Bytes2Hex(value.Bytes())))
+ })
- self.PrintValue(value)
+ return otto.UndefinedValue()
}
// The JSEthereum object attempts to wrap the PEthereum object and returns
@@ -110,7 +52,7 @@ func (self *JSEthereum) GetKey() otto.Value {
}
func (self *JSEthereum) GetStateObject(addr string) otto.Value {
- return self.toVal(self.PEthereum.GetStateObject(addr))
+ return self.toVal(&JSStateObject{self.PEthereum.GetStateObject(addr), self})
}
func (self *JSEthereum) GetStateKeyVals(addr string) otto.Value {
diff --git a/utils/cmd.go b/utils/cmd.go
index dfd867d64f..0eeb1049e1 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -1,6 +1,7 @@
package utils
import (
+ "bitbucket.org/kardianos/osext"
"fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethcrypto"
@@ -16,6 +17,8 @@ import (
"os"
"os/signal"
"path"
+ "path/filepath"
+ "runtime"
"time"
)
@@ -165,7 +168,34 @@ func NewKeyManager(KeyStore string, Datadir string, db ethutil.Database) *ethcry
return keyManager
}
+func DefaultAssetPath() string {
+ var assetPath string
+ // If the current working directory is the go-ethereum dir
+ // assume a debug build and use the source directory as
+ // asset directory.
+ pwd, _ := os.Getwd()
+ if pwd == path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal") {
+ assetPath = path.Join(pwd, "assets")
+ } else {
+ switch runtime.GOOS {
+ case "darwin":
+ // Get Binary Directory
+ exedir, _ := osext.ExecutableFolder()
+ assetPath = filepath.Join(exedir, "../Resources")
+ case "linux":
+ assetPath = "/usr/share/ethereal"
+ case "windows":
+ assetPath = "./assets"
+ default:
+ assetPath = "."
+ }
+ }
+ return assetPath
+}
+
func KeyTasks(keyManager *ethcrypto.KeyManager, KeyRing string, GenAddr bool, SecretFile string, ExportDir string, NonInteractive bool) {
+ ethcrypto.InitWords(DefaultAssetPath()) // Init mnemonic word list
+
var err error
switch {
case GenAddr:
@@ -205,7 +235,11 @@ func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
}
}
-var miner ethminer.Miner
+var miner *ethminer.Miner
+
+func GetMiner() *ethminer.Miner {
+ return miner
+}
func StartMining(ethereum *eth.Ethereum) bool {
if !ethereum.Mining {
@@ -214,13 +248,14 @@ func StartMining(ethereum *eth.Ethereum) bool {
go func() {
logger.Infoln("Start mining")
- miner = ethminer.NewDefaultMiner(addr, ethereum)
+ if miner == nil {
+ miner = ethminer.NewDefaultMiner(addr, ethereum)
+ }
// Give it some time to connect with peers
time.Sleep(3 * time.Second)
for !ethereum.IsUpToDate() {
time.Sleep(5 * time.Second)
}
-
miner.Start()
}()
RegisterInterrupt(func(os.Signal) {
@@ -232,12 +267,14 @@ func StartMining(ethereum *eth.Ethereum) bool {
}
func StopMining(ethereum *eth.Ethereum) bool {
- if ethereum.Mining {
+ if ethereum.Mining && miner != nil {
miner.Stop()
logger.Infoln("Stopped mining")
ethereum.Mining = false
+
return true
}
+
return false
}