Programma di affiliazione decentralizzato e open source sulla blockchain Waves

Un programma di affiliazione decentralizzato sulla blockchain di Waves, implementato come parte di una sovvenzione di Waves Labs dal team di Bettex.

Il post non è pubblicitario! Il programma è open source, il suo utilizzo e la distribuzione sono gratuiti. L'utilizzo del programma stimola lo sviluppo di applicazioni dApp e in generale promuove la decentralizzazione, a vantaggio di ogni utente di Internet.

Programma di affiliazione decentralizzato e open source sulla blockchain Waves

La dApp presentata per i programmi di affiliazione è un modello per progetti che includono l'affiliazione come parte delle loro funzionalità. Il codice può essere utilizzato come modello da copiare, come libreria o come insieme di idee per l'implementazione tecnica.

In termini di funzionalità, si tratta di un normale sistema di affiliazione che implementa la registrazione presso un referrer, l'accumulo multilivello di premi per i referral e la motivazione per la registrazione nel sistema (cashback). Il sistema è una dApp “pura”, ovvero l’applicazione web interagisce direttamente con la blockchain, senza avere un proprio backend, database, ecc.

Tecniche utilizzate che possono essere utili anche in tanti altri progetti:

  • Indebitamento di un conto smart con rimborso immediato (al momento della chiamata non ci sono gettoni sul conto per pagare la chiamata, ma compaiono lì a seguito della chiamata).
  • PoW-captcha - protezione contro le chiamate automatizzate ad alta frequenza alle funzioni dello smart account - analoga al captcha, ma attraverso la prova dell'utilizzo delle risorse informatiche.
  • Interrogare le chiavi di dati utilizzando un modello.

L'applicazione è composta da:

  • codice smart account nel linguaggio ride4dapps (che, come previsto, confluisce nello smart account principale per il quale occorre implementare funzionalità di affiliazione);
  • js wrapper che implementa un livello di astrazione sulla WAVES NODE REST API;
  • codice sul framework vuejs, che è un esempio di utilizzo della libreria e del codice RIDE.

Descriviamo tutte le funzionalità elencate.

Chiamare un conto intelligente per debiti con rimborso immediato

La chiamata a InvokeScript richiede il pagamento di una commissione dal conto che ha avviato la transazione. Questo non è un problema se stai realizzando un progetto per fanatici della blockchain che hanno una certa quantità di token WAVES sul proprio conto, ma se il prodotto è rivolto ad un utilizzo da parte del grande pubblico, questo diventa un problema serio. Dopotutto, l'utente deve occuparsi dell'acquisto dei token WAVES (o di un altro asset idoneo che possa essere utilizzato per pagare le transazioni), il che aumenta la già notevole barriera all'ingresso nel progetto. Possiamo distribuire una risorsa agli utenti che saranno in grado di pagare per le transazioni e affrontare il rischio del loro uso improprio quando verranno creati sistemi automatizzati per pompare una risorsa liquida dal nostro sistema.

Sarebbe molto comodo se fosse possibile chiamare InvokeScript “a spese del destinatario” (lo smart account su cui è installato lo script), e tale possibilità, anche se non in modo ovvio, esiste.

Se all'interno di InvokeScript effettui uno ScriptTransfer all'indirizzo del chiamante, che compensa i token di commissione spesi, tale chiamata avrà successo, anche se al momento della chiamata non c'erano risorse sul conto chiamante. Ciò è possibile perché il controllo della quantità sufficiente di token viene effettuato dopo l'avvio della transazione, anziché prima, in modo che le transazioni possano essere effettuate a credito, soggette a rimborso immediato.

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

Il codice seguente rimborsa la tariffa spesa utilizzando i fondi dello smart account. Per tutelarsi dall'uso improprio di questa funzionalità, è necessario utilizzare un assegno che il chiamante spenda la tariffa nel bene richiesto ed entro limiti ragionevoli:

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 proteggersi da sprechi di fondi dannosi e insensati, è necessaria la protezione automatica delle chiamate (PoW-captcha).

PoW-captcha

L’idea stessa del captcha proof-of-work non è nuova ed è già stata implementata in vari progetti, compresi quelli implementati sulla base di WAVES. L'idea è che per eseguire un'azione che consuma le risorse del nostro progetto, il chiamante deve anche spendere le proprie risorse, il che rende un attacco di esaurimento delle risorse piuttosto costoso. Per verificare in modo semplice ed economico che il mittente della transazione abbia risolto il problema PoW, è disponibile un controllo dell'ID della transazione:

if take(toBase58String(i.transactionId), 3) != “123” then launch(“prova di lavoro fallita”) else

Per effettuare una transazione, il chiamante deve selezionare tali parametri in modo che il suo codice base58 (id) inizi con i numeri 123, che corrisponde in media a un paio di decine di secondi di tempo del processore ed è generalmente ragionevole per il nostro compito. Se è richiesto un PoW più semplice o più complesso, l'attività può essere facilmente modificata in modo ovvio.

Interrogare le chiavi di dati utilizzando un modello

