public void AggiungiBlocco(Blocco blocco)
        {
            //prende i dati inerenti al blocco precedente rispetto a quello da aggiungere
            Blocco latestBlock = GetUltimoBlocco();

            //aumenta l'indice del blocco +1 rispetto a precedente
            blocco.Indice = latestBlock.Indice + 1;

            // calcola il suo hash partendo da quello del precedente
            blocco.HashPrecedente = latestBlock.HashAttuale;

            //instruzione non necessaria quando si introduce il concetto di MINING
            //blocco.HashAttuale = blocco.CalcolaHash();

            //dopo aver inserito difficoltà posso integrare operazioni di mining
            blocco.Mina(Difficoltà);

            //aggiunge il blocco alla catena
            Catena.Add(blocco);
        }
        //verifica l'integrità della blockchain
        public bool IsValido()
        {
            //finché ci sono blocchi
            for (int pos = 1; pos < Catena.Count; pos++)
            {
                Blocco bloccoCorrente   = Catena[pos];
                Blocco bloccoPrecedente = Catena[pos - 1];

                //ricalcola l'hash del blocco analizzato, se è diverso da quello memorizzato ritorna false (catena non valida)
                if (bloccoCorrente.HashAttuale != bloccoCorrente.CalcolaHash())
                {
                    return(false);
                }

                //ricalcola l'hash del blocco precedente, se è diverso da quello memorizzato ritorna false (catena non valida)
                if (bloccoCorrente.HashPrecedente != bloccoPrecedente.HashAttuale)
                {
                    return(false);
                }
            }

            //se tutti i blocchi sono coerenti tra valore presente e valore aspetta, ritorna true (catena valida)
            return(true);
        }