
Hej alla!
Nyligen lanserade Waves Labs en tÀvling för utvecklare i samband med lanseringen av den testnÀtutvidgning av smarta kontraktsprÄket RIDE för decentraliserade applikationer Ride4Dapps!
Vi valde DAO-fallet eftersom planerar att utveckla en dApp med sociala funktioner: röstning, insamling av medel, förtroendeförvaltning, etc.
Vi började med ett enkelt exempel i och i â exemplet med .
LÄt oss gÄ igenom detta exempel, testa hypoteser och titta pÄ nÄgra konstigheter:
Anta att vi har Alice â dApp-Ă€gare
Boob och Cooper â partners till Alice, medgrundare av Alice-BC DAO
Neli â företagaren som behöver finansiering
Bank â banken som delar ut tokens
Steg 1. Initiering av saldon
För att fÄ tokens i Waves testnÀt behöver vi besöka och ange adressen dit vi ska skicka tokens.
Adressen kan hittas i IDE genom att avslöja kontoinformationen.
Vi tilldelar Bank 10 WAVES. Efter detta kontrollerar vi att de har kommit fram via block- och transaktionsutforskaren:
Nu ska vi dela ut tokens frÄn banken till de andra deltagarna. (Obs: Alla transaktioner i Waves-nÀtverket Àr inte gratis, sÄ alla deltagare mÄste ha ett minimalt positivt saldo för att kunna genomföra transaktioner).
1 WAVES = 100000000 enheter (wavelets), eftersom belopp kan vara endast heltal
0.01 WAVES (Transaktionsavgift) = 1000000
Bank -> [3 WAVES] -> Alice, via TransferTransaction (Typ: 4).
Kontrollera att env.SEED, som anvÀnds för att signera transaktioner, motsvarar vÄr Bank:

ïżŒ
Om du inte har en matchande seed-frase, vÀx helt enkelt till den pÄ fliken Konton och kontrollera igen.
Efter detta skapar vi, annonserar och signerar transaktionen för att överföra 3 WAVES till Alice.
Du kan ocksÄ fÄ Alices information via variabeln env.accounts. Nummereringen börjar frÄn 0, sÄ Alice Àr env.accounts[1].

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))Resultatet kan ocksÄ observeras i utforskaren, lÀnken till den returneras till oss direkt efter utförandet av transaktionen. .
Vi verifierar att Alices saldo har ökat med 3 WAVES, och bankens saldo Ă€r nu 10 â 3 â 0.01 = 6.99.


Vi skickar 3 WAVES till Boob och Cooper, och 0.2 WAVES till Neli, Xena och Mark pÄ samma sÀtt.
(Obs: Vi gjorde ett misstag med en siffra och skickade Neli 0.02 WAVES. Var försiktig!)
broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))Efter att ha ökat saldot för alla deltagare ser vi:

Steg 2. Skapa dApp-konto
Vi kom överens om att skaparen och Àgaren av den decentraliserade applikationen kommer att vara Alice.
I kontona gÄr vi in och stÀller in henne som SEED och kontrollerar att env.SEED motsvarar Alice.
LÄt oss försöka installera det enklaste skriptet (kontraktet) för Alice-kontot.
Smartkontrakt i Waves Ă€r predikat som förhindrar eller tillĂ„ter en viss typ av utgĂ„ende transaktion att genomföras under vissa förhĂ„llanden. I det hĂ€r fallet Ă€r villkoret â ALWAYS. Kontraktskoden Ă€r true. Vi anropar deploy().

