Que fait solidity-security ?
Maîtrisez les bonnes pratiques de sécurité des contrats intelligents pour prévenir les vulnérabilités courantes et mettre en œuvre des motifs Solidity sécurisés. À utiliser lors de la rédaction de contrats intelligents, de l'audit de contrats existants ou de la mise en œuvre de mesures de sécurité pour les applications blockchain.
Pourquoi ce skill est important
La sécurité des contrats intelligents est cruciale car les vulnérabilités peuvent entraîner des pertes financières massives. Ce skill vous aide à :
- Éviter les vulnérabilités connues comme les attaques de réentrance, les débordements d'entiers, et les problèmes de contrôle d'accès.
- Appliquer les meilleures pratiques de l'industrie pour un code Solidity robuste.
- Accélérer le développement sécurisé en fournissant des motifs prêts à l'emploi.
Ce que le skill couvre
- Vulnérabilités courantes : Attaques de réentrance, débordements d'entiers, problèmes d'arithmétique, contrôle d'accès faible, manipulation de timestamp, mauvaises pratiques d'initialisation.
- Motifs sécurisés : Modèle pousse-pull (push-pull), mot de contrôle d'accès (RBAC), verrouillage de contrat, optimisation des limites de gaz, utilisation de bibliothèques sécurisées.
- Procédures d'audit : Vérification de code, tests unitaires et de fuzz, analyse statique.
Comment utiliser ce skill
- Pour écrire un nouveau contrat : Invoquez ce skill pour recevoir un template sécurisé avec des conseils pas à pas.
- Pour auditer un contrat existant : Utilisez ce skill pour analyser le code et identifier les failles potentielles.
- Pour renforcer la sécurité : Appliquez les motifs recommandés et les listes de contrôle.
Exemple de code
// Exemple d'utilisation sécurisée du motif pousse-pull
contract SafePayment {
using SafeMath for uint256;
mapping(address => uint256) private balances;
function deposit() external payable {
balances[msg.sender] = balances[msg.sender].add(msg.value);
}
function withdraw() external {
uint256 amount = balances[msg.sender];
require(amount > 0, "Pas de solde");
balances[msg.sender] = 0;
(bool success, ) = msg.sender.call{value: amount}("");
require(success, "Échec du transfert");
}
}
Listes de contrôle
- Vérifier que les fonctions de retrait utilisent le motif pousse-pull.
- Éviter d'utiliser
block.timestamppour la logique critique. - Utiliser SafeMath pour les opérations arithmétiques.
- Appliquer le contrôle d'accès avec
onlyOwnerou rôles. - Tester avec des fuzzing et des audits externes.