public async void Run() { await Task.Delay(2000); long.TryParse(levelDBStore.Get("UndoHeight"), out transferHeight); Log.Debug($"Consensus.Run at height {transferHeight}"); // 恢复到停机前的高度 ApplyBlockChain(); // 算力统计 calculatePower.Clear(); for (long ii = Math.Max(1, transferHeight - calculatePower.statistic); ii <= transferHeight; ii++) { calculatePower.Insert(BlockChainHelper.GetMcBlock(ii)); } int blockIndex = 0; while (true) { try { if (newBlocks.Count > 0) { for (blockIndex = blockIndex % newBlocks.Count; blockIndex < newBlocks.Count; blockIndex++) { if (newBlocks[blockIndex] == null) { continue; } var ipEndPoint = newBlocks[blockIndex].ipEndPoint; Block otherMcBlk = JsonHelper.FromJson <Block>(newBlocks[blockIndex].block); if (Check(otherMcBlk)) { if (await SyncHeight(otherMcBlk, newBlocks[blockIndex].ipEndPoint)) { newBlocks.RemoveAll((x) => { return(x.ipEndPoint == ipEndPoint); }); break; } //if (await SyncHeight(otherMcBlk, newBlocks[ii].ipEndPoint)) ApplyBlockChain(); } //break; } } ApplyBlockChain(); lock (this) { runAction?.Invoke(); runAction = null; } if (bifurcatedReportTime.IsPassOnce() && bifurcatedReport != "") { Log.Info(bifurcatedReport); bifurcatedReport = ""; } await Task.Delay(1000); } catch (Exception e) { newBlocks.Clear(); Log.Error(e); await Task.Delay(1000); } } }