
Ahoj všichni!
Nedávno Waves Labs vyhlásilo soutěž pro vývojáře k vydání testovací sítě rozšíření jazyka smart kontraktů RIDE pro decentralizované aplikace Ride4Dapps!
Zvolili jsme případ DAO, protože plánuje vyvíjet dApp se sociálními funkcemi: hlasováním, fundraisingem, důvěrným řízením a dalšími.
Začali jsme s jednoduchým příkladem v a v — příklad s .
Rozebráme tento příklad, otestujeme hypotézy a prozkoumáme některé zvláštnosti:
Mějme Alice — vlastníka dApp
Boob a Cooper — partneři Alice, spoluzakladatelé Alice-BC DAO
Neli — majitelka podnikání, která potřebuje financování
Bank — banka, která rozdává tokeny
Krok 1. Inicializace zůstatků
Abychom v testovací síti Waves získali tokeny, musíme se obrátit na a uvést adresu, na kterou se mají tokeny zaslat.
Adresu lze zjistit v IDE, rozbalením údajů o účtu.
Přidělujeme bance 10 WAVES. Poté zkontrolujeme, zda byly připsány prostřednictvím prohlížeče bloků a transakcí:
Nyní přidělíme tokeny z banky ostatním účastníkům. (Poznámka: Všechny transakce v síti Waves nejsou zdarma, a proto je třeba mít minimální kladný zůstatek u všech účastníků pro provádění transakcí).
1 WAVES = 100000000 jednotek (wavelets), protože částky mohou být pouze celé
0.01 WAVES (Transakční poplatek) = 1000000
Bank -> [3 WAVES] -> Alice, prostřednictvím TransferTransaction (Typ: 4).
Zkontrolujeme, že env.SEED, ze kterého jsou transakce podepsány, odpovídá našemu Bank:


Pokud nemáte odpovídající seed frázi, jednoduše se přepněte do ní na záložce Účty a zkontrolujte znovu.
Poté vytvoříme, oznámíme a podepíšeme transakci o převodu 3 WAVES Alice.
Údaje o Alici lze také zjistit prostřednictvím proměnné env.accounts. Číslování začíná od 0, tedy Alice je env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Výsledek lze také pozorovat v prohlížeči, odkaz na něj nám bude vrácen okamžitě po provedení .
Ujistíme se, že zůstatek Alice byl navýšen o 3 WAVES, a že na zůstatku banky zůstalo 10 — 3 — 0.01 = 0.699.


Zašleme Boob a Cooperovi po 3 WAVES a Neli, Xeně a Markovi po 0.2 WAVES stejným způsobem.
(Poznámka: Udělali jsme chybu o jednu číslici a poslali Neli 0.02 WAVES. Buďte opatrní!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Po navýšení zůstatků všech účastníků vidíme:

Krok 2. Vytvoření účtu dApp
Dohodli jsme se, že tvůrcem a vlastníkem decentralizované aplikace bude Alice.
V Accounts přecházíme a nastavujeme ji jako SEED a kontrolujeme, zda env.SEED odpovídá Alici.
Zkusíme nainstalovat na účet Alice ten nejjednodušší skript (kontrakt) z možných.
Chytré kontrakty ve Waves jsou predikáty, které zakazují nebo povolují provedení jakéhokoli typu výchozí transakce za určitých podmínek. V tomto případě je podmínkou ALWAYS. Kód kontraktu je true. Zavoláme deploy().

Poplatek za setScript transakci 1400000/100000000 = 0.014 WAVES. Alici zůstalo na účtu 2.986 WAVES.
Teď se pokusíme nainstalovat na účet Alice složitější logiku chytrého kontraktu, popsanou v
Ride4Dapps nyní zahrnuje 2 nové typy anotací:
- @Callable(i) — přijímá jako parametr i, data o tom, který účet transakci vyvolal/podepsal. Právě výsledek této funkce určuje změnu stavu účtu dApp. Ostatní účty mohou vytvářet transakce a vykonávat funkce s touto anotací a měnit stav účtu dApp.
- @Verifier(tx) — Verifikátor transakce s parametrem tx transakce. Odpovídá logice predikátů z RIDE. Právě v tomto výrazu lze povolit nebo zakázat další změny logiky chytrých kontraktů na účtu dApp.
Pojďme udělat dApp účet jako společnou peněženku pro všechny účastníky.

Abychom ověřili, jaký kontrakt je nyní aktivní na účtu, můžeme v prohlížeči bloků zkopírovat base64 kód chytrého kontraktu a rozpoznat ho prostřednictvím dekompilátoru ()



Ujišťujeme se, že logika chytrého kontraktu odpovídá tomu, co očekáváme.
Alici zůstalo na účtu 2.972 WAVES.
Tento dApp sleduje, kolik každý účastník vkládá do společného fondu prostřednictvím mechanismu data transaction — DataEntry(currentKey, newAmount), kde currentKey je účet, který volá funkci deposit, a newAmount je hodnota doplněného zůstatku.
Boob a Cooper vkládají své vklady na dApp účet po 1 WAVES.

Chybujeme a transakce neprochází. I když jsme se ujistili, že provádíme transakci jménem Boba, spletli jsme se v indexu a uvedli účet Bank, na kterém není chytrý kontrakt. Zde je důležité poznamenat, že za neúspěšné pokusy o iniciaci transakcí se poplatek neúčtuje! Alici zůstalo na účtu 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á zůstatek 1.99 WAVES. To znamená, že Bob zaplatil 0.01 WAVES jako poplatek.

Alice měla na svém účtu 2.972 WAVES, a nyní má 3.972. Na účtu Alice byla také zaregistrována transakce, avšak z dApp účtu (Alice) nebyly odečteny žádné poplatky.
Poté, co Cooper také doplnil účet, má Alice na svém zůstatku 4.972 WAVES.

Kdo kolik WAVES vlastní v celkové peněžence lze zjistit v prohlížeči bloků v záložce Data.
Cooper si rozmyslel, že chce nechat částku 1 WAVES v celkové peněžence, a rozhodl se vybrat polovinu prostředků. K tomu musí zavolat funkci withdraw.

Avšak, opět jsme udělali chybu, protože funkce withdraw má úplně jiné parametry, jinou signaturu. Když budete navrhovat smart kontrakty na RIDE4DAPPS, mějte na paměti tento fakt.

Cooper má nyní na svém zůstatku 2.48 WAVES. To znamená, 3 WAVES — 1 — 0.01, a pak + 0.5 — 0.01. Každé volání deposit a withdraw tedy stojí 0.01 WAVES. Nakonec se v tabulce vlastníků dApps záznamy změnily následujícím způsobem.

Bob se také rozhodl vybrat nějakou částku z celkové peněžky, ale udělal chybu a pokusil se vybrat 1.5 WAVES.

Avšak ve smart kontraktu byla kontrola na takovou situaci.
Xena je podvodnice, pokusila se vybrat 1 WAVES z celkového účtu.

Ani jí se to nepodařilo.
V další části se podíváme na složitější aspekty související s nedokonalostí Alice dApp účtu.
Zdroj: habr.com
