aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--ethereal/assets/muted/index.html1
-rw-r--r--ethereal/assets/qml/newTransaction/_new_contract.qml6
-rw-r--r--ethereal/assets/qml/newTransaction/_simple_send.qml3
-rw-r--r--ethereal/assets/samplecoin/samplecoin.html4
-rw-r--r--ethereal/ethereum.go28
-rw-r--r--ethereal/ui/gui.go91
-rw-r--r--ethereal/ui/library.go13
-rw-r--r--ethereal/ui/ui_lib.go2
-rw-r--r--ethereum/dev_console.go8
-rw-r--r--ethereum/ethereum.go54
-rw-r--r--utils/cmd.go46
-rw-r--r--utils/keys.go57
13 files changed, 195 insertions, 120 deletions
diff --git a/README.md b/README.md
index 685d4c6d9..7337f9a3c 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@ Ethereum
Ethereum Go Client © 2014 Jeffrey Wilcke.
-Current state: Proof of Concept 5.0 RC3.
+Current state: Proof of Concept 5.0 RC6.
For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).
diff --git a/ethereal/assets/muted/index.html b/ethereal/assets/muted/index.html
index 84584e373..14949b5ac 100644
--- a/ethereal/assets/muted/index.html
+++ b/ethereal/assets/muted/index.html
@@ -46,6 +46,7 @@
.CodeMirror {
height: 70%;
+ font-size: 14pt;
}
</style>
</head>
diff --git a/ethereal/assets/qml/newTransaction/_new_contract.qml b/ethereal/assets/qml/newTransaction/_new_contract.qml
index f8f3d53a0..e3c7229eb 100644
--- a/ethereal/assets/qml/newTransaction/_new_contract.qml
+++ b/ethereal/assets/qml/newTransaction/_new_contract.qml
@@ -61,7 +61,7 @@ Component {
id: txValue
width: 200
placeholderText: "Amount"
- validator: IntValidator { }
+ validator: RegExpValidator { regExp: /\d*/ }
onTextChanged: {
contractFormReady()
}
@@ -69,7 +69,7 @@ Component {
TextField {
id: txGas
width: 200
- validator: IntValidator { }
+ validator: RegExpValidator { regExp: /\d*/ }
placeholderText: "Gas"
onTextChanged: {
contractFormReady()
@@ -79,7 +79,7 @@ Component {
id: txGasPrice
width: 200
placeholderText: "Gas price"
- validator: IntValidator { }
+ validator: RegExpValidator { regExp: /\d*/ }
onTextChanged: {
contractFormReady()
}
diff --git a/ethereal/assets/qml/newTransaction/_simple_send.qml b/ethereal/assets/qml/newTransaction/_simple_send.qml
index 12420c15a..cd1ef55b6 100644
--- a/ethereal/assets/qml/newTransaction/_simple_send.qml
+++ b/ethereal/assets/qml/newTransaction/_simple_send.qml
@@ -56,9 +56,10 @@ Component {
}
TextField {
id: txSimpleValue
+ width: 200
placeholderText: "Amount"
anchors.rightMargin: 5
- validator: IntValidator { }
+ validator: RegExpValidator { regExp: /\d*/ }
onTextChanged: { checkFormState() }
}
Button {
diff --git a/ethereal/assets/samplecoin/samplecoin.html b/ethereal/assets/samplecoin/samplecoin.html
index 384936780..3f8eacc00 100644
--- a/ethereal/assets/samplecoin/samplecoin.html
+++ b/ethereal/assets/samplecoin/samplecoin.html
@@ -9,7 +9,7 @@
<script type="text/javascript">
-var jefcoinAddr = "b7cb72c47ec4f31751d0d628b5a33fd6671bbba0"
+var jefcoinAddr = "681fd48ffa236549fbcd16bdf9f98bb541a7f742"
var mAddr = ""
function createTransaction() {
@@ -23,8 +23,6 @@ function createTransaction() {
}
function init() {
- eth.set({width: 500});
-
eth.getKey(function(sec) {
mAddr = sec;
eth.getSecretToAddress(sec, function(addr) {
diff --git a/ethereal/ethereum.go b/ethereal/ethereum.go
index 15a454bdf..98fab18e3 100644
--- a/ethereal/ethereum.go
+++ b/ethereal/ethereum.go
@@ -4,8 +4,6 @@ import (
"fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethpub"
- "github.com/ethereum/eth-go/ethrpc"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/ethereal/ui"
"github.com/ethereum/go-ethereum/utils"
@@ -89,8 +87,19 @@ func main() {
}
if ExportKey {
- key := ethutil.Config.Db.GetKeys()[0]
- fmt.Printf("%x\n", key.PrivateKey)
+ keyPair := ethutil.GetKeyRing().Get(0)
+ fmt.Printf(`
+Generating new address and keypair.
+Please keep your keys somewhere save.
+
+++++++++++++++++ KeyRing +++++++++++++++++++
+addr: %x
+prvk: %x
+pubk: %x
+++++++++++++++++++++++++++++++++++++++++++++
+save these words so you can restore your account later: %s
+`, keyPair.Address(), keyPair.PrivateKey, keyPair.PublicKey)
+
os.Exit(0)
}
@@ -99,13 +108,12 @@ func main() {
os.Exit(0)
}
+ if StartMining {
+ utils.DoMining(ethereum)
+ }
+
if StartRpc {
- ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum), RpcPort)
- if err != nil {
- log.Println("Could not start RPC interface:", err)
- } else {
- go ethereum.RpcServer.Start()
- }
+ utils.DoRpc(ethereum, RpcPort)
}
log.Printf("Starting Ethereum GUI v%s\n", ethutil.Config.Ver)
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 7f84272d6..aa0364998 100644
--- a/ethereal/ui/gui.go
+++ b/ethereal/ui/gui.go
@@ -42,15 +42,11 @@ func New(ethereum *eth.Ethereum) *Gui {
panic(err)
}
- data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
// On first run we won't have any keys yet, so this would crash.
// Therefor we check if we are ready to actually start this process
var addr []byte
- if len(data) > 0 {
- key := ethutil.Config.Db.GetKeys()[0]
- addr = key.Address()
-
- //ethereum.StateManager().WatchAddr(addr)
+ if ethutil.GetKeyRing().Len() != 0 {
+ addr = ethutil.GetKeyRing().Get(0).Address()
}
pub := ethpub.NewPEthereum(ethereum)
@@ -59,6 +55,8 @@ func New(ethereum *eth.Ethereum) *Gui {
}
func (gui *Gui) Start(assetPath string) {
+ const version = "0.5.0 RC6"
+
defer gui.txDb.Close()
// Register ethereum functions
@@ -68,7 +66,7 @@ func (gui *Gui) Start(assetPath string) {
Init: func(p *ethpub.PTx, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" },
}})
- ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", "0.5.0 RC4"))
+ ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", version))
ethutil.Config.Log.Infoln("[GUI] Starting GUI")
// Create a new QML engine
gui.engine = qml.NewEngine()
@@ -81,43 +79,6 @@ func (gui *Gui) Start(assetPath string) {
// Load the main QML interface
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
- /*
- var err error
- var component qml.Object
- firstRun := len(data) == 0
-
- if firstRun {
- component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml"))
- } else {
- component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml"))
- }
- 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)
- }
-
- gui.win = component.CreateWindow(nil)
- uiLib.win = gui.win
- db := &Debugger{gui.win, make(chan bool)}
- gui.lib.Db = db
- uiLib.Db = db
-
- // Add the ui as a log system so we can log directly to the UGI
- ethutil.Config.Log.AddLogSystem(gui)
-
- // Loads previous blocks
- if firstRun == false {
- go gui.setInitialBlockChain()
- go gui.readPreviousTransactions()
- go gui.update()
- }
-
- gui.win.Show()
- gui.win.Wait()
-
- gui.eth.Stop()
- */
var win *qml.Window
var err error
@@ -199,8 +160,29 @@ func (gui *Gui) processBlock(block *ethchain.Block) {
gui.win.Root().Call("addBlock", ethpub.NewPBlock(block))
}
+func (gui *Gui) setWalletValue(amount, unconfirmedFunds *big.Int) {
+ var str string
+ if unconfirmedFunds != nil {
+ pos := "+"
+ if unconfirmedFunds.Cmp(big.NewInt(0)) >= 0 {
+ pos = "-"
+ }
+ val := ethutil.CurrencyToString(new(big.Int).Abs(ethutil.BigCopy(unconfirmedFunds)))
+ str = fmt.Sprintf("%v (%s %v)", ethutil.CurrencyToString(amount), pos, val)
+ } else {
+ str = fmt.Sprintf("%v", ethutil.CurrencyToString(amount))
+ }
+
+ gui.win.Root().Call("setWalletValue", str)
+}
+
// Simple go routine function that updates the list of peers in the GUI
func (gui *Gui) update() {
+ blockChan := make(chan ethutil.React, 1)
+ reactor := gui.eth.Reactor()
+
+ reactor.Subscribe("newBlock", blockChan)
+
txChan := make(chan ethchain.TxMsg, 1)
gui.eth.TxPool().Subscribe(txChan)
@@ -211,6 +193,12 @@ func (gui *Gui) update() {
for {
select {
+ case b := <-blockChan:
+ block := b.Resource.(*ethchain.Block)
+ if bytes.Compare(block.Coinbase, gui.addr) == 0 {
+ gui.setWalletValue(gui.eth.StateManager().ProcState().GetAccount(gui.addr).Amount, nil)
+ }
+
case txMsg := <-txChan:
tx := txMsg.Tx
@@ -232,14 +220,7 @@ func (gui *Gui) update() {
unconfirmedFunds.Add(unconfirmedFunds, tx.Value)
}
- pos := "+"
- if unconfirmedFunds.Cmp(big.NewInt(0)) >= 0 {
- pos = "-"
- }
- val := ethutil.CurrencyToString(new(big.Int).Abs(ethutil.BigCopy(unconfirmedFunds)))
- str := fmt.Sprintf("%v (%s %v)", ethutil.CurrencyToString(object.Amount), pos, val)
-
- gui.win.Root().Call("setWalletValue", str)
+ gui.setWalletValue(object.Amount, unconfirmedFunds)
} else {
object := state.GetAccount(gui.addr)
if bytes.Compare(tx.Sender(), gui.addr) == 0 {
@@ -248,7 +229,7 @@ func (gui *Gui) update() {
object.AddAmount(tx.Value)
}
- gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(object.Amount)))
+ gui.setWalletValue(object.Amount, nil)
state.SetStateObject(object)
}
@@ -274,13 +255,13 @@ func (gui *Gui) Printf(format string, v ...interface{}) {
}
func (gui *Gui) Transact(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) {
- keyPair := ethutil.Config.Db.GetKeys()[0]
+ keyPair := ethutil.GetKeyRing().Get(0)
return gui.pub.Transact(ethutil.Hex(keyPair.PrivateKey), recipient, value, gas, gasPrice, data)
}
func (gui *Gui) Create(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) {
- keyPair := ethutil.Config.Db.GetKeys()[0]
+ keyPair := ethutil.GetKeyRing().Get(0)
mainInput, initInput := mutan.PreParse(data)
diff --git a/ethereal/ui/library.go b/ethereal/ui/library.go
index c889efb45..267108195 100644
--- a/ethereal/ui/library.go
+++ b/ethereal/ui/library.go
@@ -34,10 +34,13 @@ func (lib *EthLib) ImportAndSetPrivKey(privKey string) bool {
}
func (lib *EthLib) CreateAndSetPrivKey() (string, string, string, string) {
- pub, prv := secp256k1.GenerateKeyPair()
- pair := &ethutil.Key{PrivateKey: prv, PublicKey: pub}
- ethutil.Config.Db.Put([]byte("KeyRing"), pair.RlpEncode())
- mne := ethutil.MnemonicEncode(ethutil.Hex(prv))
+ _, prv := secp256k1.GenerateKeyPair()
+ keyPair, err := ethutil.GetKeyRing().NewKeyPair(prv)
+ if err != nil {
+ panic(err)
+ }
+
+ mne := ethutil.MnemonicEncode(ethutil.Hex(keyPair.PrivateKey))
mnemonicString := strings.Join(mne, " ")
- return mnemonicString, fmt.Sprintf("%x", pair.Address()), fmt.Sprintf("%x", prv), fmt.Sprintf("%x", pub)
+ return mnemonicString, fmt.Sprintf("%x", keyPair.Address()), ethutil.Hex(keyPair.PrivateKey), ethutil.Hex(keyPair.PublicKey)
}
diff --git a/ethereal/ui/ui_lib.go b/ethereal/ui/ui_lib.go
index 6736e79ae..0c43f1675 100644
--- a/ethereal/ui/ui_lib.go
+++ b/ethereal/ui/ui_lib.go
@@ -138,7 +138,7 @@ func (ui *UiLib) DebugTx(recipient, valueStr, gasStr, gasPriceStr, data string)
callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasStr), ethutil.Big(gasPriceStr), callerScript, nil)
// Contract addr as test address
- keyPair := ethutil.Config.Db.GetKeys()[0]
+ keyPair := ethutil.GetKeyRing().Get(0)
account := ui.eth.StateManager().TransState().GetStateObject(keyPair.Address())
c := ethchain.MakeContract(callerTx, state)
callerClosure := ethchain.NewClosure(account, c, c.Script(), state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr))
diff --git a/ethereum/dev_console.go b/ethereum/dev_console.go
index 9bdd58942..5941c03ab 100644
--- a/ethereum/dev_console.go
+++ b/ethereum/dev_console.go
@@ -173,8 +173,8 @@ func (i *Console) ParseInput(input string) bool {
} else {
tx := ethchain.NewTransactionMessage(recipient, ethutil.Big(tokens[2]), ethutil.Big(tokens[3]), ethutil.Big(tokens[4]), nil)
- key := ethutil.Config.Db.GetKeys()[0]
- tx.Sign(key.PrivateKey)
+ keyPair := ethutil.GetKeyRing().Get(0)
+ tx.Sign(keyPair.PrivateKey)
i.ethereum.TxPool().QueueTransaction(tx)
fmt.Printf("%x\n", tx.Hash())
@@ -207,8 +207,8 @@ func (i *Console) ParseInput(input string) bool {
contract := ethchain.NewContractCreationTx(ethutil.Big(tokens[0]), ethutil.Big(tokens[1]), ethutil.Big(tokens[1]), mainScript, initScript)
- key := ethutil.Config.Db.GetKeys()[0]
- contract.Sign(key.PrivateKey)
+ keyPair := ethutil.GetKeyRing().Get(0)
+ contract.Sign(keyPair.PrivateKey)
i.ethereum.TxPool().QueueTransaction(contract)
diff --git a/ethereum/ethereum.go b/ethereum/ethereum.go
index babebbb48..2abf6da42 100644
--- a/ethereum/ethereum.go
+++ b/ethereum/ethereum.go
@@ -1,13 +1,9 @@
package main
import (
- "encoding/hex"
"fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain"
- "github.com/ethereum/eth-go/ethminer"
- "github.com/ethereum/eth-go/ethpub"
- "github.com/ethereum/eth-go/ethrpc"
"github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/utils"
"log"
@@ -68,10 +64,9 @@ func main() {
log.SetOutput(logfile)
logSys = log.New(logfile, "", flags)
logger.AddLogSystem(logSys)
- }
- /*else {
+ } else {
logSys = log.New(os.Stdout, "", flags)
- }*/
+ }
ethchain.InitFees()
@@ -106,8 +101,19 @@ func main() {
}
os.Exit(0)
case ExportKey:
- key := ethutil.Config.Db.GetKeys()[0]
- logSys.Println(fmt.Sprintf("prvk: %x\n", key.PrivateKey))
+ keyPair := ethutil.GetKeyRing().Get(0)
+ fmt.Printf(`
+Generating new address and keypair.
+Please keep your keys somewhere save.
+
+++++++++++++++++ KeyRing +++++++++++++++++++
+addr: %x
+prvk: %x
+pubk: %x
+++++++++++++++++++++++++++++++++++++++++++++
+save these words so you can restore your account later: %s
+`, keyPair.Address(), keyPair.PrivateKey, keyPair.PublicKey)
+
os.Exit(0)
case ShowGenesis:
logSys.Println(ethereum.BlockChain().Genesis())
@@ -127,28 +133,7 @@ func main() {
ethereum.Mining = StartMining
if StartMining {
- logger.Infoln("Miner started")
-
- // Fake block mining. It broadcasts a new block every 5 seconds
- go func() {
-
- if StartMining {
- logger.Infoln("Miner started")
-
- go func() {
- data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
- keyRing := ethutil.NewValueFromBytes(data)
- addr := keyRing.Get(1).Bytes()
-
- pair, _ := ethchain.NewKeyPairFromSec(ethutil.FromHex(hex.EncodeToString(addr)))
-
- miner := ethminer.NewDefaultMiner(pair.Address(), ethereum)
- miner.Start()
-
- }()
- }
- }()
-
+ utils.DoMining(ethereum)
}
if StartConsole {
@@ -162,12 +147,7 @@ func main() {
go console.Start()
}
if StartRpc {
- ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum), RpcPort)
- if err != nil {
- logger.Infoln("Could not start RPC interface:", err)
- } else {
- go ethereum.RpcServer.Start()
- }
+ utils.DoRpc(ethereum, RpcPort)
}
RegisterInterrupts(ethereum)
diff --git a/utils/cmd.go b/utils/cmd.go
new file mode 100644
index 000000000..8395ac8fc
--- /dev/null
+++ b/utils/cmd.go
@@ -0,0 +1,46 @@
+package utils
+
+import (
+ "github.com/ethereum/eth-go"
+ "github.com/ethereum/eth-go/ethminer"
+ "github.com/ethereum/eth-go/ethpub"
+ "github.com/ethereum/eth-go/ethrpc"
+ "github.com/ethereum/eth-go/ethutil"
+ "log"
+ "time"
+)
+
+func DoRpc(ethereum *eth.Ethereum, RpcPort int) {
+ var err error
+ ethereum.RpcServer, err = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum), RpcPort)
+ if err != nil {
+ log.Println("Could not start RPC interface:", err)
+ } else {
+ go ethereum.RpcServer.Start()
+ }
+}
+
+func DoMining(ethereum *eth.Ethereum) {
+ // Set Mining status
+ ethereum.Mining = true
+
+ if ethutil.GetKeyRing().Len() == 0 {
+ log.Println("No address found, can't start mining")
+ return
+ }
+ keyPair := ethutil.GetKeyRing().Get(0)
+ addr := keyPair.Address()
+
+ go func() {
+ // Give it some time to connect with peers
+ time.Sleep(3 * time.Second)
+
+ for ethereum.IsUpToDate() == false {
+ time.Sleep(5 * time.Second)
+ }
+ log.Println("Miner started")
+
+ miner := ethminer.NewDefaultMiner(addr, ethereum)
+ miner.Start()
+ }()
+}
diff --git a/utils/keys.go b/utils/keys.go
index 2f39c10b2..1c0f6a9d6 100644
--- a/utils/keys.go
+++ b/utils/keys.go
@@ -7,6 +7,60 @@ import (
)
func CreateKeyPair(force bool) {
+ if force {
+ ethutil.GetKeyRing().Reset()
+ fmt.Println("resetting")
+ }
+
+ if ethutil.GetKeyRing().Get(0) == nil {
+ _, prv := secp256k1.GenerateKeyPair()
+
+ keyPair, err := ethutil.GetKeyRing().NewKeyPair(prv)
+ if err != nil {
+ panic(err)
+ }
+
+ mne := ethutil.MnemonicEncode(ethutil.Hex(keyPair.PrivateKey))
+
+ fmt.Printf(`
+Generating new address and keypair.
+Please keep your keys somewhere save.
+
+++++++++++++++++ KeyRing +++++++++++++++++++
+addr: %x
+prvk: %x
+pubk: %x
+++++++++++++++++++++++++++++++++++++++++++++
+save these words so you can restore your account later: %s
+`, keyPair.Address(), keyPair.PrivateKey, keyPair.PublicKey, mne)
+ }
+}
+
+func ImportPrivateKey(sec string) {
+ ethutil.GetKeyRing().Reset()
+
+ keyPair, err := ethutil.GetKeyRing().NewKeyPair(ethutil.FromHex(sec))
+ if err != nil {
+ panic(err)
+ }
+
+ mne := ethutil.MnemonicEncode(ethutil.Hex(keyPair.PrivateKey))
+
+ fmt.Printf(`
+Generating new address and keypair.
+Please keep your keys somewhere save.
+
+++++++++++++++++ KeyRing +++++++++++++++++++
+addr: %x
+prvk: %x
+pubk: %x
+++++++++++++++++++++++++++++++++++++++++++++
+save these words so you can restore your account later: %s
+`, keyPair.Address(), keyPair.PrivateKey, keyPair.PublicKey, mne)
+}
+
+/*
+func CreateKeyPair(force bool) {
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
if len(data) == 0 || force {
pub, prv := secp256k1.GenerateKeyPair()
@@ -28,7 +82,9 @@ save these words so you can restore your account later: %s
}
}
+*/
+/*
func ImportPrivateKey(prvKey string) {
key := ethutil.FromHex(prvKey)
msg := []byte("tmp")
@@ -49,3 +105,4 @@ pubk: %x
`, pair.Address(), key, pub)
}
+*/