diff --git a/README.md b/README.md index 29dae73418..790ee541e1 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 a79e4708c1..eef49824f1 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 7742b16271..0963874057 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,22 +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 - callerClosure := ethchain.NewClosure(account, contract, script, state, gas, gasPrice) + self.SetAsm(script) + + 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 @@ -255,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) } @@ -273,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") @@ -289,7 +299,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/ext_app.go b/ethereal/ext_app.go index 17c342a1b9..ac3e090f90 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/gui.go b/ethereal/gui.go index d816a774fa..df01cddda0 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() @@ -220,8 +222,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())}) } }) diff --git a/ethereal/html_container.go b/ethereal/html_container.go index 04136f8017..b00d3f78e0 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 e1cd43acec..0f99be8865 100644 --- a/ethereal/main.go +++ b/ethereal/main.go @@ -10,15 +10,14 @@ import ( const ( ClientIdentifier = "Ethereal" - Version = "0.5.17" + Version = "0.6.0" ) 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 cb43a99bde..1b420ee219 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 997a3391a9..6a62fa1df2 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 b670cb495b..2179910748 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/ethereum/repl/javascript_runtime.go b/ethereum/repl/javascript_runtime.go index cd87f98687..41b6216d49 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) diff --git a/utils/vm_env.go b/utils/vm_env.go new file mode 100644 index 0000000000..2c40dd7b85 --- /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 }