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.
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.
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.
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.
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.
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".
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.
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).
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-srewardAmount
: 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 ALPHrewardAmount
: 1500 - 1% = 1485 ALPHrewardBaseCalAmount
: 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.
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