Cryptomonnaie

Appel de contrats intelligents blockchain depuis Java – Luiz Milfont

Appel de contrats intelligents blockchain depuis Java - Luiz Milfont


1*whu8HTsuJWK2ioiT77JhSA - Appel de contrats intelligents blockchain depuis Java - Luiz Milfont

Découvrez à quel point il peut être facile d'interagir avec une blockchain à l'aide d'une bibliothèque

introduction

Cet article est un tutoriel étape par étape très pragmatique dont l'objectif est de montrer (en particulier) aux développeurs Java un moyen très simple d'interagir avec un contrat intelligent blockchain.

Exigences

Nous allons utiliser la blockchain Tezos. Et, pour que notre code Java interagisse avec le contrat intelligent existant et déployé, nous aurons besoin de la bibliothèque TezosJ de TezosRio. Il existe deux versions de cette bibliothèque, l'une écrite spécifiquement pour le développement d'applications Android (TezosJ_SDK) et l'autre destinée aux applications Java génériques écrites avec Eclipse IDE (TezosJ_plainJava), que nous allons utiliser ici. Il n'est pas nécessaire de télécharger l'intégralité du code source de la bibliothèque. Seul le fichier JAR v1.1.0 suffit. En tant qu'IDE de développement, Eclipse sera le choix.

La cible

Le contrat que nous allons appeler est un simple registre de base de clients qui peut être trouvé déployé sur Tezos testnet à l'adresse suivante:

KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t

Vous pouvez facilement vérifier les détails du contrat via l'un des explorateurs de blocs Tezos, comme Tezblock. Ou en utilisant l'outil better-call.dev. Pourtant, une autre option consiste à vérifier le contrat avec l'explorateur SmartPy. Rappelez-vous, pensé, pour spécifier un testnet serveur, comme https://tezos-dev.cryptonomic-infra.tech.

Notre contrat intelligent est appelé «Clients» et comporte quatre points d'entrée (ou méthodes): addCustomer, removeCustomer, transfer et updateBalance. Fondamentalement, insérez, supprimez, transférez des fonds et mettez à jour. Rien d'extraordinaire. Il a été créé à des fins éducatives uniquement. Il s'agit de maintenir une liste de «clients» dans le stockage de la chaîne de blocs Tezos.

L'appel

TezosJ est probablement l'un des moyens les plus simples disponibles de nos jours pour appeler un contrat intelligent Tezos. Fondamentalement, notre appel peut être effectué en une seule commande:

JSONObject jsonObject = wallet.callContractEntryPoint (wallet.getPublicKeyHash (), "KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t", montant, frais, "", "", "addCustomer", nouvelle chaîne de caractères[]{"1000000", "123456789", "Bob", "98769985"});

Le code ci-dessus ajoute un nouveau client à la base, Bob, avec un solde de 10ꜩ, 123456789 comme identifiant et 98769985 comme numéro de téléphone. Cela se fait en appelant le callContractEntryPoint méthode qui nécessite essentiellement les mêmes paramètres, puis un Tezos commun .envoyer() , mais a quelques extras: le nom du point d'entrée du contrat et un tableau de chaînes contenant les paramètres attendus du point d'entrée (qui doivent être connus avant d'effectuer l'appel).

Pas à pas, s'il vous plaît!

Si vous ne l'avez pas encore fait, téléchargez et installez Eclipse. Ouvrez-le. La première étape consiste à créer un nouveau projet, en sélectionnant l'option Fichier-> Nouveau-> Projet, comme ceci:

L'étape suivante consiste à choisir le type de projet: Sélectionnez le projet Gradle:

Définissez le nom du nouveau projet sur «callSmartContract» et cliquez sur le bouton Terminer. Attendez qu'Eclipse crée la structure du fichier de projet. Nous allons maintenant créer une classe Main, afin de pouvoir exécuter et tester le projet. Cliquez avec le bouton droit sur le nom du projet callSmartContract et sélectionnez Nouveau-> Classe:

Ensuite, spécifiez «Main» comme nom de la nouvelle classe et assurez-vous de vérifier le «public void static Main (String args[]) "Boîte de création. Cliquez ensuite sur le bouton Terminer:

Vous remarquerez que la classe principale a été créée. Cliquez avec le bouton droit sur Classe principale et sélectionnez Exécuter en tant que-> Application Java. Il s'agit simplement de configurer la façon dont le projet est exécuté lorsque nous cliquons sur le bouton de lecture à partir de maintenant:

