Merge branch 'release/poc5-rc11'

pull/94/head poc5-rc11
Maran 10 years ago
commit 2114218ed8
  1. 2
      README.md
  2. 6
      ethereal/assets/debugger/debugger.qml
  3. 41
      ethereal/assets/qml/wallet.qml
  4. 70
      ethereal/ui/debugger.go
  5. 2
      ethereal/ui/gui.go
  6. 22
      ethereal/ui/ui_lib.go

@ -5,7 +5,7 @@ Ethereum
Ethereum Go Client © 2014 Jeffrey Wilcke. 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). For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).

@ -14,6 +14,9 @@ ApplicationWindow {
width: 1290 width: 1290
height: 900 height: 900
property alias codeText: codeEditor.text
property alias dataText: rawDataField.text
MenuBar { MenuBar {
Menu { Menu {
title: "Debugger" title: "Debugger"
@ -167,6 +170,7 @@ ApplicationWindow {
} }
} }
} }
toolBar: ToolBar { toolBar: ToolBar {
RowLayout { RowLayout {
spacing: 5 spacing: 5
@ -205,7 +209,7 @@ ApplicationWindow {
function setInstruction(num) { function setInstruction(num) {
asmTableView.selection.clear() asmTableView.selection.clear()
asmTableView.selection.select(num-1) asmTableView.selection.select(num)
} }
function setMem(mem) { function setMem(mem) {

@ -340,10 +340,8 @@ ApplicationWindow {
id: popup id: popup
visible: false visible: false
property var block property var block
width: 800 width: root.width
height: 280 height: 240
x: root.x
y: root.y + root.height
Component{ Component{
id: blockDetailsDelegate id: blockDetailsDelegate
Rectangle { Rectangle {
@ -389,17 +387,27 @@ ApplicationWindow {
onClicked: { onClicked: {
var tx = transactionModel.get(row) var tx = transactionModel.get(row)
if(tx.data) { if(tx.data) {
popup.showContractData(tx.data) popup.showContractData(tx)
}else{ }else{
popup.height = 230 popup.height = 230
} }
} }
} }
function showContractData(data) {
contractData.text = data function showContractData(tx) {
txDetailsDebugButton.tx = tx
if(tx.createsContract) {
contractData.text = tx.data
contractLabel.text = "<h4> Transaction created contract " + tx.address + "</h4>"
}else{
contractLabel.text = "<h4> Transaction ran contract " + tx.address + "</h4>"
contractData.text = tx.rawData
}
popup.height = 400 popup.height = 400
} }
Rectangle { Rectangle {
id: txDetails
width: popup.width width: popup.width
height: 300 height: 300
anchors.left: listViewThing.left anchors.left: listViewThing.left
@ -411,11 +419,28 @@ ApplicationWindow {
id: contractLabel id: contractLabel
anchors.leftMargin: 10 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 { TextArea {
id: contractData id: contractData
text: "Contract" text: "Contract"
anchors.top: contractLabel.bottom anchors.top: contractLabel.bottom
anchors.left: parent.left anchors.left: parent.left
anchors.bottom: popup.bottom
wrapMode: Text.Wrap wrapMode: Text.Wrap
width: parent.width - 30 width: parent.width - 30
height: 80 height: 80
@ -437,7 +462,7 @@ ApplicationWindow {
transactionModel.insert(0, block.txs.get(i)) transactionModel.insert(0, block.txs.get(i))
} }
if(block.txs.get(0).data){ if(block.txs.get(0).data){
popup.showContractData(block.txs.get(0).data) popup.showContractData(block.txs.get(0))
} }
} }
txView.forceActiveFocus() txView.forceActiveFocus()

@ -9,6 +9,23 @@ import (
"strings" "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 { type DebuggerWindow struct {
win *qml.Window win *qml.Window
engine *qml.Engine engine *qml.Engine
@ -41,21 +58,18 @@ func (self *DebuggerWindow) Show() {
}() }()
} }
func formatData(data string) []byte { func (self *DebuggerWindow) SetCode(code string) {
if len(data) == 0 { self.win.Set("codeText", code)
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) 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) { func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, dataStr string) {
@ -63,22 +77,28 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
self.Db.Q <- true 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() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
fmt.Println(r) 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 { if err != nil {
ethutil.Config.Log.Debugln(err) ethutil.Config.Log.Debugln(err)
@ -91,11 +111,13 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
for _, str := range dis { for _, str := range dis {
self.win.Root().Call("setAsm", str) self.win.Root().Call("setAsm", str)
} }
// Contract addr as test address // Contract addr as test address
keyPair := ethutil.GetKeyRing().Get(0) keyPair := ethutil.GetKeyRing().Get(0)
callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasStr), ethutil.Big(gasPriceStr), script) callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasStr), ethutil.Big(gasPriceStr), script)
callerTx.Sign(keyPair.PrivateKey) callerTx.Sign(keyPair.PrivateKey)
state := self.lib.eth.BlockChain().CurrentBlock.State()
account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address()) account := self.lib.eth.StateManager().TransState().GetAccount(keyPair.Address())
contract := ethchain.MakeContract(callerTx, state) contract := ethchain.MakeContract(callerTx, state)
callerClosure := ethchain.NewClosure(account, contract, script, state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr)) callerClosure := ethchain.NewClosure(account, contract, script, state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr))

@ -54,7 +54,7 @@ func New(ethereum *eth.Ethereum) *Gui {
} }
func (gui *Gui) Start(assetPath string) { func (gui *Gui) Start(assetPath string) {
const version = "0.5.0 RC10" const version = "0.5.0 RC11"
defer gui.txDb.Close() defer gui.txDb.Close()

@ -24,8 +24,9 @@ type UiLib struct {
connected bool connected bool
assetPath string assetPath string
// The main application window // The main application window
win *qml.Window win *qml.Window
Db *Debugger Db *Debugger
DbWindow *DebuggerWindow
} }
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
@ -88,9 +89,26 @@ func (ui *UiLib) ConnectToPeer(addr string) {
func (ui *UiLib) AssetPath(p string) string { func (ui *UiLib) AssetPath(p string) string {
return path.Join(ui.assetPath, p) 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" + ethutil.Hex(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() { func (self *UiLib) StartDebugger() {
dbWindow := NewDebuggerWindow(self) dbWindow := NewDebuggerWindow(self)
//self.DbWindow = dbWindow
dbWindow.Show() dbWindow.Show()
} }

Loading…
Cancel
Save