public void DelBlockWithHeight(Consensus consensus, long start) { //Log.Info($"DelBlockWithHeight {start} {start + 4}"); using (DbSnapshot snapshot = levelDBStore.GetSnapshot(0, true)) { bool bCommit = false; for (long height = start; height <= start + 4; height++) { List <string> list = snapshot.Heights.Get(height.ToString()); if (list == null || list.Count <= 100) { continue; } var blks = GetBlock(height); var blksMap = new Dictionary <string, Block>(); var ruleBlks = consensus.GetRule(height); foreach (var ruleinfo in ruleBlks.Values) { for (int ii = 0; ii < blks.Count; ii++) { if (blksMap.TryGetValue(blks[ii].Address, out Block blkr)) { if (blkr.timestamp > blks[ii].timestamp) { blksMap.Remove(blks[ii].Address); blksMap.Add(blks[ii].Address, blks[ii]); } else if (blkr.timestamp == blks[ii].timestamp && blkr.hash.CompareTo(blks[ii].hash) < 0) { blksMap.Remove(blks[ii].Address); blksMap.Add(blks[ii].Address, blks[ii]); } } else { blksMap.Add(blks[ii].Address, blks[ii]); } } } var blkRules = blksMap.Values.ToList(); if (list != null) { for (int ii = blks.Count - 1; ii >= 0; ii--) { bool syncFlag = false; if (blks[ii].temp != null) { syncFlag = blks[ii].temp.Find(x => x == "SyncFlag") != null; } if (blks.Find(x => x.hash == list[ii]) == null && !syncFlag) { list.RemoveAt(ii); bCommit = true; } } snapshot.Heights.Add(height.ToString(), list); } } if (bCommit) { snapshot.Commit(); } } }