Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

Ahoj všichni!

Nedávno Waves Labs oznámil 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 Ventuary 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 Q&A sezení a v RIDE IDE — příklad s společnou peněženkou.

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 faucet 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í: prohlížeč

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:
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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].
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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

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.
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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:
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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 příkladu

Ride4Dapps nyní zahrnuje 2 nové typy anotací:

  1. @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.
  2. @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.
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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 (například)
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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.
Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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 }]}))

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

Bob má zůstatek 1.99 WAVES. To znamená, že Bob zaplatil 0.01 WAVES jako poplatek.

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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.

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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.

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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.

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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.

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

Avšak ve smart kontraktu byla kontrola na takovou situaci.

Xena je podvodnice, pokusila se vybrat 1 WAVES z celkového účtu.

Učíme se psát smart kontrakty Waves na RIDE a RIDE4DAPPS. Část 1 (víceuživatelská peněženka)

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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster