aboutsummaryrefslogtreecommitdiffstats
path: root/ethereum.go
diff options
context:
space:
mode:
authorMaran <maran.hidskes@gmail.com>2014-03-10 18:53:31 +0800
committerMaran <maran.hidskes@gmail.com>2014-03-10 19:38:31 +0800
commit96fcc1da323ae37489721f58d04f6ebf1c14ff91 (patch)
tree4a398a71c9fc046a5b2770653f86a89fa4a7b5c6 /ethereum.go
parentfbd53f0e34b636074941f5ea7b151bf173c5ed17 (diff)
downloadgo-tangerine-96fcc1da323ae37489721f58d04f6ebf1c14ff91.tar.gz
go-tangerine-96fcc1da323ae37489721f58d04f6ebf1c14ff91.tar.zst
go-tangerine-96fcc1da323ae37489721f58d04f6ebf1c14ff91.zip
Initial smart-miner stuff
Diffstat (limited to 'ethereum.go')
-rw-r--r--ethereum.go91
1 files changed, 73 insertions, 18 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)
+ }
+ }
}
}
}()