Moving over to ethpipe

pull/122/head
obscuren 10 years ago
parent c362172567
commit a6c4543c57
  1. 10
      ethereal/assets/ext/ethereum.js
  2. 4
      ethereal/assets/ext/test.html
  3. 2
      ethereal/assets/qml/views/info.qml
  4. 2
      ethereal/assets/qml/views/transaction.qml
  5. 8
      ethereal/assets/qml/webapp.qml
  6. 9
      ethereal/debugger.go
  7. 27
      ethereal/ext_app.go
  8. 52
      ethereal/gui.go
  9. 8
      ethereal/html_container.go
  10. 4
      ethereal/ui_lib.go
  11. 32
      javascript/types.go
  12. 14
      utils/cmd.go

@ -4,6 +4,16 @@ window.eth = {
_callbacks: {}, _callbacks: {},
_onCallbacks: {}, _onCallbacks: {},
test: function() {
var t = undefined;
navigator.qt.onmessage = function(d) { t = d; }
for(;;) {
if(t !== undefined) {
return t
}
}
},
mutan: function(code) { mutan: function(code) {
}, },

@ -25,6 +25,10 @@ function test() {
eth.getEachStorageAt("9ef0f0d81e040012600b0c1abdef7c48f720f88a", function(a, b) { eth.getEachStorageAt("9ef0f0d81e040012600b0c1abdef7c48f720f88a", function(a, b) {
console.log(a,b) console.log(a,b)
}) })
eth.getBlock("f70097659f329a09642a27f11338d9269de64f1d4485786e36bfc410832148cd", function(block) {
console.log(block)
})
} }
</script> </script>

@ -28,7 +28,7 @@ Rectangle {
text: "Address" text: "Address"
} }
TextField { TextField {
text: pub.getKey().address text: eth.getKey().address
width: 500 width: 500
} }

