Compare commits

...

40 Commits

Author SHA1 Message Date
obscuren
942f552c62 Merge branch 'release/poc5-rc6' 2014-05-14 21:34:21 +02:00
obscuren
a73ae8727d Bumped version 2014-05-14 21:34:01 +02:00
obscuren
278ee3f16c Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop 2014-05-14 14:57:16 +02:00
obscuren
9a057021c3 Update wallet value for coinbase rewards. Implements #44 & #43 2014-05-14 14:57:05 +02:00
Maran
a1dcc5cd17 Prevent crash during import of privkeys.
@obscuren please check if this was commented out for a reason
2014-05-14 14:11:45 +02:00
Maran
c9db87277b Fix merge conflicts 2014-05-14 14:04:43 +02:00
Maran
2c7b625daa Make sure we have a coinbase address to mine with 2014-05-14 13:55:55 +02:00
obscuren
f18ec51cb3 Switched to new keyring methods 2014-05-14 13:55:08 +02:00
Maran
9fce273ce9 Refactored RPC client to utils so it can be reused 2014-05-14 13:32:49 +02:00
Maran
2012e0c67a Rewritten a check to only start mining once we are caught up with all peers 2014-05-14 13:26:15 +02:00
Maran
e8147cf7c6 Refactored mining into utils and exposed it to ethereal. Partly fixes #43 2014-05-14 12:41:30 +02:00
Maran
0d9c948b9b Generate coinbase from privatekey, not pubkey. Partily fixes #43 2014-05-14 12:24:49 +02:00
obscuren
faa3073625 Changed validators to regexp validators
IntValidator limits to 32bit int (JavaScript limitation) and therefor
the input fields are limited in length.
2014-05-13 22:25:05 +02:00
obscuren
809b4ae0f6 Merge branch 'develop' 2014-05-13 16:39:32 +02:00
obscuren
7f94b266c7 Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop 2014-05-13 16:39:23 +02:00
obscuren
1adfc272a8 Merge branch 'release/poc5-rc4' 2014-05-13 16:37:47 +02:00
obscuren
9caf53f8c6 Bumped 2014-05-13 16:37:15 +02:00
Maran
fca36cc03d Typo 2014-05-13 16:36:29 +02:00
Maran
b71094b01c Removed harcoded addresses from GetBlock JS bindings. Fixes #39 2014-05-13 16:32:35 +02:00
Maran
edc281ac5f Depcrecated set 2014-05-13 14:53:46 +02:00
Maran
ee2cef3b2e Adding new API test case html 2014-05-13 14:49:21 +02:00
Maran
54eff2d778 Change coinbase to be the address not public key 2014-05-13 14:48:45 +02:00
Maran
20ea78945e Implemented new JS/EthPub methods
- getTxCountAt
- getPeerCount
- getIsMining
- getIsListening
- getCoinbase
2014-05-13 14:43:08 +02:00
obscuren
dd60382fc3 Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop
Conflicts:
	ethereal/ethereum.go
	ethereum/ethereum.go
