Gedecentraliseerd, open source partnerprogramma op de Waves-blockchain

Een gedecentraliseerd partnerprogramma op de Waves-blockchain, geïmplementeerd als onderdeel van een Waves Labs-subsidie ​​door het Bettex-team.

Het bericht is geen reclame! Het programma is open source, het gebruik en de distributie ervan zijn gratis. Het gebruik van het programma stimuleert de ontwikkeling van dApp-applicaties en bevordert in het algemeen decentralisatie, waar elke internetgebruiker van profiteert.

Gedecentraliseerd, open source partnerprogramma op de Waves-blockchain

De gepresenteerde dApp voor partnerprogramma's is een sjabloon voor projecten die affiliate als onderdeel van hun functionaliteit bevatten. De code kan worden gebruikt als sjabloon om te kopiëren, als bibliotheek of als een reeks ideeën voor technische implementatie.

Qua functionaliteit is dit een regulier aangesloten systeem dat registratie bij een verwijzer, de opbouw van beloningen op meerdere niveaus voor verwijzingen en de motivatie voor registratie in het systeem implementeert (cashback). Het systeem is een ‘pure’ dApp, dat wil zeggen dat de webapplicatie rechtstreeks communiceert met de blockchain, zonder dat er een eigen backend, database, etc. is.

Gebruikte technieken die ook bij veel andere projecten van pas kunnen komen:

  • Een slimme rekening in de schulden steken met onmiddellijke terugbetaling (op het moment van de oproep staan ​​er geen tokens op de rekening om de oproep te betalen, maar ze verschijnen daar als gevolg van de oproep).
  • PoW-captcha - bescherming tegen hoogfrequente geautomatiseerde oproepen naar slimme accountfuncties - analoog aan captcha, maar door bewijs van het gebruik van computerbronnen.
  • Gegevenssleutels opvragen met behulp van een sjabloon.

De applicatie bestaat uit:

  • smart accountcode in de ride4dapps-taal (die, zoals gepland, wordt samengevoegd met het smart account waarvoor de affiliate-functionaliteit moet worden geïmplementeerd);
  • js wrapper die een abstractieniveau implementeert via de WAVES NODE REST API;
  • code op het vuejs-framework, wat een voorbeeld is van het gebruik van de bibliotheek en RIDE-code.

Laten we alle genoemde functies beschrijven.

Een slimme rekening bellen voor schulden met onmiddellijke terugbetaling

Voor het aanroepen van InvokeScript zijn kosten vereist van de rekening die de transactie initieert. Dit is geen probleem als je een project maakt voor blockchain-geeks die een bepaald aantal WAVES-tokens op hun account hebben staan, maar als het product gericht is op gebruik door het grote publiek, wordt dit een serieus probleem. De gebruiker moet immers zorgen voor de aanschaf van WAVES-tokens (of een ander geschikt middel dat kan worden gebruikt om transacties te betalen), wat de toch al aanzienlijke toetredingsdrempel tot het project vergroot. We kunnen activa distribueren aan gebruikers die voor transacties kunnen betalen en het risico van misbruik lopen wanneer er geautomatiseerde systemen worden gecreëerd om liquide activa uit ons systeem te pompen.

Het zou erg handig zijn als het mogelijk zou zijn om InvokeScript aan te roepen “op kosten van de ontvanger” (het slimme account waarop het script is geïnstalleerd), en een dergelijke mogelijkheid bestaat, hoewel niet op een voor de hand liggende manier.

Als u binnen InvokeScript een ScriptTransfer naar het adres van de beller uitvoert, die de uitgegeven tokens compenseert, zal een dergelijke oproep succesvol zijn, zelfs als er op het moment van de oproep geen activa op de bellende account stonden. Dit is mogelijk omdat de controle op voldoende tokens wordt uitgevoerd nadat de transactie is aangeroepen, in plaats van ervoor, zodat transacties op krediet kunnen worden uitgevoerd, met onmiddellijke terugbetaling.

Scriptoverdracht(i.caller, i.fee, eenheid)

Met de onderstaande code wordt het uitgegeven bedrag terugbetaald met behulp van slimme accountfondsen. Om u te beschermen tegen misbruik van deze functie, is het noodzakelijk om te controleren of de beller de vergoeding in het vereiste bezit besteedt en binnen redelijke grenzen:

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
}

Ter bescherming tegen kwaadwillige en zinloze geldverspilling is bovendien automatische oproepbescherming (PoW-captcha) vereist.

PoW-captcha

Het idee van proof-of-work captcha is niet nieuw en is al in verschillende projecten geïmplementeerd, waaronder projecten die op basis van WAVES zijn geïmplementeerd. Het idee is dat de beller, om een ​​actie uit te voeren die de hulpbronnen van ons project verbruikt, ook zijn eigen hulpbronnen moet besteden, wat een aanval waarbij de hulpbronnen uitgeput raken behoorlijk duur wordt. Voor een zeer gemakkelijke en goedkope validatie dat de afzender van de transactie het PoW-probleem heeft opgelost, is er een transactie-ID-controle:

if take(toBase58String(i.transactionId), 3) != “123” then throw(“bewijs van werk mislukt”) else

Om een ​​transactie uit te voeren, moet de beller dergelijke parameters selecteren, zodat zijn base58-code (id) begint met de cijfers 123, wat gemiddeld overeenkomt met een paar tientallen seconden processortijd en over het algemeen redelijk is voor onze taak. Als een eenvoudiger of complexer PoW vereist is, kan de taak eenvoudig op een voor de hand liggende manier worden aangepast.

Gegevenssleutels opvragen met behulp van een sjabloon

