Programma d'affiliazione decentralizatu, open source nantu à u blockchain Waves

Un prugramma di affiliazione decentralizatu nantu à u blockchain Waves, implementatu cum'è parte di una cuncessione di Waves Labs da u squadra Bettex.

U postu ùn hè micca publicità! U prugramma hè open source, u so usu è a distribuzione sò liberi. L'usu di u prugramma stimulates u sviluppu di l'applicazioni dApp è in generale prumove a decentralizazione, chì benefiziu ogni utilizatore di Internet.

Programma d'affiliazione decentralizatu, open source nantu à u blockchain Waves

A dApp presentata per i prugrammi di affiliazione hè un mudellu per i prughjetti chì includenu affiliate cum'è parte di e so funziunalità. U codice pò esse usatu cum'è un mudellu per a copia, cum'è una biblioteca, o cum'è un inseme di idee per l'implementazione tecnica.

In termini di funziunalità, questu hè un sistema di affiliazione regulare chì implementa a registrazione cù un referrer, l'accumulazione multi-livellu di ricumpensa per i riferimenti è a motivazione per a registrazione in u sistema (cashback). U sistema hè una dApp "pura", vale à dì, l'applicazione web interagisce direttamente cù u blockchain, senza avè u so propiu backend, basa di dati, etc.

