Odprtokodni decentralizirani pridruženi program na verigi blokov Waves

Decentraliziran pridruženi program, ki temelji na verigi blokov Waves, izvaja skupina Bettex kot del donacije Waves Labs.

Objava ni sponzorirana! Program je odprtokoden, njegova uporaba in distribucija sta brezplačni. Uporaba programa spodbuja razvoj dApp aplikacij in na splošno spodbuja decentralizacijo, ki je koristna za vsakega uporabnika omrežja.

Odprtokodni decentralizirani pridruženi program na verigi blokov Waves

Predstavljena aplikacija dApp for affiliate programs je predloga za projekte, ki vključujejo affiliate kot del svoje funkcionalnosti. Kodo lahko uporabite kot predlogo za kopiranje, kot knjižnico ali kot nabor idej za tehnično izvedbo.

Kar zadeva funkcionalnost, je to običajen affiliate sistem, ki izvaja registracijo pri napotitelju, večstopenjsko obračunavanje plačila za napotnike in motivacijo za registracijo v sistemu (cashback). Sistem je »čista« dApp, kar pomeni, da spletna aplikacija neposredno komunicira z verigo blokov brez lastnega zaledja, baze podatkov itd.

Uporabljene so tehnike, ki so lahko uporabne tudi pri mnogih drugih projektih:

  • Klicanje pametnega računa na dobroimetje s takojšnjim poplačilom (v času klica na računu ni žetonov za plačilo klica, se pa tam pojavijo kot posledica klica).
  • PoW-captcha - zaščita pred visokofrekvenčnim avtomatiziranim klicem funkcij pametnega računa - podobno kot captcha, vendar z dokazilom o uporabi računalniških virov.
  • Zahteva po podatkovnih ključih po predlogi.

Aplikacija je sestavljena iz:

  • koda pametnega računa v jeziku ride4dapps (ki je po načrtih združena z glavnim pametnim računom, za katerega morate implementirati affiliate funkcionalnost);
  • js ovoj, ki implementira plast abstrakcije prek API-ja WAVES NODE REST;
  • kodo na ogrodju vuejs, ki je primer uporabe knjižnice in kode RIDE.

Opišimo vse naštete lastnosti.

Zadolževanje pametnega računa s takojšnjim poplačilom

Klicanje InvokeScript zahteva plačilo pristojbine z računa, ki sproži transakcijo. To ni problem, če delate projekt za blockchain geeke, ki imajo na svojem računu določeno količino žetonov WAVES, če pa je izdelek namenjen množicam, postane to resen problem. Navsezadnje mora uporabnik poskrbeti za nakup žetonov WAVES (ali drugega primernega sredstva, s katerim lahko plača transakcije), kar poveča že tako precejšen prag za vstop v projekt. Sredstva lahko razdelimo uporabnikom, ki jim bo dovoljeno plačevati transakcije in se soočiti s tveganjem njihove zlorabe, ko bodo ustvarjeni avtomatizirani sistemi za črpanje likvidnih sredstev iz našega sistema.

Zelo priročno bi bilo, če bi bilo možno poklicati InvokeScript “na stroške prejemnika” (pametnega računa, na katerem je nameščena skripta), in ta možnost obstaja, čeprav ne na očiten način.

Če se znotraj InvokeScript izvede ScriptTransfer na naslov klicatelja, ki nadomesti žetone, porabljene za pristojbino, potem bo tak klic uspel, tudi če v času klica na kličočem računu ni bilo sredstev. To je mogoče, ker se preverjanje zadostnih žetonov opravi po klicu transakcije in ne pred njo, tako da je možno opravljati transakcije na dobroimetje, pod pogojem, da so takoj unovčeni.

ScriptTransfer(i.caller, i.fee, unit)

Spodnja koda povrne porabljeno pristojbino s sredstvi pametnega računa. Za zaščito pred zlorabo te funkcije morate uporabiti preverjanje, ali klicatelj porabi pristojbino v pravem sredstvu in v razumnih mejah:

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
}

Prav tako je za zaščito pred zlonamernim in nesmiselnim zapravljanjem sredstev potrebna zaščita pred samodejnim klicem (PoW-captcha).

PoW-captcha

Sama ideja o dokazu o delu captcha ni nova in je bila že implementirana v različne projekte, vključno s tistimi, ki temeljijo na WAVES. Bistvo ideje je, da mora klicatelj za izvedbo dejanja, ki zapravlja vire našega projekta, porabiti tudi lastna sredstva, zaradi česar je napad z izčrpanostjo virov precej drag. Za zelo enostavno in poceni preverjanje, ali je pošiljatelj transakcije rešil težavo s PoW, obstaja preverjanje ID-ja transakcije:

if take(toBase58String(i.transactionId), 3) != “123” then throw(“dokaz o delu ni uspel”) else

Za izvedbo transakcije mora klicatelj izbrati takšne parametre, da se njegova koda base58 (id) začne s številkami 123, kar ustreza povprečno nekaj deset sekund procesorskega časa in je na splošno primerno za našo nalogo. Če je potreben enostavnejši ali bolj zapleten PoW, je nalogo mogoče preprosto spremeniti na očiten način.

