diff --git a/README.md b/README.md index 29dae7341..186c979bc 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,13 @@ Ethereum ======== -[![Build Status](https://travis-ci.org/ethereum/go-ethereum.png?branch=master)](https://travis-ci.org/ethereum/go-ethereum) +Master [![Build +Status](http://cpt-obvious.ethercasts.com:8010/buildstatusimage?builder=go-ethereum-master-docker)](http://cpt-obvious.ethercasts.com:8010/builders/go-ethereum-master-docker/builds/-1) Develop [![Build +Status](http://cpt-obvious.ethercasts.com:8010/buildstatusimage?builder=go-ethereum-develop-docker)](http://cpt-obvious.ethercasts.com:8010/builders/go-ethereum-develop-docker/builds/-1) Ethereum Go Client © 2014 Jeffrey Wilcke. -Current state: Proof of Concept 0.5.17. +Current state: Proof of Concept 0.6.0. For the development package please see the [eth-go package](https://github.com/ethereum/eth-go). diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml index a79e4708c..50ff73060 100644 --- a/ethereal/assets/qml/wallet.qml +++ b/ethereal/assets/qml/wallet.qml @@ -26,6 +26,22 @@ ApplicationWindow { shortcut: "Ctrl+o" onTriggered: openAppDialog.open() } + + MenuSeparator {} + + MenuItem { + text: "Import key" + shortcut: "Ctrl+i" + onTriggered: importDialog.open() + } + + MenuItem { + text: "Export keys" + shortcut: "Ctrl+e" + onTriggered: exportDialog.open() + } + + //MenuSeparator {} } Menu { @@ -249,6 +265,8 @@ ApplicationWindow { } TextField { text: eth.getCustomIdentifier() + width: 500 + placeholderText: "Anonymous" onTextChanged: { eth.setCustomIdentifier(text) } @@ -373,9 +391,7 @@ ApplicationWindow { //ui.open(openAppDialog.fileUrl.toString()) //ui.openHtml(Qt.resolvedUrl(ui.assetPath("test.html"))) var path = openAppDialog.fileUrl.toString() - console.log(path) var ext = path.split('.').pop() - console.log(ext) if(ext == "html" || ext == "htm") { ui.openHtml(path) }else if(ext == "qml"){ @@ -384,6 +400,22 @@ ApplicationWindow { } } + FileDialog { + id: exportDialog + title: "Export keys" + onAccepted: { + } + } + + FileDialog { + id: importDialog + title: "Import key" + onAccepted: { + var path = this.fileUrl.toString() + ui.importKey(path) + } + } + statusBar: StatusBar { height: 30 RowLayout { @@ -658,7 +690,7 @@ ApplicationWindow { anchors.left: aboutIcon.right anchors.leftMargin: 10 font.pointSize: 12 - text: "

Ethereal


Development

Jeffrey Wilcke
Maran Hidskes
Viktor Trón
" + text: "

Ethereal - Adrastea


Development

Jeffrey Wilcke
Maran Hidskes
Viktor Trón
" } } diff --git a/ethereal/debugger.go b/ethereal/debugger.go index 17087f8ce..1cf5e0b66 100644 --- a/ethereal/debugger.go +++ b/ethereal/debugger.go @@ -2,12 +2,16 @@ package main import ( "fmt" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethutil" - "github.com/go-qml/qml" "math/big" "strconv" "strings" + + "github.com/ethereum/eth-go/ethchain" + "github.com/ethereum/eth-go/ethstate" + "github.com/ethereum/eth-go/ethutil" + "github.com/ethereum/eth-go/ethvm" + "github.com/ethereum/go-ethereum/utils" + "github.com/go-qml/qml" ) type DebuggerWindow struct { @@ -15,10 +19,10 @@ type DebuggerWindow struct { engine *qml.Engine lib *UiLib - vm *ethchain.Vm + vm *ethvm.Vm Db *Debugger - state *ethchain.State + state *ethstate.State } func NewDebuggerWindow(lib *UiLib) *DebuggerWindow { @@ -32,7 +36,7 @@ func NewDebuggerWindow(lib *UiLib) *DebuggerWindow { win := component.CreateWindow(nil) - w := &DebuggerWindow{engine: engine, win: win, lib: lib, vm: ðchain.Vm{}} + w := &DebuggerWindow{engine: engine, win: win, lib: lib, vm: ðvm.Vm{}} w.Db = NewDebugger(w) return w @@ -130,22 +134,16 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data state := self.lib.eth.StateManager().TransState() account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address()) - contract := ethchain.NewStateObject([]byte{0}) - contract.Amount = value + contract := ethstate.NewStateObject([]byte{0}) + contract.Balance = value - callerClosure := ethchain.NewClosure(account, contract, script, state, gas, gasPrice) + self.SetAsm(script) block := self.lib.eth.BlockChain().CurrentBlock - vm := ethchain.NewVm(state, self.lib.eth.StateManager(), ethchain.RuntimeVars{ - Block: block, - Origin: account.Address(), - BlockNumber: block.Number, - PrevHash: block.PrevHash, - Coinbase: block.Coinbase, - Time: block.Time, - Diff: block.Difficulty, - Value: ethutil.Big(valueStr), - }) + + callerClosure := ethvm.NewClosure(account, contract, script, gas, gasPrice) + env := utils.NewEnv(state, block, account.Address(), value) + vm := ethvm.New(env) vm.Verbose = true vm.Dbg = self.Db @@ -255,13 +253,13 @@ type storeVal struct { Key, Value string } -func (self *Debugger) BreakHook(pc int, op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack, stateObject *ethchain.StateObject) bool { +func (self *Debugger) BreakHook(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool { self.main.Logln("break on instr:", pc) return self.halting(pc, op, mem, stack, stateObject) } -func (self *Debugger) StepHook(pc int, op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack, stateObject *ethchain.StateObject) bool { +func (self *Debugger) StepHook(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool { return self.halting(pc, op, mem, stack, stateObject) } @@ -273,7 +271,7 @@ func (self *Debugger) BreakPoints() []int64 { return self.breakPoints } -func (d *Debugger) halting(pc int, op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack, stateObject *ethchain.StateObject) bool { +func (d *Debugger) halting(pc int, op ethvm.OpCode, mem *ethvm.Memory, stack *ethvm.Stack, stateObject *ethstate.StateObject) bool { d.win.Root().Call("setInstruction", pc) d.win.Root().Call("clearMem") d.win.Root().Call("clearStack") diff --git a/ethereal/ext_app.go b/ethereal/ext_app.go index ac745ae37..697630504 100644 --- a/ethereal/ext_app.go +++ b/ethereal/ext_app.go @@ -4,6 +4,7 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethreact" + "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/go-qml/qml" ) @@ -16,8 +17,8 @@ type AppContainer interface { Engine() *qml.Engine NewBlock(*ethchain.Block) - ObjectChanged(*ethchain.StateObject) - StorageChanged(*ethchain.StorageState) + ObjectChanged(*ethstate.StateObject) + StorageChanged(*ethstate.StorageState) NewWatcher(chan bool) } @@ -107,9 +108,9 @@ out: app.container.NewBlock(block) } case object := <-app.changeChan: - if stateObject, ok := object.Resource.(*ethchain.StateObject); ok { + if stateObject, ok := object.Resource.(*ethstate.StateObject); ok { app.container.ObjectChanged(stateObject) - } else if storageObject, ok := object.Resource.(*ethchain.StorageState); ok { + } else if storageObject, ok := object.Resource.(*ethstate.StorageState); ok { app.container.StorageChanged(storageObject) } } diff --git a/ethereal/gui.go b/ethereal/gui.go index 9bc11e81e..61f7b1099 100644 --- a/ethereal/gui.go +++ b/ethereal/gui.go @@ -3,6 +3,11 @@ package main import ( "bytes" "fmt" + "math/big" + "strconv" + "strings" + "time" + "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethdb" @@ -14,10 +19,6 @@ import ( "github.com/ethereum/eth-go/ethwire" "github.com/ethereum/go-ethereum/utils" "github.com/go-qml/qml" - "math/big" - "strconv" - "strings" - "time" ) var logger = ethlog.NewLogger("GUI") @@ -144,16 +145,21 @@ func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) { win := gui.createWindow(component) - gui.setInitialBlockChain() - gui.loadAddressBook() - gui.readPreviousTransactions() - gui.setPeerInfo() + go func() { + go gui.setInitialBlockChain() + gui.loadAddressBook() + gui.setPeerInfo() + gui.readPreviousTransactions() + }() gui.update() return win, nil } +func (gui *Gui) ImportKey(filePath string) { +} + func (gui *Gui) showKeyImport(context *qml.Context) (*qml.Window, error) { context.SetVar("lib", gui) component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/first_run.qml")) @@ -295,7 +301,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.GetAccount(gui.address()).Amount))) + gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Balance))) gui.getObjectByName("syncProgressIndicator").Set("visible", !gui.eth.IsUpToDate()) lastBlockLabel := gui.getObjectByName("lastBlockLabel") @@ -307,9 +313,8 @@ func (gui *Gui) update() { block := b.Resource.(*ethchain.Block) gui.processBlock(block, false) if bytes.Compare(block.Coinbase, gui.address()) == 0 { - gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Amount, nil) + gui.setWalletValue(gui.eth.StateManager().CurrentState().GetAccount(gui.address()).Balance, nil) } - case txMsg := <-txChan: tx := txMsg.Resource.(*ethchain.Transaction) @@ -328,7 +333,7 @@ func (gui *Gui) update() { unconfirmedFunds.Add(unconfirmedFunds, tx.Value) } - gui.setWalletValue(object.Amount, unconfirmedFunds) + gui.setWalletValue(object.Balance, unconfirmedFunds) } else { object := state.GetAccount(gui.address()) if bytes.Compare(tx.Sender(), gui.address()) == 0 { @@ -337,7 +342,7 @@ func (gui *Gui) update() { object.AddAmount(tx.Value) } - gui.setWalletValue(object.Amount, nil) + gui.setWalletValue(object.Balance, nil) state.UpdateStateObject(object) } diff --git a/ethereal/html_container.go b/ethereal/html_container.go index 04136f801..40a9f5584 100644 --- a/ethereal/html_container.go +++ b/ethereal/html_container.go @@ -2,16 +2,18 @@ package main import ( "errors" - "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethpub" - "github.com/ethereum/eth-go/ethutil" - "github.com/go-qml/qml" - "github.com/howeyc/fsnotify" "io/ioutil" "net/url" "os" "path" "path/filepath" + + "github.com/ethereum/eth-go/ethchain" + "github.com/ethereum/eth-go/ethpub" + "github.com/ethereum/eth-go/ethstate" + "github.com/ethereum/eth-go/ethutil" + "github.com/go-qml/qml" + "github.com/howeyc/fsnotify" ) type HtmlApplication struct { @@ -40,7 +42,7 @@ func (app *HtmlApplication) Create() error { return errors.New("Ethereum package not yet supported") // TODO - ethutil.OpenPackage(app.path) + //ethutil.OpenPackage(app.path) } win := component.CreateWindow(nil) @@ -121,11 +123,11 @@ func (app *HtmlApplication) NewBlock(block *ethchain.Block) { app.webView.Call("onNewBlockCb", b) } -func (app *HtmlApplication) ObjectChanged(stateObject *ethchain.StateObject) { +func (app *HtmlApplication) ObjectChanged(stateObject *ethstate.StateObject) { app.webView.Call("onObjectChangeCb", ethpub.NewPStateObject(stateObject)) } -func (app *HtmlApplication) StorageChanged(storageObject *ethchain.StorageState) { +func (app *HtmlApplication) StorageChanged(storageObject *ethstate.StorageState) { app.webView.Call("onStorageChangeCb", ethpub.NewPStorageState(storageObject)) } diff --git a/ethereal/main.go b/ethereal/main.go index e1cd43ace..04a04536d 100644 --- a/ethereal/main.go +++ b/ethereal/main.go @@ -1,24 +1,24 @@ package main import ( + "os" + "runtime" + "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/go-ethereum/utils" "github.com/go-qml/qml" - "os" - "runtime" ) const ( ClientIdentifier = "Ethereal" - Version = "0.5.17" + Version = "0.6.1" ) func main() { - // Leave QT on top at ALL times. Qt Needs to be initialized from the main thread - qml.Init(nil) - runtime.GOMAXPROCS(runtime.NumCPU()) + qml.Init(nil) + var interrupted = false utils.RegisterInterrupt(func(os.Signal) { interrupted = true diff --git a/ethereal/qml_container.go b/ethereal/qml_container.go index cb43a99bd..53ff13c2f 100644 --- a/ethereal/qml_container.go +++ b/ethereal/qml_container.go @@ -3,6 +3,7 @@ package main import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethpub" + "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/go-qml/qml" "runtime" @@ -24,7 +25,7 @@ func (app *QmlApplication) Create() error { path := string(app.path) // For some reason for windows we get /c:/path/to/something, windows doesn't like the first slash but is fine with the others so we are removing it - if string(app.path[0]) == "/" && runtime.GOOS == "windows" { + if app.path[0] == '/' && runtime.GOOS == "windows" { path = app.path[1:] } @@ -50,11 +51,11 @@ func (app *QmlApplication) NewBlock(block *ethchain.Block) { app.win.Call("onNewBlockCb", pblock) } -func (app *QmlApplication) ObjectChanged(stateObject *ethchain.StateObject) { +func (app *QmlApplication) ObjectChanged(stateObject *ethstate.StateObject) { app.win.Call("onObjectChangeCb", ethpub.NewPStateObject(stateObject)) } -func (app *QmlApplication) StorageChanged(storageObject *ethchain.StorageState) { +func (app *QmlApplication) StorageChanged(storageObject *ethstate.StorageState) { app.win.Call("onStorageChangeCb", ethpub.NewPStorageState(storageObject)) } diff --git a/ethereal/ui_lib.go b/ethereal/ui_lib.go index 997a3391a..6a62fa1df 100644 --- a/ethereal/ui_lib.go +++ b/ethereal/ui_lib.go @@ -78,8 +78,8 @@ func (ui *UiLib) AssetPath(p string) string { func (self *UiLib) StartDbWithContractAndData(contractHash, data string) { dbWindow := NewDebuggerWindow(self) object := self.eth.StateManager().CurrentState().GetStateObject(ethutil.Hex2Bytes(contractHash)) - if len(object.Script()) > 0 { - dbWindow.SetCode("0x" + ethutil.Bytes2Hex(object.Script())) + if len(object.Code) > 0 { + dbWindow.SetCode("0x" + ethutil.Bytes2Hex(object.Code)) } dbWindow.SetData("0x" + data) diff --git a/ethereum/main.go b/ethereum/main.go index b670cb495..9ece8133d 100644 --- a/ethereum/main.go +++ b/ethereum/main.go @@ -1,15 +1,16 @@ package main import ( + "runtime" + "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/go-ethereum/utils" - "runtime" ) const ( ClientIdentifier = "Ethereum(G)" - Version = "0.5.17" + Version = "0.6.1" ) var logger = ethlog.NewLogger("CLI") diff --git a/ethereum/repl/javascript_runtime.go b/ethereum/repl/javascript_runtime.go index 091e758e1..f5aea2dd9 100644 --- a/ethereum/repl/javascript_runtime.go +++ b/ethereum/repl/javascript_runtime.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethreact" + "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/go-ethereum/utils" "github.com/obscuren/otto" @@ -67,7 +68,7 @@ func NewJSRE(ethereum *eth.Ethereum) *JSRE { // Subscribe to events reactor := ethereum.Reactor() - reactor.Subscribe("newBlock", self.blockChan) + reactor.Subscribe("newBlock", re.blockChan) re.Bind("eth", &JSEthereum{re.lib, re.vm}) @@ -122,12 +123,12 @@ out: if _, ok := block.Resource.(*ethchain.Block); ok { } case object := <-self.changeChan: - if stateObject, ok := object.Resource.(*ethchain.StateObject); ok { + if stateObject, ok := object.Resource.(*ethstate.StateObject); ok { for _, cb := range self.objectCb[ethutil.Bytes2Hex(stateObject.Address())] { val, _ := self.vm.ToValue(ethpub.NewPStateObject(stateObject)) cb.Call(cb, val) } - } else if storageObject, ok := object.Resource.(*ethchain.StorageState); ok { + } else if storageObject, ok := object.Resource.(*ethstate.StorageState); ok { for _, cb := range self.objectCb[ethutil.Bytes2Hex(storageObject.StateAddress)+ethutil.Bytes2Hex(storageObject.Address)] { val, _ := self.vm.ToValue(ethpub.NewPStorageState(storageObject)) cb.Call(cb, val) diff --git a/utils/vm_env.go b/utils/vm_env.go new file mode 100644 index 000000000..2c40dd7b8 --- /dev/null +++ b/utils/vm_env.go @@ -0,0 +1,33 @@ +package utils + +import ( + "github.com/ethereum/eth-go/ethchain" + "github.com/ethereum/eth-go/ethstate" + "math/big" +) + +type VMEnv struct { + state *ethstate.State + block *ethchain.Block + + transactor []byte + value *big.Int +} + +func NewEnv(state *ethstate.State, block *ethchain.Block, transactor []byte, value *big.Int) *VMEnv { + return &VMEnv{ + state: state, + block: block, + transactor: transactor, + value: value, + } +} + +func (self *VMEnv) Origin() []byte { return self.transactor } +func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number } +func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash } +func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase } +func (self *VMEnv) Time() int64 { return self.block.Time } +func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty } +func (self *VMEnv) Value() *big.Int { return self.value } +func (self *VMEnv) State() *ethstate.State { return self.state }