Decentralizirani partnerski program otvorenog koda na Waves blockchainu

Decentralizovani partnerski program na Waves blockchainu, implementiran kao dio donacije Waves Labs od strane Bettex tima.

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

Decentralizirani partnerski program otvorenog koda na Waves blockchainu

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

Što se tiče funkcionalnosti, ovo je običan affiliate sistem koji implementira registraciju kod referera, višestepeno prikupljanje nagrada za preporuke i motivaciju za registraciju u sistemu (cashback). Sistem je „čista“ dApp, odnosno web aplikacija je u direktnoj interakciji sa blockchainom, bez sopstvenog backenda, baze podataka itd.

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

  • Pozivanje pametnog računa u dug sa momentalnom otplatom (u trenutku poziva na računu nema tokena za plaćanje poziva, ali se tamo pojavljuju kao rezultat poziva).
  • PoW-captcha — zaštita od visokofrekventnog automatskog pozivanja funkcija pametnog naloga — analogno captcha-i, ali kroz dokaz o korištenju računarskih resursa.
  • Upit za ključeve podataka pomoću predloška.

Aplikacija se sastoji od:

  • kod pametnog naloga na jeziku ride4dapps (koji je, kako je planirano, spojen u glavni pametni nalog za koji treba implementirati affiliate funkcionalnost);
  • js omotač koji implementira nivo apstrakcije preko WAVES NODE REST API-ja;
  • kod na vuejs frameworku, koji je primjer korištenja biblioteke i RIDE koda.

Hajde da opišemo sve navedene karakteristike.

Pozivanje pametnog računa za dug sa trenutnom otplatom

Pozivanje InvokeScript-a zahtijeva plaćanje naknade sa računa koji pokreće transakciju. Ovo nije problem ako pravite projekat za blockchain štreberke koji imaju određenu količinu WAVES tokena na svom računu, ali ako je proizvod namijenjen masovnoj upotrebi — postaje ozbiljan problem. Na kraju krajeva, korisnik mora voditi računa o kupovini WAVES tokena (ili drugog prikladnog sredstva koje se može koristiti za plaćanje transakcija), što povećava ionako značajnu barijeru za ulazak u projekat. Možemo distribuirati sredstvo korisnicima koji će moći da plaćaju transakcije i suočavaju se s rizikom njihove zloupotrebe kada se kreiraju automatizirani sistemi za ispumpavanje likvidnog sredstva iz našeg sistema.

Bilo bi vrlo zgodno kada bi bilo moguće pozvati InvokeScript „o trošku primaoca“ (pametni nalog na kojem je skripta instalirana), a takva mogućnost, iako ne na očigledan način, postoji.

Ako unutar InvokeScript-a napravite ScriptTransfer na adresu pozivaoca, koji nadoknađuje potrošene tokene naknade, tada će takav poziv biti uspješan, čak i ako u trenutku poziva nije bilo sredstava na računu pozivatelja. To je moguće jer se provjera za dovoljno tokena vrši nakon poziva transakcije, a ne prije nje, tako da se transakcije mogu izvršiti na kredit, podložno trenutnoj otplati.

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

Kôd ispod nadoknađuje potrošenu naknadu koristeći sredstva pametnog računa. Da biste se zaštitili od zloupotrebe ove funkcije, potrebno je koristiti provjeru da li pozivatelj troši naknadu u traženoj imovini iu razumnim granicama:

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, radi zaštite 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 različite projekte, uključujući i one koji se implementiraju na bazi WAVES-a. Ideja je da, da bi izvršio akciju koja troši resurse našeg projekta, pozivalac mora da potroši i sopstvene resurse, što napad iscrpljivanja resursa čini prilično skupim. Za vrlo laku i jeftinu provjeru valjanosti da je pošiljatelj transakcije riješio problem PoW-a, postoji provjera ID-a transakcije:

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

Da bi izvršio transakciju, pozivalac mora odabrati takve parametre tako da njegov base58 kod (id) počinje brojevima 123, što u prosjeku odgovara par desetina 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čigledan način.

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

