Decentraliserat affiliateprogram med öppen källkod på Waves blockchain

Ett decentraliserat affiliateprogram på Waves blockchain, implementerat som en del av ett Waves Labs-bidrag av Bettex-teamet.

Inlägget är ingen reklam! Programmet är öppen källkod, dess användning och distribution är gratis. Användningen av programmet stimulerar utvecklingen av dApp-applikationer och främjar generellt decentralisering, vilket gynnar alla Internetanvändare.

Decentraliserat affiliateprogram med öppen källkod på Waves blockchain

Den presenterade dApp för affiliate-program är en mall för projekt som inkluderar affiliate som en del av sin funktionalitet. Koden kan användas som en mall för kopiering, som ett bibliotek eller som en uppsättning idéer för teknisk implementering.

När det gäller funktionalitet är detta ett vanligt affiliatesystem som implementerar registrering hos en hänvisare, multi-level ackumulering av belöningar för hänvisningar och motivation för registrering i systemet (cashback). Systemet är en "ren" dApp, det vill säga webbapplikationen interagerar direkt med blockkedjan, utan att ha en egen backend, databas etc.

Tekniker som används som också kan vara användbara i många andra projekt:

  • Att skuldsätta ett smart konto med omedelbar återbetalning (vid samtalstillfället finns inga polletter på kontot för att betala för samtalet, men de dyker upp där som ett resultat av samtalet).
  • PoW-captcha - skydd mot högfrekventa automatiserade samtal till smarta kontofunktioner - analogt med captcha, men genom bevis på användningen av datorresurser.
  • Fråga efter datanycklar med en mall.

Ansökan består av:

  • smart kontokod på ride4dapps-språket (som, som planerat, slås samman till det smarta huvudkontot för vilket affiliate-funktionalitet behöver implementeras);
  • js wrapper som implementerar en abstraktionsnivå över WAVES NODE REST API;
  • kod på vuejs ramverk, vilket är ett exempel på användning av biblioteket och RIDE-koden.

Låt oss beskriva alla de listade funktionerna.

Ringa ett smart konto för skuld med omedelbar återbetalning

Att anropa InvokeScript kräver betalning av en avgift från det konto som initierar transaktionen. Detta är inget problem om du gör ett projekt för blockchain-nördar som har en viss mängd WAVES-tokens på sitt konto, men om produkten är avsedd att användas av allmänheten blir detta ett allvarligt problem. När allt kommer omkring måste användaren ta hand om att köpa WAVES-tokens (eller annan lämplig tillgång som kan användas för att betala för transaktioner), vilket ökar den redan avsevärda tröskeln för att komma in i projektet. Vi kan distribuera en tillgång till användare som kommer att kunna betala för transaktioner och står inför risken för deras missbruk när automatiserade system skapas för att pumpa ut en likvid tillgång från vårt system.

Det skulle vara mycket bekvämt om det var möjligt att anropa InvokeScript "på bekostnad av mottagaren" (det smarta kontot som skriptet är installerat på), och en sådan möjlighet finns, även om den inte är på ett uppenbart sätt.

Om du inom InvokeScript gör en ScriptTransfer till uppringarens adress, som kompenserar för de avgiftsbevis som spenderas, kommer ett sådant samtal att lyckas, även om det vid tidpunkten för samtalet inte fanns några tillgångar på det uppringande kontot. Detta är möjligt eftersom kontrollen av tillräckligt med tokens görs efter att transaktionen anropats, snarare än innan den, så att transaktioner kan göras på kredit, med förbehåll för omedelbar återbetalning.

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

Koden nedan återbetalar den förbrukade avgiften med smarta kontomedel. För att skydda mot missbruk av denna funktion är det nödvändigt att använda en kontroll av att den som ringer spenderar avgiften i den nödvändiga tillgången och inom rimliga gränser:

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
}

Dessutom, för att skydda mot skadligt och meningslöst slöseri med pengar, krävs automatiskt samtalsskydd (PoW-captcha).

PoW-captcha

Själva idén med proof-of-work captcha är inte ny och har redan implementerats i olika projekt, inklusive de som implementerats på basis av WAVES. Tanken är att för att utföra en åtgärd som förbrukar vårt projekts resurser måste den som ringer också spendera sina egna resurser, vilket gör en resursangreppsattack ganska dyr. För en mycket enkel och billig validering av att avsändaren av transaktionen har löst PoW-problemet finns det en transaktions-id-kontroll:

if take(toBase58String(i.transactionId), 3) != “123” then throw(“proof of work failed”) else

För att utföra en transaktion måste den som ringer välja sådana parametrar så att dess base58-kod (id) börjar med siffrorna 123, vilket i genomsnitt motsvarar ett par tiotals sekunders processortid och är generellt rimligt för vår uppgift. Om en enklare eller mer komplex PoW krävs, kan uppgiften enkelt modifieras på ett självklart sätt.