Poizvedba po podatkovnih ključih po predlogi

Za uporabo verige blokov kot baze podatkov je ključnega pomena imeti orodja API za poizvedovanje po bazi podatkov kot ključ-val z uporabo predlog. Tak komplet orodij se je pojavil v začetku julija 2019 kot parameter ?ujema na zahtevo REST API /addresses/data?matches=regexp. Zdaj, če moramo iz spletne aplikacije pridobiti več kot en ključ in ne vseh ključev hkrati, ampak samo neko skupino, potem lahko naredimo izbor po imenu ključa. Na primer, v tem projektu so transakcije dviga kodirane kot

withdraw_${userAddress}_${txid}

ki vam omogoča, da dobite seznam transakcij za dvig sredstev za kateri koli naslov s pomočjo predloge:

?matches=withdraw_${userAddress}_.*

Zdaj pa analizirajmo komponente končne rešitve.

koda vuejs

Koda je delujoča predstavitev, blizu resničnemu projektu. Izvaja prijavo prek Waves Keeper in delo s knjižnico affiliate.js, s pomočjo katere registrira uporabnika v sistemu, poizveduje po transakcijskih podatkih in omogoča tudi dvig zasluženih sredstev na uporabnikov račun.

Odprtokodni decentralizirani pridruženi program na verigi blokov Waves

Koda na RIDE

Sestavljen je iz funkcij registracije, sklada in dviga.

Funkcija registracije registrira uporabnika v sistem. Ima dva parametra: referer (naslov referenta) in parameter soli, ki ni uporabljen v funkcijski kodi in je potreben za izbiro ID-ja transakcije (naloga PoW-captcha).

Funkcija (tako kot ostale funkcije v tem projektu) uporablja tehniko izposoje, rezultat funkcije je financiranje plačila provizije za klic te funkcije. Zahvaljujoč tej rešitvi lahko uporabnik, ki je pravkar ustvaril denarnico, takoj dela s sistemom in mu ni treba biti zmeden zaradi vprašanja pridobitve ali prejema sredstva, ki mu omogoča plačilo provizije za transakcijo.

Rezultat registracijske funkcije sta dva zapisa:

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

To omogoča iskanje naprej in nazaj (napotitelj danega uporabnika in vse napotitve danega uporabnika).

Funkcija sklada je bolj predloga za razvoj prave funkcionalnosti. V predstavljeni obliki prevzame vsa sredstva, prenesena s transakcijo, in jih razdeli na napotitvene račune 1., 2., 3. nivoja, na račun »cashback« in račun »change« (vse, kar ostane med razdelitvijo na prejšnje računi pridejo sem).

Povračilo denarja je sredstvo za spodbujanje končnega uporabnika k sodelovanju v referenčnem sistemu. Del provizije, ki ga sistem plača v obliki "cashback", lahko uporabnik dvigne na enak način kot nagrade za priporočila.

Pri uporabi napotitvenega sistema je treba funkcijo sklada spremeniti, vgraditi v glavno logiko pametnega računa, na katerem bo sistem deloval. Na primer, če se za sklenjeno stavo izplača nagrada za napotitev, mora biti funkcija sklada vgrajena v logiko, kjer se sklene stava (ali se izvede drugo ciljno dejanje, za katero se izplača nagrada). V tej funkciji so kodirane tri ravni napotitvenih nagrad. Če želite narediti več ali manj ravni, potem je to tudi popravljeno v kodi. Odstotek nagrade je nastavljen s konstantami level1-level3, v kodi je izračunan kot količina * stopnja / 1000, to pomeni, da vrednost 1 ustreza 0,1 % (to lahko tudi spremenimo v kodi).

Klic funkcije spremeni stanje na računu in ustvari vnose za namen beleženja obrazca:

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

To pomeni, da je čas transakcije čas bloka, v katerem se nahaja. To je bolj zanesljivo kot uporaba časovnega žiga iz same transakcije, zlasti ker ni na voljo pri klicatelju.
Funkcija dviga dvigne vse zbrane nagrade na uporabnikov račun. Ustvari vnose za namene beleženja:

# withdraw log: withdraw_user_txid=amount:timestamp

Vloga

Glavni del aplikacije je knjižnica affiliate.js, ki je most med affiliate podatkovnimi modeli in WAVES NODE REST API. Implementira od ogrodja neodvisno plast abstrakcije (lahko uporabite katero koli). Aktivne funkcije (registracija, odjava) predvidevajo, da je Waves Keeper nameščen v sistemu, sama knjižnica tega ne preverja.

Izvaja metode:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Funkcionalnost metod je razvidna iz imen, parametri in povratni podatki so opisani v kodi. Funkcija registracije zahteva dodatne komentarje - zažene cikel izbire ID-ja transakcije, tako da se začne pri 123 - to je zgoraj opisana PoW captcha, ki ščiti pred množičnimi registracijami. Funkcija najde transakcijo z zahtevanim ID-jem in jo nato podpiše prek Waves Keeperja.

Pridruženi program DEX je na voljo na GitHub.com.

Vir: www.habr.com

Dodaj komentar