Fix merge conflict

This commit is contained in:
Maran 2014-04-01 13:18:42 +02:00
commit ee5e7f2b35
9 changed files with 116 additions and 40 deletions

1
.gitignore vendored
View File

@ -9,4 +9,5 @@
*un~ *un~
.DS_Store .DS_Store
*/**/.DS_Store */**/.DS_Store
./ethereum/ethereum

View File

@ -13,18 +13,17 @@ Build
======= =======
For build instruction please see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go)) For build instruction please see the [Wiki](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum(Go))
Command line options General command line options
==================== ====================
``` ```
-c Launch the developer console -c Launch the developer console (node only)
-m Start mining blocks -m Start mining blocks
-genaddr Generates a new address and private key (destructive action) -genaddr Generates a new address and private key (destructive action)
-p Port on which the server will accept incomming connections (= 30303) -p Port on which the server will accept incomming connections (= 30303)
-upnp Enable UPnP (= false) -upnp Enable UPnP (= false)
-x Desired amount of peers (= 5) -x Desired amount of peers (= 5)
-h This help -h This help
-gui Launch with GUI (= true)
-dir Data directory used to store configs and databases (=".ethereum") -dir Data directory used to store configs and databases (=".ethereum")
-import Import a private key (hex) -import Import a private key (hex)
``` ```
@ -33,8 +32,9 @@ Developer console commands
========================== ==========================
``` ```
addp <host>:<port> Connect to the given host addp <host>:<port> Connect to the given host
tx <addr> <amount> Send <amount> Wei to the specified <addr> 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. See the "help" command for *developer* options.
@ -57,7 +57,7 @@ Coding standards
Sources should be formatted according to the [Go Formatting Sources should be formatted according to the [Go Formatting
Style](http://golang.org/doc/effective_go.html#formatting). Style](http://golang.org/doc/effective_go.html#formatting).
Unless structs fields are supposed to be directly accesible, provide Unless structs fields are supposed to be directly accessible, provide
Getters and hide the fields through Go's exporting facility. Getters and hide the fields through Go's exporting facility.
When you comment put meaningfull comments. Describe in detail what you When you comment put meaningfull comments. Describe in detail what you

View File

@ -158,20 +158,35 @@ ApplicationWindow {
anchors.leftMargin: 5 anchors.leftMargin: 5
anchors.topMargin: 5 anchors.topMargin: 5
TextField { TextField {
id: txAmount id: txRecipient
width: 200 placeholderText: "Recipient address (or empty for contract)"
placeholderText: "Amount" Layout.fillWidth: true
} }
TextField { TextField {
id: txReceiver id: txValue
placeholderText: "Receiver Address (or empty for contract)" width: 200
Layout.fillWidth: true placeholderText: "Amount"
}
TextField {
id: txGas
width: 200
placeholderText: "Gas"
anchors.left: txValue
anchors.leftMargin: 5
}
TextField {
id: txGasPrice
width: 200
placeholderText: "Gas price"
anchors.left: txGas
anchors.leftMargin: 5
} }
Label { Label {
text: "Transaction data" text: "Transaction data"
} }
TextArea { TextArea {
id: codeView id: codeView
anchors.topMargin: 5 anchors.topMargin: 5
@ -180,9 +195,11 @@ ApplicationWindow {
} }
Button { Button {
id: txButton
text: "Send" text: "Send"
onClicked: { onClicked: {
console.log(eth.createTx(txReceiver.text, txAmount.text, codeView.text)) //this.enabled = false
console.log(eth.createTx(txRecipient.text, txValue.text, txGas.text, txGasPrice.text, codeView.text))
} }
} }
} }

View File

@ -16,6 +16,7 @@ var UseSeed bool
var ImportKey string var ImportKey string
var ExportKey bool var ExportKey bool
var DataDir string var DataDir string
var AssetPath string
func Init() { func Init() {
flag.BoolVar(&StartConsole, "c", false, "debug and testing console") flag.BoolVar(&StartConsole, "c", false, "debug and testing console")
@ -29,6 +30,7 @@ func Init() {
flag.StringVar(&DataDir, "dir", ".ethereal", "ethereum data directory") flag.StringVar(&DataDir, "dir", ".ethereal", "ethereum data directory")
flag.StringVar(&ImportKey, "import", "", "imports the given private key (hex)") flag.StringVar(&ImportKey, "import", "", "imports the given private key (hex)")
flag.IntVar(&MaxPeer, "x", 5, "maximum desired peers") flag.IntVar(&MaxPeer, "x", 5, "maximum desired peers")
flag.StringVar(&AssetPath, "asset_path", "", "absolute path to GUI assets directory")
flag.Parse() flag.Parse()
} }

View File

@ -100,11 +100,11 @@ func main() {
os.Exit(0) os.Exit(0)
} }
log.Printf("Starting Ethereum v%s\n", ethutil.Config.Ver) log.Printf("Starting Ethereum GUI v%s\n", ethutil.Config.Ver)
// Set the max peers // Set the max peers
ethereum.MaxPeers = MaxPeer ethereum.MaxPeers = MaxPeer
gui := ethui.New(ethereum) gui := ethui.New(ethereum)
gui.Start() gui.Start(AssetPath)
} }

