Passa ai contenuti principali

Blockchain - Le transarioni

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/ Licenza Creative Commons
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale

Commenti

Post popolari in questo blog

Telecamere Ip con accesso "nascosto"

Telecamere Ip con accesso "nascosto" Storia triste di un auto-hacking obbligato che mi ha fatto scoprire come la nostra privacy è realmente messa a rischi. Storia Ho acquistato dal mercatino/fiera del Radioamatore di Fasano quattro telecamere IP. La scatola riporta "Smart Camera" LF4810. Ne ho montata una e testata in tutte le sue funzionalità per oltre un mese. Chiaramente la manualistica scarsissima, come da tradizione in questi prodotti cinesi di costo molto concorrenziale, consiste in un "pieghevole" di 4 facciate. Chiaramente non erano documentate le impostazioni necessarie per attivare i protocolli ONVIF e RTSP che mi sono indispensabili per l'uso che ne devo fare. Nonostante questa scarsa documentazione dopo l'installazione base fatta con l'apposita app: tutto sembrava corretto. Chiaramente la prima azione che ho compiuto è stata quella di cambiare la password che di default è "123". Subito dopo h

Dynamic DNS con Duckdns.org in HTTPS

Obiettivo Avere un dominio https con certificato valido da usare come endpoint pubblico per Homeassistant e per un WebHook per i bot telegram. Fase 1 Registrazione del dominio in un servizio di dynamic DNS come https://www.duckdns.org/   : Scegliere per quale sistema operativo installare il client che si occuperà dell'aggiornamento dell'ip: Seguire la semplice guida per la configurazione del processo cron: Fase 2 Creazione del certificato e installazione sul server. Di tutto questo si occuperà una applicazione che si chiama certbot. $ sudo add-apt-repository ppa:certbot/certbot $ sudo apt install python-certbot-apache $ sudo certbot --apache -d ol3.duckdns.org -d www.ol3.duckdns.org Fase 3 Esporre il servizio https sulla rete pubblica. Aprire o reindirizzare la porta 443 verso l'host sul quale si è fatta la configurazione di certbot dal proprio router. Il certificato di certbot è valido per novanta giorn

JHipster - Uso base

Cosa è JHipster è un "generatore di applicazioni" che fornisce tutto lo stack necessario ad implementare una applicazione web e/o a microservizi basata su Spring Boot e AngularJs. E' dotato di un marketplace di componenti già pronte: https://www.jhipster.tech/#modules E' dotato di uno strumento web per la modellazione dello schema E-R: https://start.jhipster.tech/jdl-studio/ Prerequisiti - Java 8  - Node.js (usare la versione LTS 64-bit) - NPM viene installato con Node.js ma va aggiornato      $ npm install -g npm - Per usare il JHipster Marketplace, installare Yeoman:       $ npm install -g yo Uso base Gli step, presi dal sito ufficiale sono questi: 1. Installare JHipster:       $ npm install -g generator-jhipster Nota: per installare una versione specifica del generator:   $ npm install -g generator-jhipster@6.0.5 2. Crea una nuova directory ed entra dentro questa:   $ mkdir myApp   $ cd M yApp 3. Eseguire JHipster e