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