View File

@ -53,6 +53,7 @@ type Gui struct {
txDb *ethdb.LDBDatabase txDb *ethdb.LDBDatabase
addr []byte addr []byte
} }
// Create GUI, but doesn't start it // Create GUI, but doesn't start it
@ -71,7 +72,7 @@ func New(ethereum *eth.Ethereum) *Gui {
return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr} return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr}
} }
func (ui *Gui) Start() { func (ui *Gui) Start(assetPath string) {
defer ui.txDb.Close() defer ui.txDb.Close()
// Register ethereum functions // Register ethereum functions
@ -89,14 +90,16 @@ func (ui *Gui) Start() {
// Expose the eth library and the ui library to QML // Expose the eth library and the ui library to QML
context.SetVar("eth", ui.lib) context.SetVar("eth", ui.lib)
context.SetVar("ui", &UiLib{engine: ui.engine, eth: ui.eth}) uiLib := NewUiLib(ui.engine, ui.eth, assetPath)
context.SetVar("ui", uiLib)
// Load the main QML interface // Load the main QML interface
component, err := ui.engine.LoadFile(AssetPath("qml/wallet.qml")) component, err := ui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml"))
if err != nil { if err != nil {
ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'")
panic(err) panic(err)
} }
ui.engine.LoadFile(AssetPath("qml/transactions.qml")) ui.engine.LoadFile(uiLib.AssetPath("qml/transactions.qml"))
ui.win = component.CreateWindow(nil) ui.win = component.CreateWindow(nil)

View File

@ -5,6 +5,7 @@ import (
"fmt" "fmt"
"github.com/ethereum/eth-go/ethchain" "github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/obscuren/mutan"
"strings" "strings"
) )
@ -14,6 +15,50 @@ type EthLib struct {
txPool *ethchain.TxPool txPool *ethchain.TxPool
} }
func (lib *EthLib) CreateTx(recipient, valueStr, gasStr, gasPriceStr, data string) string {
var hash []byte
var contractCreation bool
if len(recipient) == 0 {
contractCreation = true
} else {
var err error
hash, err = hex.DecodeString(recipient)
if err != nil {
return err.Error()
}
}
keyPair := ethutil.Config.Db.GetKeys()[0]
value := ethutil.Big(valueStr)
gas := ethutil.Big(gasStr)
gasPrice := ethutil.Big(gasPriceStr)
var tx *ethchain.Transaction
// Compile and assemble the given data
if contractCreation {
asm, err := mutan.Compile(strings.NewReader(data), false)
if err != nil {
return err.Error()
}
code := ethutil.Assemble(asm...)
tx = ethchain.NewContractCreationTx(value, gasPrice, code)
} else {
tx = ethchain.NewTransactionMessage(hash, value, gasPrice, gas, []string{})
}
tx.Nonce = lib.stateManager.GetAddrState(keyPair.Address()).Nonce
tx.Sign(keyPair.PrivateKey)
lib.txPool.QueueTransaction(tx)
if contractCreation {
ethutil.Config.Log.Infof("Contract addr %x", tx.Hash()[12:])
} else {
ethutil.Config.Log.Infof("Tx hash %x", tx.Hash())
}
return ethutil.Hex(tx.Hash())
}
/*
func (lib *EthLib) CreateTx(receiver, a, data string) string { func (lib *EthLib) CreateTx(receiver, a, data string) string {
var hash []byte var hash []byte
if len(receiver) == 0 { if len(receiver) == 0 {
@ -31,7 +76,7 @@ func (lib *EthLib) CreateTx(receiver, a, data string) string {
amount := ethutil.Big(a) amount := ethutil.Big(a)
code := ethchain.Compile(strings.Split(data, "\n")) code := ethchain.Compile(strings.Split(data, "\n"))
tx := ethchain.NewTransaction(hash, amount, code) tx := ethchain.NewTx(hash, amount, code)
tx.Nonce = lib.stateManager.GetAddrState(keyPair.Address()).Nonce tx.Nonce = lib.stateManager.GetAddrState(keyPair.Address()).Nonce
tx.Sign(keyPair.PrivateKey) tx.Sign(keyPair.PrivateKey)
@ -46,6 +91,7 @@ func (lib *EthLib) CreateTx(receiver, a, data string) string {
return ethutil.Hex(tx.Hash()) return ethutil.Hex(tx.Hash())
} }
*/
func (lib *EthLib) GetBlock(hexHash string) *Block { func (lib *EthLib) GetBlock(hexHash string) *Block {
hash, err := hex.DecodeString(hexHash) hash, err := hex.DecodeString(hexHash)

View File

@ -16,6 +16,14 @@ type UiLib struct {
engine *qml.Engine engine *qml.Engine
eth *eth.Ethereum eth *eth.Ethereum
connected bool connected bool
assetPath string
}
func NewUiLib(engine *qml.Engine, eth *eth.Ethereum, assetPath string) *UiLib {
if assetPath == "" {
assetPath = DefaultAssetPath()
}
return &UiLib{engine: engine, eth: eth, assetPath: assetPath}
} }
// Opens a QML file (external application) // Opens a QML file (external application)
@ -45,10 +53,10 @@ func (ui *UiLib) ConnectToPeer(addr string) {
} }
func (ui *UiLib) AssetPath(p string) string { func (ui *UiLib) AssetPath(p string) string {
return AssetPath(p) return path.Join(ui.assetPath, p)
} }
func AssetPath(p string) string { func DefaultAssetPath() string {
var base string var base string
// If the current working directory is the go-ethereum dir // If the current working directory is the go-ethereum dir
// assume a debug build and use the source directory as // assume a debug build and use the source directory as
@ -71,5 +79,5 @@ func AssetPath(p string) string {
} }
} }
return path.Join(base, p) return base
} }

