Le checks-effects-interactions est le pattern canonique pour écrire des fonctions Solidity sûres face à la reentrancy :
- Checks : valider les entrées et exiger que l'appelant est autorisé.
- Effects : mettre à jour l'état pertinent dans le contrat courant.
- Interactions : seulement après la mise à jour de l'état, faire les appels externes.
Suivre cet ordre garantit que tout appel ré-entrant dans le contrat voit l'état post-mise à jour, donc un retrait ré-entré voit un solde à zéro, un over-transfer est impossible, etc.
Le pattern a plusieurs décennies en sécurité logicielle et est bien documenté dans la guidance officielle de Solidity. Malgré ça, la reentrancy continue d'être livrée en production, presque toujours parce que le développeur s'est dit « cet appel externe est sûr » ou « ce token ne peut pas être malicieux ». L'heuristique d'un auditeur senior : chaque appel externe est une reentrance potentielle, point.