Comment déboguer des contrats Ethereum Smart

Le débogage d'une transaction dans la blockchain diffère du débogage d'une application traditionnelle construite avec c ++ ou JavaScript car vous n'exécutez pas de code en temps réel. Au lieu de cela, l'exécution d'une transaction historique est mappée avec un code associé pour déboguer une transaction.

Un contrat Smart est un morceau de code exécuté au-dessus de la blockchain. Les contrats intelligents doivent avoir un sens précis. Déboguer un contrat Smart consiste à analyser une transaction étape par étape, son fonctionnement en interne et son exécution ou en cas d'échec de la transaction.

Commençons par discuter des types d’erreur en solidité en détail pour déboguer une transaction.

Types d'erreur en solidité -

1. Erreur de syntaxe

Une erreur de syntaxe survient en cas de problème dans une syntaxe de code de contrat intelligent, lorsque votre code frappe avec une erreur de syntaxe, votre contrat intelligent ne pourra pas être compilé ou déployé sur une chaîne de blocs.

L'erreur de syntaxe peut être facilement diagnostiquée à l'aide de remix, comme vous pouvez le voir sur l'image ci-dessous. Lorsque le point-virgule (;) est supprimé du code ci-dessus dans l'EDI de remix, il affiche un message d'erreur avec une solution d'erreur de syntaxe.

Une erreur de syntaxe peut être facilement diagnostiquée à l'aide de truffe, remix ou de tout autre IDE

2. Erreur d'exécution

Les erreurs d'exécution ne surviennent que lorsque vous avez déployé un contrat intelligent sur la chaîne de blocs et que votre code de solidité a été compilé en code bytec compris par EVM (machine virtuelle Ethereum). EVM est défini comme un composant d'Ethereum qui exécute un code de solidité et une erreur d'exécution survient lorsqu'il pense que votre code de contrat intelligent est défectueux ou que vous effectuez une transaction contre la logique du code.

Les erreurs d'exécution sont plus difficiles à diagnostiquer que les erreurs de syntaxe, car elles ne sont pas identifiées avant le déploiement dans une chaîne de blocs. Elles ne peuvent se produire que lorsque le changement d'état a lieu dans le contrat intelligent. détails.

3. Erreurs logiques

Les erreurs de logique ne peuvent pas être déboguées à l'aide d'un IDE ou d'un outil, car les erreurs de logique ne sont pas capturées par EVM. Selon EVM, tout est parfait et le code peut être exécuté facilement. Une erreur logique survient lorsque le développeur commet une erreur et ouvre des trous de boucle dans un contrat intelligent pour attaquants.

Exemple d'erreur logique: La célèbre attaque DAO (Reentrancy) est un exemple d'erreur logique dans laquelle le développeur a commis une erreur et a transféré l'éther avant de mettre à jour le solde de l'utilisateur.

L’audit des contrats intelligents permet d’identifier les erreurs logiques car, selon l’état d’esprit du développeur, tout se passe bien et qu’il n’ya peut-être pas d’erreur dans un contrat intelligent, mais un auditeur peut exécuter un contrat intelligent avec l’objectif de rechercher des trous morts, de vérifier la logique de gestion et de trouver des failles de sécurité dans smart contract.

La vérification formelle peut être utilisée pour la vérification logique du contrat intelligent.

Types d'erreur d'exécution

Panne d'essence

Une erreur de panne d'essence survient lorsque vous ne fournissez pas assez d'essence pour exécuter une transaction ou que l'essence ne suffit pas pour effectuer une transaction.

Revenir

La transaction est annulée lorsque vous essayez d'exécuter une transaction qui ne peut pas être exécutée conformément à la logique du contrat intelligent, c'est pourquoi EVM renverra une erreur et la transaction sera annulée.

Opcode invalide

Un opcode non valide se produit lorsque vous essayez d’appeler un code qui n’existe pas.

saut invalide

Un saut invalide se produit lorsque vous essayez d’appeler une fonction qui n’existe pas. Par exemple, si vous appelez une fonction de contrat via un autre contrat inexistant, un saut invalide se produit. Ce type d'erreur se produit également lorsque vous utilisez le langage assembleur et que vous pointez sur une mémoire erronée.

Débordement de pile

Le débordement de pile se produit lorsque vous essayez d'appeler une fonction de manière récursive et qu'il n'y a aucune condition pour l'arrêter. La solidité de la pile peut avoir une trame maximale de 1024;

Stack Underflow

Le dépassement de capacité de la pile se produit en langage assembleur lorsque vous essayez d’afficher une variable qui n’existe pas.

Exemple de code de contrat Smart à utiliser pour le débogage de tous types d’erreurs et de transactions -

solidité du pragma 0.4.24;
contrat échantillon {
   uint256 montant publicInContract;
   adresse montant publicOwner;
  constructeur (adresse _propriétaire) public payable {
     require (_owner! = address (0));
     require (valeur msg> 0,1 éther);
     amountInContract = msg.value;
     amountOwner = _owner;
   }
 fonction () externe {
  revenir();
 }
function retire () public {
require (msg.sender == amountOwner);
msg.sender.transfer (adresse (this) .balance);
}
}

Le débogueur offre la possibilité de déboguer étape par étape toute transaction (création ou appel) et de visualiser la mémoire / l’espace de stockage. Il est utile de suivre le coût du gaz par code d'opération et le gaz restant après chaque étape.

Débogage d'une transaction-

Dans le code ci-dessus, le constructeur spécifié est payable, alors que le déploiement d'un constructeur de contrat nécessite l'envoi d'une valeur d'éther supérieure à 0,1 éthers. Si moins de 0,1 ether est envoyé ou si l'adresse est égale à zéro, une erreur sera générée et la transaction sera annulée.

Comme indiqué ci-dessous, la transaction est annulée afin que nous puissions déboguer une transaction étape par étape à l'aide du remix IDE.

Étape 1. Une fois la transaction de déploiement soumise à la chaîne de blocs Ethereum à l'aide de remix, la transaction échoue comme indiqué ci-dessus. Maintenant, appuyez sur le bouton du débogueur dans l'EDI de remix pour déboguer la transaction et connaître le motif possible de l'échec de la transaction.

Étape 2. Pour lancer le débogage, indiquez le numéro de bloc et le hachage de la transaction, puis appuyez sur le bouton Démarrer le débogage pour lancer le processus de débogage.

Les opérations en langage assembleur avec le gaz utilisé et le gaz restant sont affichées pendant le débogage d'une transaction, comme indiqué ci-dessus. Le code est également mis en évidence dans le remix IDE lorsque la transaction réelle a échoué parallèlement au code opération, comme indiqué ci-dessous.

La transaction est annulée dans l'opcode assembly. Le code est mis en surbrillance là où la transaction réelle a été annulée.

Comme indiqué dans l'image ci-dessus, où transaction est annulée dans etherscan, la valeur envoyée est 0.1 ether, ce qui est inférieur à la valeur requise. c'est pourquoi la transaction a échoué dans ce scénario.

Ce processus peut être utilisé pour déboguer n'importe quelle transaction pour en savoir plus sur le gaz utilisé, le gaz restant à chaque étape, les changements d'état et pour visualiser l'espace mémoire / de stockage.

Le débogage de contrat intelligent peut également être effectué à l'aide du cadre truffle. Vous avez besoin d'un hachage de transaction pour déboguer une transaction.

Merci d'avoir lu. Consultez également nos articles de blog précédents.

QuillAudits est une plate-forme sécurisée d’audits de contrat intelligents conçue par QuillHash Technologies. Il s’agit d’une plate-forme entièrement automatisée permettant de vérifier les contrats intelligents afin de détecter les vulnérabilités en matière de sécurité grâce à ses outils automatisés et à ses outils de révision manuelle. Nous réalisons des audits de contrat intelligents et des tests d'intrusion pour détecter les vulnérabilités de sécurité pouvant nuire à l'intégrité de la plate-forme.

Pour être au courant de notre travail, rejoignez notre communauté: -

Télégramme | Twitter | Facebook | LinkedIn