OSDN Git Service

fix bug
[bytom/vapor.git] / node / node.go
index 45c335e..c30ce92 100644 (file)
@@ -24,13 +24,13 @@ import (
        "github.com/vapor/asset"
        "github.com/vapor/blockchain/pseudohsm"
        "github.com/vapor/blockchain/txfeed"
+       "github.com/vapor/common"
        cfg "github.com/vapor/config"
        "github.com/vapor/consensus"
        "github.com/vapor/crypto/ed25519/chainkd"
        "github.com/vapor/database/leveldb"
        "github.com/vapor/env"
-       "github.com/vapor/mining/cpuminer"
-       "github.com/vapor/mining/miningpool"
+       "github.com/vapor/mining/miner"
        "github.com/vapor/net/websocket"
        "github.com/vapor/netsync"
        "github.com/vapor/protocol"
@@ -59,9 +59,10 @@ type Node struct {
        api             *api.API
        chain           *protocol.Chain
        txfeed          *txfeed.Tracker
-       cpuMiner        *cpuminer.CPUMiner
-       miningPool      *miningpool.MiningPool
-       miningEnable    bool
+       //cpuMiner        *cpuminer.CPUMiner
+       miner *miner.Miner
+
+       miningEnable bool
 
        newBlockCh chan *bc.Hash
 }
@@ -73,7 +74,9 @@ func NewNode(config *cfg.Config) *Node {
        }
        initLogFile(config)
        initActiveNetParams(config)
+       initConsensusConfig(config)
        initCommonConfig(config)
+
        util.MainchainConfig = config.MainChain
        util.ValidatePegin = config.ValidatePegin
        // Get store
@@ -92,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
@@ -111,10 +119,14 @@ func NewNode(config *cfg.Config) *Node {
        }
 
        if !config.Wallet.Disable {
+               address, err := common.DecodeAddress(config.Consensus.Coinbase, &consensus.ActiveNetParams)
+               if err != nil {
+                       cmn.Exit(cmn.Fmt("DecodeAddress: %v", err))
+               }
                walletDB := dbm.NewDB("wallet", config.DBBackend, config.DBDir())
                accounts = account.NewManager(walletDB, chain)
                assets = asset.NewRegistry(walletDB, chain)
-               wallet, err = w.NewWallet(walletDB, accounts, assets, hsm, chain)
+               wallet, err = w.NewWallet(walletDB, accounts, assets, hsm, chain, address)
                if err != nil {
                        log.WithField("error", err).Error("init NewWallet")
                }
@@ -144,7 +156,6 @@ func NewNode(config *cfg.Config) *Node {
                        }
                }()
        }
-
        node := &Node{
                config:       config,
                syncManager:  syncManager,
@@ -158,9 +169,7 @@ func NewNode(config *cfg.Config) *Node {
                notificationMgr: notificationMgr,
        }
 
-       node.cpuMiner = cpuminer.NewCPUMiner(chain, accounts, txPool, newBlockCh)
-       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
@@ -216,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
@@ -261,7 +259,7 @@ func launchWebBrowser(port string) {
 }
 
 func (n *Node) initAndstartApiServer() {
-       n.api = api.NewAPI(n.syncManager, n.wallet, n.txfeed, n.cpuMiner, 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()
@@ -274,7 +272,8 @@ func (n *Node) OnStart() error {
                        n.miningEnable = false
                        log.Error(err)
                } else {
-                       n.cpuMiner.Start()
+                       //n.cpuMiner.Start()
+                       n.miner.Start()
                }
        }
        if !n.config.VaultMode {
@@ -295,11 +294,15 @@ 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()
        if n.miningEnable {
-               n.cpuMiner.Stop()
+               n.miner.Stop()
        }
        if !n.config.VaultMode {
                n.syncManager.Stop()
@@ -317,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 {
@@ -339,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?")
+                               log.Error("Invalid parent genesis block hash response via RPC. Contacting wrong parent daemon?", consensus.ActiveNetParams.ParentGenesisBlockHash, ":", hash.String())
                                return false
                        }
                        break
@@ -348,3 +347,51 @@ func bytomdRPCCheck() bool {
 
        return true
 }
+
+func initConsensusConfig(config *cfg.Config) {
+       if config.ConsensusConfigFile == "" {
+               // poa
+       } else {
+               //
+               file, err := os.Open(config.ConsensusConfigFile)
+               if err != nil {
+                       cmn.Exit(cmn.Fmt("Failed to read consensus file: %v", err))
+               }
+               defer file.Close()
+
+               if err := json.NewDecoder(file).Decode(config); err != nil {
+                       cmn.Exit(cmn.Fmt("invalid consensus file: %v", err))
+               }
+
+               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.Signers = append(config.Consensus.Signers, address)
+               }
+       }
+}
+
+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()
+               }
+
+               if err := chain.RepairDPoSData(oldBlockHeight, oldBlockHash); err != nil {
+                       cmn.Exit(cmn.Fmt("initVote failed: %v", err))
+               }
+       }
+}