Decentralizuota atvirojo kodo filialų programa „Waves“ blokų grandinėje

Decentralizuota „Waves“ blokų grandinės filialų programa, kurią „Bettex“ komanda įgyvendino kaip „Waves Labs“ dotacijos dalį.

Įrašas nėra reklama! Programa yra atvirojo kodo, jos naudojimas ir platinimas yra nemokami. Programos naudojimas skatina kurti dApp programas ir apskritai skatina decentralizaciją, kuri naudinga kiekvienam interneto vartotojui.

Decentralizuota atvirojo kodo filialų programa „Waves“ blokų grandinėje

Pateikta dApp, skirta filialų programoms, yra šablonas projektams, kurių funkcionalumas apima filialus. Kodas gali būti naudojamas kaip kopijavimo šablonas, kaip biblioteka arba kaip idėjų rinkinys techniniam įgyvendinimui.

Kalbant apie funkcionalumą, tai yra įprasta filialų sistema, kuri įgyvendina registraciją su nukreipimu, kelių lygių atlygio už nukreipimus kaupimą ir registravimosi sistemoje motyvaciją (grynųjų pinigų grąžinimą). Sistema yra „gryna“ dApp, tai yra, žiniatinklio programa tiesiogiai sąveikauja su blokų grandine, neturėdama savo užpakalinės programos, duomenų bazės ir pan.

Naudojami metodai, kurie taip pat gali būti naudingi daugelyje kitų projektų:

  • Išmaniosios sąskaitos iškvietimas į skolą nedelsiant grąžinant (skambučio metu sąskaitoje nėra žetonų, skirtų sumokėti už skambutį, bet jie atsiranda po skambučio).
  • PoW-captcha – apsauga nuo aukšto dažnio automatizuotų iškvietimų į išmaniosios paskyros funkcijas – analogiška captcha, bet per kompiuterinių išteklių panaudojimo įrodymą.
  • Duomenų raktų užklausa naudojant šabloną.

Paraišką sudaro:

  • išmaniosios paskyros kodas ride4dapps kalba (kuris, kaip planuota, yra sujungtas į pagrindinę išmaniąją paskyrą, kuriai reikia įdiegti filialo funkcionalumą);
  • js paketas, kuris įgyvendina abstrakcijos lygį per WAVES NODE REST API;
  • kodą vuejs sistemoje, kuris yra bibliotekos ir RIDE kodo naudojimo pavyzdys.

Leiskite mums apibūdinti visas išvardytas funkcijas.

Skambinimas į išmaniąją sąskaitą dėl skolos su greitu grąžinimu

Norint iškviesti InvokeScript, reikia sumokėti mokestį iš sąskaitos, kuri inicijuoja operaciją. Tai nėra problema, jei kuriate projektą „blockchain“ geeks, kurių sąskaitoje yra tam tikras kiekis WAVES žetonų, tačiau jei produktas skirtas plačiajai visuomenei, tai tampa rimta problema. Juk vartotojas turi pasirūpinti WAVES žetonų (ar kito tinkamo turto, kuriuo galima atsiskaityti už operacijas) įsigijimu, o tai padidina ir taip nemažą barjerą patekti į projektą. Galime paskirstyti turtą vartotojams, kurie galės sumokėti už operacijas ir susidurs su rizika, kad jis bus netinkamai naudojamas, kai bus sukurtos automatinės sistemos, kurios išpumpuotų iš mūsų sistemos likvidų turtą.

Būtų labai patogu, jei InvokeScript būtų galima iškviesti „gavėjo sąskaita“ (išmanioji paskyra, kurioje yra įdiegtas scenarijus), o tokia galimybė, nors ir neakivaizdžiai, yra.

Jei InvokeScript viduje atliksite ScriptTransfer skambinančiojo adresu, kuris kompensuoja išleistus mokesčio žetonus, toks skambutis bus sėkmingas, net jei skambučio metu skambinimo sąskaitoje nebuvo turto. Tai įmanoma, nes patikrinama, ar užtenka žetonų, kai iškviečiama operaciją, o ne prieš ją, kad būtų galima atlikti operacijas su kreditu ir nedelsiant grąžinti.

