2 - Jeu de prédiction sur Alephium

2 - Jeu de prédiction sur Alephium

Dans cette série d'articles, nous allons expliquer comment nous avons développé une application décentralisée sur Alephium.

·

4 min read

Cet article est la deuxième partie de "Construire sur Alephium". Pour retrouver l'article précédent qui explique le fonctionnement de la dApp et le contrat principal PredictALPH, rendez-vous ici : https://blog.notrustverify.ch/1-jeu-de-prediction-sur-alephium

Pour tester l'application: ALPH.bet

Un rappel de ce qu'est Alephium

Alephium est la première blockchain shardée de couche 1 extensible qui améliore les concepts de Proof of Work & UTXO. La décentralisation, l'auto-souveraineté et la sécurité rencontrent l'efficacité énergétique dans un réseau adapté aux développeurs optimisé pour les applications DeFi et les contrats intelligents.

Dans cet article, le contrat Round sera à l'honneur. C'est lui qui va stocker les paris, les ALPH, le nombre de participants, les gains à la fin d'un tour, etc.

Contrat Round.ral

Pour chaque nouveau round, un nouveau contrat est créé, et Round.ral est utilisé comme modèle pour cela. Voilà comment est initialisé un nouveau contrat et round dans PredictALPH.ral.

Le code complet se trouve sur Github

Les lignes 5 à 7 vont encoder les états, les transformer en ByteVec afin de pouvoir les utiliser dans CopyCreateSubContract!. La première partie, de selfContract! à operator, représente des valeurs immuables, c'est-à-dire qu'elles ne pourront plus changer après la création.

Et le nouveau round est donc créé à la ligne 9 avec les variables créées précédemment.

Github

Etats

Le premier état, prediction, contient l'adresse du contrat PredictALPH. Cela permet d'autoriser uniquement les appels provenant de ce contrat et pas d'un autre. Ainsi, il n'est pas possible d'appeler Round directement.

Github

Fonctions

Cette série de fonctions est utile pour récupérer les informations sur différents états, comme par exemple lorsque le round se termine ou encore le montant total des frais récoltés.

Github

Cette fonction est celle qui se charge de mettre à jour le nombre de ALPH pariés dans le round et de transférer les ALPH du parieur-euse-s dans le contrat du round.

La ligne 3, checkCaller, permet de valider que l'appel provient uniquement du contrat intelligent PredictALPH.

La variable totalAmount (l. 6) permet d'optimiser les coûts du contrat intelligent. Bien que la fonction tokenRemaining! puisse être utilisée, elle demande plus de gas. Ainsi, le montant total du contrat est stocké dans totalAmount pour le rendre plus efficient.

Github

La fonction calculateRewards va calculer l'issue d'un round et les gains associés.

La variable rewardBaseCalAmount est utilisée pour stocker le montant total de celles et ceux qui ont parié correctement et calculer combien une personne a gagné au moment de la réclamation de ses gains.

treasuryAmount contient le montant total des frais pris par le contrat, actuellement 1% (en points de base 100).

Pour terminer, rewardAmount est le montant effectif qui sera partagé entre tous les gagnant-e-s.

Dans le cas où le prix final est le même que le prix du début, c'est la "maison qui gagne".

Github

Fonction qui permet simplement de "booster" un round, c'est-à-dire ajouter des ALPH pour le côté qui gagne. Cela permet d'encourager les gens à jouer, par exemple.

Github

Cette fonction permet de détruire un contrat intelligent sur Alephium et donc de libérer de l'espace sur la chaîne. Elle est appelée depuis PredictALPH.ral et ne peut être exécutée complètement, donc détruire le contrat uniquement si tous les joueur-euse-s ont réclamé leurs gains (l. 4).

Github

La dernière fonction est userClaimRewards qui permet aux participant-e-s de récupérer leur gain. La ligne 10 calcule le nombre de ALPH gagné :

$$(amountBid * rewardAmount) / rewardBaseCalAmount$$

  • amountBid : nombre de ALPH parié par un participant-e-s

  • rewardAmount : somme totale jouée (moins les frais)

  • rewardBaseCalAmount : nombre total de ALPH pariés pour le côté

Si une personne parie 100 ALPH sur "Up", que le montant total des paris est de 1500 ALPH, avec 900 ALPH pour "Up", et que l'issue finale est correcte, alors le calcul des gains serait le suivant :

$$\frac{{100 \times (1500 - (1500*(100/10000))}}{{900}}$$

  • amountBid: 100 ALPH

  • rewardAmount : 1500 - 1% = 1485 ALPH

  • rewardBaseCalAmount : 900 ALPH

Donc, la personne gagnerait un total de 165 ALPH, ce qui représente un gain net de 65 ALPH par rapport à sa mise initiale.

Github

Cet article termine la deuxième partie sur ALPH.bet. Le contrat Round est utilisé pour calculer les gains, contient les ALPH joués et les redistribue.

La troisième et dernière partie va se concentrer sur le contrat Punter qui permet de conserver les informations d'une personne participant à un round, ainsi que sur les TxScript, qui sont une particularité d'Alephium.

Pour relire le premier article de la série : https://blog.notrustverify.ch/1-jeu-de-prediction-sur-alephium