Privilèges cachés du propriétaire: Fonctions d'administration dangereuses dans les contrats 'vérifiés'
— By Tony Rabbit in Tutorials

Un code source vérifié ne signifie pas qu'un jeton est sûr. Apprenez à auditer la liste des fonctions d'écriture de tout contrat, à repérer les privilèges réservés au propriétaire comme blacklist() et pause(), et à distinguer les outils d'administration inoffensifs des portes dérobées piégeant les détenteurs.
Les privilèges cachés du propriétaire dans un contrat intelligent sont des fonctions réservées à l'administrateur qui permettent à un déployeur de jetons de modifier les règles après que vous ayez déjà acheté, et elles subsistent régulièrement dans des contrats qui semblent parfaitement propres sur un explorateur de blocs. La partie dangereuse est que la vérification du code source prouve seulement que le code publié correspond au bytecode on-chain. Elle ne dit rien sur ce que ce code est autorisé à faire. Un contrat peut être vérifié, audité et même partiellement renoncé tout en conservant une fonction qui permet au propriétaire de geler votre portefeuille, de limiter vos ventes ou de créer de nouvelles fournitures à partir de rien. Ce guide est un audit pratique, pas un glossaire. Vous apprendrez exactement quelles fonctions rechercher, comment les lire sur l'explorateur et comment séparer les outils d'administration de routine d'un piège.
Points clés à retenir
- La vérification prouve que le code correspond au bytecode, pas que le code est sûr.
- blacklist(), pause() et les commutateurs de trading peuvent geler vos ordres de vente de manière permanente.
- Une porte dérobée mint permet à un développeur de diluer les détenteurs sans jamais toucher au pool de liquidité.
- Lisez l'onglet Write sur l'explorateur et jugez les fonctions en fonction de qui peut les appeler et de ce qu'elles modifient.
Pourquoi un contrat vérifié ou partiellement renoncé peut toujours être dangereux
La vérification est une fonctionnalité de transparence, pas un sceau de sécurité. Lorsqu'un projet vérifie son contrat, l'explorateur compile la source soumise et confirme qu'elle produit le bytecode exact déjà déployé. C'est vraiment utile car cela vous permet de lire ce que fait le contrat au lieu de fixer du hexadécimal. Mais un développeur malveillant veut aussi la vérification, car un contrat propre et lisible inspire confiance plus rapidement qu'un contrat non vérifié. De nombreuses escroqueries livrent du code vérifié exprès. Si la distinction n'est pas claire pour vous, notre explication sur ce que signifie réellement un contrat vérifié détaille les limites.
La renonciation à la propriété présente une lacune similaire. Un développeur peut renoncer au rôle de propriétaire standard et conserver une deuxième adresse privilégiée codée en dur dans la logique, ou renoncer seulement après que les setters dangereux aient déjà fait leurs dégâts. La renonciation ne sert à rien non plus si la fonction risquée a été écrite pour être appelable par n'importe qui, ou si elle n'a jamais été protégée par la propriété en premier lieu. Lisez notre analyse de ce que prouve réellement un contrat renoncé avant de considérer la renonciation comme un feu vert. Le résumé honnête: vérifié plus renoncé est un point de départ, pas un verdict.
Privilèges cachés du propriétaire à rechercher dans un contrat intelligent
La plupart des pouvoirs piégeant les détenteurs résident dans une poignée de fonctions réservées au propriétaire. Apprenez ces noms et vous pourrez scanner un contrat en une minute ou deux. Notez que les développeurs les renomment souvent, alors jugez par le comportement, pas seulement par l'étiquette.
- blacklist() / setBlacklist() / addBot() marque des portefeuilles spécifiques afin qu'ils ne puissent pas transférer ou vendre. Un développeur peut mettre les acheteurs sur liste noire juste après leur entrée, les laissant détenir des jetons qu'ils ne pourront jamais décharger.
- setMaxTx() / setMaxWallet() plafonne le montant que vous pouvez déplacer en une seule transaction. Défini à une valeur minuscule, cela rend les ventes significatives impossibles tandis que les achats continuent de circuler.
- enableTrading() / setTradingEnabled() active ou désactive le fonctionnement des transferts. Si le trading peut être désactivé après le lancement, votre sortie peut être fermée à volonté.
- mint() ou toute fonction qui augmente l'offre est une porte dérobée pour diluer chaque détenteur. C'est ainsi qu'un développeur peut drainer de la valeur sans jamais retirer de liquidité.
- pause() / unpause() arrête toute activité de jeton. Une véritable pause de sécurité est acceptable en théorie, mais entre de mauvaises mains, c'est un bouton de gel pour l'ensemble du marché.
- setFee() / setTaxes() modifie la taxe d'achat ou de vente. Recherchez un plafond fixe dans le code. Si le propriétaire peut fixer une taxe de vente de 99 pour cent, chaque vente est effectivement confisquée.
Comment lire la liste des fonctions d'écriture sur un explorateur de blocs
Ouvrez le jeton sur un explorateur de blocs, allez à l'onglet Contract et sélectionnez Write Contract (ou Write as Proxy si le jeton utilise un modèle de proxy). Cette liste est le menu complet des actions modifiant l'état que le contrat expose. Lisez chaque entrée par son nom et posez trois questions: qu'est-ce que cela change, qui est autorisé à l'appeler, et y a-t-il une limite à la valeur à laquelle elle peut être définie.
Pour vérifier qui peut appeler une fonction, passez à l'onglet Read Contract et trouvez owner() pour voir l'adresse du propriétaire actuel. Si elle renvoie l'adresse zéro (0x000...000), la propriété est renoncée. Ensuite, examinez les définitions de fonction dans l'onglet Code pour un modificateur onlyOwner ou une instruction require qui restreint l'appelant. Une fonction sans contrôle d'accès qui modifie les soldes ou les frais est un sérieux signal d'alarme. Si la lecture de Solidity n'est pas votre point fort, les scanners automatisés effectuent ce tri pour vous, et notre récapitulatif des meilleurs outils gratuits pour analyser les contrats intelligents couvre ceux qui signalent automatiquement les fonctions privilégiées.
Ce que chaque privilège permet à un développeur de faire, y compris le rug pull sans toucher à la liquidité
Le rug pull classique draine le pool de liquidité, et vous pouvez souvent le voir venir si le LP est déverrouillé. Les privilèges cachés du propriétaire permettent une version plus silencieuse qui ne touche jamais la liquidité. Avec une fonction blacklist() fonctionnelle, un développeur laisse tout le monde acheter, observe le prix grimper, puis met les détenteurs sur liste noire afin que seule l'équipe puisse vendre face à la demande d'achat. Le pool reste plein et le graphique semble sain jusqu'au moment où votre vente est annulée. Un setFee() sans plafond atteint le même résultat en acheminant presque toutes les ventes vers le portefeuille de l'équipe. Une porte dérobée mint() est la plus lente et la plus niable: le propriétaire crée discrètement une énorme nouvelle allocation et la vend progressivement, diluant les détenteurs pendant que le contrat passe toujours un contrôle de liquidité occasionnel. Parce qu'aucune de ces actions ne nécessite de retirer le LP, elles échappent souvent aux outils qui ne surveillent que le retrait de liquidité, c'est pourquoi l'examen au niveau des fonctions est important, en plus de notre liste de contrôle plus large des rug pulls.
Distinguer les fonctions d'administration inoffensives de celles qui piègent les détenteurs
Toutes les fonctions réservées au propriétaire ne sont pas une menace. De nombreux jetons légitimes conservent des outils d'administration pour de bonnes raisons, et l'objectif est la calibration, pas la paranoïa. Trois tests séparent les fonctions de routine des pièges. Premièrement, l'état dangereux est-il déjà verrouillé dans la direction sûre? Un commutateur de trading est acceptable une fois que le trading est activé en permanence et que la fonction ne peut plus le désactiver. Deuxièmement, y a-t-il un plafond fixe? Un setFee() qui ne peut jamais dépasser, disons, 10 pour cent est défendable, tandis qu'un sans limite supérieure ne l'est pas. Troisièmement, la propriété a-t-elle été renoncée ou transférée à un timelock ou un multisig? Un privilège qu'aucune personne seule ne peut déclencher instantanément est beaucoup moins dangereux que celui contrôlé par un EOA anonyme. Les exemples véritablement bénins incluent un enableTrading() unique qui s'active au lancement et ne peut pas être désactivé, un excludeFromFee() pour les routeurs et le contrat lui-même, et une fonction de retrait limitée au portefeuille de frais plutôt qu'au pool de liquidité. Associez ce jugement à notre guide plus large sur comment vérifier si un jeton est sûr avant d'acheter afin que la lecture du contrat soit une entrée parmi plusieurs.
Une liste de contrôle rapide pour l'audit des privilèges du propriétaire
Exécutez cette séquence avant d'acheter un jeton. Cela prend quelques minutes et détecte les pièges les plus courants:
- Confirmez que le contrat est vérifié afin de pouvoir réellement lire la source.
- Ouvrez l'onglet Write Contract et listez chaque fonction modifiant l'état.
- Signalez les fonctions blacklist, pause, mint, commutateur de trading, max-tx et les setters de frais.
- Pour chaque signalement, vérifiez le contrôle d'accès: qui peut l'appeler et la propriété est-elle renoncée, timelockée ou multisig.
- Vérifiez si les setters de taxes ont un plafond fixe et quel est ce plafond.
- Confirmez que tout commutateur de trading ne peut pas être désactivé après le lancement.
- Vérifiez avec un scanner automatisé pour détecter tout ce que vous auriez manqué.
- Si un seul portefeuille anonyme peut geler les ventes, augmenter les taxes sans limite ou créer de l'offre, traitez le jeton comme à haut risque, quelle que soit son apparence propre.
La discipline qui vous protège est simple: jugez un contrat par ce que son propriétaire est autorisé à faire, et non par les badges qu'il porte. Vérifié et renoncé sont des entrées, jamais des conclusions. Une fois que la lecture de l'onglet Write devient une habitude, les leviers cachés cessent d'être cachés.
Cet article est à des fins éducatives uniquement et ne constitue pas un conseil financier.