Decentralizirani affiliate program otvorenog koda na Waves blockchainu

Decentralizirani affiliate program na Waves blockchainu, implementiran kao dio Waves Labs granta od strane Bettex tima.

Objava nije oglašavanje! Program je otvorenog koda, njegovo korištenje i distribucija su besplatni. Korištenje programa potiče razvoj dApp aplikacija i općenito promiče decentralizaciju od koje koristi svaki korisnik interneta.

Decentralizirani affiliate program otvorenog koda na Waves blockchainu

Predstavljeni dApp za affiliate programe predložak je za projekte koji kao dio svoje funkcionalnosti uključuju affiliate. Kod se može koristiti kao predložak za kopiranje, kao biblioteka ili kao skup ideja za tehničku implementaciju.

Što se tiče funkcionalnosti, ovo je obični affiliate sustav koji implementira registraciju s refererom, višerazinsko prikupljanje nagrada za preporuke i motivaciju za registraciju u sustavu (cashback). Sustav je “čista” dApp, odnosno web aplikacija izravno komunicira s blockchainom, bez vlastite pozadine, baze podataka itd.

Korištene tehnike koje također mogu biti korisne u mnogim drugim projektima:

  • Zaduživanje pametnog računa uz trenutnu otplatu (u trenutku poziva na računu nema tokena za plaćanje poziva, već se pojavljuju kao rezultat poziva).
  • PoW-captcha — zaštita od visokofrekventnog automatskog pozivanja funkcija pametnog računa — analogno captchi, ali kroz dokaz korištenja računalnih resursa.
  • Upit za podatkovne ključeve pomoću predloška.

Aplikacija se sastoji od:

  • kod pametnog računa na jeziku ride4dapps (koji je, kako je planirano, spojen s glavnim pametnim računom za koji je potrebno implementirati affiliate funkcionalnost);
  • js omotač koji implementira razinu apstrakcije preko WAVES NODE REST API-ja;
  • kod na okviru vuejs, što je primjer korištenja knjižnice i RIDE koda.

Opišimo sve navedene karakteristike.

Poziv na pametni račun za dug uz trenutnu otplatu

Pozivanje InvokeScripta zahtijeva plaćanje naknade s računa koji je pokrenuo transakciju. Ovo nije problem ako radite projekt za blockchain geekove koji imaju određenu količinu WAVES tokena na svom računu, ali ako je proizvod namijenjen masovnom korištenju — to postaje ozbiljan problem. Uostalom, korisnik mora voditi računa o kupnji WAVES tokena (ili drugog prikladnog sredstva koje se može koristiti za plaćanje transakcija), što povećava ionako znatnu prepreku za ulazak u projekt. Možemo distribuirati sredstvo korisnicima koji će moći platiti transakcije i suočiti se s rizikom njihove zlouporabe kada se stvore automatizirani sustavi za ispumpavanje likvidnog sredstva iz našeg sustava.

Bilo bi vrlo zgodno kada bi InvokeScript bilo moguće pozvati “o trošku primatelja” (pametnog računa na kojem je skripta instalirana), a takva mogućnost, iako ne na očit način, postoji.

Ako unutar InvokeScripta napravite ScriptTransfer na adresu pozivatelja, koji nadoknađuje potrošene tokene naknade, tada će takav poziv biti uspješan, čak i ako u vrijeme poziva nije bilo sredstava na računu pozivatelja. To je moguće jer se provjera dovoljne količine tokena vrši nakon poziva transakcije, a ne prije nje, tako da se transakcije mogu izvršiti na kredit, uz trenutnu otplatu.

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

Kod u nastavku nadoknađuje potrošenu naknadu korištenjem sredstava pametnog računa. Kako bi se zaštitili od zlouporabe ove značajke, potrebno je koristiti provjeru da pozivatelj troši naknadu u traženim sredstvima i unutar razumnih granica:

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
}

Također, za zaštitu od zlonamjernog i besmislenog rasipanja sredstava potrebna je automatska zaštita poziva (PoW-captcha).

PoW-captcha

Sama ideja proof-of-work captcha nije nova i već je implementirana u razne projekte, uključujući i one implementirane na temelju WAVES-a. Ideja je da, kako bi izvršio radnju koja troši resurse našeg projekta, pozivatelj također mora potrošiti vlastite resurse, što napad iscrpljivanja resursa čini prilično skupim. Za vrlo jednostavnu i jeftinu potvrdu da je pošiljatelj transakcije riješio problem PoW-a, postoji provjera ID-a transakcije:

if take(toBase58String(i.transactionId), 3) != “123” then throw(“dokaz rada nije uspio”) else

Da bi izvršio transakciju, pozivatelj mora odabrati takve parametre da njegov base58 kod (id) počinje brojevima 123, što u prosjeku odgovara nekoliko desetaka sekundi procesorskog vremena i općenito je razumno za naš zadatak. Ako je potreban jednostavniji ili složeniji PoW, tada se zadatak može lako modificirati na očit način.

