
Bonjour à tous!
Plus récemment, Waves Labs a annoncé un concours pour les développeurs dédié à la sortie de l'extension de langage de contrat intelligent RIDE pour les applications décentralisées Ride4Dapps sur le réseau de test!
Nous avons choisi le cas DAO, car Ventuary prévoit de développer une dApp avec des fonctions sociales: vote, levée de fonds, gestion de la confiance, etc.
Nous avons commencé avec un exemple simple dans la session de questions / réponses et dans l' IDE RIDE - un exemple avec un portefeuille commun .
Regardons cet exemple, testons des hypothèses et considérons quelques bizarreries:
Laissez-nous Alice - propriétaire dApp
Boob et Cooper sont partenaires d'Alice, co-fondateurs d'Alice-BC DAO
Neli est une propriétaire d'entreprise qui a besoin de financement
Bank - une banque qui distribue des jetons
Étape 1. Initialisation des soldes
Afin de recevoir des jetons dans le réseau de test des vagues, vous devez contacter faucet et spécifier l'adresse à laquelle les jetons doivent être envoyés.
L'adresse peut être trouvée dans l'EDI en révélant les informations de compte.
Sélectionnez Bank 10 WAVES. Après avoir vérifié qu'ils sont passés par l'explorateur de blocs et de transactions: navigateur
Maintenant, distribuons des jetons de la banque aux autres participants. (Remarques: Toutes les transactions sur le réseau Wave ne sont pas gratuites, par conséquent, un solde positif minimum est requis pour que tous les participants puissent effectuer les transactions).
1 ONDES = 100000000 unités (ondelettes), car les montants ne peuvent être que des nombres entiers
0,01 ONDES (frais de transaction) = 1000000
Banque -> [3 ONDES] -> Alice, via TransferTransaction (Type: 4).
Nous vérifions que la SEM env. À partir de laquelle les transactions sont signées correspond à notre banque:


Si vous n'avez pas de phrases de départ correspondantes, passez-y simplement dans l'onglet Comptes et vérifiez à nouveau.
Après cela, nous créons, annonçons et signons une transaction sur le transfert de 3 WAVES Alice.
Vous pouvez également apprendre les données d'Alice via la variable env.accounts. La numérotation commence à 0, respectivement Alice est env.accounts [1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))
Le résultat peut également être observé dans le navigateur, le lien vers celui-ci nous reviendra immédiatement après la transaction .
Nous nous assurons que le solde d'Alice est reconstitué par 3 ONDES et que 10 - 3 - 0,01 = 0,699 restent sur le solde bancaire.


Nous envoyons Boob et Cooper en 3 ONDES, et Neli, Xena et Mark en 0,2 ONDES de la même manière.
(Notes: Nous avons fait une erreur de caractère unique et envoyé Neli 0.02 WAVES. Soyez prudent!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))
Après avoir reconstitué les soldes de tous les participants, nous voyons:

Étape 2. Création d'un compte dApp
Nous avons convenu que le créateur et propriétaire de l'application décentralisée serait Alice.
Dans Comptes, installez-le en tant que SEED et vérifiez que env.SEED correspond à Alice.
Essayons d'installer sur le compte Alice le script (contrat) le plus simple possible.
Les contacts intelligents dans Waves sont des prédicats qui interdisent ou autorisent l'exécution de tout type de transaction sortante sous certaines conditions. Dans ce cas, cette condition est TOUJOURS. Le code du contrat est vrai. Nous appelons deploy ().

Frais pour la transaction setScript 1400000/100000000 = 0,014 VAGUES. Alice a 2 986 VAGUES sur son équilibre.
Essayons maintenant d'installer sur le compte Alice une logique de contrat intelligent plus complexe décrite dans l' exemple
Ride4Dapps comprend désormais 2 nouveaux types d'annotations:
- @Callable (i) - prend comme paramètre i, les données sur le compte qui a provoqué / signé la transaction. Le résultat de cette fonction détermine la modification de l'état du compte dApp. D'autres comptes peuvent créer des transactions et exécuter des fonctions avec cette annotation et modifier l'état du compte dApp.
- @Verifier (tx) - Vérificateur de transaction avec paramètre de transaction tx. Correspond à la logique de prédicat de RIDE. C'est dans cette expression que vous pouvez activer ou désactiver d'autres modifications de la logique des contrats intelligents sur un compte dApp.
Faites attention! Le point important est que, par défaut, le script sur le compte n'est pas égal à true , mais utilise une comparaison de signature et permet uniquement au propriétaire de la signature d'effectuer des transactions.
sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPk)
Sans une telle vérification, n'importe qui peut effectuer des transactions à partir d'un compte!
Faisons du compte dApp un portefeuille commun pour tous les participants.

Pour vérifier quel contrat est actuellement actif sur votre compte, vous pouvez copier le code base64 du contrat intelligent dans le navigateur de blocs et le reconnaître via le décompilateur ( par exemple )



Nous nous assurons que la logique du contrat intelligent correspond à ce que nous attendons.
Alice a 2.972 VAGUES sur son équilibre.
Cette dApp garde une trace de la contribution de chacun des participants au fonds commun via le mécanisme de transaction de données - DataEntry (currentKey, newAmount) , où currentKey est le compte qui appelle la fonction de dépôt et newAmount est la valeur du solde réapprovisionné.
Boob et Cooper effectuent leurs dépôts sur le compte dApp à 1 VAGUE chacun.

Nous faisons une erreur et la transaction ne passe pas. Puisque nous, malgré le fait que nous étions convaincus que nous effectuons une transaction pour le compte de Bob, nous avons fait une erreur dans l'index et indiqué un compte bancaire qui n'a pas de contrat intelligent. Ici, il convient de noter un point important - pour les tentatives infructueuses d'initier des transactions, la commission n'est pas retirée! Alice a 2.972 VAGUES sur son équilibre. Bob 3 a des VAGUES.
Bob a envoyé 1 WAVES au compte dApp.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

Il reste 1,99 WAVES à Bob. Autrement dit, Bob a payé 0,01 commission WAVES

Alice avait 2.972 VAGUES sur son bilan, c'est devenu 3.972. Une transaction a également été enregistrée sur le compte d'Alice, mais aucune commission n'a été déduite du compte dApp (Alice).
Après que Cooper a également reconstitué le compte d'Alice, 4,972 VAGUES sont devenues au bilan.

Vous pouvez savoir à combien d'ondes appartiennent le portefeuille général dans l'explorateur de blocs dans l'onglet Données.
Cooper a changé d'avis sur le fait de laisser le montant de 1 ONDES sur un portefeuille commun et a décidé de retirer la moitié des affinités. Pour ce faire, il doit appeler la fonction de retrait.

Cependant, nous nous sommes encore une fois trompés, car la fonction de retrait a des paramètres complètement différents, une signature différente. Lors de la conception de contrats intelligents sur RIDE4DAPPS, vous devez faire attention à ce moment.

Cooper a 2,48 VAGUES au bilan. En conséquence, 3 ONDES - 1 - 0,01, puis + 0,5 - 0,01. En conséquence, chaque appel pour déposer et retirer coûte 0,01 ONDES. Par conséquent, les entrées de la table de propriété dApps ont changé comme suit.

Bob a également décidé de retirer une certaine quantité du portefeuille total, mais s'est trompé et a tenté d'extraire 1,5 ONDES.

Cependant, le contrat intelligent avait un chèque pour une telle situation.
Xena est une arnaque, elle a tenté de retirer 1 ONDES du compte général.

Elle a également échoué.
Dans la partie suivante , nous examinerons des problèmes plus complexes associés à l'imperfection du compte Alice dApp.