Fråga efter datanycklar med en mall

För att kunna använda blockchain som en databas är det viktigt att ha API-verktyg för att fråga databasen som nyckelval baserat på mallar. En sådan verktygslåda dök upp i början av juli 2019 i form av en parameter ?tändstickor på REST API-begäran /adresser/data?matches=regexp. Om vi ​​nu behöver få mer än en nyckel från en webbapplikation och inte alla nycklar på en gång, utan bara någon grupp, kan vi göra ett urval efter nyckelnamn. Till exempel, i detta projekt kodas uttagstransaktioner som

withdraw_${userAddress}_${txid}

som låter dig få en lista över transaktioner för uttag av pengar för en given adress med hjälp av mallen:

?matches=withdraw_${userAddress}_.*

Låt oss nu titta på komponenterna i den färdiga lösningen.

Vuejs kod

Koden är en fungerande demo nära det verkliga projektet. Det implementerar inloggning genom Waves Keeper och fungerar med affiliate.js-biblioteket, med vilket det registrerar användaren i systemet, frågar efter transaktionsdata och låter dig även ta ut intjänade pengar till användarens konto.

Decentraliserat affiliateprogram med öppen källkod på Waves blockchain

Kod för RIDE

Består av register-, fond- och uttagsfunktioner.

Registerfunktionen registrerar en användare i systemet. Den har två parametrar: referer (referrer-adress) och saltparametern, som inte används i funktionskoden, som behövs för att välja transaktions-id (PoW-captcha task).

Funktionen (liksom andra funktioner från detta projekt) använder sig av debt call-tekniken, resultatet av funktionen är att finansiera betalningen av en avgift för att anropa denna funktion. Tack vare denna lösning kan en användare som precis har skapat en plånbok omedelbart arbeta med systemet och behöver inte oroa sig för att köpa eller ta emot en tillgång som gör att han kan betala en transaktionsavgift.

Resultatet av registreringsfunktionen är två poster:

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

Detta tillåter sökningar framåt och bakåt (hänvisningsadressen för en given användare och alla hänvisningar från en given användare).

Fondfunktionen är mer en mall för att utveckla verklig funktionalitet. I sin presenterade form tar den alla medel som överförts av transaktionen och distribuerar dem till kontona för hänvisare på nivåerna 1, 2, 3, till "cashback"-kontot och "växlings"-kontot (allt som återstår när det distribueras till tidigare konton går här).

Cashback är ett sätt att motivera slutanvändaren att delta i remisssystemet. Användaren kan ta ut den del av provisionen som systemet betalar i form av "cashback" på samma sätt som belöningar för hänvisningar.

När du använder ett remisssystem bör fondfunktionen modifieras och integreras i huvudlogiken för det smarta konto som systemet kommer att fungera på. Till exempel, om en hänvisningsbelöning betalas ut för ett vad som gjorts, bör fondfunktionen byggas in i logiken där insatsen placeras (eller så utförs en annan riktad åtgärd som belöningen betalas för). Tre nivåer av hänvisningsbelöningar är kodade i denna funktion. Om du behöver göra fler eller färre nivåer så korrigeras även detta i koden. Belöningsprocenten bestäms av nivå1-nivå3 konstanterna, i koden beräknas den som belopp * nivå / 1000, det vill säga värdet 1 motsvarar 0,1 % (detta kan även ändras i koden).

Att anropa funktionen ändrar kontosaldot och skapar även poster för loggning av formuläret:

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

Det vill säga att transaktionstiden är tiden för blocket där det är beläget. Detta är mer tillförlitligt än att använda tidsstämpeln från själva transaktionen, särskilt eftersom den inte är tillgänglig från den anropsbara.
Uttagsfunktionen visar alla ackumulerade belöningar till användarens konto. Skapar poster för loggningsändamål:

# withdraw log: withdraw_user_txid=amount:timestamp

ansökan

Huvuddelen av applikationen är affiliate.js-biblioteket, som är en brygga mellan affiliatedatamodellerna och WAVES NODE REST API. Implementerar en abstraktionsnivå oberoende av ramverket (vilken som helst kan användas). Aktiva funktioner (registrera, ta tillbaka) förutsätter att Waves Keeper är installerat på systemet, biblioteket själv kontrollerar inte detta.

Implementerar metoder:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Funktionaliteten hos metoderna framgår av namnen, parametrarna och returnerade data beskrivs i koden. Registerfunktionen kräver ytterligare kommentarer - den startar en cykel för att välja transaktions-id så att den börjar vid 123 - detta är den PoW-captcha som beskrivs ovan, som skyddar mot massregistreringar. Funktionen hittar en transaktion med det id som krävs och signerar den sedan genom Waves Keeper.

DEX affiliateprogram finns tillgängligt på GitHub.com.

Källa: will.com

Lägg en kommentar