From 5d15563ea768e03a6aef28e0b7cff4fa871cca08 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 12 May 2014 12:22:16 +0200 Subject: [PATCH 01/15] PreProcess => PreParse --- ethereum/dev_console.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/dev_console.go b/ethereum/dev_console.go index d2be43205a..9bdd58942a 100644 --- a/ethereum/dev_console.go +++ b/ethereum/dev_console.go @@ -191,7 +191,7 @@ func (i *Console) ParseInput(input string) bool { case "contract": fmt.Println("Contract editor (Ctrl-D = done)") - mainInput, initInput := mutan.PreProcess(i.Editor()) + mainInput, initInput := mutan.PreParse(i.Editor()) mainScript, err := utils.Compile(mainInput) if err != nil { fmt.Println(err) From cf7ab072644c9427501f9a29d7ad5c5492edf062 Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 12 May 2014 13:41:52 +0200 Subject: [PATCH 02/15] Disable seed by default Seed host seems down, only causes timeouts, not helpful --- ethereal/config.go | 2 +- ethereum/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ethereal/config.go b/ethereal/config.go index 94f896c5f1..af85975f20 100644 --- a/ethereal/config.go +++ b/ethereal/config.go @@ -25,7 +25,7 @@ func Init() { 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") + flag.BoolVar(&UseSeed, "seed", false, "seed peers") flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") flag.BoolVar(&ExportKey, "export", false, "export private key") flag.StringVar(&OutboundPort, "p", "30303", "listening port") diff --git a/ethereum/config.go b/ethereum/config.go index 234e79f126..db13918817 100644 --- a/ethereum/config.go +++ b/ethereum/config.go @@ -28,7 +28,7 @@ func Init() { 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") + flag.BoolVar(&UseSeed, "seed", false, "seed peers") flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") flag.BoolVar(&ExportKey, "export", false, "export private key") flag.StringVar(&OutboundPort, "p", "30303", "listening port") From c43ea30e75fb0308b9cdf56070dd84d133013b51 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 12 May 2014 13:56:29 +0200 Subject: [PATCH 03/15] Refactored some code and fixed #37 --- ethereal/assets/qml/first_run.qml | 262 +++++++++++++++--------------- ethereal/ui/gui.go | 107 +++++++++--- 2 files changed, 214 insertions(+), 155 deletions(-) diff --git a/ethereal/assets/qml/first_run.qml b/ethereal/assets/qml/first_run.qml index 0bd3b4ce10..0b1dac4c60 100644 --- a/ethereal/assets/qml/first_run.qml +++ b/ethereal/assets/qml/first_run.qml @@ -10,146 +10,146 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Dialogs 1.1 ApplicationWindow { - id: wizardRoot - width: 500 - height: 400 - title: "Ethereal first run setup" + id: wizardRoot + width: 500 + height: 400 + title: "Ethereal first run setup" - Column { - spacing: 5 - anchors.leftMargin: 10 - anchors.left: parent.left + Column { + spacing: 5 + anchors.leftMargin: 10 + anchors.left: parent.left - Text { - visible: true - text: "

Ethereal setup

" - } + Text { + visible: true + text: "

Ethereal setup

" + } - Column { - id: restoreColumn - spacing: 5 - Text { - visible: true - font.pointSize: 14 - text: "Restore your Ethereum account" - id: restoreLabel - } + Column { + id: restoreColumn + spacing: 5 + Text { + visible: true + font.pointSize: 14 + text: "Restore your Ethereum account" + id: restoreLabel + } - TextField { - id: txPrivKey - width: 480 - placeholderText: "Private key or mnemonic words" - focus: true - onTextChanged: { - if(this.text.length == 64){ - detailLabel.text = "Private (hex) key detected." - actionButton.enabled = true - } - else if(this.text.split(" ").length == 24){ - detailLabel.text = "Mnemonic key detected." - actionButton.enabled = true - }else{ - detailLabel.text = "" - actionButton.enabled = false - } + TextField { + id: txPrivKey + width: 480 + placeholderText: "Private key or mnemonic words" + focus: true + onTextChanged: { + if(this.text.length == 64){ + detailLabel.text = "Private (hex) key detected." + actionButton.enabled = true + } + else if(this.text.split(" ").length == 24){ + detailLabel.text = "Mnemonic key detected." + actionButton.enabled = true + }else{ + detailLabel.text = "" + actionButton.enabled = false + } + } + } + Row { + spacing: 10 + Button { + id: actionButton + text: "Restore" + enabled: false + onClicked: { + var success = lib.importAndSetPrivKey(txPrivKey.text) + if(success){ + importedDetails.visible = true + restoreColumn.visible = false + newKey.visible = false + wizardRoot.height = 120 + } + } + } + Text { + id: detailLabel + font.pointSize: 12 + anchors.topMargin: 10 + } + } } - } - Row { - spacing: 10 - Button { - id: actionButton - text: "Restore" - enabled: false - onClicked: { - var success = eth.importAndSetPrivKey(txPrivKey.text) - if(success){ - importedDetails.visible = true - restoreColumn.visible = false - newKey.visible = false - wizardRoot.height = 120 - } - } + Column { + id: importedDetails + visible: false + Text { + text: "Your account has been imported. Please close the application and restart it again to let the changes take effect." + wrapMode: Text.WordWrap + width: 460 + } } - Text { - id: detailLabel - font.pointSize: 12 - anchors.topMargin: 10 + Column { + spacing: 5 + id: newDetailsColumn + visible: false + Text { + font.pointSize: 14 + text: "Your account details" + } + Label { + text: "Address" + } + TextField { + id: addressInput + readOnly:true + width: 480 + } + Label { + text: "Private key" + } + TextField { + id: privkeyInput + readOnly:true + width: 480 + } + Label { + text: "Mnemonic words" + } + TextField { + id: mnemonicInput + readOnly:true + width: 480 + } + Label { + text: "A new account has been created. Please take the time to write down the 24 words. You can use those to restore your account at a later date." + wrapMode: Text.WordWrap + width: 480 + } + Label { + text: "Please restart the application once you have completed the steps above." + wrapMode: Text.WordWrap + width: 480 + } } - } - } - Column { - id: importedDetails - visible: false - Text { - text: "Your account has been imported. Please close the application and restart it again to let the changes take effect." - wrapMode: Text.WordWrap - width: 460 - } - } - Column { - spacing: 5 - id: newDetailsColumn - visible: false - Text { - font.pointSize: 14 - text: "Your account details" - } - Label { - text: "Address" - } - TextField { - id: addressInput - readOnly:true - width: 480 - } - Label { - text: "Private key" - } - TextField { - id: privkeyInput - readOnly:true - width: 480 - } - Label { - text: "Mnemonic words" - } - TextField { - id: mnemonicInput - readOnly:true - width: 480 - } - Label { - text: "A new account has been created. Please take the time to write down the 24 words. You can use those to restore your account at a later date." - wrapMode: Text.WordWrap - width: 480 - } - Label { - text: "Please restart the application once you have completed the steps above." - wrapMode: Text.WordWrap - width: 480 - } - } - } - Button { - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.rightMargin: 10 - anchors.bottomMargin: 10 - id: newKey - text: "I don't have an account yet" - onClicked: { - var res = eth.createAndSetPrivKey() - mnemonicInput.text = res[0] - addressInput.text = res[1] - privkeyInput.text = res[2] + } + Button { + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.rightMargin: 10 + anchors.bottomMargin: 10 + id: newKey + text: "I don't have an account yet" + onClicked: { + var res = lib.createAndSetPrivKey() + mnemonicInput.text = res[0] + addressInput.text = res[1] + privkeyInput.text = res[2] - // Hide restore - restoreColumn.visible = false + // Hide restore + restoreColumn.visible = false - // Show new details - newDetailsColumn.visible = true - newKey.visible = false + // Show new details + newDetailsColumn.visible = true + newKey.visible = false + } } - } } diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index 46bfa01334..65c87c4c2f 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -24,7 +24,8 @@ type Gui struct { eth *eth.Ethereum // The public Ethereum library - lib *EthLib + lib *EthLib + uiLib *UiLib txDb *ethdb.LDBDatabase @@ -75,19 +76,55 @@ func (gui *Gui) Start(assetPath string) { // Expose the eth library and the ui library to QML context.SetVar("eth", gui) - uiLib := NewUiLib(gui.engine, gui.eth, assetPath) - context.SetVar("ui", uiLib) + gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath) + context.SetVar("ui", gui.uiLib) // Load the main QML interface data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) - var err error - var component qml.Object - firstRun := len(data) == 0 + /* + var err error + var component qml.Object + firstRun := len(data) == 0 + + if firstRun { + component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml")) + } else { + component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml")) + } + if err != nil { + ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'") + + panic(err) + } + + gui.win = component.CreateWindow(nil) + uiLib.win = gui.win + db := &Debugger{gui.win, make(chan bool)} + gui.lib.Db = db + uiLib.Db = db + + // Add the ui as a log system so we can log directly to the UGI + ethutil.Config.Log.AddLogSystem(gui) + + // Loads previous blocks + if firstRun == false { + go gui.setInitialBlockChain() + go gui.readPreviousTransactions() + go gui.update() + } - if firstRun { - component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml")) + gui.win.Show() + gui.win.Wait() + + gui.eth.Stop() + */ + + var win *qml.Window + var err error + if len(data) == 0 { + win, err = gui.showKeyImport(context) } else { - component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml")) + win, err = gui.showWallet(context) } if err != nil { ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'") @@ -95,26 +132,48 @@ func (gui *Gui) Start(assetPath string) { panic(err) } - gui.win = component.CreateWindow(nil) - uiLib.win = gui.win - db := &Debugger{gui.win, make(chan bool)} - gui.lib.Db = db - uiLib.Db = db + win.Show() + win.Wait() + + gui.eth.Stop() +} + +func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) { + component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/wallet.qml")) + if err != nil { + return nil, err + } - // Add the ui as a log system so we can log directly to the UGI - ethutil.Config.Log.AddLogSystem(gui) + win := gui.createWindow(component) - // Loads previous blocks - if firstRun == false { - go gui.setInitialBlockChain() - go gui.readPreviousTransactions() - go gui.update() + go gui.setInitialBlockChain() + go gui.readPreviousTransactions() + go gui.update() + + return win, nil +} + +func (gui *Gui) showKeyImport(context *qml.Context) (*qml.Window, error) { + context.SetVar("lib", gui.lib) + component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/first_run.qml")) + if err != nil { + return nil, err } - gui.win.Show() - gui.win.Wait() + return gui.createWindow(component), nil +} - gui.eth.Stop() +func (gui *Gui) createWindow(comp qml.Object) *qml.Window { + win := comp.CreateWindow(nil) + + gui.win = win + gui.uiLib.win = win + + db := &Debugger{gui.win, make(chan bool)} + gui.lib.Db = db + gui.uiLib.Db = db + + return gui.win } func (gui *Gui) setInitialBlockChain() { From 618f52312495845f6682c7ff81a3997beee8b15e Mon Sep 17 00:00:00 2001 From: Maran Date: Mon, 12 May 2014 17:23:14 +0200 Subject: [PATCH 04/15] Actually start the Ethereum server on starting the GUI --- ethereal/ethereum.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ethereal/ethereum.go b/ethereal/ethereum.go index 8b8889e373..1a6ab0044d 100644 --- a/ethereal/ethereum.go +++ b/ethereal/ethereum.go @@ -110,5 +110,11 @@ func main() { ethereum.MaxPeers = MaxPeer gui := ethui.New(ethereum) + + ethereum.Start(UseSeed) + gui.Start(AssetPath) + + // Wait for shutdown + ethereum.WaitForShutdown() } From a5963d1377ab1a4a82d5b2881e820121ac3da564 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 11:34:47 +0200 Subject: [PATCH 05/15] Enable seed again --- ethereal/config.go | 2 +- ethereum/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ethereal/config.go b/ethereal/config.go index af85975f20..94f896c5f1 100644 --- a/ethereal/config.go +++ b/ethereal/config.go @@ -25,7 +25,7 @@ func Init() { 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", false, "seed peers") + flag.BoolVar(&UseSeed, "seed", true, "seed peers") flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") flag.BoolVar(&ExportKey, "export", false, "export private key") flag.StringVar(&OutboundPort, "p", "30303", "listening port") diff --git a/ethereum/config.go b/ethereum/config.go index db13918817..234e79f126 100644 --- a/ethereum/config.go +++ b/ethereum/config.go @@ -28,7 +28,7 @@ func Init() { 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", false, "seed peers") + flag.BoolVar(&UseSeed, "seed", true, "seed peers") flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") flag.BoolVar(&ExportKey, "export", false, "export private key") flag.StringVar(&OutboundPort, "p", "30303", "listening port") From b9876df5dc719f583172017cc71af146c6f732a9 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 11:48:52 +0200 Subject: [PATCH 06/15] Added support to NewJsonRpc to return an error as well as an interface --- ethereal/ethereum.go | 8 ++++++-- ethereum/ethereum.go | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/ethereal/ethereum.go b/ethereal/ethereum.go index 1a6ab0044d..bacf6d4461 100644 --- a/ethereal/ethereum.go +++ b/ethereal/ethereum.go @@ -100,8 +100,12 @@ func main() { } if StartRpc { - ethereum.RpcServer = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) - go ethereum.RpcServer.Start() + ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) + if err != nil { + log.Println("Could not start RPC interface:", err) + } else { + go ethereum.RpcServer.Start() + } } log.Printf("Starting Ethereum GUI v%s\n", ethutil.Config.Ver) diff --git a/ethereum/ethereum.go b/ethereum/ethereum.go index 2f05bf2a17..8ef061be06 100644 --- a/ethereum/ethereum.go +++ b/ethereum/ethereum.go @@ -133,8 +133,12 @@ func main() { go console.Start() } if StartRpc { - ethereum.RpcServer = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) - go ethereum.RpcServer.Start() + ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) + if err != nil { + logger.Infoln("Could not start RPC interface:", err) + } else { + go ethereum.RpcServer.Start() + } } RegisterInterrupts(ethereum) From 8c9e6746ce741c5bc2d70f308acc955dace67e01 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 13 May 2014 11:59:03 +0200 Subject: [PATCH 07/15] Fixed wallet crash for new account. Fixes #38 --- ethereal/ui/gui.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index 65c87c4c2f..c1fda47f4c 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -207,7 +207,7 @@ func (gui *Gui) update() { state := gui.eth.StateManager().TransState() unconfirmedFunds := new(big.Int) - gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetStateObject(gui.addr).Amount))) + gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.addr).Amount))) for { select { @@ -215,7 +215,7 @@ func (gui *Gui) update() { tx := txMsg.Tx if txMsg.Type == ethchain.TxPre { - object := state.GetStateObject(gui.addr) + object := state.GetAccount(gui.addr) if bytes.Compare(tx.Sender(), gui.addr) == 0 && object.Nonce <= tx.Nonce { gui.win.Root().Call("addTx", ethpub.NewPTx(tx)) @@ -241,7 +241,7 @@ func (gui *Gui) update() { gui.win.Root().Call("setWalletValue", str) } else { - object := state.GetStateObject(gui.addr) + object := state.GetAccount(gui.addr) if bytes.Compare(tx.Sender(), gui.addr) == 0 { object.SubAmount(tx.Value) } else if bytes.Compare(tx.Recipient, gui.addr) == 0 { From 9a03df7bd831f1b66bc02510a4abed878f4ffa17 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 12:00:48 +0200 Subject: [PATCH 08/15] Implemented a flag for a different RPC port; --rpcport --- ethereal/config.go | 2 ++ ethereal/ethereum.go | 2 +- ethereum/config.go | 2 ++ ethereum/ethereum.go | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ethereal/config.go b/ethereal/config.go index 94f896c5f1..e4bdb0a000 100644 --- a/ethereal/config.go +++ b/ethereal/config.go @@ -7,6 +7,7 @@ import ( var StartConsole bool var StartMining bool var StartRpc bool +var RpcPort int var UseUPnP bool var OutboundPort string var ShowGenesis bool @@ -28,6 +29,7 @@ func Init() { flag.BoolVar(&UseSeed, "seed", true, "seed peers") flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") flag.BoolVar(&ExportKey, "export", false, "export private key") + flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on") flag.StringVar(&OutboundPort, "p", "30303", "listening port") flag.StringVar(&DataDir, "dir", ".ethereal", "ethereum data directory") flag.StringVar(&ImportKey, "import", "", "imports the given private key (hex)") diff --git a/ethereal/ethereum.go b/ethereal/ethereum.go index bacf6d4461..ffc5aaab5c 100644 --- a/ethereal/ethereum.go +++ b/ethereal/ethereum.go @@ -100,7 +100,7 @@ func main() { } if StartRpc { - ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) + ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool()), RpcPort) if err != nil { log.Println("Could not start RPC interface:", err) } else { diff --git a/ethereum/config.go b/ethereum/config.go index 234e79f126..7ca1a9801f 100644 --- a/ethereum/config.go +++ b/ethereum/config.go @@ -7,6 +7,7 @@ import ( var StartConsole bool var StartMining bool var StartRpc bool +var RpcPort int var UseUPnP bool var OutboundPort string var ShowGenesis bool @@ -26,6 +27,7 @@ func Init() { 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.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on") 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 8ef061be06..d49b5dc8af 100644 --- a/ethereum/ethereum.go +++ b/ethereum/ethereum.go @@ -133,7 +133,7 @@ func main() { go console.Start() } if StartRpc { - ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) + ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool()), RpcPort) if err != nil { logger.Infoln("Could not start RPC interface:", err) } else { From 03371b74d7b169c0ad6ccf8868bc97c7fe85169d Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 13 May 2014 12:42:01 +0200 Subject: [PATCH 09/15] Public ethereum interface uses EthManager --- ethereal/ethereum.go | 2 +- ethereal/ui/ext_app.go | 2 +- ethereal/ui/gui.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ethereal/ethereum.go b/ethereal/ethereum.go index bacf6d4461..d848e9a68c 100644 --- a/ethereal/ethereum.go +++ b/ethereal/ethereum.go @@ -100,7 +100,7 @@ func main() { } if StartRpc { - ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) + ethereum.RpcServer = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum)) if err != nil { log.Println("Could not start RPC interface:", err) } else { diff --git a/ethereal/ui/ext_app.go b/ethereal/ui/ext_app.go index 93db0ade13..de5f15db6b 100644 --- a/ethereal/ui/ext_app.go +++ b/ethereal/ui/ext_app.go @@ -34,7 +34,7 @@ type ExtApplication struct { func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { app := &ExtApplication{ - ethpub.NewPEthereum(lib.eth.StateManager(), lib.eth.BlockChain(), lib.eth.TxPool()), + ethpub.NewPEthereum(lib.eth), make(chan ethutil.React, 1), make(chan ethutil.React, 1), make(chan bool), diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index c1fda47f4c..3393b1101c 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -53,7 +53,7 @@ func New(ethereum *eth.Ethereum) *Gui { //ethereum.StateManager().WatchAddr(addr) } - pub := ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool()) + pub := ethpub.NewPEthereum(ethereum) return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub} } From 32c6126593100d37c38e423ec62c56938e5f9155 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 13 May 2014 12:45:47 +0200 Subject: [PATCH 10/15] Fix --- ethereal/ethereum.go | 2 +- ethereum/ethereum.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ethereal/ethereum.go b/ethereal/ethereum.go index d848e9a68c..fd8c56dae5 100644 --- a/ethereal/ethereum.go +++ b/ethereal/ethereum.go @@ -100,7 +100,7 @@ func main() { } if StartRpc { - ethereum.RpcServer = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum)) + ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum)) if err != nil { log.Println("Could not start RPC interface:", err) } else { diff --git a/ethereum/ethereum.go b/ethereum/ethereum.go index 8ef061be06..b60eb41817 100644 --- a/ethereum/ethereum.go +++ b/ethereum/ethereum.go @@ -133,7 +133,7 @@ func main() { go console.Start() } if StartRpc { - ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) + ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum)) if err != nil { logger.Infoln("Could not start RPC interface:", err) } else { From 20ea78945e751a1ad11e2b2fc7c4224f4c46e108 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 14:43:08 +0200 Subject: [PATCH 11/15] Implemented new JS/EthPub methods - getTxCountAt - getPeerCount - getIsMining - getIsListening - getCoinbase --- ethereal/assets/ext/ethereum.js | 17 ++++++++++++ ethereal/assets/qml/webapp.qml | 24 +++++++++++++++++ ethereum/ethereum.go | 47 ++++++++++++++++++--------------- 3 files changed, 66 insertions(+), 22 deletions(-) diff --git a/ethereal/assets/ext/ethereum.js b/ethereal/assets/ext/ethereum.js index f565e58bd6..d4eaf97fdf 100644 --- a/ethereal/assets/ext/ethereum.js +++ b/ethereal/assets/ext/ethereum.js @@ -36,6 +36,21 @@ window.eth = { postData({call: "getKey"}, cb); }, + getTxCountAt: function(address, cb) { + postData({call: "getTxCountAt", args: [address]}, cb); + }, + getIsMining: function(cb){ + postData({call: "getIsMining"}, cb) + }, + getIsListening: function(cb){ + postData({call: "getIsListening"}, cb) + }, + getCoinBase: function(cb){ + postData({call: "getCoinBase"}, cb); + }, + getPeerCount: function(cb){ + postData({call: "getPeerCount"}, cb); + }, getBalanceAt: function(address, cb) { postData({call: "getBalance", args: [address]}, cb); }, @@ -115,6 +130,8 @@ window.eth = { } } }, + + } window.eth._callbacks = {} window.eth._onCallbacks = {} diff --git a/ethereal/assets/qml/webapp.qml b/ethereal/assets/qml/webapp.qml index 14f3bd6d0e..86eb7fe2f3 100644 --- a/ethereal/assets/qml/webapp.qml +++ b/ethereal/assets/qml/webapp.qml @@ -47,13 +47,37 @@ ApplicationWindow { try { switch(data.call) { + case "getCoinBase": + postData(data._seed, eth.getCoinBase()) + + break + case "getIsListening": + postData(data._seed, eth.getIsListening()) + + break + case "getIsMining": + postData(data._seed, eth.getIsMining()) + + break + case "getPeerCount": + postData(data._seed, eth.getPeerCount()) + + break + + case "getTxCountAt": + require(1) + postData(data._seed, eth.getTxCountAt(data.args[0])) + + break case "getBlockByNumber": var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06") postData(data._seed, block) + break case "getBlockByHash": var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06") postData(data._seed, block) + break case "transact": require(5) diff --git a/ethereum/ethereum.go b/ethereum/ethereum.go index 5b578deba9..8b22533d9a 100644 --- a/ethereum/ethereum.go +++ b/ethereum/ethereum.go @@ -122,28 +122,8 @@ func main() { // Set the max peers ethereum.MaxPeers = MaxPeer - if StartConsole { - err := os.Mkdir(ethutil.Config.ExecPath, os.ModePerm) - // Error is OK if the error is ErrExist - if err != nil && !os.IsExist(err) { - log.Panic("Unable to create EXECPATH:", err) - } - - console := NewConsole(ethereum) - go console.Start() - } - if StartRpc { - ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum), RpcPort) - if err != nil { - logger.Infoln("Could not start RPC interface:", err) - } else { - go ethereum.RpcServer.Start() - } - } - - RegisterInterrupts(ethereum) - - ethereum.Start(UseSeed) + // Set Mining status + ethereum.Mining = StartMining if StartMining { logger.Infoln("Miner started") @@ -168,6 +148,29 @@ func main() { } + if StartConsole { + err := os.Mkdir(ethutil.Config.ExecPath, os.ModePerm) + // Error is OK if the error is ErrExist + if err != nil && !os.IsExist(err) { + log.Panic("Unable to create EXECPATH:", err) + } + + console := NewConsole(ethereum) + go console.Start() + } + if StartRpc { + ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum), RpcPort) + if err != nil { + logger.Infoln("Could not start RPC interface:", err) + } else { + go ethereum.RpcServer.Start() + } + } + + RegisterInterrupts(ethereum) + + ethereum.Start(UseSeed) + // Wait for shutdown ethereum.WaitForShutdown() } From 54eff2d778ef6e8a84d336d4fb14a5a35728340c Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 14:48:45 +0200 Subject: [PATCH 12/15] Change coinbase to be the address not public key --- ethereum/ethereum.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ethereum/ethereum.go b/ethereum/ethereum.go index 8b22533d9a..babebbb482 100644 --- a/ethereum/ethereum.go +++ b/ethereum/ethereum.go @@ -1,6 +1,7 @@ package main import ( + "encoding/hex" "fmt" "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethchain" @@ -139,7 +140,9 @@ func main() { keyRing := ethutil.NewValueFromBytes(data) addr := keyRing.Get(1).Bytes() - miner := ethminer.NewDefaultMiner(addr, ethereum) + pair, _ := ethchain.NewKeyPairFromSec(ethutil.FromHex(hex.EncodeToString(addr))) + + miner := ethminer.NewDefaultMiner(pair.Address(), ethereum) miner.Start() }() From ee2cef3b2e309354743b72ba96001fc799f20e8d Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 14:49:21 +0200 Subject: [PATCH 13/15] Adding new API test case html --- ethereal/assets/util/test.html | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 ethereal/assets/util/test.html diff --git a/ethereal/assets/util/test.html b/ethereal/assets/util/test.html new file mode 100644 index 0000000000..d458e66708 --- /dev/null +++ b/ethereal/assets/util/test.html @@ -0,0 +1,43 @@ + + +Utils + + + +

