From 09728bf43ce5eaed3060d0ce8aae323055aa6cba Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 28 May 2014 13:00:45 +0200 Subject: [PATCH 1/4] Debugger script&data now accept "0x" values --- ethereal/assets/debugger/debugger.qml | 6 ++- ethereal/ui/debugger.go | 64 +++++++++++++++++---------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/ethereal/assets/debugger/debugger.qml b/ethereal/assets/debugger/debugger.qml index 7c3ffbceb..40b0b68b1 100644 --- a/ethereal/assets/debugger/debugger.qml +++ b/ethereal/assets/debugger/debugger.qml @@ -14,6 +14,9 @@ ApplicationWindow { width: 1290 height: 900 + property alias codeText: codeEditor.text + property alias dataText: rawDataField.text + MenuBar { Menu { title: "Debugger" @@ -167,6 +170,7 @@ ApplicationWindow { } } } + toolBar: ToolBar { RowLayout { spacing: 5 @@ -205,7 +209,7 @@ ApplicationWindow { function setInstruction(num) { asmTableView.selection.clear() - asmTableView.selection.select(num-1) + asmTableView.selection.select(num) } function setMem(mem) { diff --git a/ethereal/ui/debugger.go b/ethereal/ui/debugger.go index 8b27c2fe5..5b1fb50a2 100644 --- a/ethereal/ui/debugger.go +++ b/ethereal/ui/debugger.go @@ -9,6 +9,23 @@ import ( "strings" ) +func formatData(data string) []byte { + if len(data) == 0 { + return nil + } + // Simple stupid + d := new(big.Int) + if data[0:1] == "\"" && data[len(data)-1:] == "\"" { + d.SetBytes([]byte(data[1 : len(data)-1])) + } else if data[:2] == "0x" { + d.SetBytes(ethutil.FromHex(data[2:])) + } else { + d.SetString(data, 0) + } + + return ethutil.BigToBytes(d, 256) +} + type DebuggerWindow struct { win *qml.Window engine *qml.Engine @@ -41,21 +58,12 @@ func (self *DebuggerWindow) Show() { }() } -func formatData(data string) []byte { - if len(data) == 0 { - return nil - } - // Simple stupid - d := new(big.Int) - if data[0:1] == "\"" && data[len(data)-1:] == "\"" { - d.SetBytes([]byte(data[1 : len(data)-1])) - } else if data[:2] == "0x" { - d.SetBytes(ethutil.FromHex(data[2:])) - } else { - d.SetString(data, 0) - } +func (self *DebuggerWindow) SetCode(code string) { + self.win.Set("codeText", code) +} - return ethutil.BigToBytes(d, 256) +func (self *DebuggerWindow) SetData(data string) { + self.win.Set("dataText", data) } func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, dataStr string) { @@ -63,22 +71,28 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data self.Db.Q <- true } - dataSlice := strings.Split(dataStr, "\n") - var data []byte - for _, dataItem := range dataSlice { - d := formatData(dataItem) - data = append(data, d...) - } - - state := self.lib.eth.BlockChain().CurrentBlock.State() - defer func() { if r := recover(); r != nil { fmt.Println(r) + self.Db.done = true } }() - script, err := ethutil.Compile(scriptStr) + data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) { + slice := strings.Split(dataStr, "\n") + for _, dataItem := range slice { + d := formatData(dataItem) + ret = append(ret, d...) + } + return + }) + + var err error + script := ethutil.StringToByteFunc(scriptStr, func(s string) (ret []byte) { + ret, err = ethutil.Compile(s) + return + }) + if err != nil { ethutil.Config.Log.Debugln(err) @@ -91,11 +105,13 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data for _, str := range dis { self.win.Root().Call("setAsm", str) } + // Contract addr as test address keyPair := ethutil.GetKeyRing().Get(0) callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasStr), ethutil.Big(gasPriceStr), script) callerTx.Sign(keyPair.PrivateKey) + state := self.lib.eth.BlockChain().CurrentBlock.State() account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address()) contract := ethchain.MakeContract(callerTx, state) callerClosure := ethchain.NewClosure(account, contract, script, state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr)) From 1eda1d25b0d27fe57287698fb883c9153ddda292 Mon Sep 17 00:00:00 2001 From: Maran Date: Wed, 28 May 2014 15:48:17 +0200 Subject: [PATCH 2/4] Hooked up the Block Explorer to the Debugger so we can instantly debug made transactions --- ethereal/assets/qml/wallet.qml | 38 ++++++++++++++++++++++++++++------ ethereal/ui/debugger.go | 6 ++++++ ethereal/ui/ui_lib.go | 23 ++++++++++++++++++-- 3 files changed, 59 insertions(+), 8 deletions(-) diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml index bba9c1d3b..82b680913 100644 --- a/ethereal/assets/qml/wallet.qml +++ b/ethereal/assets/qml/wallet.qml @@ -340,8 +340,8 @@ ApplicationWindow { id: popup visible: false property var block - width: 800 - height: 280 + width: root.width + height: 240 x: root.x y: root.y + root.height Component{ @@ -389,17 +389,27 @@ ApplicationWindow { onClicked: { var tx = transactionModel.get(row) if(tx.data) { - popup.showContractData(tx.data) + popup.showContractData(tx) }else{ popup.height = 230 } } } - function showContractData(data) { - contractData.text = data + + function showContractData(tx) { + txDetailsDebugButton.tx = tx + if(tx.createsContract) { + contractData.text = tx.data + contractLabel.text = "

Transaction created contract " + tx.address + "

" + }else{ + contractLabel.text = "

Transaction ran contract " + tx.address + "

" + contractData.text = tx.rawData + } popup.height = 400 } + Rectangle { + id: txDetails width: popup.width height: 300 anchors.left: listViewThing.left @@ -411,6 +421,22 @@ ApplicationWindow { id: contractLabel anchors.leftMargin: 10 } + Button { + property var tx + id: txDetailsDebugButton + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.top: parent.top + anchors.topMargin: 10 + text: "Debug contract" + onClicked: { + if(tx.createsContract){ + ui.startDbWithCode(tx.rawData) + }else { + ui.startDbWithContractAndData(tx.address, tx.rawData) + } + } + } TextArea { id: contractData text: "Contract" @@ -437,7 +463,7 @@ ApplicationWindow { transactionModel.insert(0, block.txs.get(i)) } if(block.txs.get(0).data){ - popup.showContractData(block.txs.get(0).data) + popup.showContractData(block.txs.get(0)) } } txView.forceActiveFocus() diff --git a/ethereal/ui/debugger.go b/ethereal/ui/debugger.go index 5b1fb50a2..342e3a7d0 100644 --- a/ethereal/ui/debugger.go +++ b/ethereal/ui/debugger.go @@ -65,6 +65,12 @@ func (self *DebuggerWindow) SetCode(code string) { func (self *DebuggerWindow) SetData(data string) { self.win.Set("dataText", data) } +func (self *DebuggerWindow) SetAsm(data string) { + dis := ethchain.Disassemble(ethutil.FromHex(data)) + for _, str := range dis { + self.win.Root().Call("setAsm", str) + } +} func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, dataStr string) { if !self.Db.done { diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go index 998392525..73ec67c86 100644 --- a/ethereal/ui/ui_lib.go +++ b/ethereal/ui/ui_lib.go @@ -2,6 +2,7 @@ package ethui import ( "bitbucket.org/kardianos/osext" + "encoding/hex" "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethutil" @@ -24,8 +25,9 @@ type UiLib struct { connected bool assetPath string // The main application window - win *qml.Window - Db *Debugger + win *qml.Window + Db *Debugger + DbWindow *DebuggerWindow } func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { @@ -88,9 +90,26 @@ func (ui *UiLib) ConnectToPeer(addr string) { func (ui *UiLib) AssetPath(p string) string { return path.Join(ui.assetPath, p) } +func (self *UiLib) StartDbWithContractAndData(contractHash, data string) { + dbWindow := NewDebuggerWindow(self) + object := self.eth.StateManager().CurrentState().GetStateObject(ethutil.FromHex(contractHash)) + if len(object.Script()) > 0 { + dbWindow.SetCode("0x" + hex.EncodeToString(object.Script())) + } + dbWindow.SetData(data) + + dbWindow.Show() +} + +func (self *UiLib) StartDbWithCode(code string) { + dbWindow := NewDebuggerWindow(self) + dbWindow.SetCode("0x" + code) + dbWindow.Show() +} func (self *UiLib) StartDebugger() { dbWindow := NewDebuggerWindow(self) + //self.DbWindow = dbWindow dbWindow.Show() } From d4f9daa631fa832d556c16f3a29eaf73bd849f32 Mon Sep 17 00:00:00 2001 From: Maran Date: Wed, 28 May 2014 16:14:24 +0200 Subject: [PATCH 3/4] Refactor hex encode and remove coupling of popup to main window --- ethereal/assets/qml/wallet.qml | 3 +-- ethereal/ui/ui_lib.go | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml index 82b680913..0e0e3d78d 100644 --- a/ethereal/assets/qml/wallet.qml +++ b/ethereal/assets/qml/wallet.qml @@ -342,8 +342,6 @@ ApplicationWindow { property var block width: root.width height: 240 - x: root.x - y: root.y + root.height Component{ id: blockDetailsDelegate Rectangle { @@ -442,6 +440,7 @@ ApplicationWindow { text: "Contract" anchors.top: contractLabel.bottom anchors.left: parent.left + anchors.bottom: popup.bottom wrapMode: Text.Wrap width: parent.width - 30 height: 80 diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go index 73ec67c86..9c4301ffe 100644 --- a/ethereal/ui/ui_lib.go +++ b/ethereal/ui/ui_lib.go @@ -2,7 +2,6 @@ package ethui import ( "bitbucket.org/kardianos/osext" - "encoding/hex" "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethutil" @@ -94,7 +93,7 @@ func (self *UiLib) StartDbWithContractAndData(contractHash, data string) { dbWindow := NewDebuggerWindow(self) object := self.eth.StateManager().CurrentState().GetStateObject(ethutil.FromHex(contractHash)) if len(object.Script()) > 0 { - dbWindow.SetCode("0x" + hex.EncodeToString(object.Script())) + dbWindow.SetCode("0x" + ethutil.Hex(object.Script())) } dbWindow.SetData(data) From 58032d60e748611b0610cf764743c6b8e5681a87 Mon Sep 17 00:00:00 2001 From: Maran Date: Wed, 28 May 2014 16:17:57 +0200 Subject: [PATCH 4/4] Bump to RC11 --- README.md | 2 +- ethereal/ui/gui.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a47ce7e25..085030ce2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Ethereum Ethereum Go Client © 2014 Jeffrey Wilcke. -Current state: Proof of Concept 5.0 RC10. +Current state: Proof of Concept 5.0 RC11. For the development package please see the [eth-go package](https://github.com/ethereum/eth-go). diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index 63ab028ab..32ff76b1a 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -54,7 +54,7 @@ func New(ethereum *eth.Ethereum) *Gui { } func (gui *Gui) Start(assetPath string) { - const version = "0.5.0 RC10" + const version = "0.5.0 RC11" defer gui.txDb.Close()