2014-05-13 12:46:40 +02:00
obscuren
32c6126593 Fix 2014-05-13 12:45:47 +02:00
obscuren
03371b74d7 Public ethereum interface uses EthManager 2014-05-13 12:42:01 +02:00
Maran
c99aa7bdcf Fix merge conflict 2014-05-13 12:40:45 +02:00
Maran
5208b04821 Merge branch 'develop' of github.com:ethereum/go-ethereum into develop 2014-05-13 12:08:54 +02:00
Maran
9a03df7bd8 Implemented a flag for a different RPC port; --rpcport 2014-05-13 12:00:48 +02:00
obscuren
67820506cb Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop 2014-05-13 11:59:13 +02:00
obscuren
8c9e6746ce Fixed wallet crash for new account. Fixes #38 2014-05-13 11:59:03 +02:00
Maran
b9876df5dc Added support to NewJsonRpc to return an error as well as an interface 2014-05-13 11:50:39 +02:00
Maran
a5963d1377 Enable seed again 2014-05-13 11:34:47 +02:00
Maran
c3ad210846 Merge branch 'develop' of github.com:ethereum/go-ethereum into develop 2014-05-12 17:23:16 +02:00
Maran
618f523124 Actually start the Ethereum server on starting the GUI 2014-05-12 17:23:14 +02:00
obscuren
c7132e5d22 Merge branch 'develop' of github.com-obscure:ethereum/go-ethereum into develop 2014-05-12 13:56:37 +02:00
obscuren
c43ea30e75 Refactored some code and fixed #37 2014-05-12 13:56:29 +02:00
Maran
cf7ab07264 Disable seed by default
Seed host seems down, only causes timeouts, not helpful
2014-05-12 13:41:52 +02:00
obscuren
5d15563ea7 PreProcess => PreParse 2014-05-12 12:22:16 +02:00
obscuren
a3cc4b0b80 Merge branch 'release/poc5-rc3' into develop 2014-05-10 16:25:08 +02:00
20 changed files with 488 additions and 243 deletions

View File

@@ -5,7 +5,7 @@ Ethereum
Ethereum Go Client © 2014 Jeffrey Wilcke. 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). For the development package please see the [eth-go package](https://github.com/ethereum/eth-go).

View File

@@ -36,6 +36,21 @@ window.eth = {
postData({call: "getKey"}, cb); postData({call: "getKey"}, cb);
}, },
getTxCountAt: function(address, cb) {
postData({call: "getTxCountAt", args: [address]}, cb);
},
getIsMining: function(cb){
postData({call: "getIsMining"}, cb)
},
getIsListening: function(cb){
postData({call: "getIsListening"}, cb)
},
getCoinBase: function(cb){
postData({call: "getCoinBase"}, cb);
},
getPeerCount: function(cb){
postData({call: "getPeerCount"}, cb);
},
getBalanceAt: function(address, cb) { getBalanceAt: function(address, cb) {
postData({call: "getBalance", args: [address]}, cb); postData({call: "getBalance", args: [address]}, cb);
}, },
@@ -115,6 +130,8 @@ window.eth = {
} }
} }
}, },
} }
window.eth._callbacks = {} window.eth._callbacks = {}
window.eth._onCallbacks = {} window.eth._onCallbacks = {}

View File

@@ -46,6 +46,7 @@
.CodeMirror { .CodeMirror {
height: 70%; height: 70%;
font-size: 14pt;
} }
</style> </style>
</head> </head>

View File

