Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Salut tuturor!

Recent, Waves Labs a anunțat a organizat un concurs pentru dezvoltatori cu ocazia lansării în rețeaua de testare a extensiei limbajului smart contracte RIDE pentru aplicații descentralizate Ride4Dapps!

Am ales cazul DAO, deoarece Ventuary planifică să dezvolte o dApp cu funcții sociale: votare, strângere de fonduri, gestionare fiduciara și altele.
Am început cu un exemplu simplu în sesiunile Q&A și în RIDE IDE — exemplul cu portofel comun.

Să analizăm acest exemplu, să verificăm ipotezele și să discutăm câteva peculiarități:

Să zicem că avem pe Alice — deținător dApp
Boob și Cooper — partenerii lui Alice, co-fondatori ai Alice-BC DAO
Neli — proprietar de afacere care are nevoie de finanțare
Bank — banca care oferă token-uri

Etapa 1. Inițializarea soldurilor

Pentru a obține token-uri în rețeaua de testare Waves, trebuie să accesăm faucet și să specificăm adresa la care să trimitem token-urile.
Adresa poate fi obținută în IDE, deschizând datele contului.
Alocăm 10 WAVES băncii. Apoi verificăm că au fost primite prin exploratorul de blocuri și tranzacții: exploratorul

Acum să distribuim token-uri din bancă către ceilalți participanți. (Notă: Toate tranzacțiile în rețeaua Waves nu sunt gratuite, așa că este necesar un sold pozitiv minim la toți participanții pentru a efectua tranzacții).

1 WAVES = 100000000 unități (wavelets), deoarece sumele pot fi doar întregi
0.01 WAVES (Taxa de tranzacție) = 1000000

Bank -> [3 WAVES] -> Alice, prin TransferTransaction (Tip: 4).

Verificăm că env.SEED, din care sunt semnate tranzacțiile, corespunde băncii noastre:
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Dacă nu aveți corespondența seed phrase, comutați pur și simplu în ea pe tab-ul Accounts și verificați din nou.
După aceasta, creăm, anunțăm și semnăm tranzacția pentru transferul a 3 WAVES către Alice.
Detaliile Alicei pot fi obținute și prin variabila env.accounts. Numerotarea începe de la 0, astfel încât Alice este env.accounts[1].
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

broadcast(transfer({recipient:address(env.accounts[1]), amount: 300000000, fee: 1000000}))

Rezultatul poate fi observat și în explorator, iar linkul la acesta ne va fi returnat imediat după execuția tranzacției.

Ne asigurăm că soldul Alicei a fost adăugat cu 3 WAVES, iar soldul băncii a rămas 10 — 3 — 0.01 = 0.699.
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Trimitem lui Boob și Cooper câte 3 WAVES, iar lui Neli, Xena și Mark câte 0.2 WAVES în același mod.
(Notă: Am comis o greșeală cu o cifră și am trimis lui Neli 0.02 WAVES. Fiți atenți!)

broadcast(transfer({recipient:address(env.accounts[4]), amount: 20000000, fee: 1000000}))

După reîncărcarea soldurilor tuturor participanților, observăm:
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Etapa 2. Crearea contului dApp

Am convenit că creatorul și proprietarul aplicației descentralizate va fi Alice.
În Accounts, o stabilim ca SEED și verificăm că env.SEED corespunde cu Alice.

Vom încerca să instalăm pe contul Alice cel mai simplu script (contract) posibil.
Smart contractele în Waves sunt predicate care interzic sau permit executarea unui anumit tip de tranzacție de ieșire în anumite condiții. În acest caz, condiția este - ALWAYS. Codul contractului - true. Apelăm deploy().

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Taxa pentru tranzacția setScript este 1400000/100000000 = 0.014 WAVES. Alice mai are 2.986 WAVES.

Acum vom încerca să stabilim pe contul Alice o logică mai complexă a smart contractului, descrisă în exemplul

Ride4Dapps acum include 2 tipuri noi de anotații:

  1. @Callable(i) — primește ca parametru i, date despre ce cont a invocat/s-a autentificat tranzacția. Anume rezultatul acestei funcții determină schimbarea stării contului dApp. Alte conturi pot crea tranzacții și executa funcții cu această anotație și schimba starea contului dApp.
  2. @Verifier(tx) — Verificator de tranzacție cu parametrul tx al tranzacției. Corespunde logicii predicatelor din RIDE. Anume în această expresie se poate permite sau interzice modificări ulterioare ale logicii smart contractelor pe contul dApp.

Să facem dApp un cont ca portofel comun pentru toți participanții.
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Pentru a verifica ce contract este activ pe cont, putem copia codul base64 al smart contractului în exploratorul de blocuri și recunoașteţi-l prin decompilator (de exemplu)
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Ne asigurăm că logica smart contractului corespunde așteptărilor noastre.
Alice mai are 2.972 WAVES.

Acest dApp înregistrează cât contribuie fiecare participant în fondul comun prin mecanismul data transaction — DataEntry(currentKey, newAmount), unde currentKey este contul care apelează funcția deposit, iar newAmount este valoarea soldului reîncărcat.

Boob și Cooper își depun sumele pe contul dApp câte 1 WAVES.
Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Facem o eroare și tranzacția nu trece. Deoarece, deși ne-am asigurat că facem tranzacția în numele lui Bob, am greșit indexul și am specificat contul Bank, pe care nu există smart contract. Aici este important să menționăm un aspect — pentru încercările nereușite de a iniția tranzacții, comisionul nu este perceput! Alice mai are pe balanță 2.972 WAVES. Bob are 3 WAVES.

Bob a trimis 1 WAVES către dApp Account.

broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Bob mai are 1.99 WAVES. Așadar, Bob a plătit 0.01 WAVES comision.

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Alice avea pe balanță 2.972 WAVES, iar acum are 3.972. Pe contul lui Alice a fost înregistrată o tranzacție, totuși din contul dApp (Alice) nu s-a retras niciun comision.
După ce Cooper a alimentat contul, Alice a ajuns la 4.972 WAVES.

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Cine deține câte WAVES în portofelul comun poate fi aflat în exploratorul de blocuri, la secțiunea Data.

Cooper s-a răzgândit și nu mai vrea să lase suma de 1 WAVES în portofelul comun, așa că a decis să retragă jumătate din fonduri. Pentru aceasta, trebuie să apeleze funcția withdraw.

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Totuși, am greșit din nou, deoarece funcția withdraw are parametrii și semnătura complet diferite. Când proiectați contracte inteligente pe RIDE4DAPPS, ar trebui să țineți cont de acest aspect.

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Cooper are acum pe balanța sa 2.48 WAVES. Drept urmare, 3 WAVES - 1 - 0.01, iar apoi + 0.5 - 0.01. Așadar, fiecare apel la deposit și withdraw costă 0.01 WAVES. În concluzie, în tabelul proprietarilor de dApps înregistrările s-au schimbat astfel.

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Bob a decis de asemenea să retragă o sumă din portofelul comun, dar a greșit și a încercat să extragă 1.5 WAVES.

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Totuși, în contractul inteligent a existat o verificare pentru o astfel de situație.

Xena este o escroacă, a încercat să retragă 1 WAVES din contul comun.

Învățăm să scriem smart contracte Waves în RIDE și RIDE4DAPPS. Partea 1 (Portofel multi-utilizator)

Ea nu a reușit nici ea.

În partea următoare, vom analiza aspecte mai complexe legate de imperfecțiunea contului dApp al lui Alice.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster