Solidity : La fonction require dans les contrats

Require Solidity Smart Contracts

La fonction require est l’une des plus utilisée dans les smart contracts avec le langage Solidity et permet de vérifier si une condition est vraie. L’utilisation de cette fonction relativement simple permet d’interrompre le code ainsi que la possibilité de renvoyer une erreur.

Require : C’est quoi et à quoi elle sert dans Solidity ?

Comme nous l’avons succinctement introduit en préambule, require est une fonction de contrôle de flux utilisée dans le langage Solidity. Sa particularité est qu’elle « exige » quelque chose avant de poursuivre la suite de ses opérations. Par exemple, les sites Web requiert de posséder un compte ou de créer un nouveau compte avant de pouvoir utiliser les services de la plateforme.

Finalement, c’est un peu la même chose avec la fonction require dans Solidity. Celle-ci possède la particularité de vérifier si une condition est vraie, ce qui permet au code suivant de s’exécuter. Si jamais la condition est fausse, require renverra une erreur, le reste du code ne sera alors pas exécuté et la transaction sera simplement annulée.

Dans le cas des contrats, elle est utilisée pour vérifier une série de condition comme :

  • Les fonds de l’utilisateur sont-ils suffisants ?
  • L’adresse de l’utilisateur a-t- elle déjà été utilisée ?
  • Est-ce que l’adresse à été utilisée pour mint un NFT ?

Elle s’implémente au sein d’autres fonctions du contrat intelligent de la façon suivante :

// Vérification si l'émetteur d'une transaction est le propriétaire du contrat
require(msg.sender == _owner, "Error message");

// Autre vérification sans message d'erreur
require(msg.sender == "0x123456...");

Comme vous pouvez le constater, le premier paramètre est celui de la condition. Le second paramètre, qui lui est optionnel, permet de retourner un message d’erreur à l’EVM qui pourra être envoyé à l’utilisateur en cas d’erreur par exemple.

Enfin, la fonction require permet ainsi de garantir la validité des conditions qui ne peuvent pas être détectées avant l’exécution. Elle vérifie les entrées, les variables d’état du contrat et les valeurs de retour des appels aux contrats externes.

Optimiser et rendre son code Solidity plus performant

Mais en plus d’être très pratiques, ces fonctions permettent aussi d’optimiser son code et de le rendre plus performant. En effet, elles permettent de réduire la quantité de code utilisé avec l’utilisation des opérateurs logiques comme if et else.

Voici un exemple (de ce qu’il ne faut pas faire) avec de multiples conditions imbriquées les unes dans les autres.

// Fonction permettant de mint un NFT
function mintNFT() public payable {

    // Vérification si l'adresse est sur la whitelist
    if (whitelist[msg.sender]) {

        // Vérification si le solde est suffisant 
        if (balances[msg.sender] >= 1 ether) {
            // Mint NFT
        } else {
            revert("Address balance is too low.");
        }
    } else {
        revert("Address is not whitelisted");
    }
}

On pourrait alors transformer le code précédent simplement en 2 lignes de cette façon :

// Fonction permettant de mint un NFT
function mintNFT() public payable {
    require(whitelist[msg.sender], "Address is not whitelisted"); // Vérification si l'adresse est sur la whitelist
    require(balances[msg.sender] >= 1 ether, "Address balance is too low"); // Vérification si le solde est suffisant 
    // Mint NFT...
}

Comme vous pouvez le constater, ce code est beaucoup plus lisible, plus clair et économique. Des éléments à ne pas négliger quand vous développez vos propres smart contracts en Solidity.

De plus, certains IDE comme Remix vont vous permettre de vous faciliter la tâche car il dispose de fonctions de vérification de la consommation. En cas de surconsommation détectée, Remix vous alertera et vous pourrez alors prendre les dispositions nécessaires pour optimiser votre code.

Conclusion

En résumé, la fonction require est un outil essentiel pour la gestion des erreurs et la sécurité dans la programmation de contrats intelligents en Solidity. De plus, elles veillent à ce que seuls les événements autorisés et valides puissent être exécutés.

Utiliser require lors de certaines vérifications par le biais du mapping en fait des atouts particulièrement puissants et économes. Maintenant, c’est à vous de jouer et de faire vos propres expérimentations avec cette fonction de contrôle de flux.

Partager l'article sur les réseaux sociaux

Auteur

Depuis 2017, je ne cesse d'explorer l'univers du Bitcoin, de la blockchain des crypto monnaies, des NFT et plus récemment, celui du Web3. Après avoir fondé Au Coin du Bloc en 2021, je met à disposition mes connaissances et tente de vulgariser les aspects obscurs pour rendre abordable et compréhensible cet univers naissant dans lequel je crois fermement.

Articles similaires