Om blockchain als database te kunnen gebruiken, is het essentieel om over API-tools te beschikken waarmee je de database als key-val kunt bevragen op basis van sjablonen. Zo’n toolkit verscheen begin juli 2019 in de vorm van een parameter ?wedstrijden op het REST API-verzoek /adressen/data?matches=regexp. Als we nu meer dan één sleutel uit een webapplicatie nodig hebben en niet alle sleutels tegelijk, maar slechts een bepaalde groep, dan kunnen we een selectie maken op basis van de sleutelnaam. In dit project worden opnametransacties bijvoorbeeld gecodeerd als

withdraw_${userAddress}_${txid}

waarmee u een lijst met transacties voor het opnemen van geld kunt krijgen voor elk bepaald adres met behulp van de sjabloon:

?matches=withdraw_${userAddress}_.*

Laten we nu eens kijken naar de componenten van de voltooide oplossing.

Vuejs-code

De code is een werkende demo die dicht bij het echte project ligt. Het implementeert inloggen via Waves Keeper en werkt met de affiliate.js-bibliotheek, waarmee het de gebruiker in het systeem registreert, transactiegegevens opvraagt ​​en u ook in staat stelt verdiende gelden op te nemen naar het account van de gebruiker.

Gedecentraliseerd, open source partnerprogramma op de Waves-blockchain

Code voor RIDE

Bestaat uit de functies registreren, financieren en opnemen.

De registerfunctie registreert een gebruiker op het systeem. Het heeft twee parameters: referer (verwijzeradres) en de salt-parameter, die niet wordt gebruikt in de functiecode, die nodig is om de transactie-ID (PoW-captcha-taak) te selecteren.

De functie maakt (net als andere functies uit dit project) gebruik van de techniek van het opvragen van schulden. Het resultaat van de functie is het financieren van de betaling van een vergoeding voor het aanroepen van deze functie. Dankzij deze oplossing kan een gebruiker die zojuist een portemonnee heeft aangemaakt direct met het systeem aan de slag en hoeft hij zich geen zorgen te maken over het kopen of ontvangen van een asset waarmee hij transactiekosten kan betalen.

Het resultaat van de registratiefunctie is twee records:

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

Dit maakt voorwaartse en achterwaartse zoekopdrachten mogelijk (de verwijzer van een bepaalde gebruiker en alle verwijzingen van een bepaalde gebruiker).

De fondsfunctie is meer een sjabloon voor het ontwikkelen van echte functionaliteit. In de gepresenteerde vorm neemt het al het geld dat door de transactie is overgemaakt en verdeelt het over de rekeningen van verwijzers van niveaus 1, 2, 3, naar de “cashback”-rekening en de “wisselrekening” (alles wat overblijft wanneer het wordt gedistribueerd naar eerdere rekeningen komen hier).

Cashback is een middel om de eindgebruiker te motiveren om deel te nemen aan het verwijzingssysteem. De gebruiker kan het door het systeem betaalde deel van de commissie in de vorm van “cashback” opnemen, op dezelfde manier als beloningen voor verwijzingen.

Bij gebruik van een verwijzingssysteem moet de fondsfunctie worden aangepast en geïntegreerd in de hoofdlogica van de slimme rekening waarop het systeem zal werken. Als er bijvoorbeeld een verwijzingsbeloning wordt betaald voor een gedane weddenschap, dan moet de fondsfunctie worden ingebouwd in de logica waar de weddenschap wordt geplaatst (of wordt er een andere gerichte actie uitgevoerd waarvoor de beloning wordt betaald). In deze functie zijn drie niveaus van verwijzingsbeloningen gecodeerd. Mocht je meer of minder levels moeten maken, dan wordt dit ook in de code gecorrigeerd. Het beloningspercentage wordt bepaald door de niveau1-niveau3-constanten; in de code wordt het berekend als bedrag * niveau / 1000, dat wil zeggen dat de waarde 1 overeenkomt met 0,1% (dit kan ook in de code worden gewijzigd).

Als u de functie aanroept, wordt het rekeningsaldo gewijzigd en worden er ook vermeldingen gemaakt voor logboekdoeleinden van het formulier:

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

Dat wil zeggen dat de transactietijd de tijd is van het blok waarin deze zich bevindt. Dit is betrouwbaarder dan het gebruik van de tijdstempel van de transactie zelf, vooral omdat deze niet beschikbaar is via de opvraagbare transactie.
De opnamefunctie toont alle verzamelde beloningen op het account van de gebruiker. Creëert vermeldingen voor logdoeleinden:

# withdraw log: withdraw_user_txid=amount:timestamp

toepassing

Het belangrijkste onderdeel van de applicatie is de affiliate.js-bibliotheek, die een brug vormt tussen de aangesloten datamodellen en de WAVES NODE REST API. Implementeert een abstractieniveau dat onafhankelijk is van het raamwerk (elk niveau kan worden gebruikt). Actieve functies (registreren, terugtrekken) gaan ervan uit dat Waves Keeper op het systeem is geïnstalleerd; de bibliotheek zelf controleert dit niet.

Implementeert methoden:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

De functionaliteit van de methoden blijkt duidelijk uit de namen; de parameters en geretourneerde gegevens worden beschreven in de code. De registerfunctie vereist extra commentaar - het start een cyclus van het selecteren van de transactie-ID zodat deze begint bij 123 - dit is de hierboven beschreven PoW-captcha, die beschermt tegen massaregistraties. De functie vindt een transactie met de vereiste ID en ondertekent deze vervolgens via Waves Keeper.

DEX-partnerprogramma is beschikbaar op GitHub.com.

Bron: www.habr.com

Voeg een reactie