Exemple #1
0
        public void Add(Recount recount)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(recount.GetKey()))
                {
                    return;
                }

                pendings.Add(recount.GetKey(), recount);
            }

            Peers.Broadcast(recount);
        }
Exemple #2
0
        public void Add(Document document)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(document.GetKey()))
                {
                    return;
                }

                pendings.Add(document.GetKey(), document);
            }

            Peers.Broadcast(document);
        }
Exemple #3
0
        public void Add(Fiscal fiscal)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(fiscal.GetKey()))
                {
                    return;
                }

                pendings.Add(fiscal.GetKey(), fiscal);
            }

            Peers.Broadcast(fiscal);
        }
Exemple #4
0
        public void Add(Urn urn)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(urn.GetKey()))
                {
                    return;
                }

                pendings.Add(urn.GetKey(), urn);
            }

            Peers.Broadcast(urn);
        }
Exemple #5
0
        public void Add(Vote vote)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(vote.GetKey()))
                {
                    return;
                }

                pendings.Add(vote.GetKey(), vote);
            }

            Peers.Broadcast(vote);
        }
Exemple #6
0
        public void Add(Member member)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(member.GetKey()))
                {
                    return;
                }

                pendings.Add(member.GetKey(), member);
            }

            Peers.Broadcast(member);
        }
Exemple #7
0
        public void Add(Question question)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(question.GetKey()))
                {
                    return;
                }

                pendings.Add(question.GetKey(), question);
            }

            Peers.Broadcast(question);
        }
Exemple #8
0
        public void Add(Community community)
        {
            lock (semaphore)
            {
                if (pendings.ContainsKey(community.GetKey()))
                {
                    return;
                }

                pendings.Add(community.GetKey(), community);
            }

            Peers.Broadcast(community);
        }
Exemple #9
0
        public void MinePendingTransactions()
        {
            logger.LogInformation($"Buscando transacciones que minar.\n" +
                                  $"\tÚltimo bloque #{Blockchain.Last.BlockNumber}.\n" +
                                  $"\tCadenas secundarias #{Blockchain.BranchesCount}\n" +
                                  $"\tTransacciones pendientes #{pendings.Count}\n" +
                                  $"\tPares registrados #{Peers.Count}: {string.Join(", ",Peers.List())}"
                                  );

            BlockItem[] pendingsToMine;
            lock (semaphore)
            {
                pendingsToMine = Pendings.ToArray();
            }

            if (pendingsToMine.Length > 0)
            {
                logger.LogInformation($"Minando {pendingsToMine.Length} transacciones");
                try
                {
                    var block = Blockchain.MineNextBlock(pendingsToMine);

                    if (block != null)
                    {
                        lock (semaphore)
                        {
                            logger.LogInformation("Hemos minado un bloque!!!");
                            Peers.Broadcast(block);
                            var transactions = block.GetTransactions();
                            foreach (var item in transactions)
                            {
                                pendings.Remove(item.GetKey());
                            }
                        }
                    }
                    else
                    {
                        logger.LogInformation("No hemos logrado minado el bloque antes que otro :(");
                    }

                    var chain = Blockchain.Trunk.ToArray();
                    KeyValuePair <string, BlockItem>[] invalids;
                    lock (semaphore)
                    {
                        invalids = pendings.Where(p => !p.Value.IsValid(chain)).ToArray();
                    }

                    foreach (var invalid in invalids)
                    {
                        logger.LogWarning($"Item {invalid.Value.GetType().Name} inválido: {string.Join("\n\r\t", invalid.Value.Messages)}");
                    }
                }
                catch (Exception ex)
                {
                    logger.LogCritical($"Error minando transacciones pendientes: {ex}");
                }
            }
            else
            {
                logger.LogDebug("No se encontraron transacciones que minar");
            }
        }