Scannez pour télécharger l’application Gate
qrCode
Autres options de téléchargement
Ne pas rappeler aujourd’hui

Automatiser l'audit Solidity avec le script Wake Printer

Prérequis et configuration

Dans ce tutoriel, nous utiliserons le dépôt workshop comme projet d’exemple :

se réveiller

Bash

Copier

se réveiller imprimer

Bash

Copier

Exécuter une imprimante spécifique par nom :

Tutoriel 1 : Créer votre première imprimante – Lister les contrats

Commençons par une imprimante simple qui liste tous les contrats dans le projet. Cet exemple introduit les concepts clés que vous utiliserez dans des analyses plus complexes.

Créer la structure de l’imprimante

Exécutez la commande suivante pour construire votre première imprimante :

from __future__ import annotations import networkx as nx import rich_click as click import wake.ir as ir import wake.ir.types as types from rich import print from wake.cli import SolidityName from wake.printers import Printer, printer

class ListContractsPrinter(Printer): (def print)self( -> None: pass @printer.command)name=“list-contracts” (def cli)self( -> None: pass

Python

Copier

Voici le rôle de chaque partie dans le modèle :

  • print)( : méthode principale d’exécution pour afficher les résultats de l’analyse
  • cli)( : gestionnaire de la ligne de commande pour la personnalisation des paramètres

Implémentation du pattern visiteur

Wake utilise le pattern visiteur pour parcourir l’arbre syntaxique abstrait des contrats )AST(. Ce pattern permet à Wake de naviguer automatiquement dans la structure du code, pour réagir à des éléments spécifiques (par exemple, contrat ou définition de fonction).

Pour lister les contrats, nous allons surcharger la méthode visit_contract_definition, qui sera appelée pour chaque contrat dans la base de code.

Ajoutez cette méthode à votre classe ListContractsPrinter :

wake print list-contracts

Bash

Copier

Cette commande exécute votre imprimante et affiche tous les noms de contrats trouvés dans votre projet.

Amélioration de la sortie

L’implémentation de base affiche tous les contrats, y compris les interfaces et contrats hérités. Améliorons-la pour n’afficher que les contrats déployables :

def visit_contract_definition)self, node: ir.ContractDefinition( -> None: if len)node.child_contracts( != 0: return if node.kind != ir.enums.ContractKind.CONTRACT: return print)node.name(

Python

Copier

La classe ContractDefinition possède des propriétés permettant de filtrer les résultats. Pour une référence complète, voir :

Implémentation complète

Voici la version finale, avec une séparation claire des préoccupations — collecte des données lors de l’itération et affichage dans la méthode print)### :

Tutoriel 2 : Analyse des fonctions de contrat

Il est crucial de connaître les fonctions accessibles de l’extérieur : les fonctions publiques ‘withdraw’ ou ‘transfer’ définissent souvent la surface d’attaque d’un contrat. Créons une imprimante qui liste toutes les fonctions publiques et externes pour cartographier cette surface.

(## Création d’une imprimante pour les fonctions

Créez une nouvelle imprimante :

class ListFunctionsPrinter)Printer(: contracts: list[ir.ContractDefinition] = []

def visit\_contract\_definition)self, node: ir.ContractDefinition( -> None:
    self.contracts.append)node###

Python

Copier

(## Gestion de la hiérarchie d’héritage

Dans la méthode print)(, nous parcourons la hiérarchie d’héritage, du contrat de base au contrat dérivé, pour afficher chaque niveau de fonctions accessibles :

def get_callable_final_functions)self, contract: ir.ContractDefinition( -> list[ir.FunctionDefinition]: return [func for func in contract.functions if len)func.child_functions### == 0 # S’il s’agit d’une implémentation finale and func.visibility in [ir.enums.Visibility.PUBLIC, ir.enums.Visibility.EXTERNAL]]

Python

Copier

Exécution de l’imprimante pour les fonctions

Lancez l’imprimante pour voir la hiérarchie d’héritage et les fonctions accessibles :

Contract : ContextContract Fonctions : Ownable

  • owner
  • renounceOwnership
  • transferOwnership

Contract : SingleTokenVault Fonctions :

  • constructor
  • deposit
  • withdraw
  • emergencyWithdraw
  • balanceOf
  • setDepositLimits

Contract : EIP712Example Fonctions :

  • constructor
  • DOMAIN_SEPARATOR
  • castVoteBySignature
  • getVoteCounts

Contract : ContextContract Contract : IERC20 Contract : IERC20Metadata Contract : IERC20 Errors : ERC20 Fonctions :

  • name
  • symbol
  • decimals
  • totalSupply
  • balanceOf
  • transfer
  • allowance
  • approve
  • transferFrom

Contract : IERC20Permit Contract : IERC5267 Contract : EIP712 Fonctions :

  • eip712Domain
  • Nonces
  • permit
  • nonces
  • DOMAIN_SEPARATOR

Contract : PermitToken Fonctions :

  • constructor

Contract : Token Fonctions :

  • constructor
  • mintTokens
  • transfer
  • transferWithBytes
  • getBalance

Contract : Context Contract : IERC20 Contract : IERC20Metadata Contract : IERC20 Errors : ERC20 Fonctions :

  • name
  • symbol
  • decimals
  • totalSupply
  • balanceOf
  • transfer
  • allowance
  • approve
  • transferFrom

Contract : MockERC20 Fonctions :

  • constructor

La sortie fournit une visualisation rapide de l’héritage et des points d’entrée accessibles pour chaque contrat.

(# @printer.command)name=“list-functions” (@click.option)“–contract-name”, type=str, required=False (def cli)self, contract_name: str | None( -> None: self.contract_name = contract_name

Python

Copier

Filtrage conditionnel

La méthode print)## 分析所有可部署的合约wake print list-functions# vérifie maintenant si un contrat spécifique a été demandé. Si aucun nom n’est fourni, l’imprimante liste tous les contrats déployables. Si un nom est spécifié, elle se concentre uniquement sur ce contrat, même s’il n’est pas une feuille dans la hiérarchie.

Implémentation complète avec options CLI

Voici la version finale de l’imprimante avec la possibilité de filtrer par contrat :

Se concentrer sur un contrat spécifique

wake print list-functions --contract-name Token

Bash

Copier

Étapes suivantes

L’imprimante vous donne la carte ; le détecteur recherche les vulnérabilités. Ensemble, ils transforment l’audit Solidity d’un processus laborieux manuel en une démarche structurée et perspicace. Chaque imprimante que vous créez peut rendre le code complexe plus clair — et renforcer la sécurité des contrats que vous examinez.

Pour la détection de vulnérabilités, Wake propose un système de détecteurs séparé, qui va au-delà de la visualisation pour identifier de véritables problèmes de sécurité. Les imprimantes vous donnent la carte ; les détecteurs recherchent les failles.

Envisagez de contribuer votre imprimante à la communauté. Les outils d’analyse sont plus puissants lorsqu’ils sont partagés, et votre imprimante personnalisée pourrait aider d’autres auditeurs à mieux comprendre des bases de code complexes.

Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
  • Récompense
  • Commentaire
  • Reposter
  • Partager
Commentaire
0/400
Aucun commentaire
  • Épingler
Trader les cryptos partout et à tout moment
qrCode
Scan pour télécharger Gate app
Communauté
Français (Afrique)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)