/// <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; } } }