Archives mensuelles : mars 2019

Développer une Application Blockchain sur Android – Partie 1

Ce poste vient comme suite logique à deux premiers posts pour créer un Smart Contract pour Ethereum et le deployer sur un testnet , je voulais créer une DApp Native : une application sous Android qui permettrait d'utiliser ce contrat de façon intuitive. 

La communauté Ethereum ne tarit pas de tutoriels pour créer des DApp "Web", mais pour les DApp Natives sur Android tous les choix techniques et UX sont à faire. Ce post est dédié à cela.

Revu et actualisé le 27 mars 2018

L'écosystème dans lequel une DApp s'intègre ?

Un DApp se distingue d'une application lambda par le fait qu'elle peut interagir avec un Blockchain, notemment :

  1. Créer des transactions en cryptomonnaie: des transferts simples, des interactions avec des Smart Contracts …

  2. Lire des informations sur des comptes blockchain et des transactions (solde, état d'exécution …).

  3. Accéder aux informations publiées par des Smart Contracts.

Une DApp Native doit pour cela interagir avec :

  1. La blockchain : Réseau qui permet d'accéder aux Smart Contracts, suivre la validation des transactions…

  2. Le Wallet : Application à la quelle l'utilisateur fait confiance pour créer des transactions sur son compte.  

Interagir avec le Wallet

Chaque compte (adresse) dans une blockchain est lié à une clé privée : on peut la représenter comme une séquence de caractères:

8F241D8E4169D4118FD6158BFE81D6158BFE81ADD961ADD961241D8E4169D411

Exemple de clé privée 256 bit

Quiconque connais cette séquences peut exécuter des transactions sur le compte associé. Par exemple : dépenser de la cryptomonnaie.

Le Wallet est l'application, hautement sécurisée, dans laquelle l'utilisateur génère et garde cette clé. Des exemples de Wallet sur Android sont TrustStatus, WallETH … Le Wallet doit signer des transactions avec cette clé pour qu'elles puissent être acceptées sur un blockchain.

On pourrait utiliser une librairie comme KEthereum pour stocker ces clés directement dans une DApp et se passer d'un Wallet séparé, mais cela nuirait à la sécurité et à la user expérience. En effet, cela voudrait dire que l'utilisateur doit faire confiance à notre DApp pour dépenser de la Cryptomonnaie en son nom, ce serait l'équivalent de donner le code PIN de votre carte bancaire à un commerçant. La DApp doit pouvoir interagir avec le Wallet pour faire signer les transactions.

Après étude, j'ai décidé de partir sur le Wallet Open Source WallETH pour deux raisons :

  1. En regardant le code source, j'ai découvert que WallETH propose un Intent Android pour signer les transactions décrites au format ERC681, ce qui est un bon début

  2. Au besoin, il me sera possible d'enrichir cette interface puisque WallETH est Open Source.

Interagir avec la Blockchain

Là aussi, il y a un choix à faire. Il existe en résumé 3 modes pour interagir avec la blockchain :

  • Full Client : Un full client télécharge et maintient une copie complète de la blockchain en local et participe directement au réseau P2P de la blockchain. Pour un client mobile autant oublier tout de suite cette piste : vu la taille et la vitesse à laquelle va le mainnet même un PC de mining a besoin de beaucoup de stockage et de temps pour se synchroniser.

  • Light Client : l'idée est de ne télécharger que les entêtes des blocks pour accélerer la synchronisation. Des libraires comme le package mobile de go-ethereum permettent d'en lancer un sur mobile mais les retours des développeurs restent assez mitigés :

    • Au premier lancement, cela prend parfois à l'application plusieurs minutes pour "se synchroniser" et devenir opérationnelle ce qui n'est pas acceptable de point de vue UX.

    • Même quand l'application n'est pas utilisée, elle doit télécharger les mises d'entêtes de la Blockchain ce qui est nuisible au contraintes de ressources limitées d'un appareil mobile. 

  • Ethereum définit des services standars JSON RPC : certains noeuds Ethereum exposent de tels services qui permettent d'interagir avec la blockchain sans devoir la télécharger en local. beaucoup de Wallets et DApps web semblent utiliser cette approche. 

De point de vue UX l'approche JSON RPC est la meilleure car elle offre une réponse immédiate. De point de vue technique aussi c'est celle qui s'adapte au mieux aux ressources limitées des appareils mobiles. Mais de point de vue sécurité, cette approche rompt avec l'idéal de décentralisation et oblige à faire confiance au fournisseur du service JSON/RPC.

Certaines librairies libres permettent de simplifier l'utilisation des services JSON/RPC sous Android comme Web3J et KEthereum . J'ai choisi la dernière car c'est la même qui est utilisée par WallETH ce qui permet une certaine cohérence. Coté serveur, il est possible de mettre en place son propre serveur JSON/RPC mais il plus rapide et fiable pour un prototype d'utiliser le service en ligne gratuit d'Infura, encore faut-il faire confiance à Infura.

UX Finale Retenue

L'UX finale retenue est donc : 

  1. L'Application crée une transaction : par exemple un payement d'une mensualité sur un Smart Contract Daret et la soumet au Wallet. Sous Android, le mécanisme le plus intuitif serait un Intent.

  2. Le Wallet s'active et demander la confirmation de l'utilisateur, signe avec la clé privée la transaction et la transmet à la Blockchain. Il renvoie alors l'identifiant de transaction à l'application.

  3. L'Application attend alors que la transaction soit validée par la Blockchain en utilisant un service JSON RPC.

  4. L'Application suit le status de la transaction jusqu'à son enregistrement ou son Refus. 

En conclusion

Beaucoup d'options sont possibles pour qu'une application Android interagisse avec une Blockchain, et il n'y a pas encore d'approche standard. Cela est  certainement dû à la complexité des compromis à faire entre sécurité, UX et limitation de ressources des appareils mobiles. De plus le Wallet peut être aussi bien Web ou Mobile, sur le même mobile que la DApp our un mobile différent …

Toujours est-il qu'on a abouti à une UX qui devrait être satisfaisante, ressemblant peu ou proue aux workflows de paiement en ligne. Dans le prochain post de la série, on mettra en oeuvre cette approche sur le cas concrêt sur Smart Contract Daret sur Ethereum .

Deployer un Smart Contract sur Ropsten un testnet d’Ethereum

Dans mon post précédent j'avais exposé les étapes pour développer et tester un Smart Contract du prêt solidaire Daret dans l'IDE REMIX. L'objectif maintenant est de le deployer sur une vraie blockchain. C'était plus facile que je ne croyais.

Les étapes principales seront :

  1. Créer quelques comptes.

  2. Les alimenter en ETH sur une blockchain de test.

  3. Déployer le Smart Contract.

  4. Executer l'inscription, le paiment mensuel et vérifier le bon fonctionnement.

Sur la blockchain Ethereum principale (mainnet) l'ETH  correspond réellement à de l'argent, cela rendrait le test assez coûteux. Heureusement qu'il existe des "testnet" : des blockchain de test ou l'on peut obtenir des ETH gratuitement mais qui ne peuvent bien entendu pas être échagés contre de la devise classique. C'est ce que j'ai utilisé.

Créer des comptes de Blockchain (des adresses)

Pour cela il faut un logiciel spécial (dit wallet). J'installé l'extension de navigateur MetaMask pour cela. 

Pour cela :

  1. J'ai ouvert https://metamask.io

  2. Cliqué sur installer l'extension et fait l'installation.

  3. Un wizard guide pas à pas pour créer un premier compte.

  4. A la fin MetaMask va vous proposer d'alimenter votre compte en ETH sur des places de marché. On n'en a pas besoin pour le test, il suffit de fermer la fenêtre :

 

Par défaut MetaMask se met sur la blockchain principale (mainnet), pour tester, j'ai basculé sur "Ropsten Test Network" grâce au menu en haut à droit de la page MetaMask.

Enfin, pour créé des comptes additionnels il faut cliquer sur "Create account" dans le menu en haut à droite :

Obtenir de l'ETH de test sur les comptes de test :

  1. Il faut aller au le Faucet Ropsten sur https://faucet.ropsten.be/,

  2. MetaMask avait déjà renseigné l'adresse du compte actuellement actif.

  3. J'ai cliqué sur "Send me test ether" et mon premier compte a été alimenté après quelques secondes.

  4. Malheureusement, faucet ne permet d'obtenir qu'un seul ETH par jour. Pour alimenter mes comptes de test j'ai donc transféré 0.2 ETH depuis mon compte principal sur chacun des comptes de test en utilisant le bouton "SEND":

  5. Une astuce tout de même : il suffit de cliquer sur le champs "Recipient Address" pour que MetaMask list les comptes existants : donc pas la peine de copier manuellement les adresses :

Modification du Smart Contract

Dans le le Smart Contract du post précédent la participation était payée en unité d'ETH directement, Il est donc impossible de participer avec 0.2 ETH du coup, j'ai utilisé cette nouvelle version où la contribution mensuelle est en wei (un milliardième de milliardième d'ETH) : https://github.com/omarbenhamid/pret-daret-sur-etherium/blob/c37ed0bb79a79966af15b751eeaabb76a15b7743/daret.sol

Une autre modification est que, dans cette nouvelle version, il n'y a plus besoin d'appeler executerMoisCourrant : dès que toutes les contribution du mois sont reçues, la collecte est envoyée au bénéficiaire du mois, sans action de sa part.

Deploiement et test du Smart Contract:

Le déploiement et test du smart contract se fait exactement comme l'exemple précédent sauf :

  1. Il faut recharger Remix (actualiser la page dans le Browser pour reconnaitre metamask)

  2. Dans l'onglet Run choisir le runtime "injected by Web 3":

  3. Charger le code du Smart Contract dans le fichier daret.sol dans REMIX, comme décrit dans le post précédent.

  4. Ensuite saisir les paramètres et cliquer sur deployer :

    Noter le 2 suivi de 15 zeros qui correspond 2/1000 d'ETH (= 2 finney en langage ethereum), en effet le "wei" est une très très petite unité. Suivi de d'une virgule suivi de 3 qui est le deuxième paramètre du constructeur du contract qui dit : Daret se déclanche dès qu'il y a 3 participants.

  5. Une fenêtre MetaMask va apparaître, il faut y confirmer la transaction

  6. Sur MetaMask ou dans les traces Remix: attendez que la transaction soit validée.

Bravo ! Le smart contrat est déployée sur une vraie blockchain.

Executer les tests

En mode connecté à la blockchain, Remix fonctionne comme en mode normal sauf 2 points:

Le premier est que REMIX ne propose dans l'onglet Run qu'un seul compte : le compte actif dans MetaMask. Pour basculer entre les différents comptes il faut donc :

  1. Ouvrir MetaMask.

  2. Choisir le compte souhaité dans le menu en haut à droite:

  3. Revenir dans REMIX. Vous verrez alors que c'est le noveau compte qui est devenu actif.

Le second est que vous aurez la fenêtre de confirmation MetaMask à chaque transaction qui s'affichera pour confirmer.

À ceci près, j'ai pu rejouer les tests comme cela a été fait dans le post précédent en utilisant 2 finney au lieur de 1ETH pour chaque contribution.

En conclusion

C'était relativement faclie de déployer et utiliser le Smart Contract Daret sur le testnet Ropsten. L'étape suivante est donc de développer une DApp: une application érgonomique pour utiliser ce Smart Contract. A suivre donc …