Dans la console, vous verrez que le projet a été exécuté avec succès, mais, bien sûr, rien ne s'est encore produit. Vous verrez donc le message «terminé»:

Nous allons maintenant ajouter le fichier JAR de la bibliothèque TezosJ. Accédez au référentiel gezub Tezos.Rio et téléchargez le fichier tezosj-sdk-plain-java-1.1.0.jar

Sur votre explorateur de fichiers, copiez le fichier tezosj-sdk-plain-java-1.1.0.jar (CTRL + C).

Revenez à Eclipse, cliquez sur le nom du projet et collez avec CTRL + V.

Le fichier apparaîtra comme ajouté à la structure du projet:

L'étape suivante consiste à ajouter le fichier JAR au chemin de génération du projet. Cliquez avec le bouton droit sur le fichier de bibliothèque dans l'explorateur de projet et choisissez l'option Build Path-> Add to Build Path (ou Build Path -> Configure Build Path):

Choisissez le fichier de bibliothèque, puis cliquez sur le bouton Appliquer et fermer:

Maintenant que nous avons tout préparé, commençons par créer un portefeuille Tezos:

Le «X» rouge ci-dessus (à gauche) nous rappelle que nous devons importer les classes, afin que notre code comprenne ce qu'est un TezosWallet:

Ajoutez maintenant une sortie de console pour vérifier si notre portefeuille est créé avec succès. Nous allons imprimer quelques informations à ce sujet: le hachage de clé publique du portefeuille (adresse Tezos), ses mots mnémoniques et le solde actuel. Après avoir ajouté les commandes System.out.println, exécutez le projet et vous obtiendrez quelque chose comme ça (vérifiez la console):

D'accord! Nous avons un portefeuille Tezos fonctionnel. Nous sommes maintenant en mesure de passer un appel au contrat intelligent Customers Tezos.

Un peu sur le contrat

le Les clients Le contrat intelligent que nous allons utiliser a été créé et déployé sur Tezos blockchain testnet à l'aide de l'IDE en ligne SmartPy.io. Vérifiez le code source du contrat ci-dessous:

# Importe la bibliothèque SmartPy.
importer smartpy en tant que sp
# Définit la classe Customer et son constructeur.
Client de classe (contrat sp.):
def __init __ (auto):
self.init (clients = sp.map ())

# Définit le point d'entrée addCustomer.
@sp.point d'accès
def addCustomer (self, params):
# Vérifie si les champs obligatoires ont des valeurs.
sp.verify (params.id! = "")
sp.verify (params.name! = "")
sp.verify (params.phoneNumber> 0)

# Déclarez les types de paramètres.
sp.set_type (params.id, sp.TString)
sp.set_type (params.name, sp.TString)
sp.set_type (params.phoneNumber, sp.TNat)
sp.set_type (params.balance, sp.TMutez)

# Définit un enregistrement client, afin que nous puissions l'ajouter à une carte.
customer = sp.record (name = params.name, phoneNumber = params.phoneNumber, balance = params.balance)

# Ajoute le nouvel enregistrement client à une carte (qui résidera dans le stockage du contrat).
self.data.customers[params.id] = client

# Définit le point d'entrée removeCustomer.
@sp.point d'accès
def removeCustomer (auto, params):
# Vérifie si les champs obligatoires ont des valeurs.
sp.verify (params.id! = "")
# Déclarez les types de paramètres.
sp.set_type (params.id, sp.TString)
# Supprimer le client de la carte.
del self.data.customers[params.id]
# Définit le point d'entrée updateBalance.
@sp.point d'accès
def updateBalance (self, params):
# Vérifie si les champs obligatoires ont des valeurs.
sp.verify (params.id! = "")
# Déclarez les types de paramètres.
sp.set_type (params.id, sp.TString)
sp.set_type (params.amount, sp.TMutez)
# Met à jour l'équilibre.
self.data.customers[params.id].balance = params.amount

# Définit le point d'entrée du transfert.
@sp.point d'accès
transfert de def (auto, params):
# Vérifie si les champs obligatoires ont des valeurs.
sp.verify (params.idFrom! = "")
sp.verify (params.idTo! = "")
sp.verify (params.amount> sp.mutez (0))
# Vérifie si le client a suffisamment de fonds pour être transféré.
sp.verify (params.amount <= self.data.customers[params.idFrom].équilibre )

