Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3f25a6ade | ||
|
|
44da1801d8 | ||
|
|
82a84dca80 | ||
|
|
0ca776a6b8 | ||
|
|
2e39efbe7c | ||
|
|
a06a84d19b | ||
|
|
e7a80ec681 | ||
|
|
15960a5c04 | ||
|
|
f702e27485 | ||
|
|
0c5a747ef1 | ||
|
|
75df148ba2 | ||
|
|
4572d4940c | ||
|
|
2b9f16802d | ||
|
|
34e2ab9f9f | ||
|
|
44296c0b33 | ||
|
|
01d9107bce | ||
|
|
ba3fabda77 | ||
|
|
edf10ef8c5 | ||
|
|
6c565eae74 |
@@ -5,7 +5,7 @@ Ethereum
|
||||
|
||||
Ethereum Go Client © 2014 Jeffrey Wilcke.
|
||||
|
||||
Current state: Proof of Concept 0.5.16.
|
||||
Current state: Proof of Concept 0.6.0.
|
||||
|
||||
For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).
|
||||
|
||||
|
||||
@@ -249,6 +249,8 @@ ApplicationWindow {
|
||||
}
|
||||
TextField {
|
||||
text: eth.getCustomIdentifier()
|
||||
width: 500
|
||||
placeholderText: "Anonymous"
|
||||
onTextChanged: {
|
||||
eth.setCustomIdentifier(text)
|
||||
}
|
||||
@@ -419,30 +421,54 @@ ApplicationWindow {
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
y: 7
|
||||
anchors.right: peerImage.left
|
||||
anchors.rightMargin: 5
|
||||
id: peerLabel
|
||||
font.pixelSize: 8
|
||||
text: "0 / 0"
|
||||
}
|
||||
Image {
|
||||
y: 7
|
||||
id: peerImage
|
||||
anchors.right: parent.right
|
||||
width: 10; height: 10
|
||||
MouseArea {
|
||||
onDoubleClicked: peerWindow.visible = true
|
||||
anchors.fill: parent
|
||||
}
|
||||
source: "../network.png"
|
||||
}
|
||||
Label {
|
||||
y: 6
|
||||
id: lastBlockLabel
|
||||
objectName: "lastBlockLabel"
|
||||
visible: true
|
||||
text: ""
|
||||
font.pixelSize: 10
|
||||
anchors.right: peerGroup.left
|
||||
anchors.rightMargin: 5
|
||||
}
|
||||
|
||||
ProgressBar {
|
||||
id: syncProgressIndicator
|
||||
visible: false
|
||||
objectName: "syncProgressIndicator"
|
||||
y: 3
|
||||
width: 140
|
||||
indeterminate: true
|
||||
anchors.right: peerGroup.left
|
||||
anchors.rightMargin: 5
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: peerGroup
|
||||
y: 7
|
||||
anchors.right: parent.right
|
||||
MouseArea {
|
||||
onDoubleClicked: peerWindow.visible = true
|
||||
anchors.fill: parent
|
||||
}
|
||||
|
||||
Label {
|
||||
id: peerLabel
|
||||
font.pixelSize: 8
|
||||
text: "0 / 0"
|
||||
}
|
||||
Image {
|
||||
id: peerImage
|
||||
width: 10; height: 10
|
||||
source: "../network.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Window {
|
||||
id: popup
|
||||
visible: false
|
||||
//flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
|
||||
property var block
|
||||
width: root.width
|
||||
height: 300
|
||||
@@ -460,7 +486,7 @@ ApplicationWindow {
|
||||
Text { text: '<h3>Block details</h3>'; color: "#F2F2F2"}
|
||||
Text { text: '<b>Block number:</b> ' + number; color: "#F2F2F2"}
|
||||
Text { text: '<b>Hash:</b> ' + hash; color: "#F2F2F2"}
|
||||
Text { text: '<b>Coinbase:</b> ' + coinbase; color: "#F2F2F2"}
|
||||
Text { text: '<b>Coinbase:</b> <' + name + '> ' + coinbase; color: "#F2F2F2"}
|
||||
Text { text: '<b>Block found at:</b> ' + prettyTime; color: "#F2F2F2"}
|
||||
Text { text: '<b>Gas used:</b> ' + gasUsed + " / " + gasLimit; color: "#F2F2F2"}
|
||||
}
|
||||
@@ -577,6 +603,7 @@ ApplicationWindow {
|
||||
|
||||
Window {
|
||||
id: addPeerWin
|
||||
//flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
|
||||
visible: false
|
||||
minimumWidth: 230
|
||||
maximumWidth: 230
|
||||
@@ -686,9 +713,9 @@ ApplicationWindow {
|
||||
}
|
||||
|
||||
if(initial){
|
||||
blockModel.append({number: block.number, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
|
||||
blockModel.append({number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
|
||||
}else{
|
||||
blockModel.insert(0, {number: block.number, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
|
||||
blockModel.insert(0, {number: block.number, name: block.name, gasLimit: block.gasLimit, gasUsed: block.gasUsed, coinbase: block.coinbase, hash: block.hash, txs: txs, txAmount: amount, time: block.time, prettyTime: convertToPretty(block.time)})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -743,6 +770,7 @@ ApplicationWindow {
|
||||
// ******************************************
|
||||
Window {
|
||||
id: peerWindow
|
||||
//flags: Qt.CustomizeWindowHint | Qt.Tool | Qt.WindowCloseButtonHint
|
||||
height: 200
|
||||
width: 700
|
||||
Rectangle {
|
||||
|
||||
@@ -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,8 +18,10 @@ type DebuggerWindow struct {
|
||||
engine *qml.Engine
|
||||
lib *UiLib
|
||||
|
||||
vm *ethchain.Vm
|
||||
vm *ethvm.Vm
|
||||
Db *Debugger
|
||||
|
||||
state *ethstate.State
|
||||
}
|
||||
|
||||
func NewDebuggerWindow(lib *UiLib) *DebuggerWindow {
|
||||
@@ -30,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
|
||||
@@ -53,6 +58,7 @@ func (self *DebuggerWindow) SetCode(code string) {
|
||||
func (self *DebuggerWindow) SetData(data string) {
|
||||
self.win.Set("dataText", data)
|
||||
}
|
||||
|
||||
func (self *DebuggerWindow) SetAsm(data []byte) {
|
||||
self.win.Root().Call("clearAsm")
|
||||
|
||||
@@ -127,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
|
||||
|
||||
@@ -252,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)
|
||||
}
|
||||
|
||||
@@ -270,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")
|
||||
@@ -286,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())})
|
||||
})
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,12 +7,14 @@ import (
|
||||
"github.com/ethereum/eth-go/ethchain"
|
||||
"github.com/ethereum/eth-go/ethdb"
|
||||
"github.com/ethereum/eth-go/ethlog"
|
||||
"github.com/ethereum/eth-go/ethminer"
|
||||
"github.com/ethereum/eth-go/ethpub"
|
||||
"github.com/ethereum/eth-go/ethutil"
|
||||
"github.com/ethereum/eth-go/ethwire"
|
||||
"github.com/ethereum/go-ethereum/utils"
|
||||
"github.com/go-qml/qml"
|
||||
"math/big"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
@@ -40,6 +42,8 @@ type Gui struct {
|
||||
Session string
|
||||
clientIdentity *ethwire.SimpleClientIdentity
|
||||
config *ethutil.ConfigManager
|
||||
|
||||
miner *ethminer.Miner
|
||||
}
|
||||
|
||||
// Create GUI, but doesn't start it
|
||||
@@ -124,6 +128,7 @@ func (gui *Gui) ToggleMining() {
|
||||
txt = "Start mining"
|
||||
} else {
|
||||
utils.StartMining(gui.eth)
|
||||
gui.miner = utils.GetMiner()
|
||||
txt = "Stop mining"
|
||||
}
|
||||
|
||||
@@ -138,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()
|
||||
|
||||
@@ -215,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())})
|
||||
}
|
||||
})
|
||||
@@ -243,7 +251,11 @@ func (gui *Gui) readPreviousTransactions() {
|
||||
}
|
||||
|
||||
func (gui *Gui) processBlock(block *ethchain.Block, initial bool) {
|
||||
gui.win.Root().Call("addBlock", ethpub.NewPBlock(block), initial)
|
||||
name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase)
|
||||
b := ethpub.NewPBlock(block)
|
||||
b.Name = name
|
||||
|
||||
gui.win.Root().Call("addBlock", b, initial)
|
||||
}
|
||||
|
||||
func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
|
||||
@@ -262,18 +274,29 @@ func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
|
||||
gui.win.Root().Call("setWalletValue", str)
|
||||
}
|
||||
|
||||
func (self *Gui) getObjectByName(objectName string) qml.Object {
|
||||
return self.win.Root().ObjectByName(objectName)
|
||||
}
|
||||
|
||||
// Simple go routine function that updates the list of peers in the GUI
|
||||
func (gui *Gui) update() {
|
||||
reactor := gui.eth.Reactor()
|
||||
|
||||
blockChan := make(chan ethutil.React, 1)
|
||||
txChan := make(chan ethutil.React, 1)
|
||||
objectChan := make(chan ethutil.React, 1)
|
||||
peerChan := make(chan ethutil.React, 1)
|
||||
var (
|
||||
blockChan = make(chan ethutil.React, 1)
|
||||
txChan = make(chan ethutil.React, 1)
|
||||
objectChan = make(chan ethutil.React, 1)
|
||||
peerChan = make(chan ethutil.React, 1)
|
||||
chainSyncChan = make(chan ethutil.React, 1)
|
||||
miningChan = make(chan ethutil.React, 1)
|
||||
)
|
||||
|
||||
reactor.Subscribe("newBlock", blockChan)
|
||||
reactor.Subscribe("newTx:pre", txChan)
|
||||
reactor.Subscribe("newTx:post", txChan)
|
||||
reactor.Subscribe("chainSync", chainSyncChan)
|
||||
reactor.Subscribe("miner:start", miningChan)
|
||||
reactor.Subscribe("miner:stop", miningChan)
|
||||
|
||||
nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg()
|
||||
if nameReg != nil {
|
||||
@@ -281,12 +304,16 @@ func (gui *Gui) update() {
|
||||
}
|
||||
reactor.Subscribe("peerList", peerChan)
|
||||
|
||||
ticker := time.NewTicker(5 * time.Second)
|
||||
peerUpdateTicker := time.NewTicker(5 * time.Second)
|
||||
generalUpdateTicker := time.NewTicker(1 * time.Second)
|
||||
|
||||
state := gui.eth.StateManager().TransState()
|
||||
|
||||
unconfirmedFunds := new(big.Int)
|
||||
gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.address()).Amount)))
|
||||
gui.getObjectByName("syncProgressIndicator").Set("visible", !gui.eth.IsUpToDate())
|
||||
|
||||
lastBlockLabel := gui.getObjectByName("lastBlockLabel")
|
||||
|
||||
for {
|
||||
select {
|
||||
@@ -328,12 +355,32 @@ func (gui *Gui) update() {
|
||||
|
||||
state.UpdateStateObject(object)
|
||||
}
|
||||
case msg := <-chainSyncChan:
|
||||
sync := msg.Resource.(bool)
|
||||
gui.win.Root().ObjectByName("syncProgressIndicator").Set("visible", sync)
|
||||
|
||||
case <-objectChan:
|
||||
gui.loadAddressBook()
|
||||
case <-peerChan:
|
||||
gui.setPeerInfo()
|
||||
case <-ticker.C:
|
||||
case <-peerUpdateTicker.C:
|
||||
gui.setPeerInfo()
|
||||
case msg := <-miningChan:
|
||||
if msg.Event == "miner:start" {
|
||||
gui.miner = msg.Resource.(*ethminer.Miner)
|
||||
} else {
|
||||
gui.miner = nil
|
||||
}
|
||||
|
||||
case <-generalUpdateTicker.C:
|
||||
statusText := "#" + gui.eth.BlockChain().CurrentBlock.Number.String()
|
||||
if gui.miner != nil {
|
||||
pow := gui.miner.GetPow()
|
||||
if pow.GetHashrate() != 0 {
|
||||
statusText = "Mining @ " + strconv.FormatInt(pow.GetHashrate(), 10) + "Khash - " + statusText
|
||||
}
|
||||
}
|
||||
lastBlockLabel.Set("text", statusText)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -356,7 +403,7 @@ func (gui *Gui) address() []byte {
|
||||
}
|
||||
|
||||
func (gui *Gui) RegisterName(name string) {
|
||||
name = fmt.Sprintf("\"%s\"", name)
|
||||
name = fmt.Sprintf("\"register\"\n\"%s\"", name)
|
||||
|
||||
gui.pub.Transact(gui.privateKey(), "NameReg", "", "10000", "10000000000000", name)
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -10,15 +10,14 @@ import (
|
||||
|
||||
const (
|
||||
ClientIdentifier = "Ethereal"
|
||||
Version = "0.5.16"
|
||||
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
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
|
||||
const (
|
||||
ClientIdentifier = "Ethereum(G)"
|
||||
Version = "0.5.16"
|
||||
Version = "0.6.0"
|
||||
)
|
||||
|
||||
var logger = ethlog.NewLogger("CLI")
|
||||
|
||||
@@ -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)
|
||||
|
||||
18
utils/cmd.go
18
utils/cmd.go
@@ -234,7 +234,11 @@ func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
|
||||
}
|
||||
}
|
||||
|
||||
var miner ethminer.Miner
|
||||
var miner *ethminer.Miner
|
||||
|
||||
func GetMiner() *ethminer.Miner {
|
||||
return miner
|
||||
}
|
||||
|
||||
func StartMining(ethereum *eth.Ethereum) bool {
|
||||
if !ethereum.Mining {
|
||||
@@ -243,7 +247,10 @@ func StartMining(ethereum *eth.Ethereum) bool {
|
||||
addr := ethereum.KeyManager().Address()
|
||||
|
||||
go func() {
|
||||
miner = ethminer.NewDefaultMiner(addr, ethereum)
|
||||
if miner == nil {
|
||||
miner = ethminer.NewDefaultMiner(addr, ethereum)
|
||||
}
|
||||
|
||||
// Give it some time to connect with peers
|
||||
time.Sleep(3 * time.Second)
|
||||
for !ethereum.IsUpToDate() {
|
||||
@@ -251,7 +258,6 @@ func StartMining(ethereum *eth.Ethereum) bool {
|
||||
}
|
||||
|
||||
logger.Infoln("Miner started")
|
||||
miner := ethminer.NewDefaultMiner(addr, ethereum)
|
||||
miner.Start()
|
||||
}()
|
||||
RegisterInterrupt(func(os.Signal) {
|
||||
@@ -263,12 +269,16 @@ func StartMining(ethereum *eth.Ethereum) bool {
|
||||
}
|
||||
|
||||
func StopMining(ethereum *eth.Ethereum) bool {
|
||||
if ethereum.Mining {
|
||||
if ethereum.Mining && miner != nil {
|
||||
miner.Stop()
|
||||
|
||||
logger.Infoln("Miner stopped")
|
||||
|
||||
ethereum.Mining = false
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
33
utils/vm_env.go
Normal file
33
utils/vm_env.go
Normal file
@@ -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 }
|
||||
Reference in New Issue
Block a user