HotMoka può essere utilizzato per definire un nodo di una vasta rete Blockchain. L'interfaccia che rappresenta un nodo (io.hotmoka.nodes.Node
) HotMoka definisce
i seguenti metodi:
- get per recuperare lo stato di un nodo e gli oggetti memorizzati;
- add che espande lo stato di un nodo aggiungendo il risultato di una nuova transazione;
- run per l'esecuzione di transazioni che coinvolgono il richiamo di metodi
@View
che non espandono la memoria del nodo; - post che espande la memoria del nodo con l'esecuzione di una transazione senza attenderne il risultato (in questo caso è ritornato un oggetto
future
); - subscribe che consente ad un utente di effettuare una sottoscrizione ad ascoltatori di eventi durante l'esecuzione di transazioni.
all'interno di HotMoka, come vedremo tra breve, abbiamo la possibilità di definire diverse tipologie di nodi Blockchain.
Tipologie di nodi Blockchain in HotMoka
Le implementazioni locali HotMoka sono nodi effettivi in esecuzione sulla macchina nella quale vengono lanciati e che possono far parte di una più vasta rete Blockchain. In HotMoka possiamo definire le seguenti tipologie di nodi: TendermintBlockchain, MemoryBlockchain e TakamakaBlockchain.
Tendermint è un engine Byzantine-fault tolerant per la costruzione di Blockchain che replica una macchina a stati finiti (Tendermint app) sui nodi di una rete sparsi nel mondo. L'aspetto più interessante di Tendermint, è la capacità di gestire automaticamente le problematiche di networking e consensus, lasciando allo sviluppatore solo il compito dello sviluppo dell'applicazione.
La MemoryBlockchain implementa un singolo nodo in memoria Ram. Si tratta quindi di una tipologia di nodo che perde il suo contenuto allo spegnimento, ma che può essere utile per il debugging, testing e l'apprendimento del funzionamento di una Blockchain, dal momento che consente l'ispezione del contenuto di blocchi, transazioni e memoria.
TakamakaBlockchain implementa invece un nodo per una Blockchain Takamaka.
A differenza di MemoryBlockchain, TendermintBlockchain e TakamakaBlockchain implementano delle reali Blockchain.
MemoryBlockchain
Vediamo adesso come sia possibile eseguire un nodo blockchain in memoria installando su di esso il file jar del progetto Takamaka sviluppato nel precedente articolo. Questa operazione può essere effettuata utilizzando sia le API Java che i tool a riga di comando del progetto Moka.
TendermintBlockchain e TakamakaBlockchain sono perfetti per il deploy di Blockchain per la programmazione di smart contract Takamaka, ma risultano essere difficoltose da analizzare in una attività di debugging, gli effetti di una transazione non sono infatti di immediata comprensione.
Una MemoryBlockchain consente invece l'accesso a blocchi e transazioni attraverso file di testo ma ricordiamo che non rappresenta un nodo di una reale Blockchain. I nodi di una MemoryBlockchain non duplicano transazioni su una rete peer-to-peer dove il consenso è imposto.
Per creare un memory blockchain Takamaka installiamo il tool a riga di comando Moka per ambiente Linux. A tal fine definiamo una directory moka
in una posizione a piacere all'interno del sistema operativo e posizioniamici al suo interno:
mkdir moka
cd moka
per completare l'installazione, apriamo un terminale ed eseguiamo i seguenti comandi:
wget https://github.com/Hotmoka/hotmoka/releases/download/1.0.0/moka_1.0.0_linux.tar.gz
tar zxf moka_1.0.0_linux.tar.gz
La creazione di un nodo Blockchain con un faucet (l'entità che consente l'acquisizione di moneta virtuale) aperto, è possibile sfruttando il comando Moka:
./moka init-memory 100000000000000000000000 --open-unsigned-faucet --takamaka-code modules/explicit/io-takamaka-code-1.0.0.jar
Nella precedente figura è possibile visualizzare le informazioni del nodo. Non chiudiamo il terminale in modo tale che il nodo rimanga in esecuzione.
Per poter installare qualcosa sul nodo blockchain ed eseguire transazioni abbiamo la necessità di un account. Un account è semplicemente un oggetto Java, un'istanza della classe io.takamaka.code.lang.ExternallyOwnedAccount
. Questo oggetto non ha nulla di speciale ma, come ogni cosa in una Blockchain, è soggetto ad un pagamento per la sua installazione.
Correntemente non abbiamo moneta per poter effettuare un pagamento. In una Blockchain reale possiamo guadagnare moneta lavorando per la rete, venendo pagati per qualche attività o anche acquistando direttamente moneta virtuale.
Nel nostro nodo di test, possiamo ottenere moneta virtuale gratuitamente, attraverso il faceut del gamete (l'account che detiene inizialmente tutta la moneta elettronica di una Blockchain).
Un'interessante proprietà del gamete è la maxFaucet, ovvero la massima quantità di moneta elettronica ottenibile gratuitamente. Il valore maxFaucet
è generalmente posto a zero ma nel nostro caso non è cosi al fine di poter mostrare l'installazione di un modulo jar sul nodo blockchain.
Creiamo quindi un nostro account con i seguenti comandi:
./moka faucet 5000000000000000
./moka create-account 50000000000 --payer faucet --url localhost:8080
Prestiamo attenzione al codice di riferimento dell'account creato, è infatti fondamentale per poter richiedere l'installazione di qualcosa sulla Blockchain.
Recuperiamo il file family-0.0.1-SNAPSHOT
del precedente articolo e copiamolo all'interno della directory moka
. Eseguiamo quindi il seguente comando per richiedere l'installazione del file jar pagando il necessario in termini di moneta virtuale:
./moka install 2021495a4a52e4e5d6ec079bef87b7e5450dd3e02cc8494dcf37ca6a06fe88ed#0 family-0.0.1-SNAPSHOT --url localhost:8080
il risultato è mostrato nell'immagine che segue:
A questo punto il nostro modulo è disponibile a tutti i partecipanti alla Blockchain creata. Nel successivo articolo vedremo come effettuare la creazione di un nodo Blockchain attraverso le API HotMoka/Takamaka.