Hotmoka è un framework per programmare una rete peer to peer realizzando una Blockchain. All'interno di questa rete, i contratti intelligenti (Smart Contracts)
sono implementati attraverso il modulo Takamaka (parte integrante del progetto Hotmoka). I jar compilati dei progetti Hotmoka e Takamaka non sono ancora disponibili
in repository pubblici come ad esempio Maven Central, ma è necessario recuperare i progetti dal relativo repository git.
Installazione Hotmoka/Takamaka
Il modo più semplice per ottenere Hotmoka/Takamaka è clonare il progetto ed installarlo sul proprio repository Maven. Sono necessarie almeno le Java JDK versione 11 per la compilazione.
Una volta ottenuto il progetto, da riga di comando è sufficiente spostarsi nella directory hotmoka
e lanciare il comando
mvn clean install
Per utilizzare Hotmoka all'interno di un IDE è sufficiente importare il relativo progetto Maven. Ad esempio, nel caso di Eclipse, dal menù scegliere la sequenza "File-Import-Existing Maven Projects" ed importare il parent Maven project contenuto nella directory Hotmoka
ottenuta dalla clonazione.
A questo punto è possibile avviare il compile, package e test della libreria Hotmoka/Takamaka con un click sul file pom del parent project scegliendo il target Maven install
.
Un progetto Java su Blockchain
Il nostro primo obiettivo è quello di installare un file jar corrispondente ad un progetto Java in una Blockchain Hotmoka. Utilizzeremo una Blockchain locale con un singolo nodo definita attraverso le API Hotmoka.
In questo articolo andiamo ad implementare il progetto Java utilizzando le API Takamaka. Creiamo un progetto Maven nella directory tutorial
di Hotmoka e dal menù di Eclipse selezioniamo "New-Maven project" specificando l'opzione "Create a simple project" con skip della selezione "archetype". Deselezioniamo "Use default Workspace directory" e inseriamo un percorso del tipo ../tutorial/family
.
La ragione della scelta di questo tipo di percorso risiede nella semplificazione dell'accesso al file jar prodotto, evitando percorsi assoluti dipendenti dalla localizzazione del proprio Maven repository locale. Nella figura che segue è mostrato un esempio:
Non aggiungiamo il progetto ad alcun working set e nella successiva schermata scegliamo io.hotmoka
come Group Id e family
come Artifact Id:
Il file pom prodotto dal wizard è minimale, facciamo in modo di completarlo con le dipendenze necessarie:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.hotmoka</groupId>
<artifactId>family</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
<dependencies>
<dependency>
<groupId>io.hotmoka</groupId>
<artifactId>io-takamaka-code</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
La modifica appena apportata dovrebbe produrre un errore sul progetto family. Per risolvere il problema effettuare un right-click sul nome del progetto scegliendo la sequenza "Maven-Update Project":
Si può notare come tra le dipendenze del progetto sia stato specificato il runtime Takamaka, questo è possibile senza che sia prodotto alcun errore in quanto la compilazione precedente di Hotmoka ha prodotto tutti i jar necessari di Takamaka nel repository Maven locale.
Completiamo la configurazione definendo la dipendenza dal modulo io.takamaka.code
. Con un right-click sul progetto family scegliere la sequenza "Configure-Create module-info.java".
All'interno del file prodotto inseriamo la dipendenza richiesta:
module family {
requires io.takamaka.code;
}
Facciamo ora in modo di avere almeno una classe da utilizzare con questo modulo in una blockchain. Definiamo il package io.takamaka.family all'interno del percorso src/main/java
e al suo interno la classe:
package io.takamaka.family;
public class Person {
private final String name;
private final int day;
private final int month;
private final int year;
public final Person parent1;
public final Person parent2;
public Person(String name, int day, int month, int year, Person parent1, Person parent2) {
this.name = name;
this.day = day;
this.month = month;
this.year = year;
this.parent1 = parent1;
this.parent2 = parent2;
}
public Person(String name, int day, int month, int year) {
this(name, day, month, year, null, null);
}
@Override
public String toString() {
return name + " (" + day + "/" + month + "/" + year + ")";
}
}
Eseguiamo infine un Maven install
sul pom del progetto family per produrre il relativo jar:
Conclusione
In questo articolo abbiamo visto come installare Hotmoka ed avere un progetto configurato all'interno del nostro IDE di sviluppo, nel successivo articolo vedremo come creare un nodo Blockchain in memoria esplorando le prime API Hotmoka.