Merge branch 'develop' of github.com:ethereum/go-ethereum into develop
This commit is contained in:
commit
c3ad210846
|
@ -10,146 +10,146 @@ import QtQuick.Controls.Styles 1.1
|
||||||
import QtQuick.Dialogs 1.1
|
import QtQuick.Dialogs 1.1
|
||||||
|
|
||||||
ApplicationWindow {
|
ApplicationWindow {
|
||||||
id: wizardRoot
|
id: wizardRoot
|
||||||
width: 500
|
width: 500
|
||||||
height: 400
|
height: 400
|
||||||
title: "Ethereal first run setup"
|
title: "Ethereal first run setup"
|
||||||
|
|
||||||
Column {
|
|
||||||
spacing: 5
|
|
||||||
anchors.leftMargin: 10
|
|
||||||
anchors.left: parent.left
|
|
||||||
|
|
||||||
Text {
|
|
||||||
visible: true
|
|
||||||
text: "<h2>Ethereal setup</h2>"
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: restoreColumn
|
spacing: 5
|
||||||
spacing: 5
|
anchors.leftMargin: 10
|
||||||
Text {
|
anchors.left: parent.left
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Text {
|
Text {
|
||||||
id: detailLabel
|
visible: true
|
||||||
font.pointSize: 12
|
text: "<h2>Ethereal setup</h2>"
|
||||||
anchors.topMargin: 10
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
Column {
|
|
||||||
id: importedDetails
|
|
||||||
visible: false
|
|
||||||
Text {
|
|
||||||
text: "<b>Your account has been imported. Please close the application and restart it again to let the changes take effect.</b>"
|
|
||||||
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: "<b>A new account has been created. Please take the time to write down the <i>24 words</i>. You can use those to restore your account at a later date.</b>"
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
width: 480
|
|
||||||
}
|
|
||||||
Label {
|
|
||||||
text: "Please restart the application once you have completed the steps above."
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
width: 480
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
Column {
|
||||||
Button {
|
id: restoreColumn
|
||||||
anchors.right: parent.right
|
spacing: 5
|
||||||
anchors.bottom: parent.bottom
|
Text {
|
||||||
anchors.rightMargin: 10
|
visible: true
|
||||||
anchors.bottomMargin: 10
|
font.pointSize: 14
|
||||||
id: newKey
|
text: "Restore your Ethereum account"
|
||||||
text: "I don't have an account yet"
|
id: restoreLabel
|
||||||
onClicked: {
|
}
|
||||||
var res = eth.createAndSetPrivKey()
|
|
||||||
mnemonicInput.text = res[0]
|
|
||||||
addressInput.text = res[1]
|
|
||||||
privkeyInput.text = res[2]
|
|
||||||
|
|
||||||
// Hide restore
|
TextField {
|
||||||
restoreColumn.visible = false
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Column {
|
||||||
|
id: importedDetails
|
||||||
|
visible: false
|
||||||
|
Text {
|
||||||
|
text: "<b>Your account has been imported. Please close the application and restart it again to let the changes take effect.</b>"
|
||||||
|
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: "<b>A new account has been created. Please take the time to write down the <i>24 words</i>. You can use those to restore your account at a later date.</b>"
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
width: 480
|
||||||
|
}
|
||||||
|
Label {
|
||||||
|
text: "Please restart the application once you have completed the steps above."
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
width: 480
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Show new details
|
|
||||||
newDetailsColumn.visible = true
|
|
||||||
newKey.visible = false
|
|
||||||
}
|
}
|
||||||
}
|
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
|
||||||
|
|
||||||
|
// Show new details
|
||||||
|
newDetailsColumn.visible = true
|
||||||
|
newKey.visible = false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,8 @@ type Gui struct {
|
||||||
eth *eth.Ethereum
|
eth *eth.Ethereum
|
||||||
|
|
||||||
// The public Ethereum library
|
// The public Ethereum library
|
||||||
lib *EthLib
|
lib *EthLib
|
||||||
|
uiLib *UiLib
|
||||||
|
|
||||||
txDb *ethdb.LDBDatabase
|
txDb *ethdb.LDBDatabase
|
||||||
|
|
||||||
|
@ -75,19 +76,55 @@ func (gui *Gui) Start(assetPath string) {
|
||||||
|
|
||||||
// Expose the eth library and the ui library to QML
|
// Expose the eth library and the ui library to QML
|
||||||
context.SetVar("eth", gui)
|
context.SetVar("eth", gui)
|
||||||
uiLib := NewUiLib(gui.engine, gui.eth, assetPath)
|
gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath)
|
||||||
context.SetVar("ui", uiLib)
|
context.SetVar("ui", gui.uiLib)
|
||||||
|
|
||||||
// Load the main QML interface
|
// Load the main QML interface
|
||||||
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
|
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
|
||||||
var err error
|
/*
|
||||||
var component qml.Object
|
var err error
|
||||||
firstRun := len(data) == 0
|
var component qml.Object
|
||||||
|
firstRun := len(data) == 0
|
||||||
|
|
||||||
if firstRun {
|
if firstRun {
|
||||||
component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml"))
|
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()
|
||||||
|
}
|
||||||
|
|
||||||
|
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 {
|
} else {
|
||||||
component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml"))
|
win, err = gui.showWallet(context)
|
||||||
}
|
}
|
||||||
if err != nil {
|
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'")
|
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,28 +132,50 @@ func (gui *Gui) Start(assetPath string) {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
gui.win = component.CreateWindow(nil)
|
win.Show()
|
||||||
uiLib.win = gui.win
|
win.Wait()
|
||||||
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()
|
|
||||||
}
|
|
||||||
|
|
||||||
gui.win.Show()
|
|
||||||
gui.win.Wait()
|
|
||||||
|
|
||||||
gui.eth.Stop()
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
win := gui.createWindow(component)
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
return gui.createWindow(component), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
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() {
|
func (gui *Gui) setInitialBlockChain() {
|
||||||
// Load previous 10 blocks
|
// Load previous 10 blocks
|
||||||
chain := gui.eth.BlockChain().GetChain(gui.eth.BlockChain().CurrentBlock.Hash(), 10)
|
chain := gui.eth.BlockChain().GetChain(gui.eth.BlockChain().CurrentBlock.Hash(), 10)
|
||||||
|
|
Loading…
Reference in New Issue