Exemplo n.º 1
0
        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();
                }
            }
        }