Programme d'affiliation open source décentralisé sur la blockchain Waves

Un programme d'affiliation décentralisé sur la blockchain Waves, mis en œuvre dans le cadre d'une subvention Waves Labs par l'équipe Bettex.

La publication n'est pas de la publicité
! Le programme est open source, son utilisation et sa distribution sont gratuites. L'application du programme stimule le développement d'applications dApp et favorise généralement la décentralisation, ce qui est bénéfique pour chaque utilisateur du réseau.

image

Introduit par dApp pour les programmes d'affiliation est un modèle pour les projets qui incluent l'affiliation dans le cadre de ses fonctionnalités. Le code peut être utilisé comme modèle de copie, comme bibliothèque ou comme ensemble d'idées pour la mise en œuvre technique.

En termes de fonctionnalité, il s'agit d'un système d'affiliation régulier qui met en œuvre l'inscription avec une indication d'un référent, une accumulation à plusieurs niveaux de récompenses pour les références et une motivation pour l'inscription dans le système (cashback). Le système est une pure dApp, c'est-à-dire que l'application Web interagit directement avec la blockchain sans son backend, sa base de données, etc.

Des techniques sont utilisées qui peuvent également être utiles dans de nombreux autres projets:

  • Appeler un compte intelligent Ă  crĂ©dit avec remboursement immĂ©diat (au moment de l'appel, il n'y a pas de jetons sur le compte pour payer l'appel, mais ils y apparaissent Ă  la suite de l'appel).
  • PoW-captcha - protection contre les appels automatisĂ©s Ă  haute frĂ©quence des fonctions de compte intelligent - un analogue du captcha, mais grâce Ă  la preuve de l'utilisation des ressources informatiques.
  • Demande de clĂ©s de donnĂ©es par modèle.

L'application se compose de:

  • code de compte intelligent dans la langue ride4dapps (qui, par conception, est fusionnĂ© dans le compte intelligent principal, pour lequel vous devez implĂ©menter la fonctionnalitĂ© d'affiliation);
  • les wrappers js qui implĂ©mentent le niveau d'abstraction sur l'API WAVES NODE REST;
  • code sur le framework vuejs, qui est un exemple d'utilisation de la bibliothèque et du code RIDE.

Nous décrivons toutes ces fonctionnalités.

Appelez un compte intelligent à crédit avec remboursement immédiat

Les appels InvokeScript nécessitent des frais du compte initiateur de transaction. Ce n'est pas un problème si vous faites un projet pour les geeks blockchain qui ont des jetons WAVES sur leur compte, mais si le produit est destiné à une utilisation généralisée, cela devient un problème grave. Après tout, l'utilisateur doit prendre soin d'acheter des jetons WAVES (ou un autre actif approprié avec lequel vous pouvez payer pour les transactions), ce qui augmente le seuil déjà considérable pour entrer dans le projet. Nous pouvons distribuer des actifs aux utilisateurs, ce qui nous permettra de payer les transactions et de faire face au risque de leur mauvaise utilisation lorsque des systèmes automatisés sont créés pour pomper des actifs liquides de notre système.

Il serait très pratique de pouvoir effectuer un appel InvokeScript «aux frais du destinataire» (ce compte intelligent sur lequel le script est installé), et une telle possibilité, bien que pas de manière évidente, existe.

Si vous exécutez ScriptTransfer dans InvokeScript à l'adresse de l'appelant, ce qui compense les jetons dépensés en frais, alors un tel appel réussira, même s'il n'y avait aucun actif sur le compte appelant au moment de l'appel. Cela est possible du fait qu'un nombre suffisant de jetons est vérifié après l'appel d'une transaction, et non avant, de sorte qu'il est possible d'effectuer des transactions à crédit sous réserve de leur remboursement immédiat.

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

Le code ci-dessous rembourse les frais dépensés aux frais du compte intelligent. Pour vous protéger contre une utilisation abusive de cette fonctionnalité, vous devez utiliser la vérification que l'appelant dépense des frais dans le bon actif et dans des limites raisonnables:

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 } 

De plus, la protection contre le gaspillage de fonds malveillant et insensé nécessite une protection contre les appels automatiques (PoW-captcha)

PoW-captcha

L'idée du captcha de preuve de travail n'est pas nouvelle et a déjà été mise en œuvre dans divers projets, y compris ceux mis en œuvre sur la base de WAVES. L'idée est que pour l'action qui gaspille les ressources de notre projet, l'appelant doit dépenser ses propres ressources, ce qui rend assez coûteuse l'attaque contre l'épuisement des ressources. Pour une validation très simple et à faible coût que l'expéditeur de la transaction a résolu la tâche PoW, il y a une vérification pour l'ID de transaction:

si prendre (toBase58String (i.transactionId), 3)! = "123" puis jeter ("la preuve du travail a échoué") sinon

Pour effectuer une transaction, l'appelant doit sélectionner de tels paramètres afin que son code base58 (id) commence à 123, ce qui correspond à une moyenne de quelques dizaines de secondes de temps processeur et est généralement raisonnable pour notre tâche. Si un PoW plus simple ou plus complexe est requis, alors la tâche est facile à affiner de manière évidente.

Demande de clés de données par modèle