# Déclarez les types de paramètres.
sp.set_type (params.idFrom, sp.TString)
sp.set_type (params.idTo, sp.TString)
sp.set_type (params.amount, sp.TMutez)
# Met à jour l'équilibre.
self.data.customers[params.idFrom].balance = self.data.customers[params.idFrom].balance - params.amount
self.data.customers[params.idTo].balance = self.data.customers[params.idTo].balance + params.amount
# Crée le scénario de test, pour simuler un appel de contrat dans SmartPy.io IDE.
@sp.add_test (name = "Clients")
test def ():
# Instancier un contrat hérité de la classe client.
myCustomersContract = Client ()

# Définit un scénario de test.
scenario = sp.test_scenario ()

# Ajoute le contrat au scénario de test.
scénario + = myCustomersContract

# Insère les clients en appelant le point d'entrée addCustomer du contrat.
# Ces clients résideront dans le stockage du contrat.
scénario + = myCustomersContract.addCustomer (id = "123456", name = "Daniel", phoneNumber = 99984537, balance = sp.mutez (0))
scénario + = myCustomersContract.addCustomer (id = "345678", name = "Eleonor", phoneNumber = 85375677, balance = sp.mutez (0))
scénario + = myCustomersContract.addCustomer (id = "678905", name = "Fabian", phoneNumber = 78655567, balance = sp.mutez (0))

# Supprime un client via son numéro d'identification.
scénario + = myCustomersContract.removeCustomer (id = "678905")

# Met à jour le solde d'un client.
scénario + = myCustomersContract.updateBalance (id = "123456", amount = sp.mutez (10000000))

# Transfère des fonds d'un client à un autre.
scénario + = myCustomersContract.transfer (idFrom = "123456", idTo = "345678", amount = sp.mutez (5000000))

Le code source du contrat SmartPy a été montré ici à des fins d'illustration uniquement et nous n'avons pas besoin de le compiler et de le déployer à nouveau. Il réside déjà sur le testnet de la blockchain Tezos, sous l'adresse:

KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t

Et… Action!

Maintenant, nous avons tout ce qu'il faut pour appeler le contrat depuis Java. Premièrement, nous allons ajouter un nouveau client en utilisant le point d’entrée «addCustomer» du contrat. Prenons le nom du client «Bob» et son identifiant sera «98765» et le numéro de téléphone «99876787». Bob aura un solde de 10ꜩ (10.000.000 mutez). Donc, notre commande d'appel de contrat sera comme ceci:

JSONObject jsonObject = wallet.callContractEntryPoint (wallet.getPublicKeyHash (), "KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t", montant, frais, "", "", "addCustomer", nouvelle chaîne de caractères[]{"1000000", "98765", "Bob", "99876787"});

Tout d'abord, nous devons informer TezosJ que nous utiliserons le testnet Tezos (où le contrat est effectivement publié). Nous devons également définir un montant pour la transaction et des frais. Cela se fait avec le code Java ci-dessous:

  // Changer de fournisseur de portefeuille pour utiliser testnet.
