Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Bonjour à tous !

Récemment, Waves Labs a annoncé un concours pour les développeurs lié au lancement en testnet de l’extension du langage de contrats intelligents RIDE pour les applications décentralisées Ride4Dapps !

Nous avons choisi le cas de DAO, car Ventuary prévoit de développer une dApp avec des fonctions sociales : vote, collecte de fonds, gestion fiduciaire, etc.
Nous avons commencé par un exemple simple dans la session de questions-réponses et dans RIDE IDE — un exemple avec un portefeuille commun.

Examinons cet exemple, vérifions les hypothèses et discutons de certaines étrangetés :

Prenons Alice — propriétaire de la dApp
Boob et Cooper — partenaires d'Alice, cofondateurs de Alice-BC DAO
Neli — propriétaire d'entreprise, qui a besoin de financement
Banque — banque qui distribue des jetons

Étape 1. Initialisation des soldes

Pour obtenir des jetons sur le testnet waves, vous devez vous rendre sur le robinet et indiquer l'adresse à laquelle envoyer les jetons.
L'adresse peut être trouvée dans l'IDE, en affichant les données du compte.
Nous attribuons 10 WAVES à la Banque. Ensuite, vérifions qu'ils ont été reçus via l'explorateur de blocs et de transactions : explorateur

Maintenant, distribuons des jetons de la Banque aux autres participants. (Remarque : Toutes les transactions sur le réseau waves ne sont pas gratuites, donc tout participant doit avoir un solde positif minimal pour effectuer des transactions).

1 WAVES = 100000000 unités (wavelets), car les montants ne peuvent être que des entiers
0.01 WAVES (Frais de transaction) = 1000000

Banque -> [3 WAVES] -> Alice, via TransferTransaction (Type : 4).

Vérifions que env.SEED, avec lequel les transactions sont signées, correspond à notre Banque :
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Si vous n'avez pas de correspondance pour la phrase seed, changez simplement d'onglet dans Comptes et vérifiez à nouveau.
Après cela, nous créons, annonçons et signons la transaction pour transférer 3 WAVES à Alice.
Vous pouvez également connaître les données d'Alice via la variable env.accounts. La numérotation commence à 0, donc Alice est env.accounts[1].
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))

Le résultat peut également être observé dans l'explorateur, le lien vers celui-ci nous sera retourné immédiatement après l'exécution de la transaction.

Nous nous assurons que le solde d'Alice a été crédité de 3 WAVES, et que le solde de la Banque reste 10 — 3 — 0.01 = 0.699.
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Nous envoyons à Boob et Cooper 3 WAVES chacun, et à Neli, Xena et Mark 0.2 WAVES de la même manière.
(Remarque : Nous avons commis une erreur d'un chiffre et avons envoyé à Neli 0.02 WAVES. Soyez attentif !)

broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))

Après avoir crédité les soldes de tous les participants, nous voyons :
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Étape 2. Création du compte dApp

Nous avons convenu qu'Alice serait la créatrice et propriétaire de l'application décentralisée.
Dans Comptes, nous l'installons comme SEED et vérifions que env.SEED correspond à Alice.

Essayons d'installer sur le compte d'Alice le script (contrat) le plus simple possible.
Les contrats intelligents dans Waves sont des prédicats qui interdisent ou permettent l'exécution d'un certain type de transaction sortante selon certaines conditions. Dans ce cas, la condition est ALWAYS. Le code du contrat est true. Nous appelons deploy().

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

La commission pour la transaction setScript est de 1400000/100000000 = 0.014 WAVES. Alice a maintenant 2.986 WAVES sur son solde.

Essayons maintenant d'installer sur le compte d'Alice une logique de contrat intelligent plus complexe, décrite dans l'exemple

Ride4Dapps inclut maintenant 2 nouveaux types d'annotations :

  1. @Callable(i) — accepte comme paramètre i, des données sur quel compte a appelé/signé la transaction. C'est le résultat de cette fonction qui détermine le changement d'état du compte dApp. D'autres comptes peuvent créer des transactions et exécuter des fonctions avec cette annotation et changer l'état du compte dApp.
  2. @Verifier(tx) — Vérificateur de la transaction avec le paramètre tx de la transaction. Correspond à la logique des prédicats de RIDE. C'est dans cette expression que l'on peut autoriser ou interdire de futurs changements à la logique des contrats intelligents sur le compte dApp.

Faisons dApp le compte comme portefeuille commun pour tous les participants.
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Pour vérifier quel contrat est actuellement actif sur le compte, vous pouvez copier le code base64 du contrat intelligent dans l'explorateur de blocs et le reconnaître à l'aide du décompilateur (par exemple)
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Nous nous assurons que la logique du contrat intelligent correspond à ce que nous attendons.
Alice a maintenant 2.972 WAVES sur son solde.

Ce dApp suit combien chaque participant contribue au fonds commun par le mécanisme data transaction — DataEntry(currentKey, newAmount), où currentKey est le compte qui appelle la fonction deposit, et newAmount est le montant du solde rechargé.

Bob et Cooper déposent chacun 1 WAVES sur le compte dApp.
Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Nous faisons une erreur et la transaction échoue. Bien que nous ayons vérifié que nous faisons la transaction au nom de Bob, nous avons fait une erreur dans l'indice et avons spécifié le compte Bank, qui n'a pas de contrat intelligent. Il convient de noter un point important : aucune commission n'est prélevée pour les tentatives infructueuses d'initier des transactions ! Alice a maintenant 2.972 WAVES sur son solde. Bob a 3 WAVES.

Bob a envoyé 1 WAVES sur le compte dApp.

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Bob a maintenant 1.99 WAVES. Cela signifie que Bob a payé 0.01 WAVES de commission.

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Alice avait 2.972 WAVES sur son solde, elle a maintenant 3.972. Une transaction est également enregistrée sur le compte d'Alice, mais aucune commission n'a été prélevée sur le compte dApp (Alice).
Après que Cooper a également approvisionné le compte d'Alice, son solde est passé à 4.972 WAVES.

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

On peut savoir à qui appartient combien de WAVES dans le portefeuille commun en consultant l'explorateur de blocs dans l'onglet Données.

Cooper a décidé de ne pas laisser le montant de 1 WAVES dans le portefeuille commun et a décidé de retirer la moitié des fonds. Pour cela, il doit appeler la fonction withdraw.

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Cependant, nous nous sommes à nouveau trompés, car la fonction withdraw a des paramètres totalement différents, une autre signature. Lorsque vous concevez des contrats intelligents sur RIDE4DAPPS, il convient de faire attention à ce point.

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Cooper a maintenant 2.48 WAVES sur son solde. Donc 3 WAVES — 1 — 0.01, puis + 0.5 — 0.01. Par conséquent, chaque appel à deposit et withdraw coûte 0.01 WAVES. En fin de compte, dans le tableau des propriétaires de dApps, les enregistrements ont changé comme suit.

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Bob a également décidé de retirer une certain montant du portefeuille commun, mais s'est trompé et a essayé de retirer 1.5 WAVES.

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Cependant, dans le contrat intelligent, il y avait une vérification pour une telle situation.

Xena est une escroc, elle a essayé de retirer 1 WAVES du compte commun.

Apprenons à écrire des contrats intelligents Waves en RIDE et RIDE4DAPPS. Partie 1 (Portefeuille Multijoueur)

Elle n'a également rien pu faire.

Dans la prochaine partie, nous examinerons des points plus complexes liés à l'imperfection du compte dApp d'Alice.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster