Programa d'afiliació descentralitzat i de codi obert a la cadena de blocs Waves

Un programa d'afiliació descentralitzat a la cadena de blocs Waves, implementat com a part d'una subvenció de Waves Labs per part de l'equip de Bettex.

La publicació no és publicitat! El programa és de codi obert, el seu ús i distribució són gratuïts. L'ús del programa estimula el desenvolupament d'aplicacions dApp i, en general, afavoreix la descentralització, que beneficia a tots els usuaris d'Internet.

Programa d'afiliació descentralitzat i de codi obert a la cadena de blocs Waves

La dApp presentada per a programes d'afiliació és una plantilla per a projectes que inclouen l'afiliació com a part de la seva funcionalitat. El codi es pot utilitzar com a plantilla per copiar, com a biblioteca o com a conjunt d'idees per a la implementació tècnica.

Pel que fa a la funcionalitat, es tracta d'un sistema d'afiliació habitual que implementa el registre amb un referent, acumulació de recompenses multinivell per a referències i motivació per registrar-se al sistema (cashback). El sistema és una dApp "pura", és a dir, l'aplicació web interactua directament amb la cadena de blocs, sense tenir el seu propi backend, base de dades, etc.

Tècniques utilitzades que també poden ser útils en molts altres projectes:

  • Endeutament d'un compte intel·ligent amb reemborsament immediat (en el moment de la trucada no hi ha fitxes al compte per pagar la trucada, però hi apareixen com a resultat de la trucada).
  • PoW-captcha - protecció contra trucades automàtiques d'alta freqüència a funcions de compte intel·ligent - anàloga a captcha, però mitjançant la prova de l'ús de recursos informàtics.
  • Consulta de claus de dades mitjançant una plantilla.

L'aplicació consta de:

  • codi de compte intel·ligent en l'idioma ride4dapps (que, tal com estava previst, es fusiona amb el compte intel·ligent principal per al qual s'ha d'implementar la funcionalitat d'afiliació);
  • js que implementa un nivell d'abstracció sobre l'API WAVES NODE REST;
  • codi al marc de vuejs, que és un exemple d'ús de la biblioteca i el codi RIDE.

Anem a descriure totes les característiques enumerades.

Trucar a un compte intel·ligent per deute amb amortització immediata

Trucar a InvokeScript requereix el pagament d'una tarifa del compte que inicia la transacció. Això no és un problema si esteu fent un projecte per a geeks de blockchain que tenen una certa quantitat de fitxes WAVES al seu compte, però si el producte està destinat a ser utilitzat pel públic en general, això es converteix en un problema greu. Al cap i a la fi, l'usuari s'ha de fer càrrec de la compra de fitxes WAVES (o un altre actiu adequat que es pugui utilitzar per pagar transaccions), cosa que augmenta la ja considerable barrera d'entrada al projecte. Podem distribuir un actiu als usuaris que podran pagar les transaccions i afrontar el risc del seu mal ús quan es creen sistemes automatitzats per treure un actiu líquid del nostre sistema.

Seria molt convenient que fos possible trucar a InvokeScript "a costa del destinatari" (el compte intel·ligent en el qual s'instal·la l'script), i aquesta possibilitat, encara que no de manera òbvia, existeix.

Si dins d'InvokeScript feu un ScriptTransfer a l'adreça de la persona que truca, que compensa les fitxes gastades, aquesta trucada tindrà èxit, fins i tot si en el moment de la trucada no hi havia cap actiu al compte de trucada. Això és possible perquè la comprovació de fitxes suficients es realitza després de la trucada de la transacció, i no abans, de manera que les transaccions es poden fer a crèdit, subjecte a un reemborsament immediat.

Script Transfer(i.caller, i.fee, unit)

El codi següent reemborsa la quota gastada amb fons del compte intel·ligent. Per protegir-se de l'ús indegut d'aquesta funció, cal comprovar que la persona que truca gasta la tarifa en l'actiu requerit i dins de límits raonables:

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
}

A més, per protegir-se del malbaratament de fons maliciós i sense sentit, es requereix una protecció automàtica de trucades (PoW-captcha).

PoW-captcha

La idea mateixa del captcha de prova de treball no és nova i ja s'ha implementat en diversos projectes, inclosos els implementats sobre la base de WAVES. La idea és que per dur a terme una acció que consumeixi els recursos del nostre projecte, la persona que truca també ha de gastar els seus propis recursos, la qual cosa fa que un atac d'esgotament de recursos sigui bastant car. Per a una validació molt fàcil i de baix cost que el remitent de la transacció ha resolt el problema de PoW, hi ha una comprovació d'identificació de la transacció:

si take(toBase58String(i.transactionId), 3) != "123" llavors throw ("prova de treball ha fallat") sinó

Per dur a terme una transacció, la persona que truca ha de seleccionar aquests paràmetres de manera que el seu codi base58 (id) comenci amb els números 123, que corresponen de mitjana a un parell de desenes de segons de temps del processador i, en general, és raonable per a la nostra tasca. Si es requereix un PoW més simple o més complex, la tasca es pot modificar fàcilment d'una manera òbvia.

