diff options
author | obscuren <geffobscura@gmail.com> | 2014-05-21 20:04:54 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-05-21 20:04:54 +0800 |
commit | 7f1a4c377c18055137909521d809251248b7b5af (patch) | |
tree | 75afd9a91da3daa7123f6083647795cdbc3fca7a | |
parent | c07c454935609bfb0f65dc38bb596a90d5493fbb (diff) | |
parent | 3ddaf56afd919d1bc435379861a3ab37f3392116 (diff) | |
download | go-tangerine-7f1a4c377c18055137909521d809251248b7b5af.tar.gz go-tangerine-7f1a4c377c18055137909521d809251248b7b5af.tar.zst go-tangerine-7f1a4c377c18055137909521d809251248b7b5af.zip |
Merge branch 'release/poc5-rc8'poc5-rc8
-rw-r--r-- | README.md | 31 | ||||
-rw-r--r-- | ethereal/assets/qml/wallet.qml | 39 | ||||
-rw-r--r-- | ethereal/assets/samplecoin/samplecoin.html | 2 | ||||
-rw-r--r-- | ethereal/ui/gui.go | 14 | ||||
-rw-r--r-- | ethereum/config.go | 11 | ||||
-rw-r--r-- | ethereum/javascript_runtime.go | 91 | ||||
-rw-r--r-- | ethereum/repl.go | 6 | ||||
-rw-r--r-- | ethereum/repl_darwin.go | 8 |
8 files changed, 156 insertions, 46 deletions
@@ -5,7 +5,7 @@ Ethereum Ethereum Go Client © 2014 Jeffrey Wilcke. -Current state: Proof of Concept 5.0 RC7. +Current state: Proof of Concept 5.0 RC8. For the development package please see the [eth-go package](https://github.com/ethereum/eth-go). @@ -26,28 +26,25 @@ General command line options ==================== ``` --c Launch the developer console (node only) +Shared between ethereum and ethereal -m Start mining blocks -genaddr Generates a new address and private key (destructive action) --p Port on which the server will accept incomming connections (= 30303) --upnp Enable UPnP (= false) --x Desired amount of peers (= 5) --h This help +-p Port on which the server will accept incomming connections +-upnp Enable UPnP +-x Desired amount of peers -r Start JSON RPC --dir Data directory used to store configs and databases (=".ethereum") --import Import a private key (hex) -``` +-dir Data directory used to store configs and databases +-import Import a private key +-h This -Developer console commands -========================== +Ethereum only +ethereum [options] [filename] +-js Start the JavaScript REPL +filename Load the given file and interpret as JavaScript +Etheral only +-asset_path absolute path to GUI assets directory ``` -addp <host>:<port> Connect to the given host -tx <addr> <amount> Send <amount> Wei to the specified <addr> -contract <value> <gasprice> Creates a new contract and launches the editor -``` - -See the "help" command for *developer* options. Contribution ============ diff --git a/ethereal/assets/qml/wallet.qml b/ethereal/assets/qml/wallet.qml index 4813aaede..51f064adf 100644 --- a/ethereal/assets/qml/wallet.qml +++ b/ethereal/assets/qml/wallet.qml @@ -67,6 +67,7 @@ ApplicationWindow { networkView.visible = false historyView.visible = false newTxView.visible = false + infoView.visible = false view.visible = true //root.title = "Ethereal - " = view.title } @@ -120,6 +121,17 @@ ApplicationWindow { } } } + + Image { + source: ui.assetPath("net.png") + anchors.horizontalCenter: parent.horizontalCenter + MouseArea { + anchors.fill: parent + onClicked: { + setView(infoView) + } + } + } } } @@ -217,6 +229,33 @@ ApplicationWindow { } } + Rectangle { + id: infoView + property var title: "Information" + visible: false + color: "#00000000" + anchors.fill: parent + + Label { + id: addressLabel + text: "Address" + anchors { + margins: 5 + top: parent.top + left: parent.left + } + } + TextField { + anchors { + margins: 5 + left: addressLabel.right + top: parent.top + } + text: pub.getKey().address + width: 500 + } + } + /* signal addPlugin(string name) Component { diff --git a/ethereal/assets/samplecoin/samplecoin.html b/ethereal/assets/samplecoin/samplecoin.html index d47c6323c..3892141cd 100644 --- a/ethereal/assets/samplecoin/samplecoin.html +++ b/ethereal/assets/samplecoin/samplecoin.html @@ -9,7 +9,7 @@ <script type="text/javascript"> -var jefcoinAddr = "739105c31705038744d190332e3a07c8fea8a9eb" +var jefcoinAddr = "fc0a9436890478bb9b1c6ed7455c2535366f4a99" var mAddr = "" function createTransaction() { diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index e267dabfd..7290bd6ec 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -55,7 +55,7 @@ func New(ethereum *eth.Ethereum) *Gui { } func (gui *Gui) Start(assetPath string) { - const version = "0.5.0 RC7" + const version = "0.5.0 RC8" defer gui.txDb.Close() @@ -74,6 +74,7 @@ func (gui *Gui) Start(assetPath string) { // Expose the eth library and the ui library to QML context.SetVar("eth", gui) + context.SetVar("pub", gui.pub) gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath) context.SetVar("ui", gui.uiLib) @@ -164,7 +165,7 @@ func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) { var str string if unconfirmedFunds != nil { pos := "+" - if unconfirmedFunds.Cmp(big.NewInt(0)) >= 0 { + if unconfirmedFunds.Cmp(big.NewInt(0)) < 0 { pos = "-" } val := ethutil.CurrencyToString(new(big.Int).Abs(ethutil.BigCopy(unconfirmedFunds))) @@ -206,15 +207,10 @@ func (gui *Gui) update() { if txMsg.Event == "newTx:pre" { object := state.GetAccount(gui.addr) - if bytes.Compare(tx.Sender(), gui.addr) == 0 && object.Nonce <= tx.Nonce { + if bytes.Compare(tx.Sender(), gui.addr) == 0 { gui.win.Root().Call("addTx", ethpub.NewPTx(tx)) gui.txDb.Put(tx.Hash(), tx.RlpEncode()) - /* - object.Nonce += 1 - state.SetStateObject(object) - */ - unconfirmedFunds.Sub(unconfirmedFunds, tx.Value) } else if bytes.Compare(tx.Recipient, gui.addr) == 0 { gui.win.Root().Call("addTx", ethpub.NewPTx(tx)) @@ -234,7 +230,7 @@ func (gui *Gui) update() { gui.setWalletValue(object.Amount, nil) - state.SetStateObject(object) + state.UpdateStateObject(object) } } } diff --git a/ethereum/config.go b/ethereum/config.go index 97e8687d8..f25f2fb66 100644 --- a/ethereum/config.go +++ b/ethereum/config.go @@ -2,6 +2,8 @@ package main import ( "flag" + "fmt" + "os" ) var StartMining bool @@ -23,6 +25,11 @@ var StartJsConsole bool var InputFile string func Init() { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "%s [options] [filename]:\n", os.Args[0]) + flag.PrintDefaults() + } + flag.BoolVar(&StartMining, "m", false, "start dagger mining") flag.BoolVar(&ShowGenesis, "g", false, "prints genesis header and exits") flag.BoolVar(&StartRpc, "r", false, "start rpc server") @@ -38,7 +45,9 @@ func Init() { flag.StringVar(&ImportKey, "import", "", "imports the given private key (hex)") flag.IntVar(&MaxPeer, "x", 10, "maximum desired peers") flag.BoolVar(&StartJsConsole, "js", false, "exp") - flag.StringVar(&InputFile, "e", "", "Run javascript file") + //flag.StringVar(&InputFile, "e", "", "Run javascript file") flag.Parse() + + InputFile = flag.Arg(0) } diff --git a/ethereum/javascript_runtime.go b/ethereum/javascript_runtime.go index b06fb9460..fa01c7005 100644 --- a/ethereum/javascript_runtime.go +++ b/ethereum/javascript_runtime.go @@ -6,7 +6,10 @@ import ( "github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethpub" "github.com/ethereum/eth-go/ethutil" - "github.com/robertkrimen/otto" + "github.com/obscuren/otto" + "io/ioutil" + "os" + "path/filepath" ) type JSRE struct { @@ -53,6 +56,22 @@ func (self *JSRE) Run(code string) (otto.Value, error) { return self.vm.Run(code) } +func (self *JSRE) Require(file string) error { + if len(filepath.Ext(file)) == 0 { + file += ".js" + } + + fh, err := os.Open(file) + if err != nil { + return err + } + + content, _ := ioutil.ReadAll(fh) + self.Run("exports = {};(function() {" + string(content) + "})();") + + return nil +} + func (self *JSRE) Stop() { // Kill the main loop self.quitChan <- true @@ -82,7 +101,10 @@ out: cb.Call(cb, val) } } else if storageObject, ok := object.Resource.(*ethchain.StorageState); ok { - fmt.Println(storageObject) + for _, cb := range self.objectCb[ethutil.Hex(storageObject.StateAddress)+ethutil.Hex(storageObject.Address)] { + val, _ := self.vm.ToValue(ethpub.NewPStorageState(storageObject)) + cb.Call(cb, val) + } } } } @@ -91,24 +113,65 @@ out: func (self *JSRE) initStdFuncs() { t, _ := self.vm.Get("eth") eth := t.Object() - eth.Set("watch", func(call otto.FunctionCall) otto.Value { - addr, _ := call.Argument(0).ToString() - cb := call.Argument(1) + eth.Set("watch", self.watch) + eth.Set("addPeer", self.addPeer) + eth.Set("require", self.require) +} + +/* + * The following methods are natively implemented javascript functions + */ + +// eth.watch +func (self JSRE) watch(call otto.FunctionCall) otto.Value { + addr, _ := call.Argument(0).ToString() + var storageAddr string + var cb otto.Value + var storageCallback bool + if len(call.ArgumentList) > 2 { + storageCallback = true + storageAddr, _ = call.Argument(1).ToString() + cb = call.Argument(2) + } else { + cb = call.Argument(1) + } + + if storageCallback { + self.objectCb[addr+storageAddr] = append(self.objectCb[addr+storageAddr], cb) + event := "storage:" + string(ethutil.FromHex(addr)) + ":" + string(ethutil.FromHex(storageAddr)) + self.ethereum.Reactor().Subscribe(event, self.changeChan) + } else { self.objectCb[addr] = append(self.objectCb[addr], cb) event := "object:" + string(ethutil.FromHex(addr)) self.ethereum.Reactor().Subscribe(event, self.changeChan) + } + + return otto.UndefinedValue() +} +func (self *JSRE) addPeer(call otto.FunctionCall) otto.Value { + host, err := call.Argument(0).ToString() + if err != nil { + return otto.FalseValue() + } + self.ethereum.ConnectToPeer(host) + + return otto.TrueValue() +} + +func (self *JSRE) require(call otto.FunctionCall) otto.Value { + file, err := call.Argument(0).ToString() + if err != nil { return otto.UndefinedValue() - }) - eth.Set("addPeer", func(call otto.FunctionCall) otto.Value { - host, err := call.Argument(0).ToString() - if err != nil { - return otto.FalseValue() - } - self.ethereum.ConnectToPeer(host) + } + if err := self.Require(file); err != nil { + fmt.Println("err:", err) + return otto.UndefinedValue() + } + + t, _ := self.vm.Get("exports") - return otto.TrueValue() - }) + return t } diff --git a/ethereum/repl.go b/ethereum/repl.go index c0b63c0a5..d1243d19c 100644 --- a/ethereum/repl.go +++ b/ethereum/repl.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/ethereum/eth-go" "github.com/ethereum/eth-go/ethpub" - "github.com/robertkrimen/otto" + "github.com/obscuren/otto" ) type Repl interface { @@ -53,6 +53,10 @@ type JSEthereum struct { vm *otto.Otto } +func (self *JSEthereum) GetBlock(hash string) otto.Value { + return self.toVal(self.PEthereum.GetBlock(hash)) +} + func (self *JSEthereum) GetKey() otto.Value { return self.toVal(self.PEthereum.GetKey()) } diff --git a/ethereum/repl_darwin.go b/ethereum/repl_darwin.go index 87da3df1d..1b98c2150 100644 --- a/ethereum/repl_darwin.go +++ b/ethereum/repl_darwin.go @@ -8,7 +8,6 @@ package main import "C" import ( - "github.com/robertkrimen/otto" "strings" "unsafe" ) @@ -87,7 +86,10 @@ L: } } -func (self *JSRepl) PrintValue(value otto.Value) { +func (self *JSRepl) PrintValue(v interface{}) { method, _ := self.re.vm.Get("prettyPrint") - method.Call(method, value) + v, err := self.re.vm.ToValue(v) + if err == nil { + method.Call(method, v) + } } |