"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"
maxNewBlockChSize = 1024
)
-var consensusEngine engine.Engine
-
type Node struct {
cmn.BaseService
//cpuMiner *cpuminer.CPUMiner
miner *miner.Miner
- miningPool *miningpool.MiningPool
miningEnable bool
newBlockCh chan *bc.Hash
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
}
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))
}
}
}()
}
-
node := &Node{
config: config,
syncManager: syncManager,
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
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
}
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()
}
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()
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 {
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
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))
+ }
+ }
}