From 15960a5c04c154a07d8813fcc9a6fa465d8d4500 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 21 Jul 2014 11:55:50 +0200 Subject: [PATCH 1/6] changed iterator --- ethereal/debugger.go | 2 +- ethereal/gui.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ethereal/debugger.go b/ethereal/debugger.go index 7742b1627..17087f8ce 100644 --- a/ethereal/debugger.go +++ b/ethereal/debugger.go @@ -289,7 +289,7 @@ func (d *Debugger) halting(pc int, op ethchain.OpCode, mem *ethchain.Memory, sta d.win.Root().Call("setStack", val.String()) } - stateObject.State().EachStorage(func(key string, node *ethutil.Value) { + stateObject.EachStorage(func(key string, node *ethutil.Value) { d.win.Root().Call("setStorage", storeVal{fmt.Sprintf("% x", key), fmt.Sprintf("% x", node.Str())}) }) diff --git a/ethereal/gui.go b/ethereal/gui.go index d816a774f..d76db2ade 100644 --- a/ethereal/gui.go +++ b/ethereal/gui.go @@ -220,8 +220,9 @@ func (gui *Gui) loadAddressBook() { nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg() if nameReg != nil { - nameReg.State().EachStorage(func(name string, value *ethutil.Value) { + nameReg.EachStorage(func(name string, value *ethutil.Value) { if name[0] != 0 { + value.Decode() gui.win.Root().Call("addAddress", struct{ Name, Address string }{name, ethutil.Bytes2Hex(value.Bytes())}) } }) From e7a80ec68165755678647f2d3e9b475d492a70dd Mon Sep 17 00:00:00 2001 From: obscuren Date: Tue, 22 Jul 2014 19:54:33 +0200 Subject: [PATCH 2/6] set asm --- ethereal/debugger.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ethereal/debugger.go b/ethereal/debugger.go index 17087f8ce..a82dcb43f 100644 --- a/ethereal/debugger.go +++ b/ethereal/debugger.go @@ -133,6 +133,8 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data contract := ethchain.NewStateObject([]byte{0}) contract.Amount = value + self.SetAsm(script) + callerClosure := ethchain.NewClosure(account, contract, script, state, gas, gasPrice) block := self.lib.eth.BlockChain().CurrentBlock From a06a84d19b24da4005bc4d150f071ec4a703521b Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 24 Jul 2014 12:30:41 +0200 Subject: [PATCH 3/6] Refactored to reflect the new VM and State --- README.md | 2 +- ethereal/assets/qml/wallet.qml | 2 ++ ethereal/debugger.go | 44 ++++++++++++++++++++-------------- ethereal/ext_app.go | 9 +++---- ethereal/html_container.go | 5 ++-- ethereal/main.go | 2 +- ethereal/qml_container.go | 5 ++-- ethereal/ui_lib.go | 4 ++-- ethereum/main.go | 2 +- utils/vm_env.go | 33 +++++++++++++++++++++++++ 10 files changed, 77 insertions(+), 31 deletions(-) create mode 100644 utils/vm_env.go diff --git a/README.md b/README.md index 29dae7341..790ee541e 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.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..eef49824f 100644 --- a/ethereal/assets/qml/wallet.qml +++ b/ethereal/assets/qml/wallet.qml @@ -249,6 +249,8 @@ ApplicationWindow { } TextField { text: eth.getCustomIdentifier() + width: 500 + placeholderText: "Anonymous" onTextChanged: { eth.setCustomIdentifier(text) } diff --git a/ethereal/debugger.go b/ethereal/debugger.go index a82dcb43f..096387405 100644 --- a/ethereal/debugger.go +++ b/ethereal/debugger.go @@ -3,7 +3,10 @@ package main import ( "fmt" "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" "math/big" "strconv" @@ -15,10 +18,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 +35,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,24 +133,29 @@ 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 := ethstate.NewStateObject([]byte{0}) contract.Amount = value self.SetAsm(script) - callerClosure := ethchain.NewClosure(account, contract, script, state, gas, gasPrice) + callerClosure := ethvm.NewClosure(account, contract, script, gas, gasPrice) 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), - }) + + /* + 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), + }) + */ + env := utils.NewEnv(state, block, account.Address(), value) + vm := ethvm.New(env) vm.Verbose = true vm.Dbg = self.Db @@ -257,13 +265,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) } @@ -275,7 +283,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 17c342a1b..ac3e090f9 100644 --- a/ethereal/ext_app.go +++ b/ethereal/ext_app.go @@ -4,6 +4,7 @@ import ( "fmt" "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" ) @@ -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) } @@ -108,9 +109,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/html_container.go b/ethereal/html_container.go index 04136f801..b00d3f78e 100644 --- a/ethereal/html_container.go +++ b/ethereal/html_container.go @@ -4,6 +4,7 @@ import ( "errors" "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" @@ -121,11 +122,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..ebda552ee 100644 --- a/ethereal/main.go +++ b/ethereal/main.go @@ -10,7 +10,7 @@ import ( const ( ClientIdentifier = "Ethereal" - Version = "0.5.17" + Version = "0.6.0" ) func main() { diff --git a/ethereal/qml_container.go b/ethereal/qml_container.go index cb43a99bd..1b420ee21 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" @@ -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..217991074 100644 --- a/ethereum/main.go +++ b/ethereum/main.go @@ -9,7 +9,7 @@ import ( const ( ClientIdentifier = "Ethereum(G)" - Version = "0.5.17" + Version = "0.6.0" ) var logger = ethlog.NewLogger("CLI") 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 } From 2e39efbe7c487fd605de0f6915bcae789138fb7e Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 24 Jul 2014 12:34:48 +0200 Subject: [PATCH 4/6] New State object --- ethereum/repl/javascript_runtime.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ethereum/repl/javascript_runtime.go b/ethereum/repl/javascript_runtime.go index cd87f9868..41b6216d4 100644 --- a/ethereum/repl/javascript_runtime.go +++ b/ethereum/repl/javascript_runtime.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethpub" + "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/go-ethereum/utils" "github.com/obscuren/otto" @@ -121,12 +122,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) From 82a84dca807c8966079253977329ef0800d20557 Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 24 Jul 2014 14:16:43 +0200 Subject: [PATCH 5/6] Move to goroutine for faster startup time --- ethereal/gui.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/ethereal/gui.go b/ethereal/gui.go index d76db2ade..df01cddda 100644 --- a/ethereal/gui.go +++ b/ethereal/gui.go @@ -143,10 +143,12 @@ func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) { win := gui.createWindow(component) - gui.setInitialBlockChain() - gui.loadAddressBook() - gui.readPreviousTransactions() - gui.setPeerInfo() + go func() { + gui.setInitialBlockChain() + gui.loadAddressBook() + gui.readPreviousTransactions() + gui.setPeerInfo() + }() go gui.update() From 44da1801d87abff4803338d9bcfb25be93969dad Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 24 Jul 2014 14:34:22 +0200 Subject: [PATCH 6/6] Fixed strange issue where qml will crash first run after go install --- ethereal/main.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ethereal/main.go b/ethereal/main.go index ebda552ee..0f99be886 100644 --- a/ethereal/main.go +++ b/ethereal/main.go @@ -14,11 +14,10 @@ const ( ) 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