Vulnérabilités courantes (réentrance, etc.)
Comprenez et atténuez les vulnérabilités courantes des contrats intelligents, telles que la réentrance, les dépassements et sous-dépassements d’entiers ainsi que les attaques par anticipation.
Vulnérabilités courantes (réentrance, etc.) est une leçon Blockchain Smart Contracts with Solidity gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Blockchain Smart Contracts with Solidity, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Blockchain Smart Contracts with Solidity comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
Smart Contract Security: Overview
Welcome to this crucial lesson on smart contract security! Unlike traditional software, bugs in smart contracts can lead to irreversible loss of funds.
Because contracts on the blockchain are often immutable, fixing vulnerabilities after deployment is incredibly difficult, if not impossible. Security must be a top priority from day one.
Understanding Reentrancy Attacks
Reentrancy is a critical vulnerability where an external call to an untrusted contract can 're-enter' the original contract before the first function call has completed its execution.
This allows the attacker to repeatedly drain funds or manipulate state by calling the vulnerable function multiple times.
Reentrancy: A Vulnerable Example
Consider this simplified withdrawal contract. Can you spot the potential issue?
The state (balances[msg.sender]) is updated *after* the external call to msg.sender.call. This delay creates a window for attack.
pragma solidity ^0.8.0;
contract VulnerableWithdraw {
mapping(address => uint) public balances;
constructor() payable {
// Fund contract for demo purposes
}
function deposit() public payable {
balances[msg.sender] += msg.value;
}
function withdraw(uint _amount) public {
require(balances[msg.sender] >= _amount, "Insufficient balance");
// External call FIRST, state update LATER
(bool success, ) = msg.sender.call{value: _amount}("");
require(success, "Transfer failed");
balances[msg.sender] -= _amount; // This line is vulnerable!
}
function getBalance() public view returns (uint) {
return address(this).balance;
}
}The Reentrancy Attack Flow
Here's how an attacker exploits the previous contract:
- 1. Deposit: Attacker deposits funds into
VulnerableWithdraw. - 2. Withdraw: Attacker calls
withdraw(amount). - 3. Re-enter: When
msg.sender.calltransfers Ether to the attacker, their malicious fallback function is triggered. - 4. Repeat: The fallback function immediately calls
withdraw(amount)again, before the original call updates the balance. This repeats until funds are drained.
Mitigating Reentrancy: The Fix
The most effective way to prevent reentrancy is to follow the Checks-Effects-Interactions (CEI) pattern:
- 1. Checks: Verify all conditions (e.g.,
requirestatements). - 2. Effects: Update all state variables (e.g.,
balances[msg.sender] -= _amount). - 3. Interactions: Make external calls (e.g.,
msg.sender.call).
This ensures state is updated *before* any untrusted external code can execute.
Reentrancy: The Fixed Contract
Here's the corrected version of the withdrawal contract, applying the CEI pattern. Notice the order of operations.
Now, the balance is decremented *before* the external call, closing the reentrancy window.
pragma solidity ^0.8.0;
contract SafeWithdraw {
mapping(address => uint) public balances;
constructor() payable {
// Fund contract for demo purposes
}
function deposit() public payable {
balances[msg.sender] += msg.value;
}
function withdraw(uint _amount) public {
// 1. Checks
require(balances[msg.sender] >= _amount, "Insufficient balance");
// 2. Effects: Update state BEFORE external call
balances[msg.sender] -= _amount;
// 3. Interactions: Make external call LAST
(bool success, ) = msg.sender.call{value: _amount}("");
require(success, "Transfer failed");
}
function getBalance() public view returns (uint) {
return address(this).balance;
}
}Integer Overflows & Underflows
Integer overflows occur when an arithmetic operation results in a value larger than the maximum that the variable type can hold. It 'wraps around' to its minimum value.
Integer underflows are the opposite: when a result is smaller than the minimum value, wrapping around to the maximum.
For example, a uint8 can hold values from 0 to 255. If it's 255 and you add 1, it becomes 0 (overflow). If it's 0 and you subtract 1, it becomes 255 (underflow).
Overflow/Underflow Example
Prior to Solidity 0.8.0, these operations would silently wrap around. Since Solidity 0.8.0, arithmetic operations default to checking for overflows/underflows and will revert if one occurs.
However, understanding the concept is vital, especially when working with older codebases or using unchecked blocks for gas optimization.
pragma solidity ^0.8.0;
contract MathVulnerabilities {
uint8 public smallNumber = 255; // Max for uint8
function triggerOverflow() public {
// In Solidity 0.8.0+, this transaction will revert.
// In older versions, smallNumber would become 0.
smallNumber = smallNumber + 1;
}
function triggerUnderflow() public {
smallNumber = 0; // Reset for demo
// In Solidity 0.8.0+, this transaction will revert.
// In older versions, smallNumber would become 255.
smallNumber = smallNumber - 1;
}
}Front-Running Attacks
Front-running is an attack where a malicious actor observes a pending transaction and submits their own transaction with a higher gas fee to have it executed first.
This is common in DeFi (Decentralized Finance) where transactions like large swaps or liquidations can be anticipated and exploited for profit.
Mitigating Front-Running
Preventing front-running is challenging due to the public nature of the mempool (pending transaction pool). However, some strategies exist:
- Commit-Reveal Schemes: Users submit a hashed version of their intent (commit), then later reveal the actual data.
- Batching: Grouping transactions together to reduce individual transaction visibility.
- Decentralized Sequencers/L2s: Using solutions that offer more private or controlled transaction ordering.
- Slippage Control: Users setting maximum acceptable price slippage for swaps.
Vulnerability Check
You've learned about three major smart contract vulnerabilities. Let's test your understanding!
Recap: Security First
In this lesson, we explored critical smart contract vulnerabilities: reentrancy, integer overflows/underflows, and front-running.
- We saw how reentrancy exploits external calls and how the Checks-Effects-Interactions pattern provides a robust defense.
- We understood how integer arithmetic can lead to unexpected values and the importance of compiler checks (Solidity 0.8.0+).
- Finally, we discussed front-running and methods like commit-reveal to mitigate it.
Always prioritize security in your smart contract development!
Apprends Blockchain Smart Contracts with Solidity avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 12
- Leçons
- 48
Questions Fréquemment Posées
La leçon « Vulnérabilités courantes (réentrance, etc.) » est-elle gratuite ?
Oui — le texte complet de « Vulnérabilités courantes (réentrance, etc.) » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Blockchain Smart Contracts with Solidity, passe à CoddyKit PRO. Le cours Blockchain Smart Contracts with Solidity comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Vulnérabilités courantes (réentrance, etc.) » ?
Comprenez et atténuez les vulnérabilités courantes des contrats intelligents, telles que la réentrance, les dépassements et sous-dépassements d’entiers ainsi que les attaques par anticipation. Tu pratiques Blockchain Smart Contracts with Solidity avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Blockchain Smart Contracts with Solidity ?
Aucune expérience préalable n'est requise. Blockchain Smart Contracts with Solidity sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Vulnérabilités courantes (réentrance, etc.) » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Blockchain Smart Contracts with Solidity ?
Oui. Chaque leçon Blockchain Smart Contracts with Solidity inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Vulnérabilités courantes (réentrance, etc.)
- Modèles de contrôle d’accès
- Programmation sécurisée avec SafeMath
- Audit, tests et primes de découverte de bogues