@@ -61,7 +61,7 @@ ApplicationWindow {
text: "Restore" text: "Restore"
enabled: false enabled: false
onClicked: { onClicked: {
var success = eth.importAndSetPrivKey(txPrivKey.text) var success = lib.importAndSetPrivKey(txPrivKey.text)
if(success){ if(success){
importedDetails.visible = true importedDetails.visible = true
restoreColumn.visible = false restoreColumn.visible = false
@@ -139,7 +139,7 @@ ApplicationWindow {
id: newKey id: newKey
text: "I don't have an account yet" text: "I don't have an account yet"
onClicked: { onClicked: {
var res = eth.createAndSetPrivKey() var res = lib.createAndSetPrivKey()
mnemonicInput.text = res[0] mnemonicInput.text = res[0]
addressInput.text = res[1] addressInput.text = res[1]
privkeyInput.text = res[2] privkeyInput.text = res[2]

View File

@@ -61,7 +61,7 @@ Component {
id: txValue id: txValue
width: 200 width: 200
placeholderText: "Amount" placeholderText: "Amount"
validator: IntValidator { } validator: RegExpValidator { regExp: /\d*/ }
onTextChanged: { onTextChanged: {
contractFormReady() contractFormReady()
} }
@@ -69,7 +69,7 @@ Component {
TextField { TextField {
id: txGas id: txGas
width: 200 width: 200
validator: IntValidator { } validator: RegExpValidator { regExp: /\d*/ }
placeholderText: "Gas" placeholderText: "Gas"
onTextChanged: { onTextChanged: {
contractFormReady() contractFormReady()
@@ -79,7 +79,7 @@ Component {
id: txGasPrice id: txGasPrice
width: 200 width: 200
placeholderText: "Gas price" placeholderText: "Gas price"
validator: IntValidator { } validator: RegExpValidator { regExp: /\d*/ }
onTextChanged: { onTextChanged: {
contractFormReady() contractFormReady()
} }

View File

@@ -56,9 +56,10 @@ Component {
} }
TextField { TextField {
id: txSimpleValue id: txSimpleValue
width: 200
placeholderText: "Amount" placeholderText: "Amount"
anchors.rightMargin: 5 anchors.rightMargin: 5
validator: IntValidator { } validator: RegExpValidator { regExp: /\d*/ }
onTextChanged: { checkFormState() } onTextChanged: { checkFormState() }
} }
Button { Button {

View File

@@ -47,13 +47,37 @@ ApplicationWindow {
try { try {
switch(data.call) { switch(data.call) {
case "getCoinBase":
postData(data._seed, eth.getCoinBase())
break
case "getIsListening":
postData(data._seed, eth.getIsListening())
break
case "getIsMining":
postData(data._seed, eth.getIsMining())
break
case "getPeerCount":
postData(data._seed, eth.getPeerCount())
break
case "getTxCountAt":
require(1)
postData(data._seed, eth.getTxCountAt(data.args[0]))
break
case "getBlockByNumber": case "getBlockByNumber":
var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06") var block = eth.getBlock(data.args[0])
postData(data._seed, block) postData(data._seed, block)
break break
case "getBlockByHash": case "getBlockByHash":
var block = eth.getBlock("b9b56cf6f907fbee21db0cd7cbc0e6fea2fe29503a3943e275c5e467d649cb06") var block = eth.getBlock(data.args[0])
postData(data._seed, block) postData(data._seed, block)
break break
case "transact": case "transact":
require(5) require(5)
@@ -94,11 +118,14 @@ ApplicationWindow {
postData(data._seed, null) postData(data._seed, null)
break; break;
case "set": case "set":
console.log("'Set' has been depcrecated")
/*
for(var key in data.args) { for(var key in data.args) {
if(webview.hasOwnProperty(key)) { if(webview.hasOwnProperty(key)) {
window[key] = data.args[key]; window[key] = data.args[key];
} }
} }
*/
break; break;
case "getSecretToAddress": case "getSecretToAddress":
require(1) require(1)

View File

@@ -9,7 +9,7 @@
<script type="text/javascript"> <script type="text/javascript">
var jefcoinAddr = "b7cb72c47ec4f31751d0d628b5a33fd6671bbba0" var jefcoinAddr = "681fd48ffa236549fbcd16bdf9f98bb541a7f742"
var mAddr = "" var mAddr = ""
function createTransaction() { function createTransaction() {
@@ -23,8 +23,6 @@ function createTransaction() {
} }
function init() { function init() {
eth.set({width: 500});
eth.getKey(function(sec) { eth.getKey(function(sec) {
mAddr = sec; mAddr = sec;
eth.getSecretToAddress(sec, function(addr) { eth.getSecretToAddress(sec, function(addr) {

View File

@@ -0,0 +1,43 @@
<html>
<head>
<title>Utils</title>
</head>
<body onload="init();">
<label>Nonce for 2ef47100e0787b915105fd5e3f4ff6752079d5cb</label>
<p id="nonce"></p>
<label>Connected peers</label>
<p id="peers"></p>
<label>Is mining</label>
<p id="isMining"></p>
<label>Is listening</label>
<p id="isListen"></p>
<label>Coinbase</label>
<p id="coinbase"></p>
<script type="text/javascript">
function init() {
eth.getTxCountAt("2ef47100e0787b915105fd5e3f4ff6752079d5cb", function(nonce){
document.querySelector("#nonce").innerHTML = nonce;
})
eth.getPeerCount(function(peerLength){
document.querySelector("#peers").innerHTML = peerLength;
})
eth.getIsMining(function(mining){
document.querySelector("#isMining").innerHTML = mining;
})
eth.getIsListening(function(listen){
document.querySelector("#isListen").innerHTML = listen;
})
eth.getCoinBase(function(address){
document.querySelector("#coinbase").innerHTML = address;
})
}
</script>
</body>
</html>

View File

@@ -7,6 +7,7 @@ import (
var StartConsole bool var StartConsole bool
var StartMining bool var StartMining bool
var StartRpc bool var StartRpc bool
var RpcPort int
var UseUPnP bool var UseUPnP bool
var OutboundPort string var OutboundPort string
var ShowGenesis bool var ShowGenesis bool
@@ -28,6 +29,7 @@ func Init() {
flag.BoolVar(&UseSeed, "seed", true, "seed peers") flag.BoolVar(&UseSeed, "seed", true, "seed peers")
flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key") flag.BoolVar(&GenAddr, "genaddr", false, "create a new priv/pub key")
flag.BoolVar(&ExportKey, "export", false, "export private key") flag.BoolVar(&ExportKey, "export", false, "export private key")
flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on")
flag.StringVar(&OutboundPort, "p", "30303", "listening port") flag.StringVar(&OutboundPort, "p", "30303", "listening port")
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)")

View File

@@ -4,8 +4,6 @@ import (
"fmt" "fmt"
"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/ethpub"
"github.com/ethereum/eth-go/ethrpc"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/ethereal/ui" "github.com/ethereum/go-ethereum/ethereal/ui"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
@@ -89,8 +87,19 @@ func main() {
} }
if ExportKey { if ExportKey {
key := ethutil.Config.Db.GetKeys()[0] keyPair := ethutil.GetKeyRing().Get(0)
fmt.Printf("%x\n", key.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)
os.Exit(0) os.Exit(0)
} }
@@ -99,9 +108,12 @@ func main() {
os.Exit(0) os.Exit(0)
} }
if StartMining {
utils.DoMining(ethereum)
}
if StartRpc { if StartRpc {
ethereum.RpcServer = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) utils.DoRpc(ethereum, RpcPort)
go ethereum.RpcServer.Start()
} }
log.Printf("Starting Ethereum GUI v%s\n", ethutil.Config.Ver) log.Printf("Starting Ethereum GUI v%s\n", ethutil.Config.Ver)
@@ -110,5 +122,11 @@ func main() {
ethereum.MaxPeers = MaxPeer ethereum.MaxPeers = MaxPeer
gui := ethui.New(ethereum) gui := ethui.New(ethereum)
ethereum.Start(UseSeed)
gui.Start(AssetPath) gui.Start(AssetPath)
// Wait for shutdown
ethereum.WaitForShutdown()
} }

View File

@@ -34,7 +34,7 @@ type ExtApplication struct {
func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication { func NewExtApplication(container AppContainer, lib *UiLib) *ExtApplication {
app := &ExtApplication{ app := &ExtApplication{
ethpub.NewPEthereum(lib.eth.StateManager(), lib.eth.BlockChain(), lib.eth.TxPool()), ethpub.NewPEthereum(lib.eth),
make(chan ethutil.React, 1), make(chan ethutil.React, 1),
make(chan ethutil.React, 1), make(chan ethutil.React, 1),
make(chan bool), make(chan bool),

View File

@@ -25,6 +25,7 @@ type Gui struct {
// The public Ethereum library // The public Ethereum library
lib *EthLib lib *EthLib
uiLib *UiLib
txDb *ethdb.LDBDatabase txDb *ethdb.LDBDatabase
@@ -41,23 +42,21 @@ func New(ethereum *eth.Ethereum) *Gui {
panic(err) panic(err)
} }
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
// On first run we won't have any keys yet, so this would crash. // 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 // Therefor we check if we are ready to actually start this process
var addr []byte var addr []byte
if len(data) > 0 { if ethutil.GetKeyRing().Len() != 0 {
key := ethutil.Config.Db.GetKeys()[0] addr = ethutil.GetKeyRing().Get(0).Address()
addr = key.Address()
//ethereum.StateManager().WatchAddr(addr)
} }
pub := ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool()) pub := ethpub.NewPEthereum(ethereum)
return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub} return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub}
} }
func (gui *Gui) Start(assetPath string) { func (gui *Gui) Start(assetPath string) {
const version = "0.5.0 RC6"
defer gui.txDb.Close() defer gui.txDb.Close()
// Register ethereum functions // Register ethereum functions
@@ -67,7 +66,7 @@ func (gui *Gui) Start(assetPath string) {
Init: func(p *ethpub.PTx, obj qml.Object) { p.Value = ""; p.Hash = ""; p.Address = "" }, 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 RC3")) ethutil.Config.SetClientString(fmt.Sprintf("/Ethereal v%s", version))
ethutil.Config.Log.Infoln("[GUI] Starting GUI") ethutil.Config.Log.Infoln("[GUI] Starting GUI")
// Create a new QML engine // Create a new QML engine
gui.engine = qml.NewEngine() gui.engine = qml.NewEngine()
@@ -75,19 +74,18 @@ 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("eth", gui) context.SetVar("eth", gui)
uiLib := NewUiLib(gui.engine, gui.eth, assetPath) gui.uiLib = NewUiLib(gui.engine, gui.eth, assetPath)
context.SetVar("ui", uiLib) context.SetVar("ui", gui.uiLib)
// Load the main QML interface // Load the main QML interface
data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
var err error
var component qml.Object
firstRun := len(data) == 0
if firstRun { var win *qml.Window
component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/first_run.qml")) var err error
if len(data) == 0 {
win, err = gui.showKeyImport(context)
} else { } else {
component, err = gui.engine.LoadFile(uiLib.AssetPath("qml/wallet.qml")) win, err = gui.showWallet(context)
} }
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'") ethutil.Config.Log.Infoln("FATAL: asset not found: you can set an alternative asset path on on the command line using option 'asset_path'")
@@ -95,26 +93,48 @@ func (gui *Gui) Start(assetPath string) {
panic(err) panic(err)
} }
gui.win = component.CreateWindow(nil) win.Show()
uiLib.win = gui.win win.Wait()
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 gui.eth.Stop()
ethutil.Config.Log.AddLogSystem(gui) }
func (gui *Gui) showWallet(context *qml.Context) (*qml.Window, error) {
component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/wallet.qml"))
if err != nil {
return nil, err
}
win := gui.createWindow(component)
// Loads previous blocks
if firstRun == false {
go gui.setInitialBlockChain() go gui.setInitialBlockChain()
go gui.readPreviousTransactions() go gui.readPreviousTransactions()
go gui.update() go gui.update()
return win, nil
} }
gui.win.Show() func (gui *Gui) showKeyImport(context *qml.Context) (*qml.Window, error) {
gui.win.Wait() context.SetVar("lib", gui.lib)
component, err := gui.engine.LoadFile(gui.uiLib.AssetPath("qml/first_run.qml"))
if err != nil {
return nil, err
}
gui.eth.Stop() return gui.createWindow(component), nil
}
func (gui *Gui) createWindow(comp qml.Object) *qml.Window {
win := comp.CreateWindow(nil)
gui.win = win
gui.uiLib.win = win
db := &Debugger{gui.win, make(chan bool)}
gui.lib.Db = db
gui.uiLib.Db = db
return gui.win
} }
func (gui *Gui) setInitialBlockChain() { func (gui *Gui) setInitialBlockChain() {
@@ -140,23 +160,50 @@ func (gui *Gui) processBlock(block *ethchain.Block) {
gui.win.Root().Call("addBlock", ethpub.NewPBlock(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 // Simple go routine function that updates the list of peers in the GUI
func (gui *Gui) update() { func (gui *Gui) update() {
blockChan := make(chan ethutil.React, 1)
reactor := gui.eth.Reactor()
reactor.Subscribe("newBlock", blockChan)
txChan := make(chan ethchain.TxMsg, 1) txChan := make(chan ethchain.TxMsg, 1)
gui.eth.TxPool().Subscribe(txChan) gui.eth.TxPool().Subscribe(txChan)
state := gui.eth.StateManager().TransState() state := gui.eth.StateManager().TransState()
unconfirmedFunds := new(big.Int) unconfirmedFunds := new(big.Int)
gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetStateObject(gui.addr).Amount))) gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(state.GetAccount(gui.addr).Amount)))
for { for {
select { 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: case txMsg := <-txChan:
tx := txMsg.Tx tx := txMsg.Tx
if txMsg.Type == ethchain.TxPre { if txMsg.Type == ethchain.TxPre {
object := state.GetStateObject(gui.addr) 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 && object.Nonce <= tx.Nonce {
gui.win.Root().Call("addTx", ethpub.NewPTx(tx)) gui.win.Root().Call("addTx", ethpub.NewPTx(tx))
@@ -173,23 +220,16 @@ func (gui *Gui) update() {
unconfirmedFunds.Add(unconfirmedFunds, tx.Value) unconfirmedFunds.Add(unconfirmedFunds, tx.Value)
} }
pos := "+" gui.setWalletValue(object.Amount, unconfirmedFunds)
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)
} else { } else {
object := state.GetStateObject(gui.addr) object := state.GetAccount(gui.addr)
if bytes.Compare(tx.Sender(), gui.addr) == 0 { if bytes.Compare(tx.Sender(), gui.addr) == 0 {
object.SubAmount(tx.Value) object.SubAmount(tx.Value)
} else if bytes.Compare(tx.Recipient, gui.addr) == 0 { } else if bytes.Compare(tx.Recipient, gui.addr) == 0 {
object.AddAmount(tx.Value) object.AddAmount(tx.Value)
} }
gui.win.Root().Call("setWalletValue", fmt.Sprintf("%v", ethutil.CurrencyToString(object.Amount))) gui.setWalletValue(object.Amount, nil)
state.SetStateObject(object) state.SetStateObject(object)
} }
@@ -215,13 +255,13 @@ func (gui *Gui) Printf(format string, v ...interface{}) {
} }
func (gui *Gui) Transact(recipient, value, gas, gasPrice, data string) (*ethpub.PReceipt, error) { 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) 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) { 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) mainInput, initInput := mutan.PreParse(data)

View File

@@ -34,10 +34,13 @@ func (lib *EthLib) ImportAndSetPrivKey(privKey string) bool {
} }
func (lib *EthLib) CreateAndSetPrivKey() (string, string, string, string) { func (lib *EthLib) CreateAndSetPrivKey() (string, string, string, string) {
pub, prv := secp256k1.GenerateKeyPair() _, prv := secp256k1.GenerateKeyPair()
pair := &ethutil.Key{PrivateKey: prv, PublicKey: pub} keyPair, err := ethutil.GetKeyRing().NewKeyPair(prv)
ethutil.Config.Db.Put([]byte("KeyRing"), pair.RlpEncode()) if err != nil {
mne := ethutil.MnemonicEncode(ethutil.Hex(prv)) panic(err)
mnemonicString := strings.Join(mne, " ") }
return mnemonicString, fmt.Sprintf("%x", pair.Address()), fmt.Sprintf("%x", prv), fmt.Sprintf("%x", pub)
mne := ethutil.MnemonicEncode(ethutil.Hex(keyPair.PrivateKey))
mnemonicString := strings.Join(mne, " ")
return mnemonicString, fmt.Sprintf("%x", keyPair.Address()), ethutil.Hex(keyPair.PrivateKey), ethutil.Hex(keyPair.PublicKey)
} }

View File

@@ -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) callerTx := ethchain.NewContractCreationTx(ethutil.Big(valueStr), ethutil.Big(gasStr), ethutil.Big(gasPriceStr), callerScript, nil)
// Contract addr as test address // Contract addr as test address
keyPair := ethutil.Config.Db.GetKeys()[0] keyPair := ethutil.GetKeyRing().Get(0)
account := ui.eth.StateManager().TransState().GetStateObject(keyPair.Address()) account := ui.eth.StateManager().TransState().GetStateObject(keyPair.Address())
c := ethchain.MakeContract(callerTx, state) c := ethchain.MakeContract(callerTx, state)
callerClosure := ethchain.NewClosure(account, c, c.Script(), state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr)) callerClosure := ethchain.NewClosure(account, c, c.Script(), state, ethutil.Big(gasStr), ethutil.Big(gasPriceStr))

View File

@@ -7,6 +7,7 @@ import (
var StartConsole bool var StartConsole bool
var StartMining bool var StartMining bool
var StartRpc bool var StartRpc bool
var RpcPort int
var UseUPnP bool var UseUPnP bool
var OutboundPort string var OutboundPort string
var ShowGenesis bool var ShowGenesis bool
@@ -26,6 +27,7 @@ func Init() {
flag.BoolVar(&ShowGenesis, "g", false, "prints genesis header and exits") flag.BoolVar(&ShowGenesis, "g", false, "prints genesis header and exits")
//flag.BoolVar(&UseGui, "gui", true, "use the gui") //flag.BoolVar(&UseGui, "gui", true, "use the gui")
flag.BoolVar(&StartRpc, "r", false, "start rpc server") flag.BoolVar(&StartRpc, "r", false, "start rpc server")
flag.IntVar(&RpcPort, "rpcport", 8080, "port to start json-rpc server on")
flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)") flag.BoolVar(&NonInteractive, "y", false, "non-interactive mode (say yes to confirmations)")
flag.BoolVar(&UseUPnP, "upnp", false, "enable UPnP support") flag.BoolVar(&UseUPnP, "upnp", false, "enable UPnP support")
flag.BoolVar(&UseSeed, "seed", true, "seed peers") flag.BoolVar(&UseSeed, "seed", true, "seed peers")

View File

@@ -173,8 +173,8 @@ func (i *Console) ParseInput(input string) bool {
} else { } else {
tx := ethchain.NewTransactionMessage(recipient, ethutil.Big(tokens[2]), ethutil.Big(tokens[3]), ethutil.Big(tokens[4]), nil) tx := ethchain.NewTransactionMessage(recipient, ethutil.Big(tokens[2]), ethutil.Big(tokens[3]), ethutil.Big(tokens[4]), nil)
key := ethutil.Config.Db.GetKeys()[0] keyPair := ethutil.GetKeyRing().Get(0)
tx.Sign(key.PrivateKey) tx.Sign(keyPair.PrivateKey)
i.ethereum.TxPool().QueueTransaction(tx) i.ethereum.TxPool().QueueTransaction(tx)
fmt.Printf("%x\n", tx.Hash()) fmt.Printf("%x\n", tx.Hash())
@@ -191,7 +191,7 @@ 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)")
mainInput, initInput := mutan.PreProcess(i.Editor()) mainInput, initInput := mutan.PreParse(i.Editor())
mainScript, err := utils.Compile(mainInput) mainScript, err := utils.Compile(mainInput)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@@ -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) contract := ethchain.NewContractCreationTx(ethutil.Big(tokens[0]), ethutil.Big(tokens[1]), ethutil.Big(tokens[1]), mainScript, initScript)
key := ethutil.Config.Db.GetKeys()[0] keyPair := ethutil.GetKeyRing().Get(0)
contract.Sign(key.PrivateKey) contract.Sign(keyPair.PrivateKey)
i.ethereum.TxPool().QueueTransaction(contract) i.ethereum.TxPool().QueueTransaction(contract)

View File

@@ -4,9 +4,6 @@ import (
"fmt" "fmt"
"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/ethminer"
"github.com/ethereum/eth-go/ethpub"
"github.com/ethereum/eth-go/ethrpc"
"github.com/ethereum/eth-go/ethutil" "github.com/ethereum/eth-go/ethutil"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
"log" "log"
@@ -67,10 +64,9 @@ func main() {
log.SetOutput(logfile) log.SetOutput(logfile)
logSys = log.New(logfile, "", flags) logSys = log.New(logfile, "", flags)
logger.AddLogSystem(logSys) logger.AddLogSystem(logSys)
} } else {
/*else {
logSys = log.New(os.Stdout, "", flags) logSys = log.New(os.Stdout, "", flags)
}*/ }
ethchain.InitFees() ethchain.InitFees()
@@ -105,8 +101,19 @@ func main() {
} }
os.Exit(0) os.Exit(0)
case ExportKey: case ExportKey:
key := ethutil.Config.Db.GetKeys()[0] keyPair := ethutil.GetKeyRing().Get(0)
logSys.Println(fmt.Sprintf("prvk: %x\n", key.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)
os.Exit(0) os.Exit(0)
case ShowGenesis: case ShowGenesis:
logSys.Println(ethereum.BlockChain().Genesis()) logSys.Println(ethereum.BlockChain().Genesis())
@@ -122,6 +129,13 @@ func main() {
// Set the max peers // Set the max peers
ethereum.MaxPeers = MaxPeer ethereum.MaxPeers = MaxPeer
// Set Mining status
ethereum.Mining = StartMining
if StartMining {
utils.DoMining(ethereum)
}
if StartConsole { if StartConsole {
err := os.Mkdir(ethutil.Config.ExecPath, os.ModePerm) err := os.Mkdir(ethutil.Config.ExecPath, os.ModePerm)
// Error is OK if the error is ErrExist // Error is OK if the error is ErrExist
@@ -133,37 +147,13 @@ func main() {
go console.Start() go console.Start()
} }
if StartRpc { if StartRpc {
ethereum.RpcServer = ethrpc.NewJsonRpcServer(ethpub.NewPEthereum(ethereum.StateManager(), ethereum.BlockChain(), ethereum.TxPool())) utils.DoRpc(ethereum, RpcPort)
go ethereum.RpcServer.Start()
} }
RegisterInterrupts(ethereum) RegisterInterrupts(ethereum)
ethereum.Start(UseSeed) ethereum.Start(UseSeed)
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()
miner := ethminer.NewDefaultMiner(addr, ethereum)
miner.Start()
}()
}
}()
}
// Wait for shutdown // Wait for shutdown
ethereum.WaitForShutdown() ethereum.WaitForShutdown()
} }

46
utils/cmd.go Normal file
View File

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

View File

@@ -6,6 +6,60 @@ import (
"github.com/obscuren/secp256k1-go" "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) { func CreateKeyPair(force bool) {
data, _ := ethutil.Config.Db.Get([]byte("KeyRing")) data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
if len(data) == 0 || force { if len(data) == 0 || force {
@@ -28,7 +82,9 @@ save these words so you can restore your account later: %s
} }
} }
*/
/*
func ImportPrivateKey(prvKey string) { func ImportPrivateKey(prvKey string) {
key := ethutil.FromHex(prvKey) key := ethutil.FromHex(prvKey)
msg := []byte("tmp") msg := []byte("tmp")
@@ -49,3 +105,4 @@ pubk: %x
`, pair.Address(), key, pub) `, pair.Address(), key, pub)
} }
*/