Jeu du Pendu en Duel, créer une partie avec la mise souhaitée ou rejoignez une partie, le vainqueur remporte le tout. DAPP réalisé dans le cadre de la formation développeur blockchain d'Alyra.
Adresse du contract: 0xD1f5b4fB58D99c93d91376FC0E110c2078B840AE (Goerli)
EtherScan: https://goerli.etherscan.io/address/0xD1f5b4fB58D99c93d91376FC0E110c2078B840AE
Vidéo de démonstration: https://youtu.be/iz33uqRb9r4
Faucet: https://goerlifaucet.com/
DAPP: https://floral-darkness-8082.on.fleek.co/
Pour ce projet de DAPP j'ai utilisé React Truffle Box. Vous pouvez copiez le repo avec la commande :
git clone https://github.com/jw418/Penduel.git
Pour installer les dépendances allez à la racine du fichier et utilisez les commandes suivante :
npm install
cd client
npm install
Pensez à modifier le fichier truffle-config.js selon le réseau choisi. https://trufflesuite.com/docs/truffle/reference/configuration/
Puis si nécessaire à créer et à configurer votre fichier .ENV à la racine et l'ajouter à votre .gitignore.
Pour voir le front en local:
cd client
npm run start
Sinon directement sur: https://floral-darkness-8082.on.fleek.co/
Assurez-vous d'être sur le réseau de test Goerli.
Pour exécuter les test du smart contract:
Allez à la racine du projet et tapez la commande:
truffle test ./test/MockPenduel.js
J'ai essayer la méthode décrite ici: https://betterprogramming.pub/how-to-mock-chainlink-vrf-coordinator-v2-and-aggregator-v3-with-truffle-0-8-0-24353b96858e pour faire les tests en local avec les faux contrats vrf v2 coordinator fourni par chainlink mais sans succès. J'ai donc repris de zéro avec une version du contrat sans chainlink.
Outil qui met en évidence certaines vulnérabilités.
_ rng volontairement dans le contract
_ ignoré: varaiable utilisé comme indiqué par chainlink
Reetrency: ligne 280 l'etat de la session est changé<
sessionPublic[idSession].state = StateSession.InProgress;
en cas de reentrency le require ligne 273 empeche l'execution de la fonction:
require(
sessionPublic[idSession].state == StateSession.Reachable,
"Error, session unreachable"
);
Reentrency pas possible grace au require, si la fonction s'exécute partiellement cela n'afffectera que l'utilisateur qui apelle la fonction(il ne pourra pas jouer et le jouer 1 pourra demander un remboursement). Cependant dans le cas ou l'utilisateur n'est pas malicieux et que la fonction ne s'exécute pas complétement il pourrait alors être lésé.
Action: déplacé l'appelle de la fonction requestRandomWords() en fin de fonction, dans ce cas si la fonction est interrompue avant la fin aucun mot ne sera générer et apres 3h les joueurs pourront demander a ce que la partie soit annulé && "sessionPublic[idSession].state = StateSession.InProgress;" placé juste après les require.
Ignoré: un require revert la fonction si nécéssaire
Ignoré: même en cas de manipulation c'est comparaison n'ont pas besoin d'une grande précisions
Action: suppression des égalités
Ignoré: require en fin de fonction qui vérifie l'exécution
Ignoré: pour les mixedCase (pas pertinent)
Action: Event name modifié
Action: uint32 callbackGasLimit = 200000; ==> uint32 callbackGasLimit = 2 * (10**5);
Action: ajout de l'attribut constant
Action: dans MockPenduel.sol pour la fonction joinSession() passé de public a external