Per utilizzare la blockchain come database, è fondamentale disporre di strumenti API per interrogare il database come valore chiave basato su modelli. Tale toolkit è apparso all’inizio di luglio 2019 sotto forma di parametro ?corrispondenze alla richiesta dell'API REST /indirizzi/dati?matches=regexp. Ora, se abbiamo bisogno di ottenere più di una chiave da un'applicazione web e non tutte le chiavi contemporaneamente, ma solo un gruppo, allora possiamo effettuare una selezione in base al nome della chiave. Ad esempio, in questo progetto, le transazioni di prelievo sono codificate come

withdraw_${userAddress}_${txid}

che ti consente di ottenere un elenco di transazioni per il prelievo di fondi per qualsiasi indirizzo utilizzando il modello:

?matches=withdraw_${userAddress}_.*

Ora diamo un'occhiata ai componenti della soluzione finita.

Codice Vuejs

Il codice è una demo funzionante vicina al progetto reale. Implementa l'accesso tramite Waves Keeper e funziona con la libreria affiliate.js, con la quale registra l'utente nel sistema, interroga i dati delle transazioni e consente anche di prelevare i fondi guadagnati sul conto dell'utente.

Programma di affiliazione decentralizzato e open source sulla blockchain Waves

Codice per RIDE

Consiste nelle funzioni di registro, deposito e prelievo.

La funzione di registrazione registra un utente nel sistema. Ha due parametri: referer (indirizzo del referrer) e il parametro salt, che non viene utilizzato nel codice funzione, necessario per selezionare l'ID della transazione (attività PoW-captcha).

La funzione (come altre funzioni di questo progetto) utilizza la tecnica della chiamata del debito, il risultato della funzione è quello di finanziare il pagamento di una commissione per la chiamata di questa funzione. Grazie a questa soluzione, un utente che ha appena creato un portafoglio può immediatamente lavorare con il sistema e non deve preoccuparsi di acquistare o ricevere un bene che gli permetta di pagare una commissione sulla transazione.

Il risultato della funzione di registrazione sono due record:

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

Ciò consente ricerche in avanti e all'indietro (il referrer di un determinato utente e tutti i referral di un determinato utente).

La funzione del fondo è più un modello per lo sviluppo di funzionalità reali. Nella sua forma presentata, prende tutti i fondi trasferiti dalla transazione e li distribuisce sui conti dei referrer di livello 1, 2, 3, sul conto “cashback” e sul conto “resto” (tutto ciò che rimane quando viene distribuito ai precedenti i conti vanno qui).

Il cashback è un mezzo per motivare l'utente finale a partecipare al sistema di riferimento. L'utente può ritirare la parte della commissione pagata dal sistema sotto forma di “cashback” allo stesso modo dei premi per i referral.

Quando si utilizza un sistema di riferimento, la funzione del fondo dovrebbe essere modificata e integrata nella logica principale del conto intelligente su cui funzionerà il sistema. Ad esempio, se viene pagata una ricompensa per una scommessa effettuata, la funzione del fondo dovrebbe essere integrata nella logica in cui viene piazzata la scommessa (o viene eseguita un'altra azione mirata per la quale viene pagata la ricompensa). In questa funzione sono codificati tre livelli di premi per i referral. Se è necessario creare più o meno livelli, anche questo viene corretto nel codice. La percentuale di ricompensa è impostata dalle costanti level1-level3; nel codice viene calcolata come importo * livello / 1000, cioè il valore 1 corrisponde allo 0,1% (questo può essere modificato anche nel codice).

La chiamata alla funzione modifica il saldo del conto e crea anche voci a scopo di registrazione del modulo:

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

Cioè, l'ora della transazione è l'ora del blocco in cui si trova. Questo è più affidabile rispetto all'utilizzo del timestamp della transazione stessa, soprattutto perché non è disponibile dal callable.
La funzione di prelievo mostra tutti i premi accumulati sul conto dell'utente. Crea voci a scopo di registrazione:

# withdraw log: withdraw_user_txid=amount:timestamp

applicazione

La parte principale dell'applicazione è la libreria affiliate.js, che funge da ponte tra i modelli di dati di affiliazione e l'API WAVES NODE REST. Implementa un livello di astrazione indipendente dal framework (è possibile utilizzarne uno qualsiasi). Le funzioni attive (registrazione, ritiro) presuppongono che Waves Keeper sia installato sul sistema; la libreria stessa non lo verifica.

Implementa i metodi:

fetchReferralTransactions
fetchWithdrawTransactions
fetchMyBalance
fetchReferrals
fetchReferer
withdraw
register

La funzionalità dei metodi è evidente dai nomi; i parametri e i dati restituiti sono descritti nel codice. La funzione di registro richiede commenti aggiuntivi - avvia un ciclo di selezione dell'ID della transazione in modo che inizi da 123 - questo è il PoW-captcha descritto sopra, che protegge dalle registrazioni di massa. La funzione trova una transazione con l'ID richiesto e quindi la firma tramite Waves Keeper.

Il programma di affiliazione DEX è disponibile su GitHub.com.

Fonte: habr.com

Aggiungi un commento