Decentralizovaný, open source affiliate program na blockchainu Waves

Decentralizovaný affiliate program na blockchainu Waves, implementovaný jako součást grantu Waves Labs týmem Bettex.

Příspěvek není reklama! Program je open source, jeho použití a distribuce jsou zdarma. Používání programu podněcuje vývoj aplikací dApp a obecně podporuje decentralizaci, z níž má prospěch každý uživatel internetu.

Decentralizovaný, open source affiliate program na blockchainu Waves

Prezentovaný dApp pro affiliate programy je šablonou pro projekty, které zahrnují affiliate programy jako součást jejich funkčnosti. Kód lze použít jako šablonu pro kopírování, jako knihovnu nebo jako soubor nápadů pro technickou implementaci.

Funkčně se jedná o běžný affiliate systém, který implementuje registraci s referrerem, víceúrovňové načítání odměn za doporučení a motivaci k registraci do systému (cashback). Systém je „čistý“ dApp, to znamená, že webová aplikace interaguje přímo s blockchainem, aniž by měla vlastní backend, databázi atd.

Použité techniky, které mohou být také užitečné v mnoha dalších projektech:

  • Zadlužení chytrého účtu s okamžitým splacením (v době hovoru na účtu nejsou žádné tokeny k zaplacení hovoru, ale objevují se tam v důsledku hovoru).
  • PoW-captcha – ochrana proti vysokofrekvenčním automatickým voláním funkcí chytrého účtu – obdoba captcha, ale prostřednictvím důkazu o využití výpočetních zdrojů.
  • Dotaz na datové klíče pomocí šablony.

Aplikace se skládá z:

  • kód chytrého účtu v jazyce ride4dapps (který je podle plánu sloučen do hlavního chytrého účtu, pro který je třeba implementovat přidruženou funkcionalitu);
  • js wrapper, který implementuje úroveň abstrakce přes WAVES NODE REST API;
  • kód na frameworku vuejs, což je příklad použití knihovny a kódu RIDE.

Pojďme si popsat všechny uvedené funkce.

Volání na chytrý účet pro dluhy s okamžitým splacením

Volání InvokeScript vyžaduje zaplacení poplatku z účtu, který transakci zahájil. To není problém, pokud děláte projekt pro blockchain geeky, kteří mají na svém účtu určité množství tokenů WAVES, ale pokud je produkt zaměřen na použití širokou veřejností, stává se to vážným problémem. Uživatel se totiž musí postarat o nákup tokenů WAVES (nebo jiného vhodného aktiva, kterým lze platit za transakce), což zvyšuje už tak značnou bariéru vstupu do projektu. Můžeme distribuovat aktiva uživatelům, kteří budou moci platit za transakce a čelit riziku jejich zneužití, když budou vytvořeny automatizované systémy k odčerpání likvidních aktiv z našeho systému.

Bylo by velmi výhodné, kdyby bylo možné volat InvokeScript „na náklady příjemce“ (chytrý účet, na kterém je skript nainstalován), a taková možnost, i když ne samozřejmým způsobem, existuje.

Pokud uvnitř InvokeScript provedete ScriptTransfer na adresu volajícího, což kompenzuje vynaložené tokeny poplatků, pak bude takový hovor úspěšný, i když v době hovoru nebyly na volajícím účtu žádné prostředky. To je možné, protože kontrola dostatečného množství tokenů se provádí po vyvolání transakce, nikoli před ní, takže transakce lze provádět na úvěr s výhradou okamžitého splacení.

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

Níže uvedený kód proplácí utracený poplatek pomocí prostředků z chytrého účtu. Pro ochranu před zneužitím této funkce je nutné použít kontrolu, že volající utratí poplatek v požadovaném aktivu a v rozumných mezích:

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
}

K ochraně před zlomyslným a nesmyslným plýtváním finančními prostředky je také vyžadována automatická ochrana hovorů (PoW-captcha).

PoW-captcha

Samotná myšlenka captcha proof-of-work není nová a již byla implementována v různých projektech, včetně těch realizovaných na bázi WAVES. Myšlenka je taková, že k provedení akce, která spotřebovává zdroje našeho projektu, musí volající také utratit své vlastní zdroje, což činí útok na vyčerpání zdrojů poměrně drahý. Pro velmi snadné a levné ověření, že odesílatel transakce vyřešil problém s PoW, existuje kontrola ID transakce:

if take(toBase58String(i.transactionId), 3) != “123” then throw(”důkaz o práci se nezdařil”) else

Aby bylo možné transakci provést, musí volající zvolit takové parametry, aby jeho base58 kód (id) začínal čísly 123, což v průměru odpovídá několika desítkám sekund procesorového času a je pro náš úkol obecně rozumné. Pokud je vyžadován jednodušší nebo složitější PoW, pak lze úlohu snadno upravit zřejmým způsobem.

