Moving over to ethpipe

This commit is contained in:
obscuren 2014-08-15 13:16:07 +02:00
parent c362172567
commit a6c4543c57
12 changed files with 65 additions and 107 deletions

View File

@ -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) {
}, },

View File

@ -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>

View File

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

View File

@ -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()

View File

@ -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

View File

@ -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) {

View File

@ -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 {

View File

@ -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) return gui.pipe.Transact(gui.privateKey(), recipient, value, gas, gasPrice, data)
}
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)
} }
func (gui *Gui) SetCustomIdentifier(customIdentifier string) { func (gui *Gui) SetCustomIdentifier(customIdentifier string) {

View File

@ -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 {

View File

@ -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) {

View File

@ -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

View File

@ -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()