forked from cerc-io/plugeth
Merge branch 'release/poc5-rc11'
This commit is contained in:
commit
2114218ed8
@ -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…
Reference in New Issue
Block a user