@ -169,7 +169,7 @@ Rectangle {
onClicked: { onClicked: {
var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros; var value = txValue.text + denomModel.get(valueDenom.currentIndex).zeros;
var gasPrice = txGasPrice.text + denomModel.get(gasDenom.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]) { if(res[1]) {
txResult.text = "Your contract <b>could not</b> be sent over the network:\n<b>" txResult.text = "Your contract <b>could not</b> be sent over the network:\n<b>"
txResult.text += res[1].error() txResult.text += res[1].error()

@ -165,13 +165,13 @@ ApplicationWindow {
break break
case "getBlockByNumber": case "getBlockByNumber":
var block = eth.getBlock(data.args[0]) var block = eth.getBlockByNumber(data.args[0])
postData(data._seed, block) postData(data._seed, block)
break break
case "getBlockByHash": case "getBlockByHash":
var block = eth.getBlock(data.args[0]) var block = eth.getBlockByHash(data.args[0])
postData(data._seed, block) postData(data._seed, block)
break break
@ -195,8 +195,8 @@ ApplicationWindow {
case "getEachStorage": case "getEachStorage":
require(1); require(1);
var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true) var storage = eth.getEachStorage(data.args[0])
postData(data._seed,stateObject) postData(data._seed, storage)
break break

@ -103,14 +103,7 @@ func (self *DebuggerWindow) Debug(valueStr, gasStr, gasPriceStr, scriptStr, data
} }
}() }()
data := ethutil.StringToByteFunc(dataStr, func(s string) (ret []byte) { data := utils.FormatTransactionData(dataStr)
slice := strings.Split(dataStr, "\n")
for _, dataItem := range slice {
d := ethutil.FormatData(dataItem)
ret = append(ret, d...)
}
return
})
var err error var err error
script := ethutil.StringToByteFunc(scriptStr, func(s string) (ret []byte) { script := ethutil.StringToByteFunc(scriptStr, func(s string) (ret []byte) {

@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"github.com/ethereum/eth-go/ethchain" "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/ethreact"
"github.com/ethereum/eth-go/ethstate" "github.com/ethereum/eth-go/ethstate"
"github.com/ethereum/go-ethereum/javascript" "github.com/ethereum/go-ethereum/javascript"
@ -19,42 +19,36 @@ type AppContainer interface {
Engine() *qml.Engine Engine() *qml.Engine
NewBlock(*ethchain.Block) NewBlock(*ethchain.Block)
ObjectChanged(*ethstate.StateObject)
StorageChanged(*ethstate.StorageState)
NewWatcher(chan bool) NewWatcher(chan bool)
Messages(ethstate.Messages, string) Messages(ethstate.Messages, string)
} }
type ExtApplication struct { type ExtApplication struct {
*ethpub.PEthereum *ethpipe.JSPipe
eth ethchain.EthManager eth ethchain.EthManager
blockChan chan ethreact.Event blockChan chan ethreact.Event
changeChan chan ethreact.Event
messageChan chan ethreact.Event messageChan chan ethreact.Event
quitChan chan bool quitChan chan bool
watcherQuitChan chan bool watcherQuitChan chan bool
filters map[string]*ethchain.Filter filters map[string]*ethchain.Filter
container AppContainer container AppContainer
lib *UiLib lib *UiLib
registeredEvents []string
} }
func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication {
app := &ExtApplication{ app := &ExtApplication{
ethpub.New(lib.eth), ethpipe.NewJSPipe(lib.eth),
lib.eth, lib.eth,
make(chan ethreact.Event, 100), make(chan ethreact.Event, 100),
make(chan ethreact.Event, 100), make(chan ethreact.Event, 100),
make(chan ethreact.Event, 100),
make(chan bool), make(chan bool),
make(chan bool), make(chan bool),
make(map[string]*ethchain.Filter), make(map[string]*ethchain.Filter),
container, container,
lib, lib,
nil,
} }
return app return app
@ -93,9 +87,6 @@ func (app *ExtApplication) stop() {
// Clean up // Clean up
reactor := app.lib.eth.Reactor() reactor := app.lib.eth.Reactor()
reactor.Unsubscribe("newBlock", app.blockChan) reactor.Unsubscribe("newBlock", app.blockChan)
for _, event := range app.registeredEvents {
reactor.Unsubscribe(event, app.changeChan)
}
// Kill the main loop // Kill the main loop
app.quitChan <- true app.quitChan <- true
@ -103,7 +94,6 @@ func (app *ExtApplication) stop() {
close(app.blockChan) close(app.blockChan)
close(app.quitChan) close(app.quitChan)
close(app.changeChan)
app.container.Destroy() app.container.Destroy()
} }
@ -118,13 +108,6 @@ out:
if block, ok := block.Resource.(*ethchain.Block); ok { if block, ok := block.Resource.(*ethchain.Block); ok {
app.container.NewBlock(block) 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: case msg := <-app.messageChan:
if messages, ok := msg.Resource.(ethstate.Messages); ok { if messages, ok := msg.Resource.(ethstate.Messages); ok {
for id, filter := range app.filters { for id, filter := range app.filters {

@ -14,7 +14,6 @@ import (
"github.com/ethereum/eth-go/ethlog" "github.com/ethereum/eth-go/ethlog"
"github.com/ethereum/eth-go/ethminer" "github.com/ethereum/eth-go/ethminer"
"github.com/ethereum/eth-go/ethpipe" "github.com/ethereum/eth-go/ethpipe"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethreact" "github.com/ethereum/eth-go/ethreact"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethwire" "github.com/ethereum/eth-go/ethwire"
@ -39,10 +38,11 @@ type Gui struct {
txDb *ethdb.LDBDatabase txDb *ethdb.LDBDatabase
pub *ethpub.PEthereum
logLevel ethlog.LogLevel logLevel ethlog.LogLevel
open bool open bool
pipe *ethpipe.JSPipe
Session string Session string
clientIdentity *ethwire.SimpleClientIdentity clientIdentity *ethwire.SimpleClientIdentity
config *ethutil.ConfigManager config *ethutil.ConfigManager
@ -57,9 +57,9 @@ func NewWindow(ethereum *eth.Ethereum, config *ethutil.ConfigManager, clientIden
panic(err) 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) { func (gui *Gui) Start(assetPath string) {
@ -68,13 +68,12 @@ func (gui *Gui) Start(assetPath string) {
// Register ethereum functions // Register ethereum functions
qml.RegisterTypes("Ethereum", 1, 0, []qml.TypeSpec{{ 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 // Create a new QML engine
gui.engine = qml.NewEngine() gui.engine = qml.NewEngine()
context := gui.engine.Context() context := gui.engine.Context()
@ -82,7 +81,6 @@ func (gui *Gui) Start(assetPath string) {
// Expose the eth library and the ui library to QML // Expose the eth library and the ui library to QML
context.SetVar("gui", gui) context.SetVar("gui", gui)
context.SetVar("pub", gui.pub)
context.SetVar("eth", gui.uiLib) context.SetVar("eth", gui.uiLib)
// Load the main QML interface // Load the main QML interface
@ -231,7 +229,7 @@ func (gui *Gui) loadAddressBook() {
view := gui.getObjectByName("infoView") view := gui.getObjectByName("infoView")
view.Call("clearAddress") view.Call("clearAddress")
nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg() nameReg := gui.pipe.World().Config().Get("NameReg")
if nameReg != nil { if nameReg != nil {
nameReg.EachStorage(func(name string, value *ethutil.Value) { nameReg.EachStorage(func(name string, value *ethutil.Value) {
if name[0] != 0 { if name[0] != 0 {
@ -255,7 +253,7 @@ func (gui *Gui) insertTransaction(window string, tx *ethchain.Transaction) {
} }
var ( var (
ptx = ethpub.NewPTx(tx) ptx = ethpipe.NewJSTx(tx)
send = nameReg.Storage(tx.Sender()) send = nameReg.Storage(tx.Sender())
rec = nameReg.Storage(tx.Recipient) rec = nameReg.Storage(tx.Recipient)
s, r string s, r string
@ -301,8 +299,9 @@ func (gui *Gui) readPreviousTransactions() {
} }
func (gui *Gui) processBlock(block *ethchain.Block, initial bool) { func (gui *Gui) processBlock(block *ethchain.Block, initial bool) {
name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase) //name := ethpub.FindNameInNameReg(gui.eth.StateManager(), block.Coinbase)
b := ethpub.NewPBlock(block) name := strings.Trim(gui.pipe.World().Config().Get("NameReg").Storage(block.Coinbase).Str(), "\x00")
b := ethpipe.NewJSBlock(block)
b.Name = name b.Name = name
gui.getObjectByName("chainView").Call("addBlock", b, initial) gui.getObjectByName("chainView").Call("addBlock", b, initial)
@ -391,12 +390,12 @@ func (gui *Gui) update() {
if bytes.Compare(tx.Sender(), gui.address()) == 0 { if bytes.Compare(tx.Sender(), gui.address()) == 0 {
object.SubAmount(tx.Value) 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()) gui.txDb.Put(tx.Hash(), tx.RlpEncode())
} else if bytes.Compare(tx.Recipient, gui.address()) == 0 { } else if bytes.Compare(tx.Recipient, gui.address()) == 0 {
object.AddAmount(tx.Value) 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()) gui.txDb.Put(tx.Hash(), tx.RlpEncode())
} }
@ -442,10 +441,9 @@ func (gui *Gui) update() {
reactor.Subscribe("miner:start", miningChan) reactor.Subscribe("miner:start", miningChan)
reactor.Subscribe("miner:stop", miningChan) reactor.Subscribe("miner:stop", miningChan)
nameReg := ethpub.EthereumConfig(gui.eth.StateManager()).NameReg() nameReg := gui.pipe.World().Config().Get("NameReg")
if nameReg != nil { reactor.Subscribe("object:"+string(nameReg.Address()), objectChan)
reactor.Subscribe("object:"+string(nameReg.Address()), objectChan)
}
reactor.Subscribe("peerList", peerChan) 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("setPeers", fmt.Sprintf("%d / %d", gui.eth.PeerCount(), gui.eth.MaxPeers))
gui.win.Root().Call("resetPeers") gui.win.Root().Call("resetPeers")
for _, peer := range gui.pub.GetPeers() { for _, peer := range gui.pipe.GetPeers() {
gui.win.Root().Call("addPeer", peer) gui.win.Root().Call("addPeer", peer)
} }
} }
@ -466,18 +464,10 @@ func (gui *Gui) address() []byte {
return gui.eth.KeyManager().Address() return gui.eth.KeyManager().Address()
} }
func (gui *Gui) RegisterName(name string) { func (gui *Gui) Transact(recipient, value, gas, gasPrice, d string) (*ethpipe.JSReceipt, error) {
name = fmt.Sprintf("\"register\"\n\"%s\"", name) 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.pipe.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
return gui.pub.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
} }
func (gui *Gui) SetCustomIdentifier(customIdentifier string) { func (gui *Gui) SetCustomIdentifier(customIdentifier string) {

@ -125,14 +125,6 @@ func (app *HtmlApplication) NewBlock(block *ethchain.Block) {
app.webView.Call("onNewBlockCb", b) 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) { func (self *HtmlApplication) Messages(messages ethstate.Messages, id string) {
var msgs []javascript.JSMessage var msgs []javascript.JSMessage
for _, m := range messages { for _, m := range messages {

@ -6,6 +6,7 @@ import (
"github.com/ethereum/eth-go" "github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethpipe"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/javascript" "github.com/ethereum/go-ethereum/javascript"
"github.com/go-qml/qml" "github.com/go-qml/qml"
@ -18,6 +19,7 @@ type memAddr struct {
// UI Library that has some basic functionality exposed // UI Library that has some basic functionality exposed
type UiLib struct { type UiLib struct {
*ethpipe.JSPipe
engine *qml.Engine engine *qml.Engine
eth *eth.Ethereum eth *eth.Ethereum
connected bool connected bool
@ -31,7 +33,7 @@ type UiLib struct {
} }
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib { 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) { func (self *UiLib) ImportTx(rlpTx string) {

@ -128,37 +128,7 @@ func (self *JSEthereum) toVal(v interface{}) otto.Value {
} }
func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value { func (self *JSEthereum) Messages(object map[string]interface{}) otto.Value {
filter := ethchain.NewFilter(self.ethereum) filter := ethchain.NewFilterFromMap(object, 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))
}
messages := filter.Find() messages := filter.Find()
var msgs []JSMessage var msgs []JSMessage

@ -8,6 +8,7 @@ import (
"os/signal" "os/signal"
"path" "path"
"path/filepath" "path/filepath"
"regexp"
"runtime" "runtime"
"time" "time"
@ -267,6 +268,19 @@ func StartMining(ethereum *eth.Ethereum) bool {
return false 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 { func StopMining(ethereum *eth.Ethereum) bool {
if ethereum.Mining && miner != nil { if ethereum.Mining && miner != nil {
miner.Stop() miner.Stop()

Loading…
Cancel
Save