diff --git a/ethereal/assets/ext/ethereum.js b/ethereal/assets/ext/ethereum.js index 03b25179b..fb8bd23a7 100644 --- a/ethereal/assets/ext/ethereum.js +++ b/ethereal/assets/ext/ethereum.js @@ -4,6 +4,16 @@ window.eth = { _callbacks: {}, _onCallbacks: {}, + test: function() { + var t = undefined; + navigator.qt.onmessage = function(d) { t = d; } + for(;;) { + if(t !== undefined) { + return t + } + } + }, + mutan: function(code) { }, diff --git a/ethereal/assets/ext/test.html b/ethereal/assets/ext/test.html index 0d6b710fa..980001f90 100644 --- a/ethereal/assets/ext/test.html +++ b/ethereal/assets/ext/test.html @@ -25,6 +25,10 @@ function test() { eth.getEachStorageAt("9ef0f0d81e040012600b0c1abdef7c48f720f88a", function(a, b) { console.log(a,b) }) + + eth.getBlock("f70097659f329a09642a27f11338d9269de64f1d4485786e36bfc410832148cd", function(block) { + console.log(block) + }) } diff --git a/ethereal/assets/qml/views/info.qml b/ethereal/assets/qml/views/info.qml index fcddd46e2..3335a306a 100644 --- a/ethereal/assets/qml/views/info.qml +++ b/ethereal/assets/qml/views/info.qml @@ -28,7 +28,7 @@ Rectangle { text: "Address" } TextField { - text: pub.getKey().address + text: eth.getKey().address width: 500 } diff --git a/ethereal/assets/qml/views/transaction.qml b/ethereal/assets/qml/views/transaction.qml index 80e1670f8..ac38ebe0c 100644 --- a/ethereal/assets/qml/views/transaction.qml +++ b/ethereal/assets/qml/views/transaction.qml @@ -169,7 +169,7 @@ Rectangle { onClicked: { var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros; var gasPrice = txGasPrice.text + denomModel.get(gasDenom.currentIndex).zeros; - var res = gui.create(txFuelRecipient.text, value, txGas.text, gasPrice, codeView.text) + var res = gui.transact(txFuelRecipient.text, value, txGas.text, gasPrice, codeView.text) if(res[1]) { txResult.text = "Your contract could not be sent over the network:\n" txResult.text += res[1].error() diff --git a/ethereal/assets/qml/webapp.qml b/ethereal/assets/qml/webapp.qml index 5faf50e91..ac48e32a1 100644 --- a/ethereal/assets/qml/webapp.qml +++ b/ethereal/assets/qml/webapp.qml @@ -165,13 +165,13 @@ ApplicationWindow { break case "getBlockByNumber": - var block = eth.getBlock(data.args[0]) + var block = eth.getBlockByNumber(data.args[0]) postData(data._seed, block) break case "getBlockByHash": - var block = eth.getBlock(data.args[0]) + var block = eth.getBlockByHash(data.args[0]) postData(data._seed, block) break @@ -195,8 +195,8 @@ ApplicationWindow { case "getEachStorage": require(1); - var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true) - postData(data._seed,stateObject) + var storage = eth.getEachStorage(data.args[0]) + postData(data._seed, storage) break diff --git a/ethereal/debugger.go b/ethereal/debugger.go index 1cf5e0b66..56f0b47fc 100644 --- a/ethereal/debugger.go +++ b/ethereal/debugger.go @@ -103,14 +103,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data } }() - data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) { - slice := strings.Split(dataStr, "\n") - for _, dataItem := range slice { - d := ethutil.FormatData(dataItem) - ret = append(ret, d...) - } - return - }) + data := utils.FormatTransactionData(dataStr) var err error script := ethutil.StringToByteFunc(scriptStr, func(s string) (ret []byte) { diff --git a/ethereal/ext_app.go b/ethereal/ext_app.go index 37e9676ff..ad826eaa6 100644 --- a/ethereal/ext_app.go +++ b/ethereal/ext_app.go @@ -4,7 +4,7 @@ import ( "encoding/json" "github.com/ethereum/eth-go/ethchain" - "github.com/ethereum/eth-go/ethpub" + "github.com/ethereum/eth-go/ethpipe" "github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethstate" "github.com/ethereum/go-ethereum/javascript" @@ -19,42 +19,36 @@ type AppContainer interface { Engine() *qml.Engine NewBlock(*ethchain.Block) - ObjectChanged(*ethstate.StateObject) - StorageChanged(*ethstate.StorageState) NewWatcher(chan bool) Messages(ethstate.Messages, string) } type ExtApplication struct { - *ethpub.PEthereum + *ethpipe.JSPipe eth ethchain.EthManager blockChan chan ethreact.Event - changeChan chan ethreact.Event messageChan chan ethreact.Event quitChan chan bool watcherQuitChan chan bool filters map[string]*ethchain.Filter - container AppContainer - lib *UiLib - registeredEvents []string + container AppContainer + lib *UiLib } func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { app := &ExtApplication{ - ethpub.New(lib.eth), + ethpipe.NewJSPipe(lib.eth), lib.eth, make(chan ethreact.Event, 100), make(chan ethreact.Event, 100), - make(chan ethreact.Event, 100), make(chan bool), make(chan bool), make(map[string]*ethchain.Filter), container, lib, - nil, } return app @@ -93,9 +87,6 @@ func (app *ExtApplication) stop() { // Clean up reactor := app.lib.eth.Reactor() reactor.Unsubscribe("newBlock", app.blockChan) - for _, event := range app.registeredEvents { - reactor.Unsubscribe(event, app.changeChan) - } // Kill the main loop app.quitChan <- true @@ -103,7 +94,6 @@ func (app *ExtApplication) stop() { close(app.blockChan) close(app.quitChan) - close(app.changeChan) app.container.Destroy() } @@ -118,13 +108,6 @@ out: if block, ok := block.Resource.(*ethchain.Block); ok { app.container.NewBlock(block) } - case object := <-app.changeChan: - if stateObject, ok := object.Resource.(*ethstate.StateObject); ok { - app.container.ObjectChanged(stateObject) - } else if storageObject, ok := object.Resource.(*ethstate.StorageState); ok { - app.container.StorageChanged(storageObject) - } - case msg := <-app.messageChan: if messages, ok := msg.Resource.(ethstate.Messages); ok { for id, filter := range app.filters { diff --git a/ethereal/gui.go b/ethereal/gui.go index c0584936d..5cc305977 100644 --- a/ethereal/gui.go +++ b/ethereal/gui.go @@ -14,7 +14,6 @@ import ( "github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethminer" "github.com/ethereum/eth-go/ethpipe" - "github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethwire" @@ -39,10 +38,11 @@ type Gui struct { txDb *ethdb.LDBDatabase - pub *ethpub.PEthereum logLevel ethlog.LogLevel open bool + pipe *ethpipe.JSPipe + Session string clientIdentity *ethwire.SimpleClientIdentity config *ethutil.ConfigManager @@ -57,9 +57,9 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIden panic(err) } - pub := ethpub.New(ethereum) + pipe := ethpipe.NewJSPipe(ethereum) - return &Gui{eth: ethereum, txDb: db, pub: pub, logLevel: ethlog.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config} + return &Gui{eth: ethereum, txDb: db, pipe: pipe, logLevel: ethlog.LogLevel(logLevel), Session: session, open: false, clientIdentity: clientIdentity, config: config} } func (gui *Gui) Start(assetPath string) { @@ -68,13 +68,12 @@ func (gui *Gui) Start(assetPath string) { // Register ethereum functions qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{ - Init: func(p *ethpub.PBlock, obj qml.Object) { p.Number = 0; p.Hash = "" }, + Init: func(p *ethpipe.JSBlock, obj qml.Object) { p.Number = 0; p.Hash = "" }, }, { - Init: func(p *ethpub.PTx, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, + Init: func(p *ethpipe.JSTransaction, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, }, { - Init: func(p *ethpub.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" }, + Init: func(p *ethpipe.KeyVal, obj qml.Object) { p.Key = ""; p.Value = "" }, }}) - // Create a new QML engine gui.engine = qml.NewEngine() context := gui.engine.Context() @@ -82,7 +81,6 @@ func (gui *Gui) Start(assetPath string) { // Expose the eth library and the ui library to QML context.SetVar("gui", gui) - context.SetVar("pub", gui.pub) context.SetVar("eth", gui.uiLib) // Load the main QML interface @@ -231,7 +229,7 @@ func (gui *Gui) loadAddressBook() { view := gui.getObjectByName("infoView") view.Call("clearAddress") - nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg() + nameReg := gui.pipe.World().Config().Get("NameReg") if nameReg != nil { nameReg.EachStorage(func(name string, value *ethutil.Value) { if name[0] != 0 { @@ -255,7 +253,7 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) { } var ( - ptx = ethpub.NewPTx(tx) + ptx = ethpipe.NewJSTx(tx) send = nameReg.Storage(tx.Sender()) rec = nameReg.Storage(tx.Recipient) s, r string @@ -301,8 +299,9 @@ func (gui *Gui) readPreviousTransactions() { } func (gui *Gui) processBlock(block *ethchain.Block, initial bool) { - name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase) - b := ethpub.NewPBlock(block) + //name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase) + name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00") + b := ethpipe.NewJSBlock(block) b.Name = name gui.getObjectByName("chainView").Call("addBlock", b, initial) @@ -391,12 +390,12 @@ func (gui *Gui) update() { if bytes.Compare(tx.Sender(), gui.address()) == 0 { object.SubAmount(tx.Value) - gui.getObjectByName("transactionView").Call("addTx", ethpub.NewPTx(tx), "send") + gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "send") gui.txDb.Put(tx.Hash(), tx.RlpEncode()) } else if bytes.Compare(tx.Recipient, gui.address()) == 0 { object.AddAmount(tx.Value) - gui.getObjectByName("transactionView").Call("addTx", ethpub.NewPTx(tx), "recv") + gui.getObjectByName("transactionView").Call("addTx", ethpipe.NewJSTx(tx), "recv") gui.txDb.Put(tx.Hash(), tx.RlpEncode()) } @@ -442,10 +441,9 @@ func (gui *Gui) update() { reactor.Subscribe("miner:start", miningChan) reactor.Subscribe("miner:stop", miningChan) - nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg() - if nameReg != nil { - reactor.Subscribe("object:"+string(nameReg.Address()), objectChan) - } + nameReg := gui.pipe.World().Config().Get("NameReg") + reactor.Subscribe("object:"+string(nameReg.Address()), objectChan) + reactor.Subscribe("peerList", peerChan) } @@ -453,7 +451,7 @@ func (gui *Gui) setPeerInfo() { gui.win.Root().Call("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers)) gui.win.Root().Call("resetPeers") - for _, peer := range gui.pub.GetPeers() { + for _, peer := range gui.pipe.GetPeers() { gui.win.Root().Call("addPeer", peer) } } @@ -466,18 +464,10 @@ func (gui *Gui) address() []byte { return gui.eth.KeyManager().Address() } -func (gui *Gui) RegisterName(name string) { - name = fmt.Sprintf("\"register\"\n\"%s\"", name) +func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (*ethpipe.JSReceipt, error) { + data := ethutil.Bytes2Hex(utils.FormatTransactionData(d)) - gui.pub.Transact(gui.privateKey(), "NameReg", "", "10000", "10000000000000", name) -} - -func (gui *Gui) Transact(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) { - return gui.pub.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data) -} - -func (gui *Gui) Create(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) { - return gui.pub.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data) + return gui.pipe.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data) } func (gui *Gui) SetCustomIdentifier(customIdentifier string) { diff --git a/ethereal/html_container.go b/ethereal/html_container.go index 7deee487d..bbf77402e 100644 --- a/ethereal/html_container.go +++ b/ethereal/html_container.go @@ -125,14 +125,6 @@ func (app *HtmlApplication) NewBlock(block *ethchain.Block) { app.webView.Call("onNewBlockCb", b) } -func (app *HtmlApplication) ObjectChanged(stateObject *ethstate.StateObject) { - app.webView.Call("onObjectChangeCb", ethpub.NewPStateObject(stateObject)) -} - -func (app *HtmlApplication) StorageChanged(storageObject *ethstate.StorageState) { - app.webView.Call("onStorageChangeCb", ethpub.NewPStorageState(storageObject)) -} - func (self *HtmlApplication) Messages(messages ethstate.Messages, id string) { var msgs []javascript.JSMessage for _, m := range messages { diff --git a/ethereal/ui_lib.go b/ethereal/ui_lib.go index f900fcaee..c48a06547 100644 --- a/ethereal/ui_lib.go +++ b/ethereal/ui_lib.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethchain" + "github.com/ethereum/eth-go/ethpipe" "github.com/ethereum/eth-go/ethutil" "github.com/ethereum/go-ethereum/javascript" "github.com/go-qml/qml" @@ -18,6 +19,7 @@ type memAddr struct { // UI Library that has some basic functionality exposed type UiLib struct { + *ethpipe.JSPipe engine *qml.Engine eth *eth.Ethereum connected bool @@ -31,7 +33,7 @@ type UiLib struct { } func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { - return &UiLib{engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth)} + return &UiLib{JSPipe: ethpipe.NewJSPipe(eth), engine: engine, eth: eth, assetPath: assetPath, jsEngine: javascript.NewJSRE(eth)} } func (self *UiLib) ImportTx(rlpTx string) { diff --git a/javascript/types.go b/javascript/types.go index fb1e54ae7..375e7b24c 100644 --- a/javascript/types.go +++ b/javascript/types.go @@ -128,37 +128,7 @@ func (self *JSEthereum) toVal(v interface{}) otto.Value { } func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value { - filter := ethchain.NewFilter(self.ethereum) - - if object["earliest"] != nil { - earliest := object["earliest"] - if e, ok := earliest.(string); ok { - filter.SetEarliestBlock(ethutil.Hex2Bytes(e)) - } else { - filter.SetEarliestBlock(earliest) - } - } - - if object["latest"] != nil { - latest := object["latest"] - if l, ok := latest.(string); ok { - filter.SetLatestBlock(ethutil.Hex2Bytes(l)) - } else { - filter.SetLatestBlock(latest) - } - } - if object["to"] != nil { - filter.AddTo(ethutil.Hex2Bytes(object["to"].(string))) - } - if object["from"] != nil { - filter.AddFrom(ethutil.Hex2Bytes(object["from"].(string))) - } - if object["max"] != nil { - filter.SetMax(object["max"].(int)) - } - if object["skip"] != nil { - filter.SetSkip(object["skip"].(int)) - } + filter := ethchain.NewFilterFromMap(object, self.ethereum) messages := filter.Find() var msgs []JSMessage diff --git a/utils/cmd.go b/utils/cmd.go index d34348ad8..58e3eed1e 100644 --- a/utils/cmd.go +++ b/utils/cmd.go @@ -8,6 +8,7 @@ import ( "os/signal" "path" "path/filepath" + "regexp" "runtime" "time" @@ -267,6 +268,19 @@ func StartMining(ethereum *eth.Ethereum) bool { return false } +func FormatTransactionData(data string) []byte { + d := ethutil.StringToByteFunc(data, func(s string) (ret []byte) { + slice := regexp.MustCompile("\\n|\\s").Split(s, 1000000000) + for _, dataItem := range slice { + d := ethutil.FormatData(dataItem) + ret = append(ret, d...) + } + return + }) + + return d +} + func StopMining(ethereum *eth.Ethereum) bool { if ethereum.Mining && miner != nil { miner.Stop()