Oopbron gedesentraliseerde geaffilieerde program op die Waves blockchain

'n Gedesentraliseerde geaffilieerde program gebaseer op die Waves-blokketting, geïmplementeer as deel van 'n Waves Labs-toekenning deur die Bettex-span.

Pos word nie geborg nie! Die program is oopbron, die gebruik en verspreiding daarvan is gratis. Die gebruik van die program stimuleer die ontwikkeling van dApp-toepassings en bevorder in die algemeen desentralisasie, wat voordelig is vir elke gebruiker van die Netwerk.

Oopbron gedesentraliseerde geaffilieerde program op die Waves blockchain

Die aangebied dApp vir geaffilieerde programme is 'n sjabloon vir projekte wat geaffilieerde as deel van hul funksionaliteit insluit. Die kode kan gebruik word as 'n sjabloon vir kopiëring, as 'n biblioteek, of as 'n stel idees vir tegniese implementering.

Wat funksionaliteit betref, is dit 'n gewone geaffilieerde stelsel wat registrasie by 'n verwyser, multi-vlak aanwas van vergoeding vir verwysings en motivering vir registrasie in die stelsel implementeer (kontantterug). Die stelsel is 'n "suiwer" dApp, dit wil sê, die webtoepassing interaksie direk met die blokketting sonder sy eie backend, databasis, ens.

Tegnieke word gebruik wat ook in baie ander projekte nuttig kan wees:

  • Bel 'n slim rekening op krediet met onmiddellike terugbetaling (ten tyde van die oproep is daar geen tekens op die rekening om vir die oproep te betaal nie, maar hulle verskyn daar as gevolg van die oproep).
  • PoW-captcha - beskerming teen hoëfrekwensie outomatiese oproep van slim rekeningfunksies - soortgelyk aan captcha, maar deur bewys van die gebruik van rekenaarhulpbronne.
  • Versoek om datasleutels volgens sjabloon.

Die aansoek bestaan ​​uit:

  • slim rekeningkode in die ride4dapps-taal (wat, soos beplan, saamgevoeg is in die hoofslimrekening, waarvoor jy die geaffilieerde funksionaliteit moet implementeer);
  • js-omhulsel wat 'n abstraksielaag oor die WAVES NODE REST API implementeer;
  • kode op die vuejs-raamwerk, wat 'n voorbeeld is van die gebruik van die biblioteek en RIDE-kode.

Kom ons beskryf al die gelyste kenmerke.

Maak 'n slim rekening skuld met onmiddellike terugbetaling

Om InvokeScript te bel vereis betaling van 'n fooi van die rekening wat die transaksie begin. Dit is nie 'n probleem as jy 'n projek doen vir blokkettinggeeks wat 'n sekere aantal WAVES-tokens op hul rekening het nie, maar as die produk op die massas gemik is, word dit 'n ernstige probleem. Die gebruiker moet immers aandag gee aan die aankoop van WAVES-tokens (of 'n ander geskikte bate wat gebruik kan word om vir transaksies te betaal), wat die reeds aansienlike drempel vir toegang tot die projek verhoog. Ons kan bates aan gebruikers versprei wat toegelaat sal word om vir transaksies te betaal en die risiko van hul misbruik in die gesig staar wanneer outomatiese stelsels geskep word om vloeibare bates uit ons stelsel te pomp.

Dit sal baie gerieflik wees as dit moontlik sou wees om InvokeScript “ten koste van die ontvanger” (die slim rekening waarop die script geïnstalleer is) te noem, en hierdie moontlikheid bestaan, hoewel nie op 'n ooglopende manier nie.

As daar binne InvokeScript 'n ScriptTransfer na die adres van die oproeper gemaak word, wat vergoed vir die tokens wat aan die fooi bestee is, dan sal so 'n oproep slaag, selfs al was daar geen bates op die oproeprekening ten tyde van die oproep nie. Dit is moontlik omdat die tjek vir voldoende tokens gemaak word nadat die transaksie opgeroep is, en nie voor dit nie, sodat dit moontlik is om transaksies op krediet te maak, mits dit onmiddellik afgelos word.

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

Die kode hieronder betaal die besteede fooi terug met slimrekeningfondse. Om teen misbruik van hierdie kenmerk te beskerm, moet jy 'n tjek gebruik dat die beller die fooi in die regte bate en binne redelike perke spandeer:

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
}

Ook, om te beskerm teen kwaadwillige en sinnelose vermorsing van fondse, word beskerming teen outomatiese oproep (PoW-captcha) vereis.

PoW-captcha

Die idee van 'n bewys-van-werk-captcha is nie nuut nie en is reeds in verskeie projekte geïmplementeer, insluitend dié wat op WAVES gebaseer is. Die punt van die idee is dat om 'n aksie uit te voer wat ons projek se hulpbronne mors, die oproeper ook hul eie hulpbronne moet spandeer, wat 'n hulpbronuitputtingsaanval redelik duur maak. Vir 'n baie maklike en laekoste-validering dat die sender van die transaksie die PoW-probleem opgelos het, is daar 'n transaksie-ID-kontrole:

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

Om 'n transaksie uit te voer, moet die beller sulke parameters kies sodat sy base58-kode (id) met die nommers 123 begin, wat ooreenstem met 'n gemiddeld van 'n paar tientalle sekondes se verwerkertyd en oor die algemeen redelik is vir ons taak. As 'n eenvoudiger of meer komplekse PoW vereis word, kan die taak maklik op 'n ooglopende manier gewysig word.

Doen navraag oor datasleutels volgens sjabloon

