IOTA Delegate PoW [Italian]

INTRODUZIONE

Sono Spataro Fabrizio (fabryprog), sviluppatore J2EE con 12 anni di esperienza. Negli ultimi 2 anni sto dedicando i miei sforzi di apprendimento al settore blockchain e a tutto quello che gira intorno ad esso.

Il mondo blockchain è vasto e trovare un progetto di riferimento è molto importante per capirne veramente le potenzialità. Da 6 mesi  ho scelto il mio progetto: IOTA

IOTA è una DLT dedicata al mondo IoT ed è conosciuta soprattutto perchè non usa uno schema a blocchi (blockchain) ma un groviglio di transazioni chiamato tangle. Proprio per la natura del tangle, la rete IOTA non ha limiti di crescita, più grande è la rete più grande è la potenzialità.

Il progetto è opensource (github) ed è tutt'ora in via di sviluppo.

PROBLEMATICA

La rete peer2peer di IOTA è fatta da nodi con all'interno un'interfaccia REST API per interagire con essa.

Le fasi di scrittura di una transazione IOTA (che è equiparabile ad un record del database) possono essere fatte localmente con chiamate singole al nodo che tra l'altro è l'unico che può salvare e trasmettere la transazione ai nodi vicini.

Una delle fasi più pesanti è la cosiddetta PoW (Proof of Work) che prevede l'esecuzione di un algoritmo CPU intensive (nota bene: il concetto di PoW su IOTA è molto differente dal concetto di altre DLT)

Abbiamo però indicato IOTA come progetto dedicato al mondo IoT ed è un fatto noto che un sensore/dispositivo IoT non disponga di una grossa potenza di calcolo oppure non può sprecare energia se l'autonomia è un fattore importante e vitale per la sua esistenza.

In questi casi quindi il task pesante PoW viene delegato ad uno dei nodi. L'algoritmo eseguito però richiede un utilizzo variabile della CPU tra 1 a 50 secondi. La variazione di tempo dipende da una variabile casuale oltre alla struttura hardware che si ha a disposizione.

Possiamo quindi ben capire che l'operazione di PoW è un problema non indifferente che occorre affrontare.

SOLUZIONE PROPOSTA

Il Delegate PoW non è una novità. Ho personalmente modificato il codice sorgente per permettere ai nodi di usufruire risorse aggiuntive esterne per il calcolo.

La mia idea principale è di utilizzare risorse comuni come PC e/o server per aiutare i nodi della rete IOTA ad essere più performante.

Per far questo ho utilizzato una libreria, chiamata Hazelcast, che permette l'esecuzione di task remoti su client collegati al cluster.

La modifica è stata quindi inserire due modalità di avvio distinte:

  1. abilitare il server a ricevere connessioni esterne
  2. avviare il worker
Quando viene chiesto al server di calcolare la PoW, il server delega il lavoro a tutti i worker collegati. Il primo che trova una soluzione la invia

Naturalmente, più worker sono collegati più il server ha una probabilità alta di incrementare le proprie prestazioni. 


TEST

Il lavoro è stato iniziato il 1 Novembre 2018 ed è stato concluso qualche giorno fa. E' stato un lavoro divertente e prettamente notturno che mi ha fatto perdere un pò ore di sonno.

Nella serata di Giovedì 22 Novembre, con l'aiuto dei ragazzi della community Telegram IOTA ITALIA e IOTA LAB [ITA] ho potuto dimostrare la bontà dell'idea e dell'implementazione.

Il server di riferimento è stato un VPS ospitato su Contabo con 4 CPU e 10 GB di RAM che riusciva a tenere una media di 3 transazioni per minuto (TPM)

I ragazzi della community hanno messo a disposizione ben 10 worker tra VPS notebook e desktop

Le prestazioni istantanee misurate con un tool appositamente scritto da un membro della comunità hanno dimostrato che il server è riuscito a delegare il PoW e raggiungere prestazioni medie di 18 TPM.

CONCLUSIONI

Concluso il lavoro sono felice di avere dimostrato prima di tutto la bontà dell'opensource e la grande collaborazione e professionalità che la community IOTA ITALIA ha costruito.

Il prossimo passo è delegare il PoW a risorse remote che possiedono GPU in grado di effettuare il calcolo mediamente 8 volte più veloce di una CPU.

Alla prossima

Commenti

Post popolari in questo blog

Hadoop, how to create a single node cluster using docker

How to install IOTA node with docker

Apache Spark - Try it using docker!