La majorité des dépenses en gaz d'Ethereum se concentrent sur le stockage. Chaque opération qui modifie l'état (stockage) du réseau Ethereum est généralement coûteuse. Par conséquent, se concentrer sur la manière dont les données sont conservées et accessibles peut entraîner des réductions de coûts significatives. Dans cette session, nous examinerons quelques moyens d'optimiser le stockage avec Remix.
La blockchain Ethereum fournit un stockage permanent. Tout ce qui est sauvegardé sur la blockchain sera disponible aussi longtemps que la blockchain survivra, mais cette permanence a un coût. L'optimisation du stockage permet non seulement de réduire les coûts, mais aussi de garantir une utilisation efficace de l'état global d'Ethereum.
Solidity stocke les variables dans des emplacements. Chaque slot a une taille de 32 octets. Lorsque les variables peuvent tenir dans un seul emplacement, elles peuvent être lues ou mises à jour avec une seule opération SLOAD ou SSTORE, respectivement.
Considérons deux contrats :
Solidity
// Sans optimisation
pragma solidity ^0.8.9 ;
contract UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidity
// Avec optimisation
pragma solidity ^0.8.9 ;
contract OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Déployez les deux contrats dans Remix et notez les différences de gaz lorsque vous interagissez avec leurs variables.
Dans la version optimisée, les valeurs 1
et 2
partagent un seul emplacement de 32 octets.
Lorsque vous n'avez plus besoin d'un emplacement de stockage, en particulier d'un emplacement de stockage de données temporaire, vous pouvez le supprimer ou le mettre à zéro pour obtenir un remboursement de gaz.
Solidity
pragma solidity ^0.8.9 ;
contract RefundExample {
uint256 public temporaryData ;
function storeTemporaryData(uint256 data) public {
temporaryData = data;
}
function clearTemporaryData() public {
delete temporaryData;
}
}
Déployez ce contrat dans Remix.
Enregistrez des données temporaires, puis effacez-les.
Vérifiez le coût du gaz. Remarquez le remboursement de gaz que vous obtenez pour l'opération de suppression
.
S'il n'est pas nécessaire d'accéder aux données sur la chaîne, envisagez de les enregistrer en tant qu'événement plutôt que de les stocker. Les événements sont beaucoup moins coûteux que les opérations de stockage.
Solidity
pragma solidity ^0.8.9 ;
contract EventExample {
event DataStored(uint256 data) ;
function storeData(uint256 data) public {
emit DataStored(data);
}
}
Déployez et interagissez avec le contrat dans Remix.
Notez que le coût du gaz est moins élevé que celui du stockage.
Il est essentiel de s'exercer maintenant que vous avez maîtrisé certaines approches fondamentales de l'optimisation du stockage. Prenez connaissance des exemples proposés et essayez de créer les vôtres. Dans la session suivante, nous approfondirons l'optimisation de la visibilité des fonctions et la réutilisation du code avec les bibliothèques. Gardez à l'esprit que l'optimisation est à la fois un art et une science. Continuez à expérimenter !
La majorité des dépenses en gaz d'Ethereum se concentrent sur le stockage. Chaque opération qui modifie l'état (stockage) du réseau Ethereum est généralement coûteuse. Par conséquent, se concentrer sur la manière dont les données sont conservées et accessibles peut entraîner des réductions de coûts significatives. Dans cette session, nous examinerons quelques moyens d'optimiser le stockage avec Remix.
La blockchain Ethereum fournit un stockage permanent. Tout ce qui est sauvegardé sur la blockchain sera disponible aussi longtemps que la blockchain survivra, mais cette permanence a un coût. L'optimisation du stockage permet non seulement de réduire les coûts, mais aussi de garantir une utilisation efficace de l'état global d'Ethereum.
Solidity stocke les variables dans des emplacements. Chaque slot a une taille de 32 octets. Lorsque les variables peuvent tenir dans un seul emplacement, elles peuvent être lues ou mises à jour avec une seule opération SLOAD ou SSTORE, respectivement.
Considérons deux contrats :
Solidity
// Sans optimisation
pragma solidity ^0.8.9 ;
contract UnoptimizedStorage {
uint256 public value1;
uint256 public value2;
}
Solidity
// Avec optimisation
pragma solidity ^0.8.9 ;
contract OptimizedStorage {
uint128 public value1;
uint128 public value2;
}
Déployez les deux contrats dans Remix et notez les différences de gaz lorsque vous interagissez avec leurs variables.
Dans la version optimisée, les valeurs 1
et 2
partagent un seul emplacement de 32 octets.
Lorsque vous n'avez plus besoin d'un emplacement de stockage, en particulier d'un emplacement de stockage de données temporaire, vous pouvez le supprimer ou le mettre à zéro pour obtenir un remboursement de gaz.
Solidity
pragma solidity ^0.8.9 ;
contract RefundExample {
uint256 public temporaryData ;
function storeTemporaryData(uint256 data) public {
temporaryData = data;
}
function clearTemporaryData() public {
delete temporaryData;
}
}
Déployez ce contrat dans Remix.
Enregistrez des données temporaires, puis effacez-les.
Vérifiez le coût du gaz. Remarquez le remboursement de gaz que vous obtenez pour l'opération de suppression
.
S'il n'est pas nécessaire d'accéder aux données sur la chaîne, envisagez de les enregistrer en tant qu'événement plutôt que de les stocker. Les événements sont beaucoup moins coûteux que les opérations de stockage.
Solidity
pragma solidity ^0.8.9 ;
contract EventExample {
event DataStored(uint256 data) ;
function storeData(uint256 data) public {
emit DataStored(data);
}
}
Déployez et interagissez avec le contrat dans Remix.
Notez que le coût du gaz est moins élevé que celui du stockage.
Il est essentiel de s'exercer maintenant que vous avez maîtrisé certaines approches fondamentales de l'optimisation du stockage. Prenez connaissance des exemples proposés et essayez de créer les vôtres. Dans la session suivante, nous approfondirons l'optimisation de la visibilité des fonctions et la réutilisation du code avec les bibliothèques. Gardez à l'esprit que l'optimisation est à la fois un art et une science. Continuez à expérimenter !