aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ethereum.go91
-rw-r--r--ui/ui_lib.go2
2 files changed, 74 insertions, 19 deletions
diff --git a/ethereum.go b/ethereum.go
index 36cd75e47..ed14a7feb 100644
--- a/ethereum.go
+++ b/ethereum.go
@@ -1,6 +1,7 @@
package main
import (
+ "bytes"
"fmt"
"github.com/ethereum/eth-go"
"github.com/ethereum/eth-go/ethchain"
@@ -172,6 +173,16 @@ func main() {
RegisterInterupts(ethereum)
ethereum.Start()
+ minerChan := make(chan ethutil.React, 5)
+ ethereum.Reactor().Subscribe("newBlock", minerChan)
+ ethereum.Reactor().Subscribe("newTx", minerChan)
+
+ minerChan2 := make(chan ethutil.React, 5)
+ ethereum.Reactor().Subscribe("newBlock", minerChan2)
+ ethereum.Reactor().Subscribe("newTx", minerChan2)
+
+ ethereum.StateManager().PrepareMiningState()
+
if StartMining {
log.Printf("Miner started\n")
@@ -181,26 +192,70 @@ func main() {
data, _ := ethutil.Config.Db.Get([]byte("KeyRing"))
keyRing := ethutil.NewValueFromBytes(data)
addr := keyRing.Get(1).Bytes()
+ txs := ethereum.TxPool().Flush()
+ block := ethereum.BlockChain().NewBlock(addr, txs)
for {
- txs := ethereum.TxPool().Flush()
- // Create a new block which we're going to mine
- block := ethereum.BlockChain().NewBlock(addr, txs)
- log.Println("Mining on new block. Includes", len(block.Transactions()), "transactions")
- // Apply all transactions to the block
- ethereum.StateManager().ApplyTransactions(block, block.Transactions())
-
- ethereum.StateManager().AccumelateRewards(block, block)
-
- // Search the nonce
- block.Nonce = pow.Search(block)
- ethereum.Broadcast(ethwire.MsgBlockTy, []interface{}{block.Value().Val})
- err := ethereum.StateManager().ProcessBlock(block)
- if err != nil {
- log.Println(err)
- } else {
- //log.Println("\n+++++++ MINED BLK +++++++\n", ethereum.BlockChain().CurrentBlock)
- log.Printf("🔨 Mined block %x\n", block.Hash())
+ select {
+ case chanMessage := <-minerChan:
+ log.Println("REACTOR: Got new block")
+
+ if block, ok := chanMessage.Resource.(*ethchain.Block); ok {
+ if bytes.Compare(ethereum.BlockChain().CurrentBlock.Hash(), block.Hash()) == 0 {
+ // TODO: Perhaps continue mining to get some uncle rewards
+ log.Println("New top block found resetting state")
+ // Reapplies the latest block to the mining state, thus resetting
+ ethereum.StateManager().PrepareMiningState()
+ block = ethereum.BlockChain().NewBlock(addr, txs)
+ log.Println("Block set")
+ } else {
+ if bytes.Compare(block.PrevHash, ethereum.BlockChain().CurrentBlock.PrevHash) == 0 {
+ log.Println("HELLO UNCLE")
+ // TODO: Add uncle to block
+ }
+ }
+ }
+
+ if tx, ok := chanMessage.Resource.(*ethchain.Transaction); ok {
+ log.Println("REACTOR: Got new transaction", tx)
+ found := false
+ for _, ctx := range txs {
+ if found = bytes.Compare(ctx.Hash(), tx.Hash()) == 0; found {
+ break
+ }
+
+ }
+ if found == false {
+ log.Println("We did not know about this transaction, adding")
+ txs = append(txs, tx)
+ } else {
+ log.Println("We already had this transaction, ignoring")
+ }
+ }
+ log.Println("Sending block reset")
+ // Start mining over
+ log.Println("Block reset done")
+ default:
+ // Create a new block which we're going to mine
+ log.Println("Mining on block. Includes", len(txs), "transactions")
+
+ // Apply all transactions to the block
+ ethereum.StateManager().ApplyTransactions(block, txs)
+ ethereum.StateManager().AccumelateRewards(block, block)
+
+ // Search the nonce
+ block.Nonce = pow.Search(block, minerChan2)
+ if block.Nonce != nil {
+ ethereum.Broadcast(ethwire.MsgBlockTy, []interface{}{block.Value().Val})
+ err := ethereum.StateManager().ProcessBlock(block)
+ if err != nil {
+ log.Println(err)
+ } else {
+ //log.Println("\n+++++++ MINED BLK +++++++\n", ethereum.BlockChain().CurrentBlock)
+ log.Printf("🔨 Mined block %x\n", block.Hash())
+ block = ethereum.BlockChain().NewBlock(addr, txs)
+ }
+ }
}
}
}()
diff --git a/ui/ui_lib.go b/ui/ui_lib.go
index 2a1abee23..fb5957cc3 100644
--- a/ui/ui_lib.go
+++ b/ui/ui_lib.go
@@ -54,7 +54,7 @@ func AssetPath(p string) string {
// Get Binary Directory
exedir, _ := osext.ExecutableFolder()
base = filepath.Join(exedir, "../Resources")
- base = "/Users/jeffrey/go/src/github.com/ethereum/go-ethereum"
+ base = "/Users/maranhidskes/projects/go/src/github.com/ethereum/go-ethereum"
case "linux":
base = "/usr/share/ethereal"
case "window":