Tutorial Solidity : détruire un contrat pour l’effacer de la blockchain

0

Lors du développement d’une Dapp, il peut être nécessaire de désactiver un smart contrat, parce qu’il n’est plus nécessaire dans l’utilisation de notre application, par exemple si il a été mise à jour, et donc que de le laisser disponible peut causer des problèmes.

Cela permet de s’assurer qu’aucune transaction ne peut avoir lieu avec le contrat en question, permettant de maintenir une cohérence des données.

Enfin, il est toujours utile de laisser une fonction de destruction d’un contrat, ne serait-ce que si celui ne se comporte finalement pas comme prévu, par exemple car il comporte des bugs non détectés lors du développement et des tests unitaires.

Par mesure de sécurité il est conseillé de ne laisser la possibilité d’utiliser cette fonction que par un compte Ethereum dédié uniquement à cela, qui ne peut rien faire d’autre, et de bien garder cette clé sécurisée et non installée sur un nœud, pour ne l’utiliser qu’à la demande lorsque c’est strictement nécessaire, car la fonction de suppression est irréversible.

Attention cependant, supprimer un contrat ne veut pas dire qu’il n’est pas plus visible dans la blockchain, il restera visible dans l’historique, il n’est simplement plus là dans la version la plus récente de la chaine de blocs et ne peut plus être utilisé, mais tout son historique est conservé.

Comment effacer un contrat

Pour effacer notre contrat de la blockchain le langage Solidity propose la fonction selfdestruct, qui comme son nom l’indique permet au contrat de s’autodétruire. Celle prend une adresse Ethereum en paramètre, et cette adresse recevra les fonds en Ether qui sont sur le contrat s’il en possède.

Pour illustrer l’utilisation de cette fonction, utilisons l’habituel contrat de messagerie dont le code avant modification est le suivant (disponible ici) :

pragma solidity >=0.4.22 <0.9.0;

contract Message {
 
    string lemessage;
 
    constructor(string memory _messageoriginal) {
        lemessage = _messageoriginal;
    }
 
   function definirMessage(string memory _nouveaumessage) public{
       lemessage = _nouveaumessage;
   }
 
    function voirMessage() public view returns (string memory){  
        return lemessage;
    }
 
}

Ajoutons lui la fonction de destruction qui renverra les Ethers stockés au compte qui exécute le contrat :

    function Detruire() public{  
        selfdestruct(msg.sender);
    }

La version définitive ressemblera à cela :

// SPDX-License-Identifier: GPL-3.
pragma solidity >=0.4.22 <0.9.0;

contract Message {
 
    string lemessage;
 
    constructor(string memory _messageoriginal) {
        lemessage = _messageoriginal;
    }
 
   function DefinirMessage(string memory _nouveaumessage) public{
       lemessage = _nouveaumessage;
   }
 
    function VoirMessage() public view returns (string memory){  
        return lemessage;
    }
    
    function Detruire() public{  
        selfdestruct(msg.sender);
    }
    
}

Ensuite dans Remix, compilons le contrat pour le déployer avec un message ‘Bienvenue’ :

Cliquez ensuite sur Detruire pour détruire ce contrat, et tentez ensuite de cliquer sur VoirMessage qui ne renverra plus rien car le contrat est détruit et n’existe plus :

En production il faudra bien s’assurer que l’utilisation de cette fonction soit réservée à un compte particulier, en la sécurisant par exemple avec un modifier.

Le code final est disponible sur Github.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.