public Blocco CreaBloccoIniziale()
        {
            var blocco = new Blocco(DateTime.Now, null, _transazioniInAttesa);

            blocco.Mina(Difficolta);
            _transazioniInAttesa = new List <Transazione>();
            return(blocco);
        }
        public void GesticiTransazioniInAttesa(string indirizzoMiner)
        {
            var blocco = new Blocco(DateTime.Now, GetUltimoBlocco().HashBloccoCorrente, _transazioniInAttesa);

            AggiungiBlocco(blocco);

            _transazioniInAttesa = new List <Transazione>();

            CreaTransazione(new Transazione(null, indirizzoMiner, Ricompensa));
        }
        public void AggiungiBlocco(Blocco blocco)
        {
            //prende i dati inerenti al blocco precedente rispetto a quello da aggiungere
            var ultimoBlocco = GetUltimoBlocco();

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

            // calcola il suo hash partendo da quello del precedente
            blocco.HashPrecedente = ultimoBlocco.HashBloccoCorrente;

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

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

            //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.HashBloccoCorrente != bloccoCorrente.CalcolaHash())
                {
                    return(false);
                }

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

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