diff options
author | obscuren <geffobscura@gmail.com> | 2014-04-12 00:50:31 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-04-12 00:50:31 +0800 |
commit | 3238894a3ba4767773849eabb7c0892554d32874 (patch) | |
tree | 88a09f860d3816a514ae6f0c9c88c0c39df876ca /ethereal/ui/ui_lib.go | |
parent | 1e94cb5286067da80c3227861a836c611f01e32b (diff) | |
download | dexon-3238894a3ba4767773849eabb7c0892554d32874.tar dexon-3238894a3ba4767773849eabb7c0892554d32874.tar.gz dexon-3238894a3ba4767773849eabb7c0892554d32874.tar.bz2 dexon-3238894a3ba4767773849eabb7c0892554d32874.tar.lz dexon-3238894a3ba4767773849eabb7c0892554d32874.tar.xz dexon-3238894a3ba4767773849eabb7c0892554d32874.tar.zst dexon-3238894a3ba4767773849eabb7c0892554d32874.zip |
Added wip debugger
Diffstat (limited to 'ethereal/ui/ui_lib.go')
-rw-r--r-- | ethereal/ui/ui_lib.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go index 5c3c98fb9..adba177d0 100644 --- a/ethereal/ui/ui_lib.go +++ b/ethereal/ui/ui_lib.go @@ -2,13 +2,18 @@ package ethui import ( "bitbucket.org/kardianos/osext" + "fmt" "github.com/ethereum/eth-go" + "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethutil" "github.com/niemeyer/qml" + "github.com/obscuren/mutan" + "math/big" "os" "path" "path/filepath" "runtime" + "strings" ) // UI Library that has some basic functionality exposed @@ -17,6 +22,8 @@ type UiLib struct { eth *eth.Ethereum connected bool assetPath string + // The main application window + win *qml.Window } func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { @@ -81,3 +88,59 @@ func DefaultAssetPath() string { return base } + +type memAddr struct { + Num string + Value string +} + +func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string) (string, error) { + state := ui.eth.BlockChain().CurrentBlock.State() + + asm, err := mutan.Compile(strings.NewReader(data), false) + if err != nil { + fmt.Println(err) + } + + callerScript := ethutil.Assemble(asm...) + dis := ethchain.Disassemble(callerScript) + ui.win.Root().Call("clearAsm") + for _, str := range dis { + ui.win.Root().Call("setAsm", str) + } + callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasPriceStr), callerScript) + + // Contract addr as test address + keyPair := ethutil.Config.Db.GetKeys()[0] + account := ui.eth.StateManager().GetAddrState(keyPair.Address()).Account + c := ethchain.MakeContract(callerTx, state) + callerClosure := ethchain.NewClosure(account, c, c.Script(), state, ethutil.Big(gasStr), new(big.Int)) + + block := ui.eth.BlockChain().CurrentBlock + vm := ethchain.NewVm(state, ethchain.RuntimeVars{ + Origin: account.Address(), + BlockNumber: block.BlockInfo().Number, + PrevHash: block.PrevHash, + Coinbase: block.Coinbase, + Time: block.Time, + Diff: block.Difficulty, + TxData: nil, + }) + callerClosure.Call(vm, nil, func(op ethchain.OpCode, mem *ethchain.Memory, stack *ethchain.Stack) { + ui.win.Root().Call("clearMem") + ui.win.Root().Call("clearStack") + + addr := 0 + for i := 0; i+32 <= mem.Len(); i += 32 { + ui.win.Root().Call("setMem", memAddr{fmt.Sprintf("%03d", addr), fmt.Sprintf("% x", mem.Data()[i:i+32])}) + addr++ + } + + for _, val := range stack.Data() { + ui.win.Root().Call("setStack", val.String()) + } + }) + state.Reset() + + return "", nil +} |