// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract Portfolio is ERC20 {
constructor() ERC20("Portfolio", "MTK") {}
string public titre;
function setTitre(string memory _titre) public { titre = _titre; }
function getTitre() public view returns (string memory) { return titre; }
struct Badge { string nom; string fin; string ecole; string image; }
Badge[] public badges;
function addBadge(string memory _nom, string memory _fin,
string memory _ecole, string memory _image) public {
badges.push(Badge(_nom, _fin, _ecole, _image));
}
}
Objectifs des semaines 12 à 15
À la fin de ces trois semaines, vous saurez lire la chaîne de blocs comme un registre de données décentralisé et en parler avec le bon vocabulaire, écrire un contrat intelligent en Solidity (une variable, une structure, un tableau, des fonctions de lecture et d'écriture), le compiler et le déployer avec Remix sur le réseau de test Sepolia après avoir obtenu des ETH de test à un faucet, brancher une application Electron sur ce contrat pour afficher un titre, lister et ajouter des badges avec leur image, puis verrouiller l'écriture au seul propriétaire du contrat.
Déroulement
- Le vocabulaire et les exemples : glossaire crypto-données, contrats d'exemple et annuaires de ressources Solidity.
- Le contrat Portfolio dans Remix : un contrat ERC20 minimal avec
setTitreetgetTitre, compilé et déployé dans la machine virtuelle de Remix. - Sur le réseau de test : MetaMask, des Sepolia ETH gratuits à un faucet, une adresse RPC, puis le déploiement réel et l'adresse du contrat.
- La dapp Electron :
config.js, l'accesseur qui parle au contrat,preload.js,main.jsetindex.html: titre, liste des badges, ajout, image. - Sécuriser :
owneret le modificateuronlyOwner, ouOwnabled'OpenZeppelin. Pour aller plus loin, les jeux d'attaque et de défense.
Trois extraits à garder sous la main
address public owner;
constructor() ERC20("Portfolio", "MTK") { owner = msg.sender; }
modifier onlyOwner() {
require(msg.sender == owner, "Seul le proprio peut ecrire");
_;
}
function setTitre(string memory _titre) public onlyOwner { titre = _titre; }
const CONFIG = {
SEPOLIA_RPC_URL: 'https://ethereum-sepolia.publicnode.com',
PRIVATE_KEY: '0x...', // votre clé privée de TEST Sepolia
CONTRACT_ADDRESS: '0x...' // l'adresse copiée de Remix après le déploiement
};
module.exports = CONFIG;
config.js contient une clé privée. Il reste dans .gitignore, ne se partage jamais, et le compte qu'il désigne ne contient que des ETH de test. Un compte avec de vrais ETH ne se branche jamais sur un projet d'école.Notes de cours
Les diaporamas des semaines 12 à 15, en version web (diapositives d'origine, exactes) et en PDF :
Les tutoriels de la dapp Portfolio
Repères et références
Pour aller plus loin
Le code et les documents du cours
dapp.zip (la dapp Electron de départ, avec Portfolio.sol et config.js.template) Ajouter un contrôle d'accès avec Ownable (PDF) Exemple : un registre de crédits carbone en Solidity (PDF) Aide-mémoire Solidity fiche PDF fiche courte affiche dépôt GitHub avec les bonnes pratiquesRessources
Outils Remix MetaMask Etherscan Sepolia Documentation Solidity OpenZeppelin S'exercer Solidity by Example Wriggly CryptoZombies Ethernaut Faucet Sepolia de Google Cloud Glossaire crypto (useweb3) Drive des semaines 12-15Évaluation : le Projet Portfolio (25 %)
Le devoir des semaines 12 à 15 : votre portfolio de badges sur la chaîne de blocs, une dapp Electron branchée sur votre contrat Portfolio déployé sur Sepolia. Cinq parties de cinq points, que les tutoriels ci-dessus construisent une à une. Le projet sera présenté sur sa propre page.
- 5 pointsSmart contract et sécurité
- 5 pointsAfficher le titre
- 5 pointsLister les badges
- 5 pointsAjouter un badge
- 5 pointsTéléverser une image et l'afficher