コード例 #1
0
        public long GetLatestConfirmedHeight()
        {
            var dac   = new BlockDac();
            var block = dac.SelectLastConfirmed();

            if (block != null)
            {
                return(block.Height);
            }
            else
            {
                return(-1);
            }
        }
コード例 #2
0
        public void ProcessUncsonfirmedBlocks()
        {
            var blockDac      = new BlockDac();
            var txDac         = new TransactionDac();
            var txComponent   = new TransactionComponent();
            var utxoComponent = new UtxoComponent();

            long lastHeight      = this.GetLatestHeight();
            long confirmedHeight = -1;
            var  confirmedBlock  = blockDac.SelectLastConfirmed();
            var  confirmedHash   = Base16.Encode(HashHelper.EmptyHash());

            if (confirmedBlock != null)
            {
                confirmedHeight = confirmedBlock.Height;
                confirmedHash   = confirmedBlock.Hash;
            }

            if (lastHeight - confirmedHeight >= 6)
            {
                var blocks = blockDac.SelectByPreviousHash(confirmedHash);

                if (blocks.Count == 1)
                {
                    blockDac.UpdateBlockStatusToConfirmed(blocks[0].Hash);
                    this.ProcessUncsonfirmedBlocks();
                }
                else if (blocks.Count > 1)
                {
                    var countOfDescendants = new Dictionary <string, long>();
                    foreach (var block in blocks)
                    {
                        var count = blockDac.CountOfDescendants(block.Hash);

                        if (!countOfDescendants.ContainsKey(block.Hash))
                        {
                            countOfDescendants.Add(block.Hash, count);
                        }
                    }

                    var dicSort = countOfDescendants.OrderBy(d => d.Value).ToList();

                    var lastItem = blocks.Where(b => b.Hash == dicSort[dicSort.Count - 1].Key).First();
                    var index    = 0;

                    while (index < dicSort.Count - 1)
                    {
                        var currentItem = blocks.Where(b => b.Hash == dicSort[index].Key).First();

                        if (lastHeight - currentItem.Height >= 6)
                        {
                            var txList = txDac.SelectByBlockHash(currentItem.Hash);

                            //Skip coinbase tx
                            for (int i = 1; i < txList.Count; i++)
                            {
                                var tx    = txList[i];
                                var txMsg = txComponent.ConvertTxEntityToMsg(tx);
                                txComponent.AddTransactionToPool(txMsg);
                            }

                            //remove coinbase from utxo
                            UtxoSet.Instance.RemoveUtxoRecord(txList[0].Hash, 0);

                            blockDac.UpdateBlockStatusToDiscarded(currentItem.Hash);
                            index++;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (dicSort.Count - index <= 1)
                    {
                        blockDac.UpdateBlockStatusToConfirmed(lastItem.Hash);
                        this.ProcessUncsonfirmedBlocks();
                    }
                }
            }
        }