Scenarijaus perkėlimas (i.caller, i.fee, unit)

Žemiau esantis kodas kompensuoja išleistą mokestį naudojant išmaniosios sąskaitos lėšas. Norint apsisaugoti nuo piktnaudžiavimo šia funkcija, būtina patikrinti, ar skambinantysis išleidžia mokestį reikiamam turtui ir neviršija pagrįstų ribų:

func checkFee(i:Invocation) = {
if i.fee > maxFee then throw(“unreasonable large fee”) else
if i.feeAssetId != unit then throw(“fee must be in WAVES”) else true
}

Be to, norint apsisaugoti nuo piktybiško ir beprasmiško lėšų švaistymo, reikalinga automatinė skambučių apsauga (PoW-captcha).

PoW-captcha

Pati „proof of work captcha“ idėja nėra nauja ir jau įgyvendinta įvairiuose projektuose, taip pat ir įgyvendinamuose WAVES pagrindu. Idėja tokia, kad norint atlikti veiksmą, kuris eikvoja mūsų projekto išteklius, skambinantysis turi išleisti ir savo išteklius, todėl išteklių išeikvojimo ataka yra gana brangi. Norint labai lengvai ir pigiai patikrinti, ar operacijos siuntėjas išsprendė PoW problemą, yra operacijos ID patikrinimas:

if take(toBase58String(i.transactionId), 3) != "123" then throw("nepavykusio darbo įrodymas") else

Norėdamas atlikti operaciją, skambinantis asmuo turi pasirinkti tokius parametrus, kad jo base58 kodas (id) prasidėtų skaičiais 123, o tai vidutiniškai atitinka porą dešimčių sekundžių procesoriaus laiko ir apskritai yra pagrįsta mūsų užduočiai. Jei reikalingas paprastesnis ar sudėtingesnis PoW, tada užduotį galima lengvai pakeisti akivaizdžiu būdu.

Duomenų raktų užklausa naudojant šabloną

Norint naudoti blokų grandinę kaip duomenų bazę, labai svarbu turėti API įrankius, skirtus duomenų bazės, kaip rakto-val, užklausoms pagal šablonus. Toks įrankių rinkinys pasirodė 2019 m. liepos pradžioje parametro pavidalu ?degtukai pagal REST API užklausą /addresses/data?matches=regexp. Dabar, jei mums reikia gauti daugiau nei vieną raktą iš žiniatinklio programos ir ne visus klavišus vienu metu, o tik tam tikrą grupę, galime pasirinkti pagal rakto pavadinimą. Pavyzdžiui, šiame projekte pinigų išėmimo operacijos yra užkoduotos kaip

withdraw_${userAddress}_${txid}

kuri leidžia gauti lėšų išėmimo operacijų sąrašą bet kuriuo nurodytu adresu naudojant šabloną:

?matches=withdraw_${userAddress}_.*

Dabar pažvelkime į gatavo sprendimo komponentus.

Vuejs kodas

Kodas yra veikianti demonstracinė versija, artima tikram projektui. Jis įgyvendina prisijungimą per Waves Keeper ir dirba su affiliate.js biblioteka, su kuria registruoja vartotoją sistemoje, užklausa operacijų duomenis, taip pat leidžia atsiimti uždirbtas lėšas į vartotojo sąskaitą.

Decentralizuota atvirojo kodo filialų programa „Waves“ blokų grandinėje

RIDE kodas

Jį sudaro registravimo, fondo ir išėmimo funkcijos.

Registro funkcija registruoja vartotoją sistemoje. Jis turi du parametrus: referer (nukreiptojo adresas) ir druskos parametrą, kuris nenaudojamas funkcijos kode, kuris reikalingas norint pasirinkti operacijos ID (PoW-captcha užduotis).