View File

@ -11,6 +11,7 @@ import (
"github.com/ethereum/eth-go/ethdb" "github.com/ethereum/eth-go/ethdb"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/eth-go/ethwire" "github.com/ethereum/eth-go/ethwire"
"github.com/obscuren/mutan"
_ "math/big" _ "math/big"
"os" "os"
"strings" "strings"
@ -52,15 +53,15 @@ func (i *Console) ValidateInput(action string, argumentLength int) error {
case action == "gettx" && argumentLength != 1: case action == "gettx" && argumentLength != 1:
err = true err = true
expArgCount = 1 expArgCount = 1
case action == "tx" && argumentLength != 2: case action == "tx" && argumentLength != 4:
err = true err = true
expArgCount = 2 expArgCount = 4
case action == "getaddr" && argumentLength != 1: case action == "getaddr" && argumentLength != 1:
err = true err = true
expArgCount = 1 expArgCount = 1
case action == "contract" && argumentLength != 1: case action == "contract" && argumentLength != 2:
err = true err = true
expArgCount = 1 expArgCount = 2
case action == "say" && argumentLength != 1: case action == "say" && argumentLength != 1:
err = true err = true
expArgCount = 1 expArgCount = 1
@ -79,7 +80,7 @@ func (i *Console) ValidateInput(action string, argumentLength int) error {
} }
} }
func (i *Console) Editor() []string { func (i *Console) Editor() string {
var buff bytes.Buffer var buff bytes.Buffer
for { for {
reader := bufio.NewReader(os.Stdin) reader := bufio.NewReader(os.Stdin)
@ -94,15 +95,7 @@ func (i *Console) Editor() []string {
} }
} }
scanner := bufio.NewScanner(strings.NewReader(buff.String())) return buff.String()
scanner.Split(bufio.ScanLines)
var lines []string
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
return lines
} }
func (i *Console) PrintRoot() { func (i *Console) PrintRoot() {
@ -178,7 +171,7 @@ func (i *Console) ParseInput(input string) bool {
if err != nil { if err != nil {
fmt.Println("recipient err:", err) fmt.Println("recipient err:", err)
} else { } else {
tx := ethchain.NewTransaction(recipient, ethutil.Big(tokens[2]), []string{""}) tx := ethchain.NewTransactionMessage(recipient, ethutil.Big(tokens[2]), ethutil.Big(tokens[3]), ethutil.Big(tokens[4]), []string{""})
key := ethutil.Config.Db.GetKeys()[0] key := ethutil.Config.Db.GetKeys()[0]
tx.Sign(key.PrivateKey) tx.Sign(key.PrivateKey)
@ -197,9 +190,15 @@ func (i *Console) ParseInput(input string) bool {
} }
case "contract": case "contract":
fmt.Println("Contract editor (Ctrl-D = done)") fmt.Println("Contract editor (Ctrl-D = done)")
code := ethchain.Compile(i.Editor()) asm, err := mutan.Compile(strings.NewReader(i.Editor()), false)
if err != nil {
fmt.Println(err)
break
}
contract := ethchain.NewTransaction(ethchain.ContractAddr, ethutil.Big(tokens[1]), code) code := ethutil.Assemble(asm)
contract := ethchain.NewContractCreationTx(ethutil.Big(tokens[0]), ethutil.Big(tokens[1]), code)
key := ethutil.Config.Db.GetKeys()[0] key := ethutil.Config.Db.GetKeys()[0]
contract.Sign(key.PrivateKey) contract.Sign(key.PrivateKey)