Tecniche utilizzate chì ponu ancu esse utili in parechji altri prughjetti:

  • Chjama un contu intelligente in u debitu cù u rimborsu immediatu (à u mumentu di a chjama ùn ci sò micca tokens nantu à u contu per pagà per a chjama, ma appariscenu quì com'è u risultatu di a chjama).
  • PoW-captcha - prutezzione contr'à e chiamate automatizati d'alta freccia à e funzioni intelligenti di u cuntu - analogu à captcha, ma attraversu a prova di l'usu di risorse informatiche.
  • Interrogazione per e chjave di dati utilizendu un mudellu.

L'applicazione hè custituita da:

  • codice di cuntu intelligente in a lingua ride4dapps (chì, cum'è previstu, hè unitu in u contu intelligente principale per quale a funziunalità di affiliazione deve esse implementata);
  • js wrapper chì implementa un livellu di astrazione annantu à l'API WAVES NODE REST;
  • codice nant'à u quadru di vuejs, chì hè un esempiu di usu di a biblioteca è codice RIDE.

Descrivimu tutte e funzioni listate.

Chjama un contu intelligente per u debitu cù rimborsu immediata

Calling InvokeScript richiede u pagamentu di una tarifa da u contu chì inizia a transazzione. Questu ùn hè micca un prublema s'è vo fate un prughjettu per i geeks blockchain chì anu una certa quantità di tokens WAVES in u so contu, ma se u pruduttu hè destinatu à l'usu da u publicu generale, questu diventa un prublema seriu. Dopu tuttu, l'utilizatore deve piglià cura di l'acquistu di tokens WAVES (o un altru attivu adattatu chì pò esse usatu per pagà per e transacciones), chì aumenta a barriera digià considerableu per l'ingressu à u prugettu. Pudemu distribuisce un attivu à l'utilizatori chì puderanu pagà per e transacciones è affruntà u risicu di u so misu quandu i sistemi automatizati sò creati per pompà un attivu liquidu da u nostru sistema.

Saria assai còmuda s'ellu era pussibule di chjamà InvokeScript "à a spesa di u destinatariu" (u cuntu intelligente nantu à quale u script hè stallatu), è una tale pussibilità, ancu s'ellu ùn hè micca in modu ovvi, esiste.

Se in InvokeScript fate un ScriptTransfer à l'indirizzu di u chjamante, chì cumpensà i tokens di tariffu spesi, allora una tale chjamata serà successu, ancu s'ellu à u mumentu di a chjama ùn ci era micca attivu nantu à u contu chjamatu. Questu hè pussibule perchè a verificazione di tokens suffirenti hè fatta dopu chì a transazzione hè chjamata, invece di prima, per chì e transazzione ponu esse fatte in creditu, sottumessu à u rimborsu immediata.

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

U codice quì sottu rimborsa a tarifa spesa utilizendu fondi di contu intelligente. Per pruteggiri contra l'abusu di sta funzione, hè necessariu d'utilizà un cuntrollu chì u chjamante spende a tarifa in l'assetu necessariu è in limiti ragiunate:

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
}

Inoltre, per pruteggiri contr'à i maliziusi è senza sensu di sprechi di fondi, a prutezzione automatica di a chjama (PoW-captcha) hè necessaria.

PoW-captcha

L'idea stessa di captcha di prova di travagliu ùn hè micca nova è hè digià stata implementata in diversi prughjetti, cumprese quelli implementati nantu à a basa di WAVES. L'idea hè chì per fà una azione chì cunsuma e risorse di u nostru prughjettu, u chjamante deve ancu spende i so risorse, chì rende un attaccu di depletion di risorse abbastanza caru. Per una validazione assai faciule è di prezzu bassu chì u mittente di a transazzione hà risoltu u prublema PoW, ci hè una verificazione d'identità di transazzione:

se take(toBase58String(i.transactionId), 3) != "123" allora throw ("prova di travagliu fiascatu") altri

Per fà una transazzione, u chjamante deve selezziunà tali paràmetri in modu chì u so codice di basa 58 (id) principia cù i numeri 123, chì currisponde in media à un paru di decine di seconde di u tempu di processore è hè generalmente ragiunate per u nostru compitu. Se un PoW più simplice o più cumplessu hè necessariu, allura u compitu pò esse facilmente mudificatu in modu evidenti.

Interrogazione per e chjave di dati utilizendu un mudellu

Per utilizà a blockchain cum'è una basa di dati, hè vitale per avè strumenti API per interrogà a basa di dati cum'è chjave-val basatu nantu à mudelli. Un tali toolkit apparsu à u principiu di lugliu 2019 in forma di paràmetru ?partite à a dumanda di l'API REST /indirizzi/dati?matches=regexp. Avà, se avemu bisognu di ottene più di una chjave da una applicazione web è micca tutte e chjave in una volta, ma solu un gruppu, allora pudemu fà una selezzione per nome di chjave. Per esempiu, in stu prughjettu, e transazzione di ritirata sò codificate cum'è

withdraw_${userAddress}_${txid}

chì vi permette di ottene una lista di e transazzione per a retirazzione di fondi per ogni indirizzu datu cù u mudellu:

?matches=withdraw_${userAddress}_.*

Avà fighjemu i cumpunenti di a suluzione finita.

codice Vuejs

U codice hè una demo di travagliu vicinu à u prughjettu veru. Implementa u login attraversu Waves Keeper è travaglia cù a biblioteca affiliate.js, cù quale registra l'utilizatore in u sistema, interrogà i dati di transazzione, è permette ancu di ritirà i fondi guadagnati à u contu di l'utilizatore.

Programma d'affiliazione decentralizatu, open source nantu à u blockchain Waves

Codice per RIDE

Consiste in u registru, funziunamentu di funziunamentu è ritirata.

A funzione di registru registra un utilizatore in u sistema. Havi dui paràmetri: riferimentu (indirizzu di riferimentu) è u paràmetru di u sali, chì ùn hè micca usatu in u codice di funzione, chì hè necessariu per selezziunà l'id di transazzione (tastu PoW-captcha).

A funzione (cum'è altre funzioni di stu prughjettu) usa a tecnica di chjama di u debitu, u risultatu di a funzione hè di finanzià u pagamentu di una tarifa per chjamà sta funzione. Grazie à sta suluzione, un utilizatore chì hà appena creatu una billetera pò travaglià immediatamente cù u sistema è ùn deve micca preoccupatu di cumprà o riceve un attivu chì li permette di pagà una tarifa di transazzione.

U risultatu di a funzione di registrazione hè dui registri:

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

Questu permette ricerche avanti è inverse (u referrer di un utilizatore datu è tutti i riferimenti di un utilizatore datu).

A funzione di u fondu hè più di un mudellu per u sviluppu di funziunalità reali. In a so forma presentata, piglia tutti i fondi trasferiti da a transazzione è li distribuisce à i cunti di i referreri di i livelli 1, 2, 3, à u cuntu "cashback" è u cuntu "cambià" (tuttu ciò chì ferma quandu hè distribuitu à precedente). cunti và quì).

Cashback hè un mezzu per motivà l'utilizatori finali à participà à u sistema di riferimentu. L'utilizatore pò ritirà a parte di a cumissioni pagata da u sistema in a forma di "cashback" in u listessu modu cum'è ricumpensa per i riferimenti.

Quandu s'utilice un sistema di riferimentu, a funzione di u fondu deve esse mudificata è integrata in a logica principale di u cuntu intelligente nantu à quale u sistema hà da travaglià. Per esempiu, se una ricumpensa di riferimentu hè pagata per una scumessa fatta, allora a funzione di u fondu deve esse integrata in a logica induve a scumessa hè piazzata (o una altra azione mirata hè realizata per quale a recompensa hè pagata). Trè livelli di ricumpensa di riferimentu sò codificati in questa funzione. Sè avete bisognu di fà più o menu livelli, allora questu hè ancu currettu in u codice. U percentualità di ricumpensa hè stabilitu da e custanti level1-level3 in u codice chì hè calculatu quantità * livellu / 1000, vale à dì, u valore 1 currisponde à 0,1% (questu pò ancu esse cambiatu in u codice).

Chjama a funzione cambia u saldo di u contu è crea ancu entrate per scopi di logu di a forma:

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

Questu hè, u tempu di transazzione hè u tempu di u bloccu in quale si trova. Questu hè più affidabile chì l'usu di u timestamp da a transazzione stessu, soprattuttu perchè ùn hè micca dispunibule da u callable.
A funzione di ritirata mostra tutti i premii accumulati à u contu di l'utilizatore. Crea voci per scopi di logu:

# withdraw log: withdraw_user_txid=amount:timestamp

Applicazione

A parte principale di l'applicazione hè a libreria affiliate.js, chì hè un ponte trà i mudelli di dati affilati è l'API WAVES NODE REST. Implementa un livellu di astrazione indipendente da u framework (qualsiasi pò esse usatu). Funzioni attive (registrà, ritira) assume chì Waves Keeper hè stallatu nantu à u sistema a biblioteca stessa ùn verifica micca questu.

Implementa i metudi:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

A funziunalità di i metudi hè evidenti da i nomi di i paràmetri è i dati restituiti sò descritti in u codice. A funzione di registru richiede cumenti supplementari - cumencia un ciculu di selezzione di l'id di transazzione in modu chì principia à 123 - questu hè u PoW-captcha descrittu sopra, chì pruteghja contra i registrazioni di massa. A funzione trova una transazzione cù l'identificatore necessariu, è dopu a firma cù Waves Keeper.

U prugramma di affiliazione DEX hè dispunibule à GitHub.com.

Source: www.habr.com

Add a comment