From f18ec51cb3959cc662bfc7b84314cd1d3b1541b5 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Wed, 14 May 2014 13:55:08 +0200
Subject: [PATCH] Switched to new keyring methods

---
 README.md                                  |  2 +-
 ethereal/assets/muted/index.html           |  1 +
 ethereal/assets/samplecoin/samplecoin.html |  4 +-
 ethereal/ethereum.go                       | 15 +++++-
 ethereal/ui/gui.go                         | 49 ++-----------------
 ethereal/ui/library.go                     | 13 +++--
 ethereal/ui/ui_lib.go                      |  2 +-
 ethereum/dev_console.go                    |  8 +--
 ethereum/ethereum.go                       | 15 +++++-
 utils/cmd.go                               | 11 ++---
 utils/keys.go                              | 57 ++++++++++++++++++++++
 11 files changed, 106 insertions(+), 71 deletions(-)

diff --git a/README.md b/README.md
index 685d4c6d9..35c97c8ee 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 RC4.
 
 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/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 32c16f64f..63f907571 100644
--- a/ethereal/ethereum.go
+++ b/ethereal/ethereum.go
@@ -89,8 +89,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)
 	}
 
diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go
index 7f84272d6..396447a81 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)
@@ -81,43 +77,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
@@ -274,13 +233,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 207e61c88..b5460ac69 100644
--- a/ethereum/ethereum.go
+++ b/ethereum/ethereum.go
@@ -104,8 +104,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())
diff --git a/utils/cmd.go b/utils/cmd.go
index a99fd9eed..654014169 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -1,9 +1,7 @@
 package utils
 
 import (
-	"encoding/hex"
 	"github.com/ethereum/eth-go"
-	"github.com/ethereum/eth-go/ethchain"
 	"github.com/ethereum/eth-go/ethminer"
 	_ "github.com/ethereum/eth-go/ethrpc"
 	"github.com/ethereum/eth-go/ethutil"
@@ -18,13 +16,10 @@ func DoMining(ethereum *eth.Ethereum) {
 
 	// Fake block mining. It broadcasts a new block every 5 seconds
 	go func() {
-		data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
-		keyRing := ethutil.NewValueFromBytes(data)
-		addr := keyRing.Get(0).Bytes()
+		keyPair := ethutil.GetKeyRing().Get(0)
+		addr := keyPair.Address()
 
-		pair, _ := ethchain.NewKeyPairFromSec(ethutil.FromHex(hex.EncodeToString(addr)))
-
-		miner := ethminer.NewDefaultMiner(pair.Address(), ethereum)
+		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
@@ -6,6 +6,60 @@ import (
 	"github.com/obscuren/secp256k1-go"
 )
 
+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 {
@@ -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)
 }
+*/