+ + +

+ + +

+ + +

+ + +

+ + + + + From edc281ac5fb3f77aa826507390d374d5bbe1bb81 Mon Sep 17 00:00:00 2001 From: Maran Date: Tue, 13 May 2014 14:53:46 +0200 Subject: [PATCH 14/15] Depcrecated set --- ethereal/assets/qml/webapp.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ethereal/assets/qml/webapp.qml b/ethereal/assets/qml/webapp.qml index 86eb7fe2f3..7af006f779 100644 --- a/ethereal/assets/qml/webapp.qml +++ b/ethereal/assets/qml/webapp.qml @@ -118,11 +118,14 @@ ApplicationWindow { postData(data._seed, null) break; case "set": + console.log("'Set' has been depcrecated") + /* for(var key in data.args) { if(webview.hasOwnProperty(key)) { window[key] = data.args[key]; } } + */ break; case "getSecretToAddress": require(1) From 9caf53f8c63cb30a174d2b33ef85176c8f6f8204 Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 13 May 2014 16:37:15 +0200 Subject: [PATCH 15/15] Bumped --- ethereal/ui/gui.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index 3393b1101c..7f84272d6c 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -68,7 +68,7 @@ func (gui *Gui) Start(assetPath string) { Init: func(p *ethpub.PTx, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, }}) - ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", "0.5.0 RC3")) + ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", "0.5.0 RC4")) ethutil.Config.Log.Infoln("[GUI] Starting GUI") // Create a new QML engine gui.engine = qml.NewEngine()