Consulta de claus de dades mitjançant una plantilla

Per utilitzar la cadena de blocs com a base de dades, és vital disposar d'eines API per consultar la base de dades com a clau de valor basat en plantilles. Aquest conjunt d'eines va aparèixer a principis de juliol de 2019 en forma de paràmetre ? partits a la sol·licitud de l'API REST /addresses/data?matches=regexp. Ara, si necessitem obtenir més d'una clau d'una aplicació web i no totes les claus alhora, sinó només algun grup, podem fer una selecció pel nom de la clau. Per exemple, en aquest projecte, les transaccions de retirada es codifiquen com a

withdraw_${userAddress}_${txid}

que us permet obtenir una llista de transaccions per a la retirada de fons per a qualsevol adreça determinada mitjançant la plantilla:

?matches=withdraw_${userAddress}_.*

Ara mirem els components de la solució acabada.

Codi Vuejs

El codi és una demostració de treball propera al projecte real. Implementa l'inici de sessió a través de Waves Keeper i treballa amb la biblioteca affiliate.js, amb la qual registra l'usuari al sistema, consulta dades de transaccions i també permet retirar els fons obtinguts al compte de l'usuari.

Programa d'afiliació descentralitzat i de codi obert a la cadena de blocs Waves

Codi per RIDE

Consisteix en les funcions de registre, finançament i retirada.

La funció de registre registra un usuari al sistema. Té dos paràmetres: el referent (adreça de referència) i el paràmetre de sal, que no s'utilitza en el codi de funció, que és necessari per seleccionar l'identificador de la transacció (tasca PoW-captcha).

La funció (com altres funcions d'aquest projecte) utilitza la tècnica de trucada de deute, el resultat de la funció és finançar el pagament d'una tarifa per trucar a aquesta funció. Gràcies a aquesta solució, un usuari que acaba de crear una cartera pot treballar immediatament amb el sistema i no s'ha de preocupar per comprar o rebre un actiu que li permeti pagar una quota de transacció.

El resultat de la funció de registre són dos registres:

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

Això permet cerques endavant i inverses (el referent d'un usuari determinat i totes les referències d'un usuari determinat).

La funció de fons és més aviat una plantilla per desenvolupar una funcionalitat real. En la seva forma presentada, pren tots els fons transferits per la transacció i els distribueix als comptes dels referents dels nivells 1, 2, 3, al compte de "cashback" i al compte de "canvi" (tot el que queda quan es distribueix a l'anterior comptes va aquí).

El cashback és un mitjà per motivar l'usuari final a participar en el sistema de referència. L'usuari pot retirar la part de la comissió abonada pel sistema en forma de "cashback" de la mateixa manera que les recompenses per referències.

Quan s'utilitza un sistema de referència, la funció de fons s'ha de modificar i integrar a la lògica principal del compte intel·ligent en què funcionarà el sistema. Per exemple, si es paga una recompensa de referència per una aposta feta, la funció de fons s'hauria d'incorporar a la lògica on es fa l'aposta (o es realitza una altra acció específica per a la qual es paga la recompensa). En aquesta funció es codifiquen tres nivells de recompenses de referència. Si necessiteu fer més o menys nivells, això també es corregeix al codi. El percentatge de recompensa es defineix per les constants de nivell1-nivell3 del codi amb el qual es calcula quantitat * nivell / 1000, és a dir, el valor 1 correspon al 0,1% (això també es pot canviar al codi).

La crida a la funció canvia el saldo del compte i també crea entrades per al registre del formulari:

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

És a dir, el temps de transacció és el temps del bloc en el qual es troba. Això és més fiable que utilitzar el segell de temps de la transacció en si, sobretot perquè no està disponible des de l'anomenable.
La funció de retirada mostra totes les recompenses acumulades al compte de l'usuari. Crea entrades amb finalitats de registre:

# withdraw log: withdraw_user_txid=amount:timestamp

Aplicació

La part principal de l'aplicació és la biblioteca affiliate.js, que és un pont entre els models de dades d'afiliats i l'API WAVES NODE REST. Implementa un nivell d'abstracció independent del marc (es pot utilitzar qualsevol). Les funcions actives (registrar, retirar) suposen que Waves Keeper està instal·lat al sistema, la pròpia biblioteca no ho verifica.

Implementa mètodes:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

La funcionalitat dels mètodes és òbvia pels noms dels paràmetres i les dades retornades es descriuen al codi. La funció de registre requereix comentaris addicionals: inicia un cicle de selecció de l'identificador de transacció perquè comenci a 123; aquest és el PoW-captcha descrit anteriorment, que protegeix contra els registres massius. La funció troba una transacció amb l'identificador requerit i després la signa mitjançant Waves Keeper.

El programa d'afiliació DEX està disponible a GitHub.Com.

Font: www.habr.com

Afegeix comentari