Vos USDC rapportent au taux d'hierQuicknode le transfère automatiquement vers le coffre-fort Morpho le plus performant du jour. Disponible sur 7 chaînes.
Élaborez votre stratégieTutoriel 101 sur Zeppelin OS
Zeppelin est entièrement dédié au développement de contrats intelligents. L'équipe a aidé de nombreux développeurs à créer des contrats intelligents à l'aide d'openzeppelin-solidity, l'une des bibliothèques web3 les plus téléchargées sur NPM (avec plus de 10 000 téléchargements chaque semaine !).

Certifié SOC 2 Type II · ISO 27001
29 mai 2019 — 7 min de lecture


Zeppelin est entièrement dédié au développement de contrats intelligents. L'équipe a aidé de nombreux développeurs à créer des contrats intelligents avec openzeppelin-solidity, l'une des bibliothèques Web3 les plus téléchargées sur NPM (avec plus de 10 000 téléchargements chaque semaine !). D'après le site web de Zeppelin :
« ZeppelinOS est une plateforme de développement spécialement conçue pour les projets de contrats intelligents. Elle permet des mises à jour transparentes et offre des incitations économiques visant à créer un écosystème sain d'applications sécurisées. »
ZeppelinOS aide les développeurs à créer des contrats intelligents évolutifs à l’aide de bibliothèques accessibles à tous sur la Ethereum . Contrairement aux contrats traditionnels (qui peuvent rester figés à jamais sur la blockchain, avec des erreurs, des fonctionnalités limitées, etc.), ZeppelinOS permet aux utilisateurs d’opter pour la mise à jour des contrats, ouvrant ainsi la voie à un processus plus durable pour le développement de projets Web3 sur la blockchain. Grâce aux mises à jour, nous pouvons effectuer des versions itératives, ajouter rapidement de petites fonctionnalités (que nous pouvons adapter en fonction des objectifs en constante évolution de nos utilisateurs) et, bien sûr, corriger les bugs introduits lors des itérations précédentes.
Créons un contrat CrudApp évolutif ! Nous allons le déployer CrudApp.sol puis le mettre à jour tout en conservant ses données… Alors, c'est parti :
1- Créer un projet et installer les dépendances
mkdir crud cd crud npm init npm install --global zos
2- Initialisez votre projet
zos init crud
Cette commande va créer un zos.json fichier, qui contient toutes les informations relatives au projet. Pour plus de détails sur ce fichier, consultez la section fichiers de configuration page.
La commande va également initialiser Truffe. À ce stade, à l'intérieur du beurk répertoire, vous devriez avoir un package.json fichier (créé par npm), deux répertoires vides nommés contrats et migrations, un truffle-config.js fichier (créé par zos pour Truffle), et un zos.json fichier (créé par zos (pour ZeppelinOS).
3- Ajouter le contrat CrudApp.sol
Ajoutons maintenant notre fichier CurdApp.sol. Nous allons apporter quelques modifications à notre contrat intelligent précédent ; voyons donc en quoi elles consistent :
pragma solidity ^0.4.23;
contract CrudApp {
struct country{
string name;
string leader;
uint256 population;
}
country[] public countries;
uint256 public totalCountries;
constructor() public {
totalCountries = 0;
}
event CountryEvent(string countryName , string leader, uint256 population);
event LeaderUpdated(string countryName , string leader);
event CountryDelete(string countryName);
function insert( string countryName , string leader , uint256 population) public returns (uint256 totalCountries){
country memory newCountry = country(countryName , leader, population);
countries.push(newCountry);
totalCountries++;
//emit event
emit CountryEvent (countryName, leader, population);
return totalCountries;
}
function updateLeader(string countryName, string newLeader) public returns (bool success){
//This has a problem we need loop
for(uint256 i =0; i< totalCountries; i++){
if(compareStrings(countries[i].name ,countryName)){
countries[i].leader = newLeader;
emit LeaderUpdated(countryName, newLeader);
return true;
}
}
return false;
}
function deleteCountry(string countryName) public returns(bool success){
require(totalCountries > 0);
for(uint256 i =0; i< totalCountries; i++){
if(compareStrings(countries[i].name , countryName)){
countries[i] = countries[totalCountries-1]; // pushing last into current arrray index which we gonna delete
delete countries[totalCountries-1]; // now deleteing last index
totalCountries--; //total count decrease
countries.length--; // array length decrease
//emit event
emit CountryDelete(countryName);
return true;
}
}
return false;
}
function getCountry(string countryName) public view returns(string name , string leader , uint256 population){
for(uint256 i =0; i< totalCountries; i++){
if(compareStrings(countries[i].name, countryName)){
//emit event
return (countries[i].name , countries[i].leader , countries[i].population);
}
}
revert('country not found');
}
function compareStrings (string a, string b) internal pure returns (bool){
return keccak256(a) == keccak256(b);
}
function getTotalCountries() public view returns (uint256 length){
return countries.length;
}
}Suppression du constructeur et ajout d'un initialiseur
« Vous pouvez utiliser vos contrats Solidity dans ZeppelinOS sans aucune modification, à l'exception de leurs constructeurs. En raison d'une contrainte liée au système de mise à niveau basé sur des proxys, aucun constructeur ne peut être utilisé dans les contrats pouvant faire l'objet d'une mise à niveau. Vous pouvez en savoir plus sur les raisons de cette restriction en consultant la page « ZeppelinOS Upgrades Pattern ». »
Cela signifie que, lorsque vous utilisez un contrat dans ZeppelinOS, vous devez transformer son constructeur en une fonction classique, généralement nommée initialiser, où vous exécutez toute la logique de configuration :
function initialize(uint256 countryLimit) initializer public {
totalCountries = 0;
limit = countryLimit;
}Vous devez importer Initializable.sol Il faut aussi que ceci fonctionne :
import "zos-lib/contracts/Initializable.sol";
Installez Ganache et déployez votre projet
Nous utiliserons Ganache (une blockchain locale) pour déployer notre contrat intelligent. Vous pouvez modifier les paramètres réseau dans truffle-config.js Si vous souhaitez utiliser un autre réseau, ouvrez un autre terminal et exécutez les commandes suivantes :
npm install -g ganache-cli --port 9545 --deterministic
Revenez maintenant au terminal précédent et exécutez les commandes ci-dessous pour démarrer une session. Nous utilisons --réseau option pour le réseau local et --de [adresse] pour fournir une Ethereum (que nous allons utiliser pour déployer le contrat intelligent). Nous utilisons une adresse Ganache par défaut (vous pouvez la voir dans le terminal Ganache) et nous utilisons également une expire indicateur permettant de définir la durée de validité de cette session en secondes (1 heure dans ce cas).
zos session --network local --from 0x1df62f291b2e969fb0849d99d9ce41e2f137006e --expires 3600
Déployons maintenant notre projet :
zos push
Cette commande déploie CrudApp au réseau local et affiche son adresse. Vous pouvez déployer d'autres contrats à l'aide de ajouter commande et seront également déployés après l'exécution de cette commande.
Le pousser Cette commande crée également un zos.dev-<network_id>.json fichier contenant toutes les informations relatives à votre projet sur ce réseau spécifique, y compris les adresses des implémentations de contrats déployées dans contracts["MyContract"].address. Pour en savoir plus sur ce format de fichier, consultez la fichiers de configuration section.
Mettre à jour le projet
pousser La commande déploie des contrats logiques qui ne sont pas destinés à être utilisés directement ; nous avons donc besoin d'une instance pouvant être mise à jour (nous aborderons les contrats logiques et Page « Modèles de mises à jour » de ZeppelinOS (dans nos prochains articles de blog).
Créons maintenant une instance évolutive de notre CrudApp.sol:
zos create CrudApp --init initialize --args 200
Le zos créer La commande utilise des options facultatives --init [nom-de-fonction] avec le nom de la fonction (qui est initialiser (dans notre cas). Vous pouvez également passer des arguments à cette fonction (à savoir 200, le nombre maximal de pays) dans notre cas. Cela affichera également l'adresse d'un contrat intelligent, que nous utiliserons lors de nos interactions avec celui-ci.
Interagir avec le contrat
Interagissons maintenant avec notre contrat et ajoutons quelques pays. Pour accéder à la console Truffle, exécutez la commande suivante :
npx truffle console --network local
Vous allez maintenant voir s'afficher la console Truffle. Exécutons quelques commandes et ajoutons quelques pays :
truffle(local)> crud = CrudApp.at('<your-contract-address>')
truffle(local)> crud.limit()
truffle(local)> crud.insert("USA", "Elizabeth Warren", 33000000)
truffle(local)> crud.getCountry("USA")
truffle(local)> crud.getTotalCountries()Nous avons ajouté une entrée dans notre contrat intelligent. Mettons à jour notre CrudApp !
Ajouter une fonction
Nous allons ajouter une fonction supplémentaire à la fin de notre contrat intelligent, puis le mettre à jour. Pour l'instant, nous disposons donc déjà d'un getCountry() fonction… nous allons en ajouter une autre getLeader() fonction de notre contrat intelligent.
function getLeader(string leaderName) public view returns(string name , string leader , uint256 population){
for(uint256 i =0; i< totalCountries; i++){
if(compareStrings(countries[i].leader, leaderName)){
//emit event
return (countries[i].name , countries[i].leader , countries[i].population);
}
}
revert('Leader not found');
}Mettons maintenant à jour notre contrat intelligent. Pour cela, nous devons exécuter les commandes suivantes :
zos push zos update CrudApp
Cela affichera une nouvelle adresse de contrat intelligent que nous utiliserons pour tester notre contrat mis à jour.
Test du contrat intelligent mis à jour
Testons maintenant notre contrat intelligent. Il devrait conserver nos données précédentes et nous permettre d'accéder à nos nouvelles getLeader() fonction. Interagissons donc à nouveau avec notre contrat intelligent :
truffle(local)> crud = CrudApp.at('<your-contract-address>')
truffle(local)> crud.limit()
truffle(local)> crud.getTotalCountries()
truffle(local)> crud.getLeader("Elizabeth Warren")Vous pourrez constater que le contrat intelligent a été mis à jour, tout comme n'importe quel autre morceau de code. 🍰 — Dans notre prochain article, nous allons créer un jeton ERC-20 évolutif !
Conclusion
Même si cela semble assez simple, il faut faire preuve d’une grande prudence lors de l’utilisation de ZeppelinOS en raison de la gestion du stockage par Solidity. Vous pouvez consulter ici les points auxquels vous devez prêter une attention particulière lors de la mise à jour de votre contrat intelligent. ZeppelinOS apporte une réelle valeur ajoutée à Ethereum !
Dites-nous ce que vous aimeriez découvrir dans la section des commentaires.👇
Vous avez besoin d'aide pour votre projet ou vous avez des questions ? Contactez-nous via ce formulaire, sur Twitter Quicknode, ou envoyez-nous un message sur Discord!
Fondée en 2017, Quicknode une infrastructure blockchain de niveau institutionnel destinée aux développeurs et aux entreprises. Grâce à une disponibilité de 99,99 % et à la prise en charge de plus de 80 chaînes, les équipes peuvent développer et faire évoluer leurs applications sur la blockchain sans aucun compromis.
Les dernières actualités en matière d'ingénierie, les mises à jour sur les produits et les nouvelles du Web3, directement dans votre boîte mail.