
Hej alle sammen!
For nylig annoncerede Waves Labs en konkurrence for udviklere i forbindelse med lanceringen af testnet til udvidelse af smart kontrakt-sproget RIDE for decentrale applikationer Ride4Dapps!
Vi valgte DAO-caset, da planlægger at udvikle en dApp med sociale funktioner: afstemninger, fundraising, tillidsvoldsomhed osv.
Vi startede med et simpelt eksempel i og i — eksemplet med .
Lad os gennemgå dette eksempel, tjekke hypoteserne og se på nogle underlige ting:
Lad os sige, at vi har Alice — dApp-ejeren
Boob og Cooper — Alices partnere, medstiftere af Alice-BC DAO
Neli — en virksomhedsejer, der har brug for finansiering
Banken — banken, der uddeler tokens
Trin 1. Initialisering af saldi
For at få tokens i testnetværket Waves skal du kontakte og angive den adresse, hvortil du vil sende tokens.
Adressen kan findes i IDE ved at udvide kontodetails.
Vi tildeler Banken 10 WAVES. Herefter tjekker vi, at de er modtaget via blok- og transaktionsoversigten:
Lad os nu fordele tokens fra banken til de øvrige deltagere. (Bemærk: Alle transaktioner i Waves-netværket er ikke gratis, så alle deltagere skal have en minimal positiv saldo for at kunne gennemføre transaktioner).
1 WAVES = 100000000 enheder (wavelets), da beløb kun kan være heltal
0.01 WAVES (transaktionsgebyr) = 1000000
Bank -> [3 WAVES] -> Alice, via TransferTransaction (Type: 4).
Vi tjekker, at env.SEED, hvorfra transaktionerne underskrives, stemmer overens med vores Bank:


Hvis du ikke har den korrekte seed-sætning, skal du blot skifte til det i fanen Konti og tjekke igen.
Derefter opretter, annoncerer og underskriver vi transaktionen om overførsel af 3 WAVES til Alice.
Du kan også finde Alicess data gennem variablen env.accounts. Nummereringen starter fra 0, derfor er Alice env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Resultatet kan også ses i oversigten, linket til det vil blive returneret til os straks efter udførelsen .
Vi sikrer, at Alices saldo er steget med 3 WAVES, mens bankens saldo forbliver 10 — 3 — 0.01 = 0.699.


Vi sender Boob og Cooper 3 WAVES hver, og Neli, Xena og Mark 0.2 WAVES på samme måde.
(Bemærk: Vi lavede en fejl med en enkelt tegn og sendte Neli 0.02 WAVES. Vær forsigtig!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Efter at have opdateret saldi for alle deltagere ser vi:

Trin 2. Oprettelse af dApp-konto
Vi aftalte, at skaberen og ejeren af den decentrale applikation vil være Alice.
I Accounts går vi ind og sætter hende som SEED og tjekker, at env.SEED svarer til Alice.
Lad os prøve at installere det enkleste script (kontrakt) på Alice's konto.
Smart-kontrakter i Waves er prædikater, der forhindrer eller tillader udførelsen af en bestemt type udgående transaktion under bestemte betingelser. I dette tilfælde er betingelsen - ALWAYS. Kontraktkoden - true. Vi kalder deploy().

Gebyr for setScript transaktionen 1400000/100000000 = 0.014 WAVES. Alice har 2.986 WAVES tilbage på balancen.
Lad os nu prøve at installere en mere kompleks logik i smart-kontrakten på Alice's konto, beskrevet i
Ride4Dapps inkluderer nu 2 nye typer annotationer:
- @Callable(i) — tager parameteren i, data om hvilken konto der har kaldt/underskrevet transaktionen. Resultatet af denne funktion bestemmer ændringen af dApp-kontoens tilstand. Andre konti kan oprette transaktioner og udføre funktioner med denne annotation og ændre dApp-kontoens tilstand.
- @Verifier(tx) — Verifikator for transaktionen med parameteren tx. Dette svarer til logikken af prædikater i RIDE. Det er netop i dette udtryk, at vi kan tillade eller forbyde yderligere ændringer i logikken af smart-kontrakterne på dApp-kontoen.
Lad os lave dApp kontoen til en fælles pung for alle deltagere.

For at tjekke, hvilken kontrakt der i øjeblikket er aktiv på kontoen, kan man i blokobserven kopiere base64 koden af smart-kontrakten og genkende den gennem dekompilatoren ()



Vi sikrer os, at logikken i smart-kontrakten svarer til det, vi forventer.
Alice har 2.972 WAVES tilbage på balancen.
Denne dApp holder styr på, hvor meget hver deltager indskyder i fællesskabsfonden gennem mekanismen data transaction — DataEntry(currentKey, newAmount), hvor currentKey er den konto, der kalder funktionen deposit, og newAmount er beløbet for den indskudte balance.
Boob og Cooper indskyder hver 1 WAVES på dApp-kontoen.

Vi laver en fejl, og transaktionen går ikke igennem. Selvom vi har sikret os, at vi laver transaktionen på vegne af Bob, lavede vi en fejltagelse i indekset og angav kontoen Bank, som ikke har nogen smart-kontrakt. Her skal det bemærkes, at vigtige punkter - der opkræves ikke gebyrer for fejlede forsøg på at initiere transaktioner! Der opkræves ikke gebyr for! Alice har 2.972 WAVES tilbage. Bob har 3 WAVES.
Bob sendte 1 WAVES til dApp-kontoen.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob har 1,99 WAVES tilbage. Det vil sige, at Bob betalte 0,01 WAVES i gebyr.

Alice havde 2,972 WAVES på kontoen, og det blev til 3,972. Der er også registreret en transaktion på Alices konto, men der blev ikke trukket noget gebyr fra dApp Account (Alice).
Efter at Cooper også indbetalte, blev der 4,972 WAVES på Alices konto.

Hvor meget WAVES der tilhører hver person i den fælles wallet, kan ses i blokkædeoversigten under fanen Data.
Cooper fortrød at lade 1 WAVES stå i den fælles wallet og besluttede at trække halvdelen af midlerne ud. For dette skal han kalde funktionen withdraw.

Men vi tog fejl igen, da funktionen withdraw har helt andre parametre, en anden signatur. Når du designer smarte kontrakter på RIDE4DAPPS, skal du være opmærksom på dette.

Cooper har nu 2,48 WAVES på sin konto. Så 3 WAVES - 1 - 0,01, og derefter + 0,5 - 0,01. Så hver kald til deposit og withdraw koster 0,01 WAVES. Som et resultat ændrede posterne i ejerlisten for dApps sig på følgende måde.

Bob besluttede også at trække et beløb fra den fælles wallet, men tog fejl og forsøgte at trække 1,5 WAVES.

Men der var en kontrol i smart-kontrakten for denne situation.
Xena er en svindler; hun prøvede at trække 1 WAVES fra den fælles konto.

Hun havde heller ingen held.
I næste del vil vi se på mere komplekse aspekter relateret til ufuldkommenheder i Alice dApp Account.
Kilde: habr.com
