Transazioni
Definizioni
Nel contesto delle blockchain usate per le criptovalute il concetto di "transazione" implica effettivamente un passaggio di valuta da un possessore ad un'altro.
In questo contesto, nel quale mi astraggo dall'applicazione nel campo delle criptovalute, e faccio una trattazione più generica delle blockchain la transazione è una transizione di stato: il contenuto informativo che si vuole certificare è cambiato.
Nel nostro caso specifico cambia il campo "Dati" dell'oggetto Block e passa da uno al successivo dei seguenti valori, ma risulterà evidente che è possibile inserire nel blocco qualunque informazione:
"Ciao a tutti quanti"
"Ciao a tutti quanti i curiosi delle blockchain"
"Ciao a tutti quanti i curiosi delle blockchain che leggono questo blog"
Blocco informativo
Nel caso delle criptovalute l'attenzione si sarebbe spostata, a questo punto, alla verifica dei saldi dei conti ai quali è stato chiesto di addebitare e l'esistenza dei conti ai quali è stato chiesto di accreditare. Ma come già detto queste dinamiche in questa fase non mi interessano.
In questo studio ciò che conta è il blocco informativo.
E' cambiato il patrimonio informativo del nostro registro passando da:
"Ciao a tutti quanti"
a:
"Ciao a tutti quanti i curiosi delle blockchain"
e poi:
"Ciao a tutti quanti i curiosi delle blockchain che leggono questo blog"
La catena
Ogni cambiamento va incatenato e quindi il codice che segue non fa altro che generare il primo blocco, poi cambiare il campo "Dati", legare questo blocco al precedente (mediante l'impostazione "b.setPrecedente(precedente);" ) e cifrarlo.
All'ulteriore cambio del campo Dati tutto si ripete, legando sempre l'ultimo blocco al precedente.
Si capisce che procedendo così si ottiene un registro con dei dati NON modificabili, tracciabili e con un marchio temporale dato dal timestamp: una catena di blocchi.
import java.security.NoSuchAlgorithmException;
import java.sql.Timestamp;
import java.util.Random;
import it.fc.blockchain.model.Block;
import it.fc.blockchain.utils.Cypher;
public class ValidateBlock {
public static String seal = "00";
public static String givenRandomString() {
int leftLimit = 97; // letter 'a'
int rightLimit = 122; // letter 'z'
int targetStringLength = 5;
Random random = new Random();
StringBuilder buffer = new StringBuilder(targetStringLength);
for (int i = 0; i < targetStringLength; i++) {
int randomLimitedInt = leftLimit + (int) (random.nextFloat() * (rightLimit - leftLimit + 1));
buffer.append((char) randomLimitedInt);
}
String generatedString = buffer.toString();
return generatedString;
}
public static String getSeal() {
return seal;
}
public void setSeal(String seal) {
this.seal = seal;
}
/**
*
* Dato un blocco cerca una codifica SHA256 in BASE64 che cominci con il numero
*
* di "Difficulty" pari alla lunghezza dei caratteri definiti in "Seal". Appena
*
* la trova valorizza il timestamp del nodo
*
*
*
* @param b
*
* @return
*
* @throws NoSuchAlgorithmException
*
*/
public static boolean validateBlock(Block b) throws NoSuchAlgorithmException {
boolean ret = false;
String validHash = "11";
System.out.println("Inizio mining" + new Timestamp(System.currentTimeMillis()));
String tempNonce = null;
while (!validHash.substring(0, getSeal().length()).equals(getSeal())) {
tempNonce = givenRandomString();
b.setNonce(tempNonce);
validHash = Cypher.hash2Base64(b.toString());
System.out.println(validHash);
}
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
b.setTimestamp(String.valueOf(timestamp.getTime()));
ret = true;
System.out.println("Fine mining" + new Timestamp(System.currentTimeMillis()));
b.setHash(validHash);
b.setNonce(tempNonce);
return ret;
}
public static void main(String[] args) throws NoSuchAlgorithmException {
Block b = new Block();
b.setDati("Ciao a tutti quanti");
b.setId("1");
b.setNonce("0000");
String precedente = "";
if (validateBlock(b)) {
System.out.println("Id = " + b.getId());
System.out.println("Nonce = " + b.getNonce());
System.out.println("Dati = " + b.getDati());
System.out.println("Timestamp = " + b.getTimestamp());
System.out.println("Blocco precedente = " + b.getPrecedente());
precedente = b.getHash();
System.out.println("Hash = " + precedente);
}
System.out.println("************************************************************");
b = new Block();
b.setDati("Ciao a tutti quanti i curiosi delle blockchain");
b.setId("2");
b.setNonce("0000");
b.setPrecedente(precedente);
if (validateBlock(b)) {
System.out.println("Id = " + b.getId());
System.out.println("Nonce = " + b.getNonce());
System.out.println("Dati = " + b.getDati());
System.out.println("Timestamp = " + b.getTimestamp());
System.out.println("Blocco precedente = " + b.getPrecedente());
precedente = b.getHash();
System.out.println("Hash = " + precedente);
}
System.out.println("************************************************************");
b = new Block();
b.setDati("Ciao a tutti quanti i curiosi delle blockchain che leggono questo blog");
b.setId("3");
b.setNonce("0000");
b.setPrecedente(precedente);
if (validateBlock(b)) {
System.out.println("Id = " + b.getId());
System.out.println("Nonce = " + b.getNonce());
System.out.println("Dati = " + b.getDati());
System.out.println("Timestamp = " + b.getTimestamp());
System.out.println("Blocco precedente = " + b.getPrecedente());
precedente = b.getHash();
System.out.println("Hash = " + precedente);
}
System.out.println("************************************************************");
}
}
To be continued...
Abbiamo la catena dei nodi. Dobbiamo condividere questo oggetto altrimenti non si può garantire l'affidabilità del contenuto informativo.
https://www.bitconio.net/2016/03/09/come-funziona-bitcoin/
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale
Commenti
Posta un commento