Guide des transactions Grin sur le réseau de test « floonet » par Vivien Boucher, étudiant à l’ESGI

6
32

Vivien Boucher est étudiant en bachelor « blockchain » à l’ESGI, un cursus créé par Eureka Certification, organisme de formation certifié et certifiant sur le sujet depuis 2014. Il est en alternance chez PolkaTulk et travail sur les questions de copyrights via le projet www.scenso.tv. Retrouvez l’actualité de Eureka sur Twitter, ainsi que celle de l’ESGI, découvrez les grandes conférences organisées par Eureka sur YouTube. Pour vous former à la « blockchain », contactez l’équipe pédagogique de Eureka ou bien directement l’administration de l’ESGI.

Dans mon dernier article, j’ai détaillé comment configurer un noeud et un mineur sur le réseau Grin. La prochaine étape logique était de paramétrer une transaction. Je vais essayer d’expliquer le protocole de transaction MimbleWimble de manière la plus simple possible. Si vous souhaitez en apprendre plus, vous trouverez un tas de sources à la fin de cet article pour mieux comprendre MimbleWimble et les courbes elliptiques cryptographiques.

A l’heure actuelle aucune solution de portefeuille n’est disponible pour le système d’exploitation Windows (une version est néanmoins en cours de développement rassurez-vous), vous ne pouvez reproduire cet exercice uniquement sous MAC ou Linux.

Avant de faire nos transactions, petit rappel sur le concept principal de Grin qui est la confidentialité totale des transactions, ce qui signifie que l’on ne retrouve ni adresse ni montant publics dans les transactions Grin. Contrairement à ce que nous avons l’habitude de voir sur les transactions Bitcoin ou Ethereum, où les différents protagonistes et le montant des transactions sont clairement identifiables.

Une autre différence entre Grin (MimbleWimble) et Bitcoin est que sur Bitcoin les transactions sont chainées, elles dépendent les unes des autres. En effet, chaque entrée (input) dépend d’une sortie (output), et vice et versa. Sur MimbleWimble les sorties sont situées sur une courbe elliptique cryptographique et signées par les différentes parties de la transactions. Cette signature entre les différentes parties à pour effet de changer le propriétaire de la sortie et donc d’obtenir le contrôle des fonds.

Pour nous initier aux transactions Grin la meilleure solution est d’utiliser un réseau de test. Sur Grin ce réseau se nomme « floonet ». Toutes les opérations réalisées ici seront donc réalisées avec des Grins de test qui n’ont aucune valeur.

Pour obtenir des grins à échanger vous avez deux méthodes :
– Trouver un Faucet : Les faucets sont des gens qui vous proposent des jetons gratuitement pour faire des tests.
– Miner vous même des grins sur le testnet : La difficulté sur le réseau de test étant réduite par rapport au réseau principal, il est facile de rapidement miner quelques grins. Cependant il faut savoir que les revenus issus de la Coinbase sont verrouillés pendant environ 24 heures.

Actuellement je n’ai trouvé aucun faucet disponible, néanmoins je vous propose de m’envoyer dans les commentaires ou par email : 0tp4[at]protonmail[dot]com votre adresse GrinBox et je vous ferai parvenir quelques jetons de tests pour vos expérimentations.

 

1. Qu’est-ce qu’une adresse GrinBox ?

Grinbox est un protocole d’adresse construit comme une seconde couche au protocole Grin, il permet d’avoir une adresse sur le réseau et de pouvoir ainsi établir une connexion entre deux personnes souhaitant s’échanger des grins via un portefeuille spécifique le “WALLET 713”.

La principale chose que vous devez savoir est que les adresses ne font pas parties du protocole de base et que si vous les utilisez sur le réseau principal vous le faites à vos risques et périls, tant pour la confidentialité que pour l’intégrité de vos transactions. Pour que la transaction se réalise il faudra que votre Wallet713 soit démarré (online) lors de la transaction !

 

2. Comment générer une adresse Grinbox via le portefeuille Wallet713 ?

Pour obtenir une adresse rendez-vous sur github.com/vault713/wallet713/releases et téléchargez la dernière release. Pour lancer le wallet sur le testnet :
./wallet713 --floonet

Une fois dans l’interface créer un portefeuille avec la commande :
init -p monMotDePasse

Votre adresse GrinBox va apparaître en plus de vos informations traditionnelles de Wallet :
Grin

Pour réaliser vos transactions vous aurez besoin :

