diff --git a/cmd/XDC/main.go b/cmd/XDC/main.go index bbf662d27b..fcc90bd24b 100644 --- a/cmd/XDC/main.go +++ b/cmd/XDC/main.go @@ -321,7 +321,6 @@ func startNode(ctx *cli.Context, stack *node.Node, cfg XDCConfig) { log.Info("Enabled staking node!!!") } defer close(core.CheckpointCh) - defer close(core.M1Ch) for { select { case <-core.CheckpointCh: @@ -356,11 +355,7 @@ func startNode(ctx *cli.Context, stack *node.Node, cfg XDCConfig) { started = true log.Info("Enabled staking node!!!") } - case <-core.M1Ch: - err := ethereum.BlockChain().UpdateM1() - if err != nil { - log.Error("Error when update M1", err) - } + } } }() diff --git a/compression/go-ethereum - Shortcut.lnk b/compression/go-ethereum - Shortcut.lnk new file mode 100644 index 0000000000..6c558cc384 Binary files /dev/null and b/compression/go-ethereum - Shortcut.lnk differ diff --git a/core/blockchain.go b/core/blockchain.go index edff342b83..ac6e279a12 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -52,7 +52,6 @@ import ( var ( blockInsertTimer = metrics.NewRegisteredTimer("chain/inserts", nil) CheckpointCh = make(chan int) - M1Ch = make(chan int) ErrNoGenesis = errors.New("Genesis not found in chain") ) @@ -698,7 +697,7 @@ func (bc *BlockChain) procFutureBlocks() { type WriteStatus byte const ( - NonStatTy WriteStatus = iota + NonStatTy WriteStatus = iota CanonStatTy SideStatTy ) @@ -1192,14 +1191,21 @@ func (bc *BlockChain) insertChain(chain types.Blocks) (int, []interface{}, []*ty stats.processed++ stats.usedGas += usedGas stats.report(chain, i, bc.stateCache.TrieDB().Size()) - if i == len(chain)-1 && bc.chainConfig.XDPoS != nil { + if bc.chainConfig.XDPoS != nil { // epoch block if (chain[i].NumberU64() % bc.chainConfig.XDPoS.Epoch) == 0 { CheckpointCh <- 1 } // prepare set of masternodes for the next epoch if (chain[i].NumberU64() % bc.chainConfig.XDPoS.Epoch) == (bc.chainConfig.XDPoS.Epoch - bc.chainConfig.XDPoS.Gap) { - M1Ch <- 1 + err := bc.UpdateM1() + if err != nil { + if err == ErrNotXDPoS { + log.Crit("Error when update M1 ", "err", err) + } else { + log.Error("Error when update M1 ", "err", err) + } + } } } } @@ -1594,14 +1600,14 @@ func (bc *BlockChain) GetClient() (*ethclient.Client, error) { func (bc *BlockChain) UpdateM1() error { if bc.Config().XDPoS == nil { - return errors.New("XDPoS not found in config") + return ErrNotXDPoS } engine := bc.Engine().(*XDPoS.XDPoS) log.Info("It's time to update new set of masternodes for the next epoch...") // get masternodes information from smart contract - client, err := ethclient.Dial(bc.IPCEndpoint) + client, err := bc.GetClient() if err != nil { - log.Crit("Fail to connect IPC: %v", err) + return err } addr := common.HexToAddress(common.MasternodeVotingSMC) validator, err := contractValidator.NewXDCValidator(addr, client) @@ -1613,7 +1619,6 @@ func (bc *BlockChain) UpdateM1() error { if err != nil { return err } - var ms []XDPoS.Masternode for _, candidate := range candidates { v, err := validator.GetCandidateCap(opts, candidate) @@ -1627,7 +1632,7 @@ func (bc *BlockChain) UpdateM1() error { } log.Info("Ordered list of masternode candidates") for _, m := range ms { - fmt.Printf("address: %s, stake: %s\n", m.Address.String(), m.Stake) + log.Info("", "address", m.Address.String(), "stake", m.Stake) } if len(ms) == 0 { log.Info("No masternode candidates found. Keep the current masternodes set for the next epoch") diff --git a/core/error.go b/core/error.go index 410eca1e1e..9dccd0e0bb 100644 --- a/core/error.go +++ b/core/error.go @@ -32,4 +32,7 @@ var ( // ErrNonceTooHigh is returned if the nonce of a transaction is higher than the // next one expected based on the local chain. ErrNonceTooHigh = errors.New("nonce too high") + + ErrNotXDPoS = errors.New("XDPoS not found in config") + ) diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index d283b61f19..6f27cd8e16 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -173,7 +173,6 @@ type LightChain interface { // BlockChain encapsulates functions required to sync a (full or fast) blockchain. type BlockChain interface { Config() *params.ChainConfig - UpdateM1() error LightChain // HasBlock verifies a block's presence in the local chain. @@ -1347,13 +1346,7 @@ func (d *Downloader) processFullSyncContent() error { if err := d.importBlockResults(inserts); err != nil { return err } - // prepare set of masternodes for the next epoch - if (inserts[len(inserts)-1].Header.Number.Uint64() % epoch) == (epoch - gap) { - err := d.blockchain.UpdateM1() - if (err != nil) { - log.Error("Error when update M1", err) - } - } + } start = end + 1 end = end + int(epoch) diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index c9daf09b51..83ec2829f4 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -458,7 +458,6 @@ func (dl *downloadTester) dropPeer(id string) { // Config retrieves the blockchain's chain configuration. func (dl *downloadTester) Config() *params.ChainConfig { return params.TestChainConfig } -func (dl *downloadTester) UpdateM1() error { return nil } type downloadTesterPeer struct { dl *downloadTester diff --git a/miner/worker.go b/miner/worker.go index 7a1f710942..1ec9b9c7e7 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -593,7 +593,14 @@ func (self *worker) commitNewWork() { } // prepare set of masternodes for the next epoch if (work.Block.NumberU64() % work.config.XDPoS.Epoch) == (work.config.XDPoS.Epoch - work.config.XDPoS.Gap) { - core.M1Ch <- 1 + err := self.chain.UpdateM1() + if err != nil { + if err == core.ErrNotXDPoS { + log.Crit("Error when update M1 ", "err", err) + } else { + log.Error("Error when update M1 ", "err", err) + } + } } } self.push(work)