
Bonjour à tous !
Récemment, Waves Labs 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 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 et dans — un exemple avec .
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 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 :
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 :


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].

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 .
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.


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 :

É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().

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
Ride4Dapps inclut maintenant 2 nouveaux types d'annotations :
- @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.
- @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.

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 ()



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.

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 }]}))
Bob a maintenant 1.99 WAVES. Cela signifie que Bob a payé 0.01 WAVES de commission.

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.

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.

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.

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.

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.

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.

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
