
Ahojte všetci!
Nedávno spoločnosť Waves Labs súťaž pre vývojárov pri príležitosti vydania testovacej siete rozšírenia jazyka smart kontraktov RIDE pre decentralizované aplikácie Ride4Dapps!
Vybrali sme si prípad DAO, pretože plánuje vyvíjať dApp so sociálnymi funkciami: hlasovanie, fundraising, správa v investíciách a podobne.
Začali sme prácu s jednoduchým príkladom v a v — příkladom s .
Poďme rozobrať tento príklad, overiť hypotézy a preskúmať niektoré zvláštnosti:
Predpokladajme, že máme Alice — vlastníčka dApp
Boob a Cooper — partneri Alice, spoluzakladatelia DAO Alice-BC
Neli — majiteľ obchodovania, ktorý potrebuje financovanie
Bank — banka, ktorá rozdáva tokeny
Krok 1. Inicializácia zostatkov
Aby ste v testovacej sieti waves získali tokeny, musíte sa obrátiť na a uviesť adresu, na ktorú majú byť tokeny odoslané.
Adresu môžete získať v IDE, rozbalením údajov o účte.
Prideliť Bank 10 WAVES. Potom skontrolujeme, že prišli cez prehliadač blokov a transakcií:
Teraz rozdáme tokeny z banky ostatným účastníkom. (Poznámky: Všetky transakcie v sieti waves nie sú bezplatné, takže všetci účastníci musia mať minimálne kladný zostatok, aby mohli uskutočňovať transakcie).
1 WAVES = 100000000 jednotiek (wavelets), pretože množstvá môžu byť len celé čísla
0,01 WAVES (poplatok za transakciu) = 1000000
Bank -> [3 WAVES] -> Alice, cez TransferTransaction (Typ: 4).
Kontrolujeme, že env.SEED, od ktorého sú transakcie podpísané, zodpovedá nášmu Bank:


Ak nemáte zhodu seed frázy, jednoducho sa na ňu prepnite na karte Účty a skontrolujte to znovu.
Potom vytvoríme, oznámime a podpíšeme transakciu na prevod 3 WAVES Alice.
Údaje o Alice môžete taktiež získať pomocou premennej env.accounts. Číslovanie začína od 0, takže Alice je env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Výsledok môžete taktiež sledovať v prehliadači, odkaz naň dostaneme hneď po vykonaní .
Uistíme sa, že zostatok Alice sa zvýšil o 3 WAVES, a na zostatku banky zostalo 10 — 3 — 0,01 = 0,699.


Pošleme Boob a Cooper po 3 WAVES, a Neli, Xena a Mark po 0,2 WAVES rovnakým spôsobom.
(Poznámky: Urobili sme chybu o jednu číslicu a poslali Neli 0,02 WAVES. Dávajte si pozor!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Po doplnení zostatkov všetkých účastníkov vidíme:

Krok 2. Vytvorenie účtu dApp
Dohodli sme sa, že tvorcom a vlastníkom decentralizovanej aplikácie bude Alice.
V účtoch nastavíme ju ako SEED a overíme, či env.SEED zodpovedá Alice.
Skúsime nainštalovať na účet Alice najjednoduchší skript (kontrakt) z možných.
Smart kontrakty v Waves sú predikáty, ktoré zakazujú alebo umožňujú vykonanie určitého typu odchádzajúcej transakcie za určitých podmienok. V tomto prípade je podmienkou — VŽDY. Kód kontraktu — true. Voláme deploy().

Poplatok za transakciu setScript je 1400000/100000000 = 0.014 WAVES. Alice zostalo na účte 2.986 WAVES.
Skúsime teraz nainštalovať na účet Alice zložitejšiu logiku smart kontraktu, popísanú v
Ride4Dapps teraz zahŕňa 2 nové typy anotácií:
- @Callable(i) — prijíma ako parameter i, údaje o tom, ktorý účet vyvolal/podpisoval transakciu. Práve výsledok tejto funkcie určuje zmenu stavu účtu dApp. Iné účty môžu vytvárať transakcie a vykonávať funkcie s touto anotáciou a meniť stav účtu dApp.
- @Verifier(tx) — Verifikátor transakcie s parametrom tx transakcie. Zodpovedá logike predikátov z RIDE. Práve v tomto výraze je možné povoliť alebo zakázať ďalšie zmeny logiky smart kontraktov na účte dApp.
Urobme dApp účet ako spoločnú peňaženku pre všetkých účastníkov.

Aby sme skontrolovali, aký kontrakt je momentálne aktívny na účte, môžeme v prehliadači blokov skopírovať base64 kód smart kontraktu a rozpoznať ho pomocou dekompilátora ()



Uistíme sa, že logika smart kontraktu zodpovedá tomu, čo očakávame.
Alice zostalo na účte 2.972 WAVES.
Tento dApp sleduje, koľko každá zúčastnených osôb prispieva do spoločného fondu prostredníctvom mechanizmu data transaction — DataEntry(currentKey, newAmount), kde currentKey — to je účet, ktorý vyvoláva funkciu deposit, a newAmount — to je hodnota doplneného zostatku.
Boob a Cooper vkladajú svoje depozity na dApp account po 1 WAVES.

Dopúšťame sa chyby a transakcia neprejde. Aj keď sme sa uistili, že robíme transakciu v mene Boba, urobili sme chybu v indexe a uviedli účet Bank, na ktorom nie je smart kontrakt. Tu sa oplatí poznamenať dôležitú vec — za neúspešné pokusy iniciovať transakcie sa poplatok neúčtuje! Alice zostalo na účte 2.972 WAVES. Bob má 3 WAVES.
Bob poslal 1 WAVES na dApp účet.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob má ešte 1,99 WAVES. To znamená, že Bob zaplatil 0,01 WAVES poplatku.

Alice mala na svojom účte 2,972 WAVES, teraz má 3,972. Na účte Alice je tiež zaznamenaná transakcia, ale z dApp účtu (Alice) sa žiadny poplatok neuložil.
Potom, čo Cooper tiež vložil peniaze, malo Alice na účte už 4,972 WAVES.

Kto koľko WAVES vlastní v spoločnom peňaženke, sa dá zistiť v prehliadači blokov na karte Data.
Cooper sa rozhodol, že nechce nechať sumu 1 WAVES v spoločnej peňaženke, a rozhodol sa vybrať polovicu prostriedkov. Na to musí zavolať funkciu withdraw.

Avšak, opäť sme sa pomýlili, pretože funkcia withdraw má úplne iné parametre, iný podpis. Pri navrhovaní smart kontraktov na RIDE4DAPPS treba na tento aspekt dávať pozor.

Cooper má teraz na účte 2,48 WAVES. Takže 3 WAVES — 1 — 0,01, a potom + 0,5 — 0,01. Každé zavolanie deposit a withdraw stojí 0,01 WAVES. Výsledkom je, že v tabuľke vlastníkov dApps sa záznamy zmenili takto.

Bob sa tiež rozhodol vybrať určitú sumu z spoločnej peňaženky, ale pomýlil sa a pokúsil sa vybrať 1,5 WAVES.

Avšak, v smart kontrakte bola kontrola na takúto situáciu.
Xena je podvodníčka, pokúsila sa vybrať 1 WAVES z spoločného účtu.

Ani jej sa to nepodarilo.
V ďalšej časti sa pozrieme na zložitejšie otázky spojené s nedokonalosťou účtu dApp Alice.
Zdroj: habr.com