1- d’un Serveur Grin, qui fera office de noeud réseau et de portefeuille : github.com/mimblewimble/grin/releases. Une fois téléchargé décompressez l’archive et lancez le serveur avec la commande “./grin --floonet”. La synchronisation de la blockchain peut prendre un peu de temps. Vous devrez laisser ce terminal ouvert durant tout l’exercice, c’est lui qui sera consulté pour connaître le solde de votre compte Grin. Pour initier un portefeuille sur le testnet dans un terminal : ./grin --floonet wallet init

2- d’un second portefeuille : Wallet713 : github.com/vault713/wallet713/releases

Dans un second terminal : Création du portefeuille 1 sur WALLET713 :
Grin

Après avoir miné ou avoir reçu des jetons sur le testnet, vous devez disposer désormais d’un wallet avec des fonds. Pour afficher ces fonds en fonctions des wallets :
Grin wallet : ./grin --floonet wallet info
Wallet713 : ./wallet713 puis la commande info
Grin

Petit point sur les informations ci-dessus :
Total : Le nombre total de grins que vous possédez
Immature Coinbase : Nombre de grins issus de la Coinbase (récompense de bloc) en attente de confirmation.
Awaiting Confirmation : Votre solde en attente de confirmation.
Locked by previous transaction : Transactions que vous avez émises en attente de confirmation.

La confirmation des transactions : Le nombre de confirmations correspond au nombre de blocs validés depuis l’émission de la transaction. Plus le nombre de confirmations est élevé, plus la transaction est fiable. Cette solution de « confirmation » permet d’être sûr qu’une grande partie du réseau a bien acté le bloc contenant votre transaction. À titre d’exemple, il faut attendre six confirmations pour valider une transaction de dépôt sur Bitcoin.

Par mesure de sécurité les grins issus de la Coinbase sont verrouillés pendant un nombre de blocs plus long, soit 1440 confirmations. Ce qui, avec un temps de bloc d’environ 60 secondes nous donne 24 heures d’attente avant de pouvoir les utiliser.

 

3. Comment envoyer des Grins ?

Avec Grin Wallet il y a deux méthodes pour envoyer des grins :

– Via un échange de fichier : pratique pour débuter, ne nécessite pas de configuration particulière. Le procédé peut s’avérer laborieux car il nécessite deux interactions de la part de l’émetteur de la transaction et une de la part du récepteur.

– Via le protocole HTTP : Rapide, ne nécessite qu’une seule manipulation. Mais cette méthode pose problème car pour échanger avec quelqu’un à l’extérieur de votre réseau il vous faudra disposer d’une IP publique (qui peut être amenée à changer en fonction de votre fournisseur de service internet) et il vous faudra également ouvrir des ports dans votre pare-feu et rediriger le trafic entrant vers votre machine… Pas très pratique tout ça… Par exemple le protocole GrinBox permet d’établir une http entre deux participants, mais cela crée un intermédiaire entre vous et votre interlocuteur avant l’établissement de la connexion.

 

4. Préconisation sur le paiement via fichier

Pour des raisons de praticité, le portefeuille ne contenant pas de fonds sera le portefeuille de Bob. Les transactions sur Grin sont réalisées par les deux parties de la transaction. Chacun à son tour va signer la transaction afin que les deux parties puissent la déchiffrer.

Dans Grin la dépense des outputs s’effectue comme sur Bitcoin. Par exemple pour envoyer 20 grins à Bob à partir d’un output de 40, je vais devoir envoyer une transaction de 20 à Bob, ainsi qu’une autre transaction de 20 à moi-même pour récupérer le change (output de change).

 

Comment Alice va payer Bob sur le Grin network ?

a. Préparation de la transaction par Alice

Dans le terminal, nous allons créer un fichier pour envoyer 10 grins à Bob. Pour se faire l’on utilise la commande : ./grin --floonet wallet send -m “nomDuFichier.tx” “montant”
Ce qui donne : ./grin --floonet wallet send -m file -d ma_transaction.tx 10$
Le fichier est créé par défaut dans le répertoire de l’application Grin ou Wallet713.
Grin

Ce fichier de transaction qui vient d’être créé contient :

