Les smart-contracts Ethereum sur Android avec Ethereum-android - Partie 2

Étape 2

La seconde étape consiste à récupérer l’instance du contrat dans l’application. C’est à ce moment que nous renseignons son interface Java spécifiée dans l’étape précédente, ainsi que son adresse sur la blockchain.

String contractAddress = "0xffffffffffffffffffffff" /* put here your contract address*/
 ContractSample contract = ethereumjava.contract.withAbi(Counter.class).at(contractAddress);

Appeler des fonctions d’un smart-contract

L’application est désormais capable d’appeler localement ou via la blockchain les fonctions du smart-contract :

Pour appeler localement on utilise la fonction SolidityFunction#call(). Il s’agit en fait d’un getter de la variable counter qui lit sa valeur de type int.

SInt256 counter = contract.counter().call(); //--> is 0 at start

L’appel d’une fonction de smart-contract de manière persistante est asynchrone. En effet, il est nécessaire d’attendre que la transaction contenant l’appel à la fonction soit minée.

Pour pouvoir être notifié de l’inscription de notre transaction dans la blockchain, nous utilisons la méthode SolidityFunction#sendTransactionAndGetMined(). Il s’agit d’une méthode spécifique à Ethereum-android qui encapsule beaucoup de code et dont nous avons souvent besoin.

Cette méthode prend à minima 2 paramètres :

l’identifiant du compte qui appelle cette fonction,

un montant de gas.

Le gas est une notion spécifique aux smart-contracts d’Ethereum. Ce mécanisme permet d’éviter les boucles infinies lors de l’exécution des smart-contracts. Le code s’exécute sur la machine virtuelle Ethereum (EVM) de chaque noeud du réseau à la réception de la transaction contenant l’appel à une fonction de smart-contract (une fois ajoutée à un bloc par un mineur). S’agissant de code exécutable contenant une suite d’instructions, chaque instruction peut prendre plus ou moins de temps à s’exécuter en fonction de son type. Chaque type possède un coût fixe en unités de gas. Une unité de gas ayant un prix, le compte qui appelle une fonction de smart-contract devra veiller à intégrer dans la transaction suffisamment d’unités de gas et posséder le montant associé sur son compte. Le nombre d’unités nécessaires est indiqué lors des tests avec le compilateur en ligne. Il est commun de fournir un nombre entier supérieur à l’estimation. Soyez rassurés, la somme associée au montant de gas non utilisé n’est pas prélevée sur le compte.

String accountId = "0x000000000000..."; /* put here the account which call the function */
 contract.increase().sendTransactionAndGetMined(accountId, new BigInteger("90000")) // gas
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(t => {
         System.out.println(t);
         /*
         Call has been made on the contract
         This can checked with the transaction reference
         */
     });

Observez la redirection du flux de données sur le thread principal d’Android, à la sauce RxJava, grâce à l’opération observeOn. Cet appel déclenche un changement de thread dans l’exécution de la chaine d’opérations du flux de données. Toutes les opérations qui s’exécutent après le observeOn se feront sur le main thread d’Android. Ainsi, il sera possible de modifier directement la vue depuis la méthode call() du subscribe. Il faut également préciser que, comme le spécifie RxJava, la méthode subscribe() peut prendre une Action en unique paramètre. Cela correspond au comportement à avoir lors de la réception d’une nouvelle donnée (onNext).

À présent, si nous récupérons la valeur du compteur via

contract.counter().call();

la valeur retournée est égale à 1.

Souscrire à des événements de smart-contract

Le smart-contract compteur propose d’être notifié toutes les 5 incrémentations. Voici comment souscrire à cette notification.

contract.fivesMore().watch()
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(c => {
         System.out.println(c);
         /*
         You've been notified that counter was  incremented 5 more times
 
         Parameter 'c' has the current counter's value.
         You can directly update your app view
         */
     });

De la même manière que lors de l’appel à sendTransactionAndGetMined, nous redirigeons le flux du traitement sur le thread principal d’Android. L’intérieur de la fonction call() sera exécuté à chaque fois que l’événement fivesMore sera émis sur la blockchain.

That’s all folks

Vous êtes à présent prêts à développer votre première application Android décentralisée, contenant un nœud blockchain complet. À ce stade, vous pourrez :

  • vous connecter à une blockchain depuis votre smartphone
  • créer des portefeuilles virtuels
  • émettre des transactions sur le réseau,
  • analyser en profondeur la blockchain
  • récupérer un smart-contract déployé sur une blockchain
  • communiquer avec un smart-contract déployé
  • être notifié lorsqu’une transaction est inscrite dans la blockchain
  • être notifié lors de l’émission d’un événement Solidity d’un smart-contract

Important : ce projet est actuellement en cours de développement et vous est proposé en version alpha, non stable. Il est destiné à un usage expérimental et ne doit être en aucun cas être utilisé en production.

La librairie va continuer à évoluer. Par exemple, nous souhaitons limiter les contraintes d’architecture de l’application Android en déplaçant le lancement du service Geth en dehors de la classe Application. De plus, pour le moment, toutes les méthodes de l’API exposée par Geth ne sont pas implémentées.

0 commentaires

votre commentaire

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

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

Inscription newsletter

Ne manquez plus nos derniers articles !