wallet.setProvider («https://tezos-dev.cryptonomic-infra.tech»);

// Définit le montant et les frais de la transaction.
Montant BigDecimal = nouveau BigDecimal («0»);
Frais BigDecimal = nouveau BigDecimal («0,1»);

// Appelle le point d'entrée du contrat.
JSONObject jsonObject = wallet.callContractEntryPoint (wallet.getPublicKeyHash (), «KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t», montant, frais, «», «», «addCustomer», nouvelle chaîne de caractères[]{"1000000", "98765", "Bob", "99876787"});

// Imprime le hachage d'opération dans la console.
String opHash = (String) jsonObject.get ("result");
System.out.println ("OpHash:" + opHash);

Copiez le code et collez-le dans notre classe principale, pour qu'il reste comme ceci:

Notez que pour que cet appel fonctionne, vous devez d'abord approvisionner et révéler votre compte Tezos. Sinon, vous pouvez obtenir une erreur comme celle-ci:

Il y avait des erreurs: type ‘branch’ id ‘proto.005-PsBabyM1.implicit.empty_implicit_contract’

Exécutez le projet! Si tout était ok, vous obtiendrez comme résultat un hachage d'opération affiché dans la console:

Cela indique que nous avons envoyé avec succès une transaction callContract à la blockchain de testnet Tezos (car nous avons un hachage d'opération). Maintenant, vérifions si la transaction a été acceptée par la blockchain Tezos. Nous allons utiliser l'explorateur TezBlock pour le faire. Ouvrez https://tezblock.io dans votre navigateur préféré et, tout d'abord, dans le coin supérieur droit de l'écran, passez de «mainnet» à «balylonnet» (c'est la même chose que testnet). Ensuite, collez le hachage d'opération que nous avons obtenu de notre exécution java dans la zone de recherche et appuyez sur la touche "Entrée":

Cela montrera les résultats de notre appel de contrat, avec les détails de l'opération. En cliquant sur «afficher», vous pourrez vérifier les paramètres passés de notre code Java à la blockchain Tezos:

Paramètres:

Gauche (Gauche (Gauche (Paire (Paire (Paire 1000000 "98765") "Bob") 99876787)))

Ce sont les paramètres formatés Micheline que notre appel de l'application Java a généré. Les contrats intelligents Tezos, lorsqu'ils sont déployés, sont écrits en langue Michelson et ils attendent des paramètres d'entrée envoyés dans ce format. L'un des avantages de l'utilisation de la bibliothèque TezosJ est qu'elle génère des paramètres au format Micheline à la volée et vous n'avez pas à vous soucier de la façon dont cela est fait.

Le grand finale

À présent, nous pouvons garantir que le contrat a été correctement appelé, que les paramètres ont été passés et que l'opération a été acceptée par la blockchain Tezos. Maintenant, la dernière chose que nous devons faire est de vérifier si le nouveau client, Bob, a été inséré dans le stockage du contrat. Pour cela, nous utiliserons l'outil better-call.dev. Ouvrez simplement votre navigateur et pointez-le sur https://better-call.dev. Entrez l'adresse de notre contrat client (KT18pK2MGrnTZqyTafUe1sWp2ubJ75eYT86t) dans le champ de recherche, changez le réseau en babylonnet et appuyez sur Entrée:

Le résultat sera une liste de toutes les opérations jamais envoyées à l'adresse du contrat ainsi que l'état actuel du stockage du contrat. Ici, vous devrez vérifier les paramètres que vous avez transmis à partir de Java et s'ils sont correctement enregistrés dans le stockage:

Aller plus loin

Vous pouvez essayer les autres points d'entrée du contrat, comme removeCustomer, transfer et updateBalance. N'oubliez pas de toujours vérifier le nombre de paramètres requis par chaque point d'entrée.

Lors de l'exécution du code, si vous obtenez une erreur Java, cela signifie que la transaction n'a pas été envoyée. Dans ce cas, vous devez revérifier vos paramètres, son ordre, le solde de votre compte, les frais et le réseau (mainnet ou testnet) dans lequel vous travaillez. Vérifiez également vos paramètres gasLimit et storageLimit.

D'un autre côté, si vous obtenez un hachage d'opération, cela signifie que votre application Java a correctement envoyé la transaction à la blockchain. Mais, pourtant, vous devez vérifier les éventuelles erreurs liées à la blockchain. Dans ce cas, lorsque vous vérifiez avec l'explorateur TezBlock, il affichera des erreurs avec un arrière-plan de couleur saumon, ce qui signifie que quelque chose de mal s'est produit dans le contexte de la blockchain (comme un mauvais nombre de paramètres passés, un mauvais formatage de Micheline ou même un contrat avec des conditions non acceptées - par exemple : vous avez appelé le point d'entrée du transfert mais le client «de» n'a pas assez de fonds pour envoyer).

Conclusion

Il n'a jamais été aussi simple pour les développeurs de travailler avec des contrats intelligents blockchain. Tezos, en particulier, propose de nombreux excellents outils et une énorme myriade de bibliothèques de langages informatiques qui facilitent l'intégration avec la plupart des systèmes. La bibliothèque TezosJ innove en proposant une méthode callContractEntryPoint facile à utiliser qui crée des paramètres au format Micheline à la volée. Il possède tous les outils dont les développeurs Java ont besoin pour prospérer dans le développement d'applications qui interagissent de manière transparente avec la blockchain.

Téléchargez le code complet

Vous pouvez télécharger ici le projet Eclipse complet présenté dans cet article.

Afficher plus

SupportIvy

SupportIvy.com : Un lieu pour partager le savoir et mieux comprendre le monde. Meilleure plate-forme de support gratuit pour vous, Documentation &Tutoriels par les experts.

Articles similaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page
Fermer