Avgiften för setScript transaktionen Àr 1400000/100000000 = 0.014 WAVES. Alice har 2.986 WAVES kvar pÄ sitt saldo.
LÄt oss nu försöka installera en mer komplex logik för smartkontraktet pÄ Alice-kontot, som beskrivs i
Ride4Dapps inkluderar nu 2 nya typer av anteckningar:
- @Callable(i) â accepterar som parameter i, data om vilket konto som anropade/signerade transaktionen. Resultatet av denna funktion bestĂ€mmer förĂ€ndringen av dApp-kontots tillstĂ„nd. Andra konton kan skapa transaktioner och utföra funktioner med denna anteckning och Ă€ndra tillstĂ„ndet för dApp-kontot.
- @Verifier(tx) â Verifierare av transaktionen med parametern tx transaktionen. Motsvarar logiken i predikaten frĂ„n RIDE. Det Ă€r i detta uttryck som man kan tillĂ„ta eller förbjuda ytterligare Ă€ndringar av smartkontraktens logik pĂ„ dApp-kontot.
LÄt oss skapa dApp kontot som en gemensam plÄnbok för alla deltagare.

För att kontrollera vilket kontrakt som för nÀrvarande Àr aktivt pÄ kontot kan vi kopiera base64-koden för smartkontraktet i blockutforskaren och avkoda den med en dekompilator ()



Vi sÀkerstÀller att logiken för smartkontraktet överensstÀmmer med vad vi förvÀntar oss.
Alice har 2.972 WAVES kvar pÄ sitt saldo.
Denna dApp hĂ„ller reda pĂ„ hur mycket var och en av deltagarna bidrar med till den gemensamma fonden genom mekanismen data transaction â DataEntry(currentKey, newAmount), dĂ€r currentKey Ă€r kontot som anropar funktionen deposit, och newAmount Ă€r beloppet av det tillagda saldot.
Bob och Cooper gör sina insÀttningar pÄ dApp-kontot med 1 WAVES vardera.

Vi gör ett misstag och transaktionen misslyckas. Eftersom vi, trots att vi sÀkerstÀllde att vi gör transaktionen i Bobs namn, förvÀxlade indexet och angav kontot Bank, dÀr det inte finns nÄgot smartkontrakt. HÀr Àr det viktigt att notera att för misslyckade försök att initiera transaktioner tas ingen avgift. Avgiften tas inte ut! Alice har 2.972 WAVES kvar pÄ sitt saldo. Bob har 3 WAVES.
Bob skickade 1 WAVES till dApp-kontot.
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
Bob har 1.99 WAVES kvar. Det vill sÀga att Bob betalade 0.01 WAVES i avgift.

Alice hade 2.972 WAVES pÄ sitt saldo, nu har hon 3.972. Ett transaktion Àr ocksÄ registrerad pÄ Alices konto, men ingen avgift har dragits frÄn dApp-kontot (Alice).
Efter att Cooper Àven fyllt pÄ sitt saldo har Alices balans blivit 4.972 WAVES.

Den totala mÀngden WAVES som tillhör olika anvÀndare i den gemensamma plÄnboken kan ses i blockutforskaren under fliken Data.
Cooper Àndrade sig och ville inte lÀmna beloppet 1 WAVES i den gemensamma plÄnboken sÄ han beslutade att ta ut hÀlften av sina medel. För detta mÄste han anropa funktionen withdraw.

Men vi gjorde Äterigen ett misstag eftersom withdraw-funktionen har helt andra parametrar och en annat signatur. NÀr ni designar smarta kontrakt pÄ RIDE4DAPPS bör ni vara uppmÀrksamma pÄ detta.

Coopers saldo blev 2.48 WAVES. SĂ„ledes Ă€r 3 WAVES â 1 â 0.01, och sedan + 0.5 â 0.01. Varje anrop till deposit och withdraw kostar 0.01 WAVES. SĂ„ledes har Ă€garstatistiken i dApps nu Ă€ndrats enligt följande.

Bob beslöt ocksÄ att ta ut en viss summa frÄn den gemensamma plÄnboken, men han hade fel och försökte ta ut 1.5 WAVES.

Men det fanns en kontroll i smartkontraktet för en sÄdan situation.
Xena Àr en bedragare, hon försökte ta ut 1 WAVES frÄn den gemensamma kontot.

Hon lyckades inte heller.
I nÀsta del kommer vi att titta pÄ mer komplexa aspekter i samband med bristerna i Alices dApp-konto.
KĂ€lla: habr.com