Upit za podatkovne ključeve pomoću predloška

Da biste koristili blockchain kao bazu podataka, od vitalnog je značaja imati API alate za postavljanje upita bazi podataka kao key-val na temelju predložaka. Takav se alat pojavio početkom srpnja 2019. u obliku parametra ?šibice na zahtjev REST API-ja /addresses/data?matches=regexp. Sada, ako trebamo dobiti više od jednog ključa iz web aplikacije, a ne sve ključeve odjednom, već samo neku grupu, tada možemo napraviti odabir prema nazivu ključa. Na primjer, u ovom projektu, transakcije povlačenja su kodirane kao

withdraw_${userAddress}_${txid}

koji vam omogućuje da dobijete popis transakcija za povlačenje sredstava za bilo koju adresu koristeći predložak:

?matches=withdraw_${userAddress}_.*

Sada pogledajmo komponente gotovog rješenja.

Vuejs kod

Kod je radni demo blizak stvarnom projektu. Implementira prijavu putem Waves Keepera i radi s bibliotekom affiliate.js, s kojom registrira korisnika u sustavu, ispituje podatke o transakcijama, a također vam omogućuje povlačenje zarađenih sredstava na korisnički račun.

Decentralizirani affiliate program otvorenog koda na Waves blockchainu

Šifra za VOŽNJU

Sastoji se od funkcija registra, fonda i povlačenja.

Funkcija registracije registrira korisnika na sustav. Ima dva parametra: referer (adresa preporuke) i parametar soli koji se ne koristi u kodu funkcije, a koji je potreban za odabir ID-a transakcije (PoW-captcha zadatak).

Funkcija (kao i ostale funkcije iz ovog projekta) koristi tehniku ​​poziva duga, rezultat funkcije je financiranje plaćanja naknade za pozivanje ove funkcije. Zahvaljujući ovom rješenju, korisnik koji je upravo kreirao novčanik može odmah raditi sa sustavom i ne mora brinuti o kupnji ili primanju imovine koja mu omogućuje plaćanje transakcijske naknade.

Rezultat funkcije registracije su dva zapisa:

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

To omogućuje pretraživanje naprijed i nazad (preporuka određenog korisnika i sve preporuke određenog korisnika).

Funkcija fonda više je obrazac za razvoj stvarne funkcionalnosti. U prikazanom obliku uzima sva sredstva prenesena transakcijom i raspodjeljuje ih na račune referenata razina 1, 2, 3, na “cashback” račun i “change” račun (sve što ostane kada se raspodijeli prethodnim računi idu ovdje).

Cashback je način poticanja krajnjeg korisnika na sudjelovanje u sustavu preporuke. Korisnik može povući dio provizije koju plaća sustav u obliku "povrata novca" na isti način kao i nagrade za preporuke.

Prilikom korištenja referalnog sustava, funkciju fonda treba modificirati i integrirati u glavnu logiku pametnog računa na kojem će sustav raditi. Na primjer, ako se nagrada za preporuku isplaćuje za okladu, tada bi funkcija fonda trebala biti ugrađena u logiku gdje se oklada stavlja (ili se izvodi druga ciljana radnja za koju se isplaćuje nagrada). Tri razine nagrada za preporuke kodirane su u ovoj funkciji. Ako trebate napraviti više ili manje razina, to je također ispravljeno u kodu. Postotak nagrade postavljen je konstantama level1-level3; u kodu se izračunava kao iznos * razina / 1000, odnosno vrijednost 1 odgovara 0,1% (ovo se također može promijeniti u kodu).

Pozivanjem funkcije mijenja se stanje na računu i stvaraju se unosi za potrebe bilježenja obrasca:

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

Odnosno, vrijeme transakcije je vrijeme bloka u kojem se nalazi. Ovo je pouzdanije od korištenja vremenske oznake iz same transakcije, pogotovo zato što nije dostupna od pozivatelja.
Funkcija povlačenja prikazuje sve akumulirane nagrade na korisničkom računu. Stvara unose za potrebe bilježenja:

# withdraw log: withdraw_user_txid=amount:timestamp

primjena

Glavni dio aplikacije je biblioteka affiliate.js, koja je most između affiliate podatkovnih modela i WAVES NODE REST API-ja. Implementira razinu apstrakcije neovisnu o okviru (može se koristiti bilo koja). Aktivne funkcije (registracija, odjava) pretpostavljaju da je Waves Keeper instaliran na sustavu; sama knjižnica to ne provjerava.

Implementira metode:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Funkcionalnost metoda očita je iz naziva, parametri i vraćeni podaci opisani su u kodu. Funkcija registracije zahtijeva dodatne komentare - pokreće ciklus odabira ID-a transakcije tako da počinje od 123 - to je gore opisana PoW-captcha koja štiti od masovnih registracija. Funkcija pronalazi transakciju sa traženim ID-om, a zatim je potpisuje kroz Waves Keeper.

DEX affiliate program dostupan je na GitHub.com.

Izvor: www.habr.com

Dodajte komentar