Dotaz na datové klíče pomocí šablony

Aby bylo možné používat blockchain jako databázi, je nezbytné mít nástroje API pro dotazování databáze jako klíč-val na základě šablon. Takový toolkit se objevil na začátku července 2019 ve formě parametru ?zápasy na žádost REST API /addresses/data?matches=regexp. Nyní, pokud potřebujeme získat více než jeden klíč z webové aplikace a ne všechny klíče najednou, ale pouze nějakou skupinu, můžeme provést výběr podle názvu klíče. Například v tomto projektu jsou výběrové transakce kódovány jako

withdraw_${userAddress}_${txid}

což vám umožní získat seznam transakcí pro výběr finančních prostředků pro libovolnou adresu pomocí šablony:

?matches=withdraw_${userAddress}_.*

Nyní se podívejme na součásti hotového řešení.

Vuejsův kód

Kód je pracovní demo blízké skutečnému projektu. Implementuje přihlašování přes Waves Keeper a spolupracuje s knihovnou affiliate.js, pomocí které eviduje uživatele v systému, dotazuje se na transakční data a také umožňuje vybírat vydělané prostředky na účet uživatele.

Decentralizovaný, open source affiliate program na blockchainu Waves

Kód pro RIDE

Skládá se z funkcí registru, fondu a výběru.

Funkce registrace zaregistruje uživatele v systému. Má dva parametry: referer (adresa refereru) a parametr salt, který se nepoužívá v kódu funkce, který je potřeba k výběru id transakce (úloha PoW-captcha).

Funkce (stejně jako ostatní funkce z tohoto projektu) využívá techniku ​​dluhového volání, výsledkem funkce je financování úhrady poplatku za volání této funkce. Díky tomuto řešení může uživatel, který si právě vytvořil peněženku, okamžitě pracovat se systémem a nemusí se starat o nákup nebo příjem aktiva, které mu umožní zaplatit transakční poplatek.

Výsledkem funkce registrace jsou dva záznamy:

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

To umožňuje dopředné a zpětné vyhledávání (referrer daného uživatele a všechna doporučení daného uživatele).

Funkce fondu je spíše šablonou pro vývoj skutečné funkčnosti. Ve své prezentované podobě vezme všechny prostředky převedené transakcí a rozděluje je na účty doporučovatelů úrovně 1, 2, 3, na účet „cashback“ a účet „změny“ (vše, co zůstane při distribuci na předchozí účty jdou sem).

Cashback je prostředek, jak motivovat koncového uživatele k účasti v systému doporučení. Uživatel si může část provize vyplacené systémem vybrat formou „cashbacku“ stejně jako odměny za doporučení.

Při použití systému doporučení by měla být funkce fondu upravena a integrována do hlavní logiky chytrého účtu, na kterém bude systém fungovat. Pokud je například za uskutečněnou sázku vyplácena odměna za doporučení, pak by funkce fondu měla být zabudována do logiky, kde je sázka podána (nebo je provedena jiná cílená akce, za kterou je odměna vyplácena). Do této funkce jsou zakódovány tři úrovně odměn za doporučení. Pokud potřebujete udělat více nebo méně úrovní, je to také opraveno v kódu. Procento odměny je nastaveno konstantami level1-level3, v kódu se počítá jako částka * úroveň / 1000, to znamená, že hodnota 1 odpovídá 0,1 % (to lze také změnit v kódu).

Volání funkce změní zůstatek účtu a také vytvoří záznamy pro účely protokolování formuláře:

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

To znamená, že čas transakce je čas bloku, ve kterém se nachází. To je spolehlivější než použití časového razítka ze samotné transakce, zejména proto, že není dostupné z volaného.
Funkce výběru zobrazí všechny nashromážděné odměny na účet uživatele. Vytváří záznamy pro účely protokolování:

# withdraw log: withdraw_user_txid=amount:timestamp

Aplikace

Hlavní částí aplikace je knihovna affiliate.js, která je mostem mezi affiliate datovými modely a WAVES NODE REST API. Implementuje úroveň abstrakce nezávislou na rámci (lze použít kteroukoli). Aktivní funkce (registrace, stažení) předpokládají, že je v systému nainstalován Waves Keeper, samotná knihovna to nekontroluje.

Implementuje metody:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Funkčnost metod je zřejmá z názvů, parametry a vrácená data jsou popsána v kódu. Funkce registru vyžaduje další komentáře - spustí cyklus výběru id transakce tak, aby začínalo na 123 - to je výše popsaná PoW-captcha, která chrání před hromadnými registracemi. Funkce najde transakci s požadovaným ID a poté ji podepíše prostřednictvím Waves Keeper.

DEX affiliate program je dostupný na GitHub.com.

Zdroj: www.habr.com

Přidat komentář