Da biste koristili blockchain kao bazu podataka, od vitalnog je značaja imati API alate za ispitivanje baze podataka kao ključ-val na osnovu predložaka. Takav alat se pojavio početkom jula 2019. u obliku parametra ?šibice na REST API zahtjev /addresses/data?matches=regexp. Sada, ako trebamo da dobijemo više od jednog ključa iz web aplikacije i to ne sve ključeve odjednom, već samo neku grupu, onda možemo napraviti izbor po imenu ključa. Na primjer, u ovom projektu transakcije povlačenja su kodirane kao

withdraw_${userAddress}_${txid}

koji vam omogućava da dobijete listu transakcija za povlačenje sredstava za bilo koju adresu koristeći šablon:

?matches=withdraw_${userAddress}_.*

Pogledajmo sada komponente gotovog rješenja.

Vuejs kod

Kod je radni demo blizak stvarnom projektu. Implementira prijavu preko Waves Keeper-a i radi sa bibliotekom affiliate.js, pomoću koje registruje korisnika u sistemu, ispituje podatke o transakcijama, a takođe vam omogućava da povučete zarađena sredstva na korisnički račun.

Decentralizirani partnerski program otvorenog koda na Waves blockchainu

Kod za RIDE

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

Funkcija registracije registruje korisnika na sistemu. Ima dva parametra: referer (adresa upućivača) 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 druge 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 sistemom i ne mora brinuti o kupovini ili primanju sredstva koje mu omogućava da plati naknadu za transakciju.

Rezultat funkcije registracije su dva zapisa:

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

Ovo omogućava pretraživanje naprijed i nazad (referer datog korisnika i sve preporuke datog korisnika).

Funkcija fonda je više šablon za razvoj stvarne funkcionalnosti. U svom predstavljenom obliku, preuzima sva sredstva prenesena transakcijom i distribuira ih na račune referera nivoa 1, 2, 3, na račun „cashback“ i račun „change“ (sve što ostane kada se raspodijeli na prethodni računi idu ovdje).

Cashback je sredstvo stimulacije krajnjeg korisnika da učestvuje u sistemu preporuka. Korisnik može povući dio provizije koju plaća sistem u obliku “cashback-a” na isti način kao i nagrade za preporuke.

Kada koristite sistem preporuka, funkciju fonda treba modificirati i integrirati u glavnu logiku pametnog računa na kojem će sistem raditi. Na primjer, ako se za napravljenu opkladu isplaćuje nagrada za preporuku, tada bi funkcija fonda trebala biti ugrađena u logiku gdje se opklada stavlja (ili se izvodi druga ciljana radnja za koju se plaća nagrada). U ovu funkciju su kodirana tri nivoa nagrada za preporuke. Ako trebate napraviti više ili manje nivoa, to je također ispravljeno u kodu. Procenat nagrade je postavljen konstantama level1-level3, au kodu se izračunava kao iznos * nivo / 1000, odnosno vrijednost 1 odgovara 0,1% (ovo se također može promijeniti u kodu).

Pozivanje funkcije mijenja stanje na računu i također kreira unose za potrebe evidentiranja obrasca:

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

To jest, 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. Kreira unose za potrebe evidentiranja:

# withdraw log: withdraw_user_txid=amount:timestamp

Aplikacija

Glavni dio aplikacije je biblioteka affiliate.js, koja je most između pridruženih modela podataka i WAVES NODE REST API-ja. Implementira nivo apstrakcije nezavisno od okvira (bilo koji se može koristiti). Aktivne funkcije (registracija, povlačenje) pretpostavljaju da je Waves Keeper instaliran na sistemu; sama biblioteka to ne provjerava.

Implementira metode:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Funkcionalnost metoda je očigledna iz imena; parametri i vraćeni podaci su opisani u kodu. Funkcija registra zahtijeva dodatne komentare - započinje ciklus odabira ID-a transakcije tako da počinje na 123 - ovo je gore opisana PoW-captcha koja štiti od masovnih registracija. Funkcija pronalazi transakciju sa potrebnim ID-om, a zatim je potpisuje putem Waves Keeper-a.

DEX affiliate program je dostupan na GitHub.Com.

izvor: www.habr.com

Dodajte komentar