Esempio n. 1
0
        /// <summary>Aggiorna il portafogli di tutti gli utenti appartenenti alla blockchain</summary>
        #endregion
        public void AggiornaSaldoUtenti()
        {
            foreach (var blocco in Catena)
            {
                foreach (var transazione in blocco.Transazioni)
                {
                    if (!transazione.Contabilizzata)
                    {
                        var mittente     = RicercaUtente(transazione.IdMittente);
                        var destinatario = RicercaUtente(transazione.IdDestinatario);

                        if ((transazione.IdMittente != null) && (transazione.IdMittente == mittente.IdUnivoco) && (transazione.IdDestinatario == destinatario.IdUnivoco))
                        {
                            SmartContract.VerificaSaldo(mittente.Nome, destinatario.Nome, transazione.Valore);
                        }

                        transazione.Contabilizzata = true;
                    }
                }
            }
        }
        private void GestioneMenu()
        {
            var selezione = (int)OpzioniMenu.Annulla;

            do
            {
                var moneteCircolanti = UniMolCoin.AggiornaBilancio();

                ColoreTitoli();
                Console.WriteLine("\n\t*** MENU UNIMOL COIN ***");
                Console.WriteLine("\t=========================");
                Console.WriteLine($"\t{(int)OpzioniMenu.AggiungiTransazione}. Aggiungere una transazione.");
                Console.WriteLine($"\t{(int)OpzioniMenu.MostraBlockChain}. Mostra la BlockChain.");
                Console.WriteLine($"\t{(int)OpzioniMenu.MostraSmartContract}. Mostra lo SmartContract di UniMol Coin.");
                Console.WriteLine($"\t{(int)OpzioniMenu.VerificaSaldo}. Verifica saldo di uno specifico utente.");
                Console.WriteLine($"\t{(int)OpzioniMenu.UrlServer}. Connessione al server.");
                Console.WriteLine($"\t{(int)OpzioniMenu.Esci}. Esci.");
                Console.WriteLine("\t=========================");
                ColoreNormale();
                Console.Write("\tInserisci una scelta: ");

                var azione = Console.ReadLine();


                //cerca di convertire l'azione selezionata in un intero
                try
                {
                    selezione = Convert.ToInt16(azione);
                    Console.Clear();
                }
                catch (Exception exception)
                {
                    ColoreAvvisi();
                    Console.WriteLine("\t\n*** Errore. Operazione non riconosciuta, riprova! ***");

                    ColoreNormale();
                    Console.WriteLine(exception.Message);
                }

                if (UniMolCoin.IsValido())
                {
                    switch (selezione)
                    {
                    case (int)OpzioniMenu.UrlServer:
                        Console.WriteLine("*** CONNESSIONE AL SERVER ***");
                        Console.WriteLine($"Per favore, inserisci l'URL del server ({(int)OpzioniMenu.Annulla} per annullare)");
                        var serverUrl = Console.ReadLine();

                        if (((int)OpzioniMenu.Annulla).ToString().Equals(serverUrl))
                        {
                            break;
                        }

                        Client.Connetti($"{serverUrl}/Blockchain");
                        Console.WriteLine("Connessione effettuata con successo!");
                        break;


                    case (int)OpzioniMenu.AggiungiTransazione:
                        ColoreTitoli();
                        Console.WriteLine("\t\n*** REGISTRA TRANSAZIONE ***");
                        ColoreNormale();
                        Console.WriteLine($"Per favore, inserisci il nome del mittente ( {(int)OpzioniMenu.Annulla} per annullare)");

                        var nomeMittente = Console.ReadLine();

                        if ((nomeMittente == ((int)OpzioniMenu.Annulla).ToString()) || (string.IsNullOrEmpty(nomeMittente)))
                        {
                            break;
                        }

                        NormalizzaNome(ref nomeMittente);

                        Console.WriteLine($"Per favore, inserisci il nome del destinatario ( {(int)OpzioniMenu.Annulla} per annullare)");
                        var nomeDestinatario = Console.ReadLine();

                        if ((nomeDestinatario == ((int)OpzioniMenu.Annulla).ToString()) || (string.IsNullOrEmpty(nomeDestinatario)))
                        {
                            break;
                        }

                        NormalizzaNome(ref nomeDestinatario);

                        Console.WriteLine($"Per favore, inserisci l'importo ( {(int)OpzioniMenu.Annulla} per annullare)");
                        var importo = Console.ReadLine();

                        if (importo == ((int)OpzioniMenu.Annulla).ToString())
                        {
                            break;
                        }

                        if (Convert.ToInt32(importo) < 0)
                        {
                            ColoreAvvisi();
                            Console.WriteLine("\t*** Errore. Importo non valido. ***");
                            break;
                        }

                        if ((UniMolCoin.VerificaUtente(nomeMittente)) && (UniMolCoin.VerificaUtente(nomeDestinatario)))
                        {
                            var mittente     = UniMolCoin.RicercaUtente(nomeMittente);
                            var destinatario = UniMolCoin.RicercaUtente(nomeDestinatario);

                            if (SmartContract.VerificaSaldo(mittente.Nome, destinatario.Nome, Convert.ToInt32(importo)))
                            {
                                SmartContract.TrasferisciMoneta(Convert.ToInt32(importo), mittente, destinatario);

                                UniMolCoin.CreaTransazione(new Transazione(mittente, destinatario, Convert.ToInt32(importo)));

                                var randomMiner      = new Random();
                                var minerSelezionato = randomMiner.Next(0, UniMolCoin.Utenti.Count);

                                //il miner sarà estratto casualmente tra la lista degli utenti e non deve corrispondere nè al mittente, nè al destinatario
                                while ((minerSelezionato != UniMolCoin.Utenti.IndexOf(mittente)) && (minerSelezionato != UniMolCoin.Utenti.IndexOf(destinatario)))
                                {
                                    minerSelezionato = randomMiner.Next(0, UniMolCoin.Utenti.Count);
                                }

                                UniMolCoin.MinaTransazioni(UniMolCoin.Utenti[minerSelezionato]);

                                Console.WriteLine(JsonConvert.SerializeObject(UniMolCoin, Formatting.Indented));
                            }
                            else
                            {
                                ColoreAvvisi();
                                Console.WriteLine("\t*** Errore: Transazione non valida, importo più alto della capacità di spesa del mittente. ***");
                            }
                        }
                        else
                        {
                            ColoreAvvisi();
                            Console.WriteLine("\t*** Errore. Verificare i valori inseriti di mittente e destinatario. ***");
                        }
                        break;


                    case (int)OpzioniMenu.MostraBlockChain:
                        ColoreTitoli();
                        Console.WriteLine("\t\n*** MOSTRA BLOCKCHAIN ***");
                        ColoreNormale();
                        Console.WriteLine(JsonConvert.SerializeObject(UniMolCoin, Formatting.Indented));
                        ColoreRecap();
                        Console.WriteLine($"Sono in circolazione {moneteCircolanti} UniMolCoin");
                        ColoreNormale();
                        break;


                    case (int)OpzioniMenu.MostraSmartContract:
                        ColoreTitoli();
                        Console.WriteLine("\t\n*** MOSTRA SMART CONTRACT ***\n");
                        ColoreRecap();
                        SmartContract.MostraContratto();
                        ColoreNormale();
                        break;


                    case (int)OpzioniMenu.VerificaSaldo:
                        ColoreTitoli();
                        Console.WriteLine("\t\n*** MOSTRA SALDO UTENTE ***");
                        ColoreNormale();
                        Console.WriteLine("Inserisci il nome dell'utente di cui mostrare il saldo: ");
                        var nomeUtente = Console.ReadLine();

                        try
                        {
                            NormalizzaNome(ref nomeUtente);
                            var utenteCercato = UniMolCoin.RicercaUtente(nomeUtente);
                            ColoreRecap();
                            Console.WriteLine($"\tNome: {utenteCercato.Nome}" +
                                              $"\n\tID: {utenteCercato.IdUnivoco}" +
                                              $"\n\tSaldo: {utenteCercato.Saldo.Count}");
                        }
                        catch (Exception)
                        {
                            ColoreAvvisi();
                            Console.WriteLine("\t*** Errore. Input non valido o utente non trovato. ***");
                        }

                        ColoreNormale();
                        break;


                    case (int)OpzioniMenu.Esci:
                        ColoreAvvisi();
                        Console.WriteLine("\t\n*** Arrivederci! ***");
                        ColoreNormale();
                        break;


                    default:
                        Console.Clear();
                        ColoreAvvisi();
                        Console.WriteLine("\t\n*** Errore. Operazione non riconosciuta, riprova! ***");
                        ColoreNormale();
                        break;
                    }
                }
                else
                {
                    ColoreAvvisi();
                    Console.WriteLine("*** Errore. BlockChain non valida! ***");
                    selezione = (int)OpzioniMenu.Esci;
                }
            } while (!((int)OpzioniMenu.Esci).Equals(selezione));


            if (Client != null)
            {
                try
                {
                    Client.Close();
                }
                finally
                {
                    Client = null;
                }
            }
        }