– La valeur de la transaction que l’on souhaite échanger entre nos deux portefeuilles (dans ce cas, 10).
TX UUID : identificateur unique utilisé pour identifier cette transaction.
Frais TX : Les frais de transaction
lock_height : numéro de bloc à partir duquel cette transaction devient valide.
Output TX : le ou les Outputs non utilisés que je vais utiliser comme entrées pour la transaction.
– L’output de change.
– Un nombre aléatoire non divulgué qui est considéré comme un engagement, ce nombre aléatoire étant nécessaire pour vérifier et dépenser la transaction que je viens de créer, c’est une preuve cryptographique que je possède ce nombre et donc que je suis en mesure de payer Bob.
– La somme de tous les « binding factor » des outputs que je vais utiliser dans la transaction, encore une fois cela prouve que je suis en mesure de dépenser les outputs de la transaction.

Les nombres aléatoires présents dans les transactions sont de très grands nombres (clés privées).

 

b. Préparation de la transaction par Bob

Maintenant c’est à Bob de jouer, il lui faut lancer son gestionnaire de portefeuille :
./wallet713 --floonet
Puis créer un portefeuille, chiffré par un mot de passe (Bob adore la sécurité) :
init -p monmotdepasse
Bob place le fichier “ma_transaction.tx” que je lui ai envoyé dans le dossier de l’application Wallet713.
Grin

Puis Bob va importer cette transaction dans son portefeuille.
Grin

Lors de cette étape Bob va créer un message à partir des frais de transaction et du « lock_height ». Il va également choisir un nombre secret « binding factor » qu’il va intégrer dans une signature de Schnorr. La signature de Schnorr est un challenge cryptographique qui permet de vérifier que les deux parties de la transaction sont en possession d’un secret sans pour autant le révéler.

Grâce à ce nombre, une fois la transaction publiée et minée par le réseau, Bob sera le propriétaire de l’output et je ne pourrais plus le dépenser car je ne connaîtrais pas son nombre secret.

Bob va ainsi générer un fichier « nomDeLaTransaction.tx.response » qu’il va devoir à son tour m’envoyer.

 

c. Finalisation de la transaction de grins entre Alice et Bob

Je réceptionne ce fichier et le place à mon tour dans le répertoire de mon portefeuille et confirme la transaction via la commande :
./grin --floonet wallet finalize -i ma_transaction.tx.response

Lors de cette dernière opération mon portefeuille va résoudre le challenge de Schnorr envoyé par Bob. Cette opération va me permettre de vérifier que
– Bob sait combien de Grin il va recevoir (10).
– Bob connaît son nombre secret.
– Bob connaît le « binding factor » pour les 10 grins qu’il s’attend à recevoir.

Et voilà, Bob a bien reçu les 10 grins que je viens de lui envoyer.
Grin

 

d. Comment vérifier l’intégrité de la transaction de grins ?

Prenons par exemple cette transaction :
Les valeurs • G sont les nombres aléatoires qui ont été utilisés durant la transaction. Les valeurs • H sont les montants cachés des transactions.
Les points G et H étant deux points définis sur la courbe elliptique cryptographique de MimbleWimble.

(125 • G) +( 30 • H )+( 40 • G) + (10 • H) – (16 • G) – ( 40 • H) = (149 • G) +(0 • H)

Le résultat 0 • H est tout à fait normal car lors de cette transaction aucun grin n’a été créé (output == Input).

Mais pour que la transaction soit complètement valide il faut également que 149 • G corresponde à un point de la courbe elliptique cryptographique utilisée par MimbleWimble.

Cette équation permet de valider une transaction mais également de vérifier qu’aucune monnaie n’a été créée à partir de rien.

Bien sûr, l’équation normale est beaucoup plus compliquée car rappelez-vous : nous ne connaissons ni les montants ni les nombres aléatoires de cette transaction ! Cette signature qui est attachée à toutes les transactions est appelée « transaction kernel », elle est vérifiée par tous les validateurs du réseau.

 


Sources :

– Introduction à MimbleWimble :
https://github.com/mimblewimble/grin/blob/master/doc/intro.md
– Approfondir les transactions MimbleWimble :
https://medium.com/beam-mw/mimblewimble-explained-like-youre-12-d779a5bb483d
– Approfondir les transactions MimbleWimble :
https://medium.com/@brandonarvanaghi/grin-transactions-explained-step-by-step-fdceb905a853
– Introduction simple au fonctionnement MimbleWimble :
https://youtu.be/IduWUrsv7_M
– Les courbes Elliptiques Cryptographiques :
https://youtu.be/7BguILcoXkg
– Signatures de Schnoor :
https://youtu.be/MZrGiPTAjmE
– Site de l’équipe à l’origine de Wallet713 :
https://713.mw/