OSDN Git Service

fix bug
[bytom/vapor.git] / node / node.go
index 0c7cfa4..c30ce92 100644 (file)
@@ -27,13 +27,10 @@ import (
        "github.com/vapor/common"
        cfg "github.com/vapor/config"
        "github.com/vapor/consensus"
-       engine "github.com/vapor/consensus/consensus"
-       "github.com/vapor/consensus/consensus/dpos"
        "github.com/vapor/crypto/ed25519/chainkd"
        "github.com/vapor/database/leveldb"
        "github.com/vapor/env"
        "github.com/vapor/mining/miner"
-       "github.com/vapor/mining/miningpool"
        "github.com/vapor/net/websocket"
        "github.com/vapor/netsync"
        "github.com/vapor/protocol"
@@ -47,8 +44,6 @@ const (
        maxNewBlockChSize = 1024
 )
 
-var consensusEngine engine.Engine
-
 type Node struct {
        cmn.BaseService
 
@@ -67,7 +62,6 @@ type Node struct {
        //cpuMiner        *cpuminer.CPUMiner
        miner *miner.Miner
 
-       miningPool   *miningpool.MiningPool
        miningEnable bool
 
        newBlockCh chan *bc.Hash
@@ -101,6 +95,11 @@ func NewNode(config *cfg.Config) *Node {
                cmn.Exit(cmn.Fmt("Failed to create chain structure: %v", err))
        }
 
+       switch config.Consensus.Type {
+       case "dpos":
+               initDpos(chain, config)
+       }
+
        var accounts *account.Manager = nil
        var assets *asset.Registry = nil
        var wallet *w.Wallet = nil
@@ -120,7 +119,7 @@ func NewNode(config *cfg.Config) *Node {
        }
 
        if !config.Wallet.Disable {
-               address, err := common.DecodeAddress(config.Consensus.Dpos.Coinbase, &consensus.ActiveNetParams)
+               address, err := common.DecodeAddress(config.Consensus.Coinbase, &consensus.ActiveNetParams)
                if err != nil {
                        cmn.Exit(cmn.Fmt("DecodeAddress: %v", err))
                }
@@ -157,7 +156,6 @@ func NewNode(config *cfg.Config) *Node {
                        }
                }()
        }
-
        node := &Node{
                config:       config,
                syncManager:  syncManager,
@@ -171,11 +169,7 @@ func NewNode(config *cfg.Config) *Node {
                notificationMgr: notificationMgr,
        }
 
-       //node.cpuMiner = cpuminer.NewCPUMiner(chain, accounts, txPool, newBlockCh)
-       consensusEngine = createConsensusEngine(config, store)
-       node.miner = miner.NewMiner(chain, accounts, txPool, newBlockCh, consensusEngine)
-       node.miningPool = miningpool.NewMiningPool(chain, accounts, txPool, newBlockCh)
-
+       node.miner = miner.NewMiner(chain, accounts, txPool, newBlockCh)
        node.BaseService = *cmn.NewBaseService(nil, "Node", node)
 
        return node
@@ -231,17 +225,6 @@ func initActiveNetParams(config *cfg.Config) {
                consensus.ActiveNetParams.FedpegXPubs = federationRedeemXPubs
        }
 
-       if config.Side.SignBlockXPubs != "" {
-               var signBlockXPubs []chainkd.XPub
-               xPubs := strings.Split(config.Side.SignBlockXPubs, ",")
-               for _, xpubStr := range xPubs {
-                       var xpub chainkd.XPub
-                       xpub.UnmarshalText([]byte(xpubStr))
-                       signBlockXPubs = append(signBlockXPubs, xpub)
-               }
-               consensus.ActiveNetParams.SignBlockXPubs = signBlockXPubs
-       }
-
        consensus.ActiveNetParams.Signer = config.Signer
        consensus.ActiveNetParams.PeginMinDepth = config.Side.PeginMinDepth
        consensus.ActiveNetParams.ParentGenesisBlockHash = config.Side.ParentGenesisBlockHash
@@ -276,7 +259,7 @@ func launchWebBrowser(port string) {
 }
 
 func (n *Node) initAndstartApiServer() {
-       n.api = api.NewAPI(n.syncManager, n.wallet, n.txfeed, n.miner, n.miningPool, n.chain, n.config, n.accessTokens, n.newBlockCh, n.notificationMgr)
+       n.api = api.NewAPI(n.syncManager, n.wallet, n.txfeed, n.miner, n.chain, n.config, n.accessTokens, n.newBlockCh, n.notificationMgr)
 
        listenAddr := env.String("LISTEN", n.config.ApiAddress)
        env.Parse()
@@ -311,6 +294,10 @@ func (n *Node) OnStart() error {
 }
 
 func (n *Node) OnStop() {
+       if err := n.chain.Engine.Finish(); err != nil {
+               log.Errorf("OnStop: %v", err)
+       }
+
        n.notificationMgr.Shutdown()
        n.notificationMgr.WaitForShutdown()
        n.BaseService.OnStop()
@@ -333,10 +320,6 @@ func (n *Node) SyncManager() *netsync.SyncManager {
        return n.syncManager
 }
 
-func (n *Node) MiningPool() *miningpool.MiningPool {
-       return n.miningPool
-}
-
 /**bytomdRPCCheck Check if bytomd connection via RPC is correctly working*/
 func bytomdRPCCheck() bool {
        type Req struct {
@@ -355,7 +338,7 @@ func bytomdRPCCheck() bool {
                        json.Unmarshal(tmp, &blockHeader)
                        hash := blockHeader.BlockHeader.Hash()
                        if strings.Compare(consensus.ActiveNetParams.ParentGenesisBlockHash, hash.String()) != 0 {
-                               log.Error("Invalid parent genesis block hash response via RPC. Contacting wrong parent daemon?", consensus.ActiveNetParams.ParentGenesisBlockHash, hash.String())
+                               log.Error("Invalid parent genesis block hash response via RPC. Contacting wrong parent daemon?", consensus.ActiveNetParams.ParentGenesisBlockHash, ":", hash.String())
                                return false
                        }
                        break
@@ -379,24 +362,36 @@ func initConsensusConfig(config *cfg.Config) {
                if err := json.NewDecoder(file).Decode(config); err != nil {
                        cmn.Exit(cmn.Fmt("invalid consensus file: %v", err))
                }
-               for _, v := range config.Consensus.Dpos.SelfVoteSigners {
+
+               for _, v := range config.Consensus.SelfVoteSigners {
                        address, err := common.DecodeAddress(v, &consensus.ActiveNetParams)
                        if err != nil {
                                cmn.Exit(cmn.Fmt("Address resolution failed: %v", err))
                        }
-                       config.Consensus.Dpos.Signers = append(config.Consensus.Dpos.Signers, address)
+                       config.Consensus.Signers = append(config.Consensus.Signers, address)
                }
        }
 }
 
-func createConsensusEngine(config *cfg.Config, store protocol.Store) engine.Engine {
-       if config.Consensus.Dpos != nil {
-               return dpos.New(config.Consensus.Dpos, store)
-       } else {
-               return nil
-       }
-}
+func initDpos(chain *protocol.Chain, config *cfg.Config) {
+       header := chain.BestBlockHeader()
+       height := header.Height
+       hash := header.Hash()
+       maxSignerCount := config.Consensus.MaxSignerCount
+       period := config.Consensus.Period
+       err := chain.Engine.Init(chain, maxSignerCount, period, height, hash)
+
+       if height > 0 {
+               oldBlockHeight := chain.Engine.GetOldBlockHeight()
+               oldBlockHash := chain.Engine.GetOldBlockHash()
+               if err != nil {
+                       oldBlockHeight = 0
+                       header, _ = chain.GetHeaderByHeight(oldBlockHeight)
+                       oldBlockHash = header.Hash()
+               }
 
-func GetConsensusEngine() engine.Engine {
-       return consensusEngine
+               if err := chain.RepairDPoSData(oldBlockHeight, oldBlockHash); err != nil {
+                       cmn.Exit(cmn.Fmt("initVote failed: %v", err))
+               }
+       }
 }