Funkcija (kaip ir kitos šio projekto funkcijos) naudoja skolų iškvietimo techniką, funkcijos rezultatas yra finansuoti mokesčio už šios funkcijos iškvietimą mokėjimą. Šio sprendimo dėka ką tik piniginę susikūręs vartotojas gali iš karto dirbti su sistema ir jam nereikės sukti galvos dėl turto įsigijimo ar gavimo, leidžiančio sumokėti operacijos mokestį.

Registracijos funkcijos rezultatas yra du įrašai:

${owner)_referer = referer
${referer}_referral_${owner} = owner

Tai leidžia ieškoti pirmyn ir atgal (tam tikro vartotojo persiuntimo URL ir visi konkretaus vartotojo persiuntimai).

Fondo funkcija yra daugiau tikrojo funkcionalumo kūrimo šablonas. Pateiktoje formoje jis paima visas pervestas lėšas per operaciją ir paskirsto jas į 1, 2, 3 lygių siuntėjų sąskaitas, į „grynųjų pinigų grąžinimo“ ir „pakeitimo“ sąskaitą (visa, kas lieka paskirstant ankstesnei sąskaitos patenka čia).

Cashback – tai priemonė, skatinanti galutinį vartotoją dalyvauti persiuntimo sistemoje. Vartotojas gali atsiimti sistemos sumokėtą komisinio mokesčio dalį „grynųjų pinigų grąžinimo“ forma taip pat, kaip ir atlygį už nukreipimus.

Naudojant nukreipimo sistemą, fondo funkcija turėtų būti modifikuota ir integruota į pagrindinę išmaniosios sąskaitos, kurioje veiks sistema, logiką. Pavyzdžiui, jei už atliktą statymą mokamas atlygis už nukreipimą, fondo funkcija turėtų būti integruota į logiką, kurioje statomas (arba atliekamas kitas tikslinis veiksmas, už kurį mokamas atlygis). Šioje funkcijoje užkoduoti trys atlygio už siuntimą lygiai. Jei jums reikia padaryti daugiau ar mažiau lygių, tai taip pat pataisoma kode. Atlygio procentas nustatomas pagal 1 lygio ir 3 lygio konstantas, kaip jis apskaičiuojamas suma * lygis / 1000, tai yra, reikšmė 1 atitinka 0,1% (tai taip pat gali būti pakeista kode).

Funkcijos iškvietimas pakeičia sąskaitos likutį ir taip pat sukuria įrašus formos registravimo tikslais:

fund_address_txid = address:owner:inc:level:timestamp
Для получения timestamp (текущего времени) используется такая вот связка
func getTimestamp() = {
let block = extract(blockInfoByHeight(height))
toString(block.timestamp)
}

Tai yra, operacijos laikas yra bloko, kuriame jis yra, laikas. Tai patikimiau nei naudojant pačios operacijos laiko žymą, ypač todėl, kad jos negalima iškviesti.
Išėmimo funkcija rodo visus sukauptus atlygius vartotojo paskyroje. Sukuria įrašus registravimo tikslais:

# withdraw log: withdraw_user_txid=amount:timestamp

Taikymas

Pagrindinė programos dalis yra affiliate.js biblioteka, kuri yra tiltas tarp filialų duomenų modelių ir WAVES NODE REST API. Įgyvendina abstrakcijos lygį, nepriklausantį nuo sistemos (galima naudoti bet kurį). Aktyvios funkcijos (registravimas, atšaukimas) daro prielaidą, kad Waves Keeper yra įdiegtas sistemoje, pati biblioteka to netikrina.

Taiko metodus:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Metodų funkcionalumas akivaizdus iš pavadinimų, parametrai ir grąžinami duomenys aprašyti kode. Registro funkcijai reikalingi papildomi komentarai – pradedamas operacijos ID pasirinkimo ciklas, kad jis prasidėtų nuo 123 – tai aukščiau aprašyta PoW-captcha, apsauganti nuo masinių registracijų. Funkcija suranda operaciją su reikiamu ID ir pasirašo ją per Waves Keeper.

DEX filialo programa pasiekiama adresu GitHub.com.

Šaltinis: www.habr.com

Добавить комментарий