Audit des contrats intelligents et prévention de la réentrée
##Présentation
L'audit des contrats intelligents est un processus crucial dans l'industrie de la blockchain pour garantir la sécurité et l'intégrité des contrats intelligents. Dans ce chapitre, nous nous concentrerons sur l'audit des contrats intelligents et la prévention des réentrants, l'une des vulnérabilités les plus courantes dans la programmation de contrats intelligents.
Rentrée
La réentrée est une vulnérabilité qui se produit lorsqu'un contrat intelligent appelle une fonction dans un autre contrat, et que ce dernier contrat appelle une fonction dans le premier contrat, ce qui peut provoquer un cycle d'appel infini et consommer tout le gaz du contrat.
Exemple de réentrée
`
solidité
solidité du pragma ^0.8.0 ;
contrat RéentréeVulnérable {
mapping(address => uint256) soldes publics ;
fonction dépôt() public payable {
soldes[msg.sender] += msg.value ;
}
fonction retirer (montant uint256) public {
require(balances[msg.sender] >= montant, "Solde insuffisant");
soldes[msg.sender] -= montant ;
payable(msg.sender).transfer(montant);
}
}Dans cet exemple, si un attaquant appelle la fonction « retirer » avec un montant supérieur à son solde, le contrat rentrera et consommera tout le gaz disponible.
## Prévention de la réentrée
Il existe plusieurs façons d'empêcher la réentrée dans les contrats intelligents :
### 1. Utiliser `call.value()` au lieu de `transfer()`
Au lieu d'utiliser `transfer()`, qui peut provoquer un retour, vous devez utiliser `call.value()` pour envoyer des fonds vers un autre compte.
``solidité
solidité du pragma ^0.8.0 ;
contrat ReentrancySafe {
mapping(address => uint256) soldes publics ;
fonction dépôt() public payable {
soldes[msg.sender] += msg.value ;
}
fonction retirer (montant uint256) public {
require(balances[msg.sender] >= montant, "Solde insuffisant");
soldes[msg.sender] -= montant ;
(bool envoyé, ) = payable(msg.sender).call{value: montant}("");
require(sent, "Échec de l'envoi d'Ether");
}
}
2. Utiliser « require » pour vérifier le solde avant d'effectuer la transaction
Il faut vérifier que le solde de l'utilisateur est suffisant avant d'effectuer la transaction.
solidité
solidité du pragma ^0.8.0 ;
contrat ReentrancySafe {
mapping(address => uint256) soldes publics ;
fonction dépôt() public payable {
soldes[msg.sender] += msg.value ;
}
fonction retirer (montant uint256) public {
require(balances[msg.sender] >= montant, "Solde insuffisant");
soldes[msg.sender] -= montant ;
payable(msg.sender).transfer(montant);
}
}### 3. Utiliser `revert` pour annuler la transaction en cas de fonds insuffisants
« revert » doit être utilisé pour annuler la transaction en cas de fonds insuffisants.
``solidité
solidité du pragma ^0.8.0 ;
contrat ReentrancySafe {
mapping(address => uint256) soldes publics ;
fonction dépôt() public payable {
soldes[msg.sender] += msg.value ;
}
fonction retirer (montant uint256) public {
require(balances[msg.sender] >= montant, "Solde insuffisant");
soldes[msg.sender] -= montant ;
payable(msg.sender).transfer(montant);
}
}
Audit des contrats intelligents
L'audit des contrats intelligents est un processus qui consiste à examiner le code du contrat pour identifier les vulnérabilités et garantir sa sécurité et son intégrité. Certains des outils et techniques utilisés dans l'audit des contrats intelligents incluent :
1. Analyse statique
L'analyse statique consiste à revoir le code du contrat sans l'exécuter. Il est utilisé pour identifier les erreurs et les vulnérabilités dans le code.
solidité
solidité du pragma ^0.8.0 ;
contrat StatiqueAudit {
fonction analyseCode() public pur {
// Revoir le code du contrat
}
}### 2. Analyse dynamique
L'analyse dynamique consiste à exécuter le contrat et à observer son comportement. Il est utilisé pour identifier les erreurs et les vulnérabilités dans l’exécution du contrat.
``solidité
solidité du pragma ^0.8.0 ;
contratDynamicAudit {
fonction analyserBehavior() public {
// Exécute le contrat et observe son comportement
}
}
3. Tests unitaires
Les tests unitaires consistent à rédiger des tests pour chaque fonction du contrat afin de garantir son bon fonctionnement.
solidité
solidité du pragma ^0.8.0 ;
contrat UnitTests {
fonction testDeposit() public {
// Tester la fonction de dépôt
}
fonction testWithdraw() public {
// Teste la fonction de retrait
}
}
``
Conclusion
L'audit des contrats intelligents et la prévention des ré-entrées sont des processus cruciaux dans l'industrie de la blockchain pour garantir la sécurité et l'intégrité des contrats intelligents. En utilisant des outils et des techniques tels que l'analyse statique, l'analyse dynamique et les tests unitaires, vous pouvez identifier et prévenir les vulnérabilités des contrats intelligents.