Afin d'utiliser la blockchain comme base de données, il est essentiel de disposer d'outils API pour interroger la base de données en tant que modèles de valeur-clé. Une telle boîte à outils est apparue début juillet 2019 en tant que paramètre ? Matches pour la demande / adresses / données de l'API REST ? Matches = regexp . Maintenant, si nous devons obtenir non pas une clé et pas toutes les clés d'une application Web à la fois, mais seulement un groupe, nous pouvons faire une sélection par le nom de la clé. Par exemple, dans ce projet, les transactions de retrait sont codées comme

 withdraw_${userAddress}_${txid} 

qui vous permet d'obtenir une liste des transactions pour retirer des fonds pour une adresse donnée selon le modèle:

 ?matches=withdraw_${userAddress}_.* 

Nous allons maintenant analyser les composants de la solution clé en main.

Code Vuejs

Le code est une démo fonctionnelle proche d'un vrai projet. Il implémente la connexion via Waves Keeper et travaille avec la bibliothèque affiliate.js, à l'aide de laquelle il enregistre l'utilisateur dans le système, interroge les données de transaction et vous permet également de retirer des fonds gagnés sur le compte de l'utilisateur.

image

Code RIDE

Il consiste en des fonctions d'enregistrement, de financement et de retrait.

La fonction d'enregistrement s'inscrit auprès du système utilisateur. Il a deux paramètres: referer (adresse de référence) et le paramètre salt, qui n'est pas utilisé dans le code de fonction, qui est nécessaire pour sélectionner l'ID de transaction (tâche PoW-captcha).

La fonction (comme les autres fonctions de ce projet) utilise la technique d'emprunt, le résultat de la fonction est de financer des frais pour appeler cette fonction. Grâce à cette décision, l'utilisateur qui vient de créer le portefeuille peut immédiatement travailler avec le système et il n'a pas besoin d'être intrigué par la question de l'achat ou de la réception d'un bien qui vous permet de payer des frais de transaction.

Le résultat de la fonction d'enregistrement est deux entrées:

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

Cela permet des recherches directes et inverses (référent de cet utilisateur et toutes les références de cet utilisateur).

La fonction de fonds est plus probablement un modèle pour développer une fonctionnalité réelle. Dans la forme présentée, il prend tous les fonds transférés par la transaction et les distribue aux comptes des référents 1, 2, 3, au compte «cashback» et au compte «change» (tout ce qui reste lors de la distribution aux comptes précédents tombe ici).

La remise en argent est un moyen de stimuler l'utilisateur final à participer au système de référence. L'utilisateur peut retirer la partie de la commission payée par le système sous forme de «cashback» au même titre que les récompenses pour les filleuls.

Lors de l'utilisation du système de référence, la fonction de fonds doit être modifiée, intégrée dans la logique principale du compte intelligent sur lequel le système fonctionnera. Par exemple, si les frais de référence sont payés pour le pari effectué, la fonction de fonds doit être intégrée dans la logique dans laquelle le pari est effectué (ou une autre action ciblée est effectuée, pour laquelle les frais sont payés). Cette fonction encode trois niveaux de récompenses de parrainage. Si vous devez faire plus ou moins de niveaux, cela est également corrigé dans le code. Le pourcentage de rémunération est fixé par les constantes niveau1-niveau3, dans le code, il est considéré comme montant * niveau / 1000 , c'est-à-dire que la valeur 1 correspond à 0,1% (cela peut également être modifié dans le code).

L'appel de fonction modifie le solde du compte et crée également des entrées dans le but de se connecter dans le formulaire:

 fund_address_txid = address:owner:inc:level:timestamp   timestamp ( )     func getTimestamp() = { let block = extract(blockInfoByHeight(height)) toString(block.timestamp) } 

Autrement dit, le temps de transaction est le temps du bloc dans lequel il se trouve. C'est plus fiable que d'utiliser l'horodatage de la transaction elle-mĂŞme, d'autant plus qu'il n'est pas accessible depuis callable.
La fonction de retrait affiche toutes les récompenses accumulées sur le compte utilisateur. Crée des entrées à des fins de journalisation:

 # withdraw log: withdraw_user_txid=amount:timestamp 

App

La partie principale de l'application est la bibliothèque affiliate.js, qui est un pont entre les modèles de données d'affiliation et l'API WAVES NODE REST. Implémente un niveau d'abstraction indépendant du framework (n'importe lequel peut être utilisé). Les fonctions actives (enregistrer, retirer) supposent que Waves Keeper est installé dans le système, la bibliothèque elle-même ne vérifie pas cela.

Met en œuvre des méthodes:

 fetchReferralTransactions fetchWithdrawTransactions fetchMyBalance fetchReferrals fetchReferer withdraw register 

La fonctionnalité des méthodes est évidente à partir des noms, les paramètres et les données retournées sont décrits dans le code. La fonction d'enregistrement nécessite des commentaires supplémentaires - elle démarre le cycle de correspondance des identifiants de transaction pour qu'il démarre à 123 - c'est le PoW-captcha décrit ci-dessus, qui protège contre les enregistrements de masse. La fonction recherche la transaction avec l'ID souhaité, puis la signe via Waves Keeper.

Le programme d'affiliation DEX est disponible sur GitHub.com .

Source: https://habr.com/ru/post/fr459590/


All Articles