Om die blokketting as 'n databasis te gebruik, is dit noodsaaklik om API-instrumente te hê om die databasis as 'n sleutelwaarde te bevraagteken deur sjablone te gebruik. So 'n gereedskapstel het vroeg in Julie 2019 as 'n parameter verskyn ?wedstryde op die REST API-versoek /adresse/data?matches=regexp. Nou, as ons meer as een sleutel en nie alle sleutels gelyktydig van die webtoepassing moet kry nie, maar slegs een of ander groep, dan kan ons 'n keuse maak deur die naam van die sleutel. Byvoorbeeld, in hierdie projek word onttrekkingstransaksies geënkodeer as

withdraw_${userAddress}_${txid}

wat jou toelaat om 'n lys van transaksies vir die onttrekking van fondse vir enige gegewe adres te kry deur die sjabloon te gebruik:

?matches=withdraw_${userAddress}_.*

Kom ons ontleed nou die komponente van die voltooide oplossing.

sien kode

Die kode is 'n werkende demo, naby aan 'n regte projek. Dit implementeer aanmelding deur Waves Keeper en werk saam met die affiliate.js-biblioteek, met die hulp waarvan dit 'n gebruiker in die stelsel registreer, transaksiedata navrae, en jou ook toelaat om verdiende fondse na die gebruiker se rekening te onttrek.

Oopbron gedesentraliseerde geaffilieerde program op die Waves blockchain

Kode op RIDE

Bestaan ​​uit registrasie-, fonds- en onttrekkingsfunksies.

Die registerfunksie registreer 'n gebruiker in die stelsel. Dit het twee parameters: verwyser (verwyser se adres) en die soutparameter wat nie in die funksiekode gebruik word nie, wat nodig is om die transaksie-ID (PoW-captcha-taak) te kies.

Die funksie (soos die res van die funksies in hierdie projek) gebruik die leentegniek, die resultaat van die funksie is die betaling van 'n fooi vir die oproep van hierdie funksie. Danksy hierdie oplossing kan 'n gebruiker wat pas 'n beursie geskep het, onmiddellik met die stelsel werk en hoef nie verward te wees oor die kwessie van die verkryging of ontvangs van 'n bate wat hom toelaat om 'n transaksiefooi te betaal nie.

Die resultaat van die registrasiefunksie is twee rekords:

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

Dit laat vorentoe en agtertoe soektogte toe (verwyser van die gegewe gebruiker en alle verwysings van die gegewe gebruiker).

Die fondsfunksie is meer 'n sjabloon vir die ontwikkeling van werklike funksionaliteit. In die voorgestelde vorm neem dit al die fondse oorgedra deur die transaksie en versprei dit na die verwysingsrekeninge van die 1ste, 2de, 3de vlakke, na die "kontantterug"-rekening en die "verandering"-rekening (alles wat oorbly tydens verspreiding na vorige rekeninge kom hier).

Kontantterug is 'n manier om die eindgebruiker aan te spoor om aan die verwysingstelsel deel te neem. Die deel van die kommissie wat deur die stelsel betaal word in die vorm van "kontantterug" kan deur die gebruiker onttrek word op dieselfde manier as belonings vir verwysings.

Wanneer die verwysingstelsel gebruik word, moet die fondsfunksie gewysig word, ingebou in die hooflogika van die slimrekening waarop die stelsel sal werk. Byvoorbeeld, as 'n verwysingsbeloning betaal word vir 'n weddenskap wat gemaak is, moet die fondsfunksie ingebou word in die logika waar die weddenskap gemaak word (of 'n ander teikenaksie word uitgevoer waarvoor die beloning betaal word). Daar is drie vlakke van verwysingsbelonings wat in hierdie kenmerk gekodeer is. As jy meer of minder vlakke wil maak, dan word dit ook in die kode reggestel. Die beloning persentasie word bepaal deur die vlak1-vlak3 konstantes, in die kode word dit bereken as bedrag * vlak / 1000, dit wil sê, die waarde 1 stem ooreen met 0,1% (dit kan ook in die kode verander word).

Die funksie-oproep verander die saldo van die rekening en skep ook inskrywings met die doel om die vorm aan te teken:

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

Dit wil sê, die tyd van die transaksie is die tyd van die blok waarin dit geleë is. Dit is meer betroubaar as om die tydstempel van die transaksie self te gebruik, veral omdat dit nie by die oproepbare beskikbaar is nie.
Die onttrekkingsfunksie onttrek alle opgehoopte belonings na die gebruiker se rekening. Skep inskrywings vir logdoeleindes:

# withdraw log: withdraw_user_txid=amount:timestamp

Artikels

Die hoofdeel van die toepassing is die affiliate.js-biblioteek, wat 'n brug is tussen die geaffilieerde datamodelle en die WAVES NODE REST API. Implementeer 'n abstraksielaag wat onafhanklik van die raamwerk is (enige een kan gebruik word). Aktiewe funksies (registreer, onttrek) veronderstel dat Waves Keeper in die stelsel geïnstalleer is, die biblioteek self kontroleer dit nie.

Implementeer metodes:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

Die funksionaliteit van die metodes is duidelik uit die name, die parameters en terugkeerdata word in die kode beskryf. Die registerfunksie vereis bykomende opmerkings - dit begin die transaksie-ID seleksie siklus sodat dit by 123 begin - dit is die PoW captcha hierbo beskryf, wat teen massaregistrasies beskerm. Die funksie vind 'n transaksie met die vereiste ID, en teken dit dan deur Waves Keeper.

DEX geaffilieerde program beskikbaar by GitHub.com.

Bron: will.com

Voeg 'n opmerking