/// <summary>Aggiorna il portafogli di tutti gli utenti appartenenti alla blockchain</summary> #endregion public void AggiornaSaldoUtenti() { foreach (Blocco blocco in Catena) { foreach (Transazione 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 = Annulla; do { var moneteCircolanti = UniMolCoin.AggiornaBilancio(); ColoreTitoli(); Console.WriteLine("\n\t*** MENU UNIMOL COIN ***"); Console.WriteLine("\t========================="); Console.WriteLine($"\t{AggiungiTransazione}. Aggiungere una transazione."); Console.WriteLine($"\t{MostraBlockchain}. Mostra la BlockChain."); Console.WriteLine($"\t{MostraSmartContract}. Mostra lo SmartContract di UniMol Coin."); Console.WriteLine($"\t{VerificaSaldo}. Verifica saldo di uno specifico utente."); Console.WriteLine($"\t{Esci}. Esci."); Console.WriteLine("\t========================="); ColoreNormale(); Console.Write("\tInserisci una scelta: "); var azione = Console.ReadLine(); 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 AggiungiTransazione: ColoreTitoli(); Console.WriteLine("\t\n*** REGISTRA TRANSAZIONE ***"); ColoreNormale(); Console.WriteLine($"Per favore, inserisci il nome del mittente ( {Annulla} per annullare)"); var nomeMittente = Console.ReadLine(); if ((nomeMittente == Annulla.ToString()) || (string.IsNullOrEmpty(nomeMittente))) { break; } NormalizzaNome(ref nomeMittente); Console.WriteLine($"Per favore, inserisci il nome del destinatario ( {Annulla} per annullare)"); var nomeDestinatario = Console.ReadLine(); if ((nomeDestinatario == Annulla.ToString()) || (string.IsNullOrEmpty(nomeDestinatario))) { break; } NormalizzaNome(ref nomeDestinatario); Console.WriteLine($"Per favore, inserisci l'importo ( {Annulla} per annullare)"); var importo = Console.ReadLine(); if (importo == Annulla.ToString()) { break; } if (Convert.ToInt32(importo) < 0) { ColoreAvvisi(); Console.WriteLine("\t*** Errore. Importo non valido. ***"); break; } if ((UniMolCoin.VerificaUtente(nomeMittente)) && (UniMolCoin.VerificaUtente(nomeDestinatario))) { Utente mittente = UniMolCoin.RicercaUtente(nomeMittente); Utente 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))); Random randomMiner = new Random(); //il miner sarà estratto casualmente tra la lista degli utenti UniMolCoin.MinaTransazioni(UniMolCoin.Utenti[randomMiner.Next(0, UniMolCoin.Utenti.Count)]); 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 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 MostraSmartContract: ColoreTitoli(); Console.WriteLine("\t\n*** MOSTRA SMART CONTRACT ***\n"); ColoreRecap(); SmartContract.MostraContratto(); ColoreNormale(); break; case 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); Utente 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 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 = Esci; } } while (!Esci.Equals(selezione)); }