Modifications du Code#
Cette section explique en détail les ajouts et modifications spécifiques apportés au contrat de base pour répondre aux tâches du projet.
Partie 1 Tâche 1 : Initialiser le Bénéficiaire#
// Part 1 Task 1. Initialize beneficiary with address of smart contract’s owner
// Hint: In the constructor, "msg.sender" is the address of the owner.
// ** Start code here. 1 line approximately. **/
beneficiary = msg.sender;
// ** End code here. **/
Explication :
But : Assigner l’adresse du déployeur du contrat (le propriétaire) à la variable beneficiary.
Détails : - msg.sender représente l’adresse de l’entité qui déploie le contrat. - En définissant beneficiary = msg.sender;, nous nous assurons que le propriétaire est enregistré comme bénéficiaire, qui peut effectuer certaines actions restreintes dans le contrat. - Cela permet de mettre en place des contrôles d’accès pour des fonctions sensibles, comme la révélation des gagnants.
—
Partie 1 Tâche 2 : Initialiser les Articles aux Index 1 et 2#
// Part 1 Task 2. Initialize two items at index 1 and 2.
// ** Start code here. 2 lines approximately. **/
items[1] = Item({ itemId: 1, itemTokens: emptyArray });
items[2] = Item({ itemId: 2, itemTokens: emptyArray });
// ** End code here **/
Explication :
But : Initialiser les articles aux indices 1 et 2 dans le tableau items.
Détails : - Crée deux instances de Item avec itemId défini à 1 et 2, respectivement. - emptyArray est un tableau vide de itemTokens, indiquant qu’aucune enchère n’a encore été placée. - Cette étape complète l’initialisation des trois articles (indices 0, 1 et 2) pour l’enchère.
—
Partie 1 Tâche 3 : Initialiser l’Adresse de l’Enchérisseur#
// Part 1 Task 3. Initialize the address of the bidder
/* Hint: Here the bidders[bidderCount].addr should be initialized with the address of the registrant. */
// ** Start code here. 1 line approximately. **/
bidders[bidderCount].addr = msg.sender;
// ** End code here. **
Explication :
But : Enregistrer l’adresse Ethereum de l’enchérisseur qui s’inscrit.
Détails : - bidders[bidderCount] accède à la structure Person à l’index courant bidderCount. - msg.sender est l’adresse de l’enchérisseur appelant la fonction register(). - En assignant msg.sender à bidders[bidderCount].addr, nous lions l’identité de l’enchérisseur à son adresse Ethereum dans le contrat.
—
Partie 1 Tâche 4 : Implémenter les Conditions dans la Fonction bid#
/*
Part 1 Task 4. Implement the three conditions below.
4.1 If the number of tokens remaining with the bidder is less than the count of tokens bid, revert.
4.2 If there are no tokens remaining with the bidder, revert.
4.3 If the id of the item for which the bid is placed is greater than 2, revert.
Hint: "tokenDetails[msg.sender].remainingTokens" gives the number of tokens remaining with the bidder.
*/
// ** Start code here. 2 lines approximately. **/
require(tokenDetails[msg.sender].remainingTokens >= _count, "Not enough tokens remaining");
require(_itemId <= 2, "Invalid item id");
// ** End code here. **
Explication :
But : Assurer que les enchères sont valides en appliquant les conditions nécessaires avant de procéder.
Détails : - Condition 1 & 2 :
require(tokenDetails[msg.sender].remainingTokens >= _count, « Not enough tokens remaining »);
Vérifie si l’enchérisseur a suffisamment de jetons pour placer l’enchère.
Si l’enchérisseur a zéro ou un nombre insuffisant de jetons, la transaction est annulée avec un message d’erreur.
Condition 3 : - require(_itemId <= 2, « Invalid item id »); - Assure que _itemId est dans la plage valide (0 à 2), correspondant aux articles initialisés.
En appliquant ces conditions, le contrat empêche les enchères invalides et maintient l’intégrité des données.
—
Partie 1 Tâche 5 : Décrémenter les Jetons Restants et Mettre à Jour le Solde#
/* Part 1 Task 5. Decrement the remainingTokens by the number of tokens bid and store the value in the balance variable.
Hint: "tokenDetails[msg.sender].remainingTokens" should be decremented by "_count". */
// ** Start code here. 1 line approximately. **
uint balance = tokenDetails[msg.sender].remainingTokens - _count;
// ** End code here. **
Explication :
But : Mettre à jour le solde de jetons de l’enchérisseur après avoir placé une enchère.
Détails : - Calcule le nouveau solde en soustrayant _count (le nombre de jetons misés) de remainingTokens. - Stocke le résultat dans la variable balance pour une utilisation ultérieure. - Cela garantit que le nombre de jetons de l’enchérisseur reflète avec précision les jetons qu’il lui reste pour les futures enchères.
—
Partie 1 Tâche 6 : Assigner les Gagnants#
/* Part 1 Task 6. Assign the winners.
Hint: "bidders[winnerId]" will give you the Person object with the winnerId.
You need to assign the address of the person obtained above to winners[id]. */
// ** Start coding here *** 1 line approximately.
winners[id] = bidders[winnerId].addr;
// ** end code here *
Explication :
But : Enregistrer l’adresse du gagnant pour chaque article après la fin de l’enchère.
Détails : - winnerId est l’identifiant de l’enchérisseur gagnant, obtenu à partir des itemTokens sélectionnés aléatoirement. - bidders[winnerId].addr récupère l’adresse Ethereum de l’enchérisseur gagnant. - En assignant cette adresse à winners[id], nous stockons l’adresse du gagnant dans le tableau winners à l’index correspondant à l’article.
Cette étape finalise l’enchère en liant chaque article à son gagnant.
—
Partie 2 Tâche 1 : Créer le Modificateur onlyOwner#
// Part 2 Task 1. Create a modifier named "onlyOwner" to ensure that only the owner is allowed to reveal winners
// Hint: Use require to validate if "msg.sender" is equal to the "beneficiary".
modifier onlyOwner {
// ** Start code here. 2 lines approximately. **
require(msg.sender == beneficiary);
_;
// ** End code here. **
}
Explication :
But : Restreindre l’accès à certaines fonctions pour que seul le propriétaire du contrat (bénéficiaire) puisse les exécuter.
Détails : - modifier onlyOwner définit un modificateur personnalisé qui peut être appliqué aux fonctions. - require(msg.sender == beneficiary); vérifie si l’appelant de la fonction est le bénéficiaire.
Si ce n’est pas le cas, la transaction est annulée, empêchant tout accès non autorisé.
Le _; indique où le corps de la fonction modifiée sera inséré.
Ce modificateur est appliqué à la fonction revealWinners() pour s’assurer que seul le propriétaire peut révéler les résultats de l’enchère.
Utilisation du Modificateur `onlyOwner` :
function revealWinners() public onlyOwner {
// Implémentation de la fonction...
}
En ajoutant onlyOwner après la déclaration de la fonction, nous appliquons le contrôle d’accès défini dans le modificateur.
—
En intégrant ces modifications, le contrat assure une fonctionnalité complète et sécurisée pour la gestion de l’enchère.