Maîtriser le Web 3.0 avec Waves #4

Christophe Verdot
Maîtriser le Web 3.0 avec Waves
8 min readJul 23, 2019

Module #4 Pratiquer avec RIDE for dApps

Hey! C’est le cours en ligne «Maîtriser le Web 3.0 avec Waves». Module 4.

Dans ce module, nous allons utiliser des smart contract et apprendre à travailler avec les principales bibliothèques Waves.

Sujets de ce module :

  • Smart Contracts et dApps
  • Coupon Bazar Web3.0 dApp
  • Système de vote “envoyer / révéler” — Quiz et challenges
  • Pratique

Le smart contract est un code source informatique ou un programme qui peut être exécuté dans un environnement distribué tel qu’un réseau Blockchain. Toutes les opérations et les résultats d’exécution sont stockés dans la Blockchain.

Dans cette définition, le smart contract n’est pas un contrat entre des parties, mais un protocole de coopération entre utilisateurs, ainsi qu’entre utilisateur et ordinateur, voir entre ordinateurs, conformément aux règles décrites dans le code source du smart contract.

Il existe deux types différents de smart contract Waves : Smart Accounts et Smart Assets. Tout compte Waves peut être converti en smart account en appliquant un account-script (script de compte) spécial. Le script de compte est un code en langage RIDE qui contient un ensemble de conditions pour autoriser et refuser différents types de transactions sortantes.

Afin de faciliter le processus de développement de dApp pour les développeurs, le langage de smart contract RIDE-Waves propose deux types de fonctions: @Verifier et @Callable.

Les fonctions @Callable peuvent être appelées par des utilisateurs depuis l’extérieurs. À la suite de l’exécutiond’une fonction @Callable, de nouvelles informations peuvent être insérées ou mises à jour dans le stockage de données clé-valeur du compte dApp ou (et) des fonds peuvent être transférés du compte dApp vers le compte “appelant” ou vers un autre compte, en fonction de la logique du code associé au compte dApp. Dans notre cas, dApp et smart account sont la même entité.

Les fonctions @Callable fonctionnent avec deux types d’arguments d’entrée: args et payment. Waves API a une fonction spéciale pour appeler les fonctions @Callable — invokeScript. Regardez l’exemple ci-dessous: “Ici, vous pouvez voir WriteSet dans le code RIDE du smart account. Cela signifie que le résultat de cette invocation sera écrit dans le stockage clé-valeur du compte dApp.”

Regardez le deuxième exemple ci-dessous: “Ici, vous pouvez voir TransferSet et ScriptResult dans le code RIDE du smart contract. Cela signifie que le résultat de cette invocation sera écrit dans le stockage de la valeur clé de la dApp et que des fonds seront également transférés à une adresse en parallèle”.

Nous pouvons utiliser n’importe quelle combinaison de WriteSet, TransferSet ou les deux ensemble via la méthode ScriptResult.

Toutes les opérations sont atomiques !

Rappel : nous construisons une place de marché décentralisé Web 3.0 pour des coupons de réduction — le «Coupon Bazaar».

Les utilisateurs recherchent des bon de récuction sur des produits et services et peuvent les acheter à un prix modique sur le marché.

Chaque coupon — est un actif numérique qui représente une réduction spéciale du fournisseur.

“Coupon Bazaar” est une place de marché. Il fournit des services recherche, de paiement et de livraison entre fournisseurs et clients.

Utilisons les fonctions @Callable pour implémenter la dApp et toutes ses fonctionnalités décrites précédemment ! Mais tout d’abord, regardez le code ci-dessous: “Vous pouvez constater que nous sommes en mesure de déclarer toutes les fonctions personnalisées dans RIDE. Nous travaillons principalement avec le stockage clé-valeur du compte dApp, implémentons donc certaines fonctions dans ce sens.”

Nous sommes maintenant prêts à implémenter la fonctionnalité pour les fournisseurs: “Ajouter un article” (addItem).

S’il vous plaît, ouvrez l’IDE et ajoutez cette fonctionnalité.

Déployez le script dApp de l’étape précédente et appelez “Ajouter un élément” (addItem) à partir du fichier de test Java Script.

Ouvrez le stockage de données du compte dApp dans l’explorateur et mettez-le résultat ici:

Les utilisateurs recherchent des remises sur les produits et services et peuvent les acheter à un prix modique sur le marché.

Implémentons la fonction “Achat” pour le client.

Comme vous pouvez le constater, notre application dispose d’une clé spéciale pour la comptabilisation du solde du fournisseur. En outre, le client peut acheter le même coupon plusieurs fois. Tous les achats seront enregistrés sur le stockage du compte dApp.

Implémentez la fonctionnalité d’achat et mettez ici le changement d’état depuis l’explorer de transactions.

La dApp “Coupon Bazaar” dispose d’une clé spéciale pour la comptabilisation du solde du fournisseur. Pour retirer des fonds sur le compte personnel du fournisseur, nous devons implémenter la fonction de retrait. Faisons cela:

Implémentez la fonctionnalité de retrait et mettez ici le changement d’état de l’explorer de transactions.

Imaginons que les membres de la communauté “Coupon Bazaar” souhaitent voter pour la promotion ou le retrait de certains produits. Ils peuvent le faire en utilisant une procédure de vote privée.

Mais … attendez un moment …
Tout dans le réseau public Blockchain est transparent. Ainsi, tous les votes seront ouverts aux autres pendant l’élection, et le vote d’un membre pourra influer sur les décisions des autres.

Le système “Commit-Reveal” nous aidera à éviter cela.

Nous avons maintenant deux étapes:

Étape de validation (Commit) — nous collectons ici les votes cryptés en utilisant la fonction de hachage et une chaîne aléatoire (salt).

Étape de révélation (Reveal) — nous collectons ici les votes déchiffrés et comparons leurs hachages aux hachages enregistrés.
Comme vous pouvez le constater, il n’y a aucun moyen de modifier le vote une fois l’étape de validation terminée. Personne ne connaît les votes avant la révélation.

Mettons cela en pratique! Mais tout d’abord, nous devons déclarer des variables et des fonctions:

Étape de validation (commit) — nous collectons ici les votes chiffrés en utilisant la fonction de hachage et une chaîne aléatoire (salt):

Suivant

let commits = ["G8ZMEiXEGefpEdgEFN5mYr6oEEABJrtcBBLkZf6Ujmcq",

"Bf2yysmAoroXAzVidK1wxuVYpRGLy1nWe6cNAGXBf5Hi",

"ACHSFMGY7bp3aHryCLYc499XvojeGrgBp59zSvwgLnkQ"]

let reveals = ["delisted", "featured", "featured"]

let salts = ["random1", "random2", "random3"]

Implémentez la fonctionnalité commit (en utilisant les hachages et les votes du code ci-dessus) dans notre application dApp et mettez les modifications de l'état dans le transactions explorer ici :

Essayez de faire trois commits à partir de comptes différents (avec les données de l’étape précédente) et mettez ici les données de valeur-clé du stockage dApp:

Étape de révélation (Reveal) — nous collectons ici les votes déchiffrés et comparons leurs hachages aux hachages enregistrés.
Comme vous pouvez le constater, il n’y a aucun moyen de modifier le vote une fois l’étape de validation terminée.

Personne ne connaît les votes avant la révélation. Une fois que l’étape de révélation est terminée, le résultat du vote est considéré comme un changement de statut.

Essayez de faire trois itérations de révélation à partir de comptes différents (avec les données des étapes précédentes) et mettez ici les “changements d’état” de la troisième transaction “voteReveal”:

Rappel : nous construisons un marché Web3 décentralisé pour des coupons de réduction — le «Coupons Bazaar».

Les utilisateurs recherchent des remises sur des produits et services et peuvent les acheter à un prix modique sur le marché.

Chaque coupon — est un actif numérique qui représente une réduction spéciale du fournisseur.

Dans cette étape, nous allons essayer d’améliorer notre application de base du “Module 1”.

Ouvrez github et faites un fork du repository mweb3waves (https://github.com/AlekseiPupyshev/mweb3waves) vers votre compte github.

Clonez-le sur votre ordinateur local et passez sur la branche bchintegration.

git clone https://github.com/**your*account**/mweb3waves.git;git checkout bchintegration;npm install;npm run build;npm run server;

Lancez la commande npm et ouvrez http://localhost:5000/. Ceci est la nouvelle base de notre “Coupon Bazaar”.

Regardons le code source (package.json et index.jsx):

Ici vous pouvez voir quelques changements:

1. De nouvelles bibliothèques importantes ont été incluses dans le projet — waves-transactions et waves-crypto.

2. Les fonctions les plus importantes ont été importées dans l’application React.

Vous connaissez déjà: {invokeScript, broadcast, waitForTx} les fonctions utilisées dans les test Java Script via l’IDE.

nodeInteraction — nous permettra d’obtenir des données clé-valeur du stockage dApp.

Faisons quelques exercices !

Ouvrez la console de votre navigateur via http: // localhost: 5000 / et mettez le résultat imprimé par console.log (JSON.stringify (v)) :

Comment obtenir des hashes pour la mise en place de l’étape de validation?

let commits = ["G8ZMEiXEGefpEdgEFN5mYr6oEEABJrtcBBLkZf6Ujmcq", "Bf2yysmAoroXAzVidK1wxuVYpRGLy1nWe6cNAGXBf5Hi", "ACHSFMGY7bp3aHryCLYc499XvojeGrgBp59zSvwgLnkQ"] 
let reveals = ["delisted", "featured", "featured"]
let salts = ["random1", "random2", "random3"]

Ouvrez la console du navigateur via http://localhost:5000/ et essayez d’appeler les fonctions “crypto”:

Mettez ici le hash pour :

"delisted" + "random4"

À l’aide de l’objet nodeInteraction, entrez le code pour obtenir le numéro de bloc actuel de la Blockchaine (height) :

Indice :

https://wavesplatform.github.io/waves-transactions/globals.html

--

--

Christophe Verdot
Maîtriser le Web 3.0 avec Waves

Web Developer - Waves Platform France Tech Ambassador— Waves Platform Lead for Philippines - Signature